ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmggYi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oCmluZGV4IGY0ZjliOWUuLmY4MjA5OTkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaApAQCAtMTYsNyArMTYsNyBAQAogdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbik7CiB2b2lkIENSWVBUX0FyY0ZvdXJTZXR1cCh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGxlbmd0aCk7CiB2b2lkIENSWVBUX0FyY0ZvdXJDcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgYm9vbCBiRW5jcnlwdCk7Cit2b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LCBGWF9EV09SRCBibG9ja2xlbiwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBrZXlsZW4sIEZYX0JPT0wgYkVuY3J5cHQpOwogdm9pZCBDUllQVF9BRVNTZXRJVih2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBpdik7CiB2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGVzdCwgY29uc3QgdWludDhfdCogc3JjLCBGWF9EV09SRCBzaXplKTsKIHZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkZXN0LCBjb25zdCB1aW50OF90KiBzcmMsIEZYX0RXT1JEIHNpemUpOwpAQCAtNDAsNyArNDAsNyBAQAogdm9pZCBDUllQVF9TSEE1MTJVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiB2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pOwogdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TZXRQdWJLZXlEZWNyeXB0b3IoYm9vbCAoKmZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSk7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgKaW5kZXggYjZmOGRlMC4uNTg3N2UxMSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICB2b2lkIEluaXRSZW5kZXJNb2R1bGUoKTsKIAotICAgIHZvaWQgU2V0RG93bmxvYWRDYWxsYmFjayhib29sICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSk7CisgICAgdm9pZCBTZXREb3dubG9hZENhbGxiYWNrKEZYX0JPT0wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKTsKIAotICAgIGJvb2wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOworICAgIEZYX0JPT0wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgdm9pZCBOb3RpZnlNb2R1bGVBdmFpbGFibGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9SZW5kZXJNb2R1bGU+IG1fcFJlbmRlck1vZHVsZTsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9QYWdlTW9kdWxlPiBtX3BQYWdlTW9kdWxlOwogCi0gICAgYm9vbCAoKm1fcERvd25sb2FkQ2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKTsKKyAgICBGWF9CT09MICgqbV9wRG93bmxvYWRDYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NlY3VyaXR5SGFuZGxlck1hcDsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9vYmplY3RzLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAppbmRleCA4ZDk1NGZmLi40NWI3Y2M2IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaApAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICByZXR1cm4gbV9HZW5OdW07CiAgICAgfQogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0OworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT2JqKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgIENsb25lKGJvb2wgYkRpcmVjdCA9IGZhbHNlKSBjb25zdDsKKyAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZShGWF9CT09MIGJEaXJlY3QgPSBGQUxTRSkgY29uc3Q7CiAKICAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZVJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIGNvbnN0OwogCkBAIC04OCw5ICs4OCw5IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIHByb3RlY3RlZDoKICAgICBDUERGX09iamVjdChGWF9EV09SRCB0eXBlKSA6IG1fVHlwZSh0eXBlKSwgbV9PYmpOdW0oMCksIG1fR2VuTnVtKDApIHsgfQpAQCAtMTA4LDI3ICsxMDgsMjcgQEAKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX1N5bnRheFBhcnNlcjsKIHByaXZhdGU6CiAgICAgQ1BERl9PYmplY3QoY29uc3QgQ1BERl9PYmplY3QmIHNyYykge30KLSAgICBDUERGX09iamVjdCogQ2xvbmVJbnRlcm5hbChib29sIGJEaXJlY3QsIENGWF9NYXBQdHJUb1B0ciogdmlzaXRlZCkgY29uc3Q7CisgICAgQ1BERl9PYmplY3QqIENsb25lSW50ZXJuYWwoRlhfQk9PTCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0OwogfTsKIGNsYXNzIENQREZfQm9vbGVhbiA6IHB1YmxpYyBDUERGX09iamVjdAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKGJvb2wgdmFsdWUpCisgICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKEZYX0JPT0wgdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfQm9vbGVhbih2YWx1ZSk7CiAgICAgfQogCiAgICAgQ1BERl9Cb29sZWFuKCkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKGZhbHNlKSB7IH0KLSAgICBDUERGX0Jvb2xlYW4oYm9vbCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KKyAgICBDUERGX0Jvb2xlYW4oRlhfQk9PTCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KIAotICAgIGJvb2wJCQkJCUlkZW50aWNhbChDUERGX0Jvb2xlYW4qIHBPdGhlcikgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9Cb29sZWFuKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmFsdWUgPT0gcE90aGVyLT5tX2JWYWx1ZTsKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBib29sCQkJCQltX2JWYWx1ZTsKKyAgICBGWF9CT09MCQkJCQltX2JWYWx1ZTsKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKIH07CiBjbGFzcyBDUERGX051bWJlciA6IHB1YmxpYyBDUERGX09iamVjdApAQCAtMTUwLDE0ICsxNTAsMTQgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcihzdHIpOwogICAgIH0KIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShib29sIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKKyAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKGJJbnRlZ2VyLCBwRGF0YSk7CiAgICAgfQogCiAgICAgQ1BERl9OdW1iZXIoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGZhbHNlKSwgbV9JbnRlZ2VyKDApIHsgfQogCi0gICAgQ1BERl9OdW1iZXIoYm9vbCBiSW50ZWdlciwgdm9pZCogcERhdGEpOworICAgIENQREZfTnVtYmVyKEZYX0JPT0wgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKIAogICAgIENQREZfTnVtYmVyKGludCB2YWx1ZSk7CiAKQEAgLTE2NSwxMyArMTY1LDEzIEBACiAKICAgICBDUERGX051bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0OwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoKSBjb25zdDsKIAogICAgIHZvaWQJCQkJCVNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBib29sCQkJCQlJc0ludGVnZXIoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJCUlzSW50ZWdlcigpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSW50ZWdlcjsKICAgICB9CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBib29sCQkJCQltX2JJbnRlZ2VyOworICAgIEZYX0JPT0wJCQkJCW1fYkludGVnZXI7CiAKICAgICB1bmlvbiB7CiAKQEAgLTIxMyw3ICsyMTMsNyBAQAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfU3RyaW5nKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIGJvb2wgYkhleCA9IGZhbHNlKQorICAgIHN0YXRpYyBDUERGX1N0cmluZyoJCUNyZWF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoc3RyLCBiSGV4KTsKICAgICB9CkBAIC0yMjMsOSArMjIzLDkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmluZyhzdHIpOwogICAgIH0KIAotICAgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KGZhbHNlKSB7IH0KKyAgICBDUERGX1N0cmluZygpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChGQUxTRSkgeyB9CiAKLSAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXggPSBmYWxzZSkKKyAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKICAgICAgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9TdHJpbmcoc3RyKSwgbV9iSGV4KGJIZXgpIHsKICAgICB9CiAKQEAgLTIzNiwxMiArMjM2LDEyIEBACiAgICAgICAgIHJldHVybiBtX1N0cmluZzsKICAgICB9CiAKLSAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX1N0cmluZyA9PSBwT3RoZXItPm1fU3RyaW5nOwogICAgIH0KIAotICAgIGJvb2wJCQkJCUlzSGV4KCkgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJc0hleCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSGV4OwogICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1N0cmluZzsKIAotICAgIGJvb2wJCQkJCW1fYkhleDsKKyAgICBGWF9CT09MCQkJCQltX2JIZXg7CiAgICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7CiB9OwogY2xhc3MgQ1BERl9OYW1lIDogcHVibGljIENQREZfT2JqZWN0CkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1fTmFtZTsKICAgICB9CiAKLSAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfTmFtZSogcE90aGVyKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fTmFtZSA9PSBwT3RoZXItPm1fTmFtZTsKICAgICB9CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgQWRkTnVtYmVyKHZhbHVlKTsKICAgICB9CiAKLSAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKIHByb3RlY3RlZDoKIAogICAgIH5DUERGX0FycmF5KCk7CkBAIC00MTksNyArNDE5LDcgQEAKIAogICAgIGludAkJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWZhdWx0X2ludCkgY29uc3Q7CiAKLSAgICBib29sCQkJCQlHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJEZWZhdWx0ID0gZmFsc2UpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYkRlZmF1bHQgPSBGQUxTRSkgY29uc3Q7CiAKICAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCkBAIC00MzksNyArNDM5LDcgQEAKICAgICB9CiAKIAotICAgIGJvb2wJCQkJCUtleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKICAgICBGWF9QT1NJVElPTgkJCQlHZXRTdGFydFBvcygpIGNvbnN0OwogCkBAIC00NzgsNyArNDc4LDcgQEAKIAogICAgIHZvaWQJCQkJCVNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJWYWx1ZSk7CisgICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSk7CiAKIAogCkBAIC00ODcsNyArNDg3LDcgQEAKIAogICAgIHZvaWQJCQkJCVJlcGxhY2VLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvbGRrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmV3a2V5KTsKIAotICAgIGJvb2wJCQkJCUlkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgY29uc3Q7CiAKICAgICBpbnQJCQkJCQlHZXRDb3VudCgpIGNvbnN0CiAgICAgewpAQCAtNTE5LDE1ICs1MTksMTUgQEAKICAgICAgICAgcmV0dXJuIG1fcERpY3Q7CiAgICAgfQogCi0gICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiQ29tcHJlc3NlZCwgYm9vbCBiS2VlcEJ1Zik7CisgICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiQ29tcHJlc3NlZCwgRlhfQk9PTCBiS2VlcEJ1Zik7CiAKICAgICB2b2lkCQkJCQlJbml0U3RyZWFtKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAogICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiAKLSAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0OwogCi0gICAgQ1BERl9TdHJlYW1GaWx0ZXIqCQlHZXRTdHJlYW1GaWx0ZXIoYm9vbCBiUmF3ID0gZmFsc2UpIGNvbnN0OworICAgIENQREZfU3RyZWFtRmlsdGVyKgkJR2V0U3RyZWFtRmlsdGVyKEZYX0JPT0wgYlJhdyA9IEZBTFNFKSBjb25zdDsKIAogCiAKQEAgLTUzNiwxNSArNTM2LDE1IEBACiAgICAgICAgIHJldHVybiBtX2R3U2l6ZTsKICAgICB9CiAKLSAgICBib29sCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKIAogCi0gICAgYm9vbAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDE7CiAgICAgfQogCi0gICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoYm9vbCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CisgICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CiBwcm90ZWN0ZWQ6CiAKICAgICB+Q1BERl9TdHJlYW0oKTsKQEAgLTU3OSw4ICs1NzksOCBAQAogCiAgICAgfkNQREZfU3RyZWFtQWNjKCk7CiAKLSAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiUmF3QWNjZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBib29sIGJJbWFnZUFjYyA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBGWF9CT09MIGJJbWFnZUFjYyA9IEZBTFNFKTsKIAogICAgIGNvbnN0IENQREZfU3RyZWFtKgkJR2V0U3RyZWFtKCkgY29uc3QKICAgICB7CkBAIC02MTMsNyArNjEzLDcgQEAKIAogICAgIEZYX0RXT1JECQkJCW1fZHdTaXplOwogCi0gICAgYm9vbAkJCQkJbV9iTmV3QnVmOworICAgIEZYX0JPT0wJCQkJCW1fYk5ld0J1ZjsKIAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JbWFnZURlY29kZXI7CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAgICAgdm9pZAkJCQkJU2V0UmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9SZWZPYmpOdW0gPT0gcE90aGVyLT5tX1JlZk9iak51bTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCmluZGV4IDJmYzlkZTguLmJkOGI1YzkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCkBAIC0yOCwxMiArMjgsMTIgQEAKIGNsYXNzIENQREZfUGFnZU9iamVjdHMKIHsKIHB1YmxpYzoKLSAgICBDUERGX1BhZ2VPYmplY3RzKGJvb2wgYlJlbGVhc2VNZW1iZXJzID0gdHJ1ZSk7CisgICAgQ1BERl9QYWdlT2JqZWN0cyhGWF9CT09MIGJSZWxlYXNlTWVtYmVycyA9IFRSVUUpOwogICAgIH5DUERGX1BhZ2VPYmplY3RzKCk7CiAKICAgICB2b2lkCQkJCUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgYm9vbAkJCQlJc1BhcnNlZCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlJc1BhcnNlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEOwogICAgIH0KQEAgLTc2LDcgKzc2LDcgQEAKIAogICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CiAKLSAgICBib29sCQkJCUJhY2tncm91bmRBbHBoYU5lZWRlZCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlCYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsKICAgICB9CkBAIC0xMDYsOCArMTA2LDggQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIENsZWFyQ2FjaGVPYmplY3RzKCk7CiAKICAgICBDRlhfUHRyTGlzdAkJCW1fT2JqZWN0TGlzdDsKLSAgICBib29sCQkJCW1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsKLSAgICBib29sCQkJCW1fYlJlbGVhc2VNZW1iZXJzOworICAgIEZYX0JPT0wJCQkJbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOworICAgIEZYX0JPT0wJCQkJbV9iUmVsZWFzZU1lbWJlcnM7CiAgICAgQ1BERl9Db250ZW50UGFyc2VyKgltX3BQYXJzZXI7CiAgICAgUGFyc2VTdGF0ZQkJCW1fUGFyc2VTdGF0ZTsKIH07CkBAIC0xMjAsMTEgKzEyMCwxMSBAQAogCiAgICAgfkNQREZfUGFnZSgpOwogCi0gICAgdm9pZAkJCQlMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIGJvb2wgYlBhZ2VDYWNoZSA9IHRydWUpOworICAgIHZvaWQJCQkJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LCBGWF9CT09MIGJQYWdlQ2FjaGUgPSBUUlVFKTsKIAotICAgIHZvaWQJCQkJU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBib29sIGJSZVBhcnNlID0gZmFsc2UpOworICAgIHZvaWQJCQkJU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCVBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwogCiAgICAgdm9pZAkJCQlHZXREaXNwbGF5TWF0cml4KENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCwgaW50IHhQb3MsIGludCB5UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsIGludCB5U2l6ZSwgaW50IGlSb3RhdGUpIGNvbnN0OwpAQCAtMTc3LDEzICsxNzcsMTMgQEAKIAogICAgIENQREZfUGFyc2VPcHRpb25zKCk7CiAKLSAgICBib29sCQkJCW1fYlRleHRPbmx5OworICAgIEZYX0JPT0wJCQkJbV9iVGV4dE9ubHk7CiAKLSAgICBib29sCQkJCW1fYk1hcmtlZENvbnRlbnQ7CisgICAgRlhfQk9PTAkJCQltX2JNYXJrZWRDb250ZW50OwogCi0gICAgYm9vbAkJCQltX2JTZXBhcmF0ZUZvcm07CisgICAgRlhfQk9PTAkJCQltX2JTZXBhcmF0ZUZvcm07CiAKLSAgICBib29sCQkJCW1fYkRlY29kZUlubGluZUltYWdlOworICAgIEZYX0JPT0wJCQkJbV9iRGVjb2RlSW5saW5lSW1hZ2U7CiB9OwogY2xhc3MgQ1BERl9Gb3JtIDogcHVibGljIENQREZfUGFnZU9iamVjdHMKIHsKQEAgLTIwNiw3ICsyMDYsNyBAQAogcHVibGljOgogICAgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZShDUERGX1BhZ2UqIHBQYWdlKTsKICAgICB+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCk7Ci0gICAgYm9vbCBJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpOworICAgIEZYX0JPT0wgSW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KTsKICAgICB2b2lkIEdlbmVyYXRlQ29udGVudCgpOwogICAgIHZvaWQgVHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpOwogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAppbmRleCBjMTQwZGU2Li43MzU0MGEzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaApAQCAtODgsNyArODgsNyBAQAogICAgICAgICBtX3BPYmplY3QtPkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKICAgICB9CiAKLSAgICBib29sCQkJCUlzUmVjdCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlJc1JlY3QoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+SXNSZWN0KCk7CiAgICAgfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKICAgICBDRlhfRmxvYXRSZWN0CQlHZXRDbGlwQm94KCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCUFwcGVuZFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBib29sIGJBdXRvTWVyZ2UpOworICAgIHZvaWQJCQkJQXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSk7CiAKICAgICB2b2lkCQkJCURlbGV0ZVBhdGgoaW50IGxheWVyX2luZGV4KTsKIApAQCAtMjkyLDE1ICsyOTIsMTUgQEAKIAogICAgIGludAkJCQkJbV9SZW5kZXJJbnRlbnQ7CiAKLSAgICBib29sCQkJCW1fU3Ryb2tlQWRqdXN0OworICAgIEZYX0JPT0wJCQkJbV9TdHJva2VBZGp1c3Q7CiAKLSAgICBib29sCQkJCW1fQWxwaGFTb3VyY2U7CisgICAgRlhfQk9PTAkJCQltX0FscGhhU291cmNlOwogCi0gICAgYm9vbAkJCQltX1RleHRLbm9ja291dDsKKyAgICBGWF9CT09MCQkJCW1fVGV4dEtub2Nrb3V0OwogCi0gICAgYm9vbAkJCQltX1N0cm9rZU9QOworICAgIEZYX0JPT0wJCQkJbV9TdHJva2VPUDsKIAotICAgIGJvb2wJCQkJbV9GaWxsT1A7CisgICAgRlhfQk9PTAkJCQltX0ZpbGxPUDsKIAogICAgIGludAkJCQkJbV9PUE1vZGU7CiAKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKICAgICB9CiAKLSAgICBpbnQJCQkJCUdldEFscGhhKGJvb2wgYlN0cm9rZSkgY29uc3QKKyAgICBpbnQJCQkJCUdldEFscGhhKEZYX0JPT0wgYlN0cm9rZSkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBGWFNZU19yb3VuZCgoYlN0cm9rZSA/IG1fcE9iamVjdC0+bV9TdHJva2VBbHBoYSA6IG1fcE9iamVjdC0+bV9GaWxsQWxwaGEpICogMjU1KSA6IDI1NTsKICAgICB9CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICAgICAgcmV0dXJuIG1fcFBhcmFtOwogICAgIH0KIAotICAgIGlubGluZSBib29sCQlIYXNNQ0lEKCkgY29uc3Q7CisgICAgaW5saW5lIEZYX0JPT0wJCUhhc01DSUQoKSBjb25zdDsKIAogICAgIGlubGluZSB2b2lkCQkJU2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKICAgICB7CkBAIC00MDIsNyArNDAyLDcgQEAKIAogICAgIGludAkJCQkJR2V0TUNJRCgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBib29sIGJEaWN0TmVlZENsb25lKTsKKyAgICB2b2lkCQkJCUFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIENQREZfRGljdGlvbmFyeSogcERpY3QsIEZYX0JPT0wgYkRpY3ROZWVkQ2xvbmUpOwogCiAgICAgdm9pZAkJCQlEZWxldGVMYXN0TWFyaygpOwogcHJpdmF0ZToKQEAgLTQxOCw5ICs0MTgsOSBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5HZXRNQ0lEKCkgOiAtMTsKICAgICB9CiAKLSAgICBib29sCQkJCUhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCUhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdDsKIAotICAgIGJvb2wJCQkJTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKKyAgICBGWF9CT09MCQkJCUxvb2t1cE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrLCBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3Q7CiB9OwogCiAjZGVmaW5lIFBERlBBR0VfVEVYVCAgICAgMQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICAgICB2b2lkCQkJCVJlbW92ZUNsaXBQYXRoKCk7CiAKLSAgICB2b2lkCQkJCUFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgYm9vbCBiQXV0b01lcmdlKTsKKyAgICB2b2lkCQkJCUFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKIAogICAgIHZvaWQJCQkJQ29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaik7CiAKQEAgLTYyOSw3ICs2MjksNyBAQAogCiAgICAgaW50CQkJCQltX0ZpbGxUeXBlOwogCi0gICAgYm9vbAkJCQltX2JTdHJva2U7CisgICAgRlhfQk9PTAkJCQltX2JTdHJva2U7CiAKICAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaAppbmRleCA3YTQzOTQ3Li5hODU2NDMzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgKQEAgLTg2LDkgKzg2LDkgQEAKIAogICAgIGludAkJCQkJCUdldFBhZ2VJbmRleChGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfRFdPUkQJCQkJR2V0VXNlclBlcm1pc3Npb25zKGJvb2wgYkNoZWNrUmV2aXNpb24gPSBmYWxzZSkgY29uc3Q7CisgICAgRlhfRFdPUkQJCQkJR2V0VXNlclBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSkgY29uc3Q7CiAKLSAgICBib29sCQkJCQlJc093bmVyKCkgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJSXNPd25lcigpIGNvbnN0OwogCiAKIApAQCAtMTEyLDE0ICsxMTIsMTQgQEAKICAgICB2b2lkCQkJCQlDbGVhclJlbmRlckZvbnQoKTsKIAogCi0gICAgYm9vbAkJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUlzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSBjb25zdDsKIAogICAgIC8vIHxwRm9udERpY3R8IG11c3Qgbm90IGJlIG51bGwuCiAgICAgQ1BERl9Gb250KiBMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqCQlMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBOVUxMKTsKIAotICAgIENQREZfUGF0dGVybioJCQlMb2FkUGF0dGVybihDUERGX09iamVjdCogcE9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4ID0gTlVMTCk7CisgICAgQ1BERl9QYXR0ZXJuKgkJCUxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXggPSBOVUxMKTsKIAogICAgIENQREZfSW1hZ2UqCQkJCUxvYWRJbWFnZUYoQ1BERl9PYmplY3QqIHBPYmopOwogCkBAIC0xMjksMTcgKzEyOSwxNyBAQAogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7Ci0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7CisgICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CisgICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CiAjZW5kaWYKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIENQREZfRm9udCogICAgICAgICAgICAgIEFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lID0gZmFsc2UpOworICAgIENQREZfRm9udCogICAgICAgICAgICAgIEFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOwogI2VuZGlmCiAKICAgICBDUERGX0ZvbnQqCQkJCUFkZFN0YW5kYXJkRm9udChjb25zdCBGWF9DSEFSKiBmb250LCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKIAogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIGJvb2wgYlZlcnQpOworICAgIENQREZfRm9udCoJCQkJQWRkRm9udChDRlhfRm9udCogcEZvbnQsIGludCBjaGFyc2V0LCBGWF9CT09MIGJWZXJ0KTsKIAogICAgIHZvaWQJCQkJCUNyZWF0ZU5ld0RvYygpOwogCkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICBDRlhfQnl0ZVN0cmluZwkJCW1fSUQyOwogCiAKLSAgICBib29sCQkJCQltX2JMaW5lYXJpemVkOworICAgIEZYX0JPT0wJCQkJCW1fYkxpbmVhcml6ZWQ7CiAKICAgICBGWF9EV09SRAkJCQltX2R3Rmlyc3RQYWdlTm87CiAKQEAgLTE3Miw4ICsxNzIsOCBAQAogICAgIGludAkJCQkJCV9HZXRQYWdlQ291bnQoKSBjb25zdDsKICAgICBDUERGX0RpY3Rpb25hcnkqCQlfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsIGludCBpUGFnZSwgaW50IG5QYWdlc1RvR28sIGludCBsZXZlbCk7CiAgICAgaW50CQkJCQkJX0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsID0gMCk7Ci0gICAgYm9vbAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLSAgICBib29sCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBib29sIGJQcmludGluZyk7CisgICAgRlhfQk9PTAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgICBGWF9CT09MCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSoJCUdldFZhbGlkYXRlUGFnZURhdGEoKTsKICAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NyZWF0b3I7CkBAIC0yMDQsMTQgKzIwNCwxNCBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmdDCQlHZXRXb3JkKCk7CiAKLSAgICBib29sCQkJCVNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pOworICAgIEZYX0JPT0wJCQkJU2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBib29sCQkJCVNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pOworICAgIEZYX0JPT0wJCQkJU2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBib29sCQkJCUZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZW5kX3Rva2VuLAorICAgIEZYX0JPT0wJCQkJRmluZFRhZ1BhaXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdGFydF90b2tlbiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc3RhcnRfcG9zLCBGWF9EV09SRCYgZW5kX3Bvcyk7CiAKLSAgICBib29sCQkJCUZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CisgICAgRlhfQk9PTAkJCQlGaW5kVGFnUGFyYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbiwgaW50IG5QYXJhbXMpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRQb3MoKQogICAgIHsKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgICAgICBtX1BvcyA9IHBvczsKICAgICB9CiAKLSAgICBDUERGX09iamVjdCoJCUdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMLCBib29sIGJEZWNyeXB0ID0gdHJ1ZSk7CisgICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCwgRlhfQk9PTCBiRGVjcnlwdCA9IFRSVUUpOwogCiAKICAgICBDUERGX09iamVjdCoJCUdldE9iamVjdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwpOwpAQCAtMjcxLDkgKzI3MSw5IEBACiAKICAgICB2b2lkCQkJCVRvTmV4dFdvcmQoKTsKIAotICAgIGJvb2wJCQkJU2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQsIGJvb2wgYldob2xlV29yZCwgYm9vbCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpOworICAgIEZYX0JPT0wJCQkJU2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfQk9PTCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpOwogCi0gICAgaW50CQkJCQlTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkcywgYm9vbCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CisgICAgaW50CQkJCQlTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkcywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CiAKICAgICBGWF9GSUxFU0laRQkJCUZpbmRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKIApAQCAtMjgyLDI3ICsyODIsMjcgQEAKICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IHBDcnlwdG9IYW5kbGVyOwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNFbmNyeXB0ZWQoKQorICAgIEZYX0JPT0wJCQkJSXNFbmNyeXB0ZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcENyeXB0b0hhbmRsZXIgIT0gTlVMTDsKICAgICB9CiAKLSAgICBib29sCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgICBGWF9CT09MCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKIAotICAgIGJvb2wJCQkJUmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpOworICAgIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcik7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcik7CiBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIGNvbnN0IGludCBrUGFyc2VyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKICAgICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOwogCi0gICAgdmlydHVhbCBib29sCQkJCUdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0TmV4dENoYXIodWludDhfdCYgY2gpOwogCi0gICAgYm9vbAkJCQlHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgICBGWF9CT09MCQkJCUdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOwogCiAgICAgdm9pZAkJCQlHZXROZXh0V29yZCgpOwogCi0gICAgYm9vbAkJCQlJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIGNvbnN0IHVpbnQ4X3QqIHRhZywgRlhfRFdPUkQgdGFnbGVuKTsKKyAgICBGWF9CT09MCQkJCUlzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRTdHJpbmcoKTsKIApAQCAtMzEyLDcgKzMxMiw3IEBACiAKICAgICBGWF9GSUxFU0laRQkJCW1fUG9zOwogCi0gICAgYm9vbAkJCQltX2JGaWxlU3RyZWFtOworICAgIEZYX0JPT0wJCQkJbV9iRmlsZVN0cmVhbTsKIAogICAgIGludAkJCQkJbV9NZXRhZGF0YU9iam51bTsKIApAQCAtMzM0LDcgKzMzNCw3IEBACiAKICAgICBGWF9EV09SRAkJCW1fV29yZFNpemU7CiAKLSAgICBib29sCQkJCW1fYklzTnVtYmVyOworICAgIEZYX0JPT0wJCQkJbV9iSXNOdW1iZXI7CiAKICAgICBGWF9GSUxFU0laRQkJCW1fZHdXb3JkUG9zOwogICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYXJzZXI7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICNkZWZpbmUgUERGUEFSU0VfTk9TVFJFQU0JMgogc3RydWN0IFBBUlNFX0NPTlRFWFQgewogCi0gICAgYm9vbAkJbV9GbGFnczsKKyAgICBGWF9CT09MCQltX0ZsYWdzOwogCiAgICAgRlhfRklMRVNJWkUJbV9EaWN0U3RhcnQ7CiAKQEAgLTM2OSwxNSArMzY5LDE1IEBACiAgICAgQ1BERl9QYXJzZXIoKTsKICAgICB+Q1BERl9QYXJzZXIoKTsKIAotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlKTsKLSAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBib29sIGJSZVBhcnNlID0gZmFsc2UpOwotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBib29sIGJSZVBhcnNlID0gZmFsc2UsIGJvb2wgYk93bkZpbGVSZWFkID0gdHJ1ZSk7CisgICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CisgICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSwgRlhfQk9PTCBiT3duRmlsZVJlYWQgPSBUUlVFKTsKIAotICAgIHZvaWQJCQkJQ2xvc2VQYXJzZXIoYm9vbCBiUmVQYXJzZSA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCUNsb3NlUGFyc2VyKEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CiAKLSAgICBGWF9EV09SRAlHZXRQZXJtaXNzaW9ucyhib29sIGJDaGVja1JldmlzaW9uID0gZmFsc2UpOworICAgIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSk7CiAKLSAgICBib29sCQlJc093bmVyKCk7CisgICAgRlhfQk9PTAkJSXNPd25lcigpOwogCiAgICAgdm9pZAkJCQlTZXRQYXNzd29yZChjb25zdCBGWF9DSEFSKiBwYXNzd29yZCkKICAgICB7CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fcENyeXB0b0hhbmRsZXI7CiAgICAgfQogCi0gICAgdm9pZAkJCQlTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIGJvb2wgYkZvcmNlZCA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCVNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgRlhfQk9PTCBiRm9yY2VkID0gRkFMU0UpOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFJlY2lwaWVudCgpCiAgICAgewpAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgIHJldHVybiBtX3BFbmNyeXB0RGljdDsKICAgICB9CiAKLSAgICBib29sCQkJCUlzRW5jcnlwdGVkKCkKKyAgICBGWF9CT09MCQkJCUlzRW5jcnlwdGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBHZXRFbmNyeXB0RGljdCgpICE9IE5VTEw7CiAgICAgfQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAKICAgICBDUERGX09iamVjdCoJCVBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCkgOwogICAgIEZYX0RXT1JECQkJR2V0TGFzdE9iak51bSgpOwotICAgIGJvb2wJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pOworICAgIEZYX0JPT0wJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pOwogCiAgICAgRlhfRklMRVNJWkUJCQlHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKTsKIApAQCAtNDU2LDEyICs0NTYsMTIgQEAKIAogICAgIHZvaWQJCQkJR2V0SW5kaXJlY3RCaW5hcnkoRlhfRFdPUkQgb2JqbnVtLCB1aW50OF90KiYgcEJ1ZmZlciwgRlhfRFdPUkQmIHNpemUpOwogCi0gICAgYm9vbAkJCQlHZXRGaWxlU3RyZWFtT3B0aW9uKCkKKyAgICBGWF9CT09MCQkJCUdldEZpbGVTdHJlYW1PcHRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fYkZpbGVTdHJlYW07CiAgICAgfQogCi0gICAgdm9pZAkJCQlTZXRGaWxlU3RyZWFtT3B0aW9uKGJvb2wgYikKKyAgICB2b2lkCQkJCVNldEZpbGVTdHJlYW1PcHRpb24oRlhfQk9PTCBiKQogICAgIHsKICAgICAgICAgbV9TeW50YXgubV9iRmlsZVN0cmVhbSA9IGI7CiAgICAgfQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgICAgIHJldHVybiBtX0ZpbGVWZXJzaW9uOwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNYUmVmU3RyZWFtKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCUlzWFJlZlN0cmVhbSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iWFJlZlN0cmVhbTsKICAgICB9CkBAIC00ODYsNyArNDg2LDcgQEAKICAgICBDUERGX09iamVjdCoJCVBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0sCiAgICAgICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIEZYX0ZJTEVTSVpFICpwUmVzdWx0UG9zKTsKIAotICAgIEZYX0RXT1JECQkJU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlLCBib29sIGJPd25GaWxlUmVhZCA9IHRydWUpOworICAgIEZYX0RXT1JECQkJU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLCBGWF9CT09MIGJPd25GaWxlUmVhZCA9IFRSVUUpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRGaXJzdFBhZ2VObygpCiAgICAgewpAQCAtNDk2LDMwICs0OTYsMzAgQEAKICAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CiAKICAgICBDUERGX1N5bnRheFBhcnNlcgltX1N5bnRheDsKLSAgICBib29sCQkJCW1fYk93bkZpbGVSZWFkOworICAgIEZYX0JPT0wJCQkJbV9iT3duRmlsZVJlYWQ7CiAgICAgQ1BERl9PYmplY3QqCQlQYXJzZURpcmVjdChDUERGX09iamVjdCogcE9iaik7CiAKLSAgICBib29sCQkJCUxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CisgICAgRlhfQk9PTAkJCQlMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MpOwogCi0gICAgYm9vbAkJCQlMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MpOworICAgIEZYX0JPT0wJCQkJTG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIGJvb2wJCQkJTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIGJvb2wgYlNraXAsIGJvb2wgYkZpcnN0KTsKKyAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUgc3RyZWFtcG9zLCBGWF9CT09MIGJTa2lwLCBGWF9CT09MIGJGaXJzdCk7CiAKLSAgICBib29sCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIGJvb2wgYk1haW5YUmVmKTsKKyAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKTsKIAogICAgIENQREZfRGljdGlvbmFyeSoJTG9hZFRyYWlsZXJWNCgpOwogCi0gICAgYm9vbAkJCQlSZWJ1aWxkQ3Jvc3NSZWYoKTsKKyAgICBGWF9CT09MCQkJCVJlYnVpbGRDcm9zc1JlZigpOwogCiAgICAgRlhfRFdPUkQJCQlTZXRFbmNyeXB0SGFuZGxlcigpOwogCiAgICAgdm9pZAkJCQlSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKIAotICAgIGJvb2wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKIAotICAgIGJvb2wJCQkJTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKIAotICAgIGJvb2wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CisgICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAogICAgIEZYX0RXT1JECQkJTG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7CiAKQEAgLTUyNyw3ICs1MjcsNyBAQAogCiAgICAgQ1BERl9TdHJlYW1BY2MqCQlHZXRPYmplY3RTdHJlYW0oRlhfRFdPUkQgbnVtYmVyKTsKIAotICAgIGJvb2wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOworICAgIEZYX0JPT0wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOwogCiAKIApAQCAtNTQwLDEyICs1NDAsMTIgQEAKIAogICAgIEZYX0ZJTEVTSVpFCQkJbV9MYXN0WFJlZk9mZnNldDsKIAotICAgIGJvb2wJCQkJbV9iWFJlZlN0cmVhbTsKKyAgICBGWF9CT09MCQkJCW1fYlhSZWZTdHJlYW07CiAKIAogICAgIENQREZfU2VjdXJpdHlIYW5kbGVyKgltX3BTZWN1cml0eUhhbmRsZXI7CiAKLSAgICBib29sCQkJCQltX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcjsKKyAgICBGWF9CT09MCQkJCQltX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcjsKIAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9ic1JlY2lwaWVudDsKIApAQCAtNTYyLDcgKzU2Miw3IEBACiAgICAgQ0ZYX1dvcmRBcnJheQkJbV9PYmpWZXJzaW9uOwogICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfRGljdGlvbmFyeSAqPgltX1RyYWlsZXJzOwogCi0gICAgYm9vbAkJCQltX2JWZXJzaW9uVXBkYXRlZDsKKyAgICBGWF9CT09MCQkJCW1fYlZlcnNpb25VcGRhdGVkOwogCiAgICAgQ1BERl9PYmplY3QqCQltX3BMaW5lYXJpemVkOwogCkBAIC01ODIsMTcgKzU4MiwxNyBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9TZWN1cml0eUhhbmRsZXIoKSB7fQogCi0gICAgdmlydHVhbCBib29sCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlJc093bmVyKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNPd25lcigpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbikgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbikgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlJc01ldGFkYXRhRW5jcnlwdGVkKCkKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCkgPSAwOwpAQCAtNjA5LDE0ICs2MDksMTQgQEAKICAgICBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CiAKICAgICB2aXJ0dWFsIH5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7Ci0gICAgdmlydHVhbCBib29sCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoKTsKLSAgICB2aXJ0dWFsIGJvb2wJCUlzT3duZXIoKQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNPd25lcigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iT3duZXI7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBjb25zdCB1aW50OF90KiYgYnVmZmVyLCBpbnQmIGtleWxlbik7Ci0gICAgdmlydHVhbCBib29sCQlJc01ldGFkYXRhRW5jcnlwdGVkKCk7CisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKTsKICAgICB2aXJ0dWFsIENQREZfQ3J5cHRvSGFuZGxlcioJQ3JlYXRlQ3J5cHRvSGFuZGxlcigpOwogICAgIHZpcnR1YWwgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciogR2V0U3RhbmRhcmRIYW5kbGVyKCkKICAgICB7CkBAIC02NDEsOCArNjQxLDggQEAKICAgICAgICAgcmV0dXJuIG1fUmV2aXNpb247CiAgICAgfQogCi0gICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXkpOwotICAgIGludAkJCQkJQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBib29sIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQga2V5X2xlbik7CisgICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpOworICAgIGludAkJCQkJQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQga2V5X2xlbik7CiBwcml2YXRlOgogCiAgICAgaW50CQkJCQltX1ZlcnNpb247CkBAIC02NTMsMjIgKzY1MywyMiBAQAogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKIAotICAgIGJvb2wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwotICAgIGJvb2wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOworICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOworICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOwogCi0gICAgYm9vbAkJCQlDaGVja1VzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSWdub3JlRW5jcnlwdE1ldGEsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKTsKKyAgICBGWF9CT09MCQkJCUNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOwogCi0gICAgYm9vbAkJCQlDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOwotICAgIGJvb2wJCQkJQUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXkpOwotICAgIHZvaWQJCQkJQUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiT3duZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSk7Ci0gICAgdm9pZAkJCQlBRVMyNTZfU2V0UGVybXMoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHBlcm1pc3Npb24sIGJvb2wgYkVuY3J5cHRNZXRhZGF0YSwgY29uc3QgdWludDhfdCoga2V5KTsKKyAgICBGWF9CT09MCQkJCUNoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbik7CisgICAgRlhfQk9PTAkJCQlBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7CisgICAgdm9pZAkJCQlBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KTsKKyAgICB2b2lkCQkJCUFFUzI1Nl9TZXRQZXJtcyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgcGVybWlzc2lvbiwgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpOwogICAgIHZvaWQJCQkJT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBib29sIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKTsKLSAgICBib29sCQkJCUNoZWNrU2VjdXJpdHkoaW50MzJfdCBrZXlfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpOworICAgIEZYX0JPT0wJCQkJQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOwogCi0gICAgYm9vbAkJCQltX2JPd25lcjsKKyAgICBGWF9CT09MCQkJCW1fYk93bmVyOwogCiAgICAgRlhfRFdPUkQJCQltX1Blcm1pc3Npb25zOwogCkBAIC02ODQsMjAgKzY4NCwyMCBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9DcnlwdG9IYW5kbGVyKCkge30KIAotICAgIHZpcnR1YWwgYm9vbAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECURlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQqCURlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOwogCiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUVuY3J5cHRHZXRTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJRW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwogCiAgICAgdm9pZAkJCQlEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CkBAIC03MTAsMjIgKzcxMCwyMiBAQAogCiAgICAgdmlydHVhbCB+Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKTsKIAotICAgIGJvb2wJCQkJSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOwotICAgIHZpcnR1YWwgYm9vbAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOworICAgIEZYX0JPT0wJCQkJSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOworICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJRGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpOwogICAgIHZpcnR1YWwgdm9pZCoJRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKTsKLSAgICB2aXJ0dWFsIGJvb2wJCURlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIGJvb2wJCURlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCBGWF9EV09SRAlFbmNyeXB0R2V0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIGJvb2wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBGWF9CT09MCQlFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogcHJvdGVjdGVkOgogCi0gICAgdmlydHVhbCB2b2lkCQlDcnlwdEJsb2NrKGJvb2wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIHZvaWQJCUNyeXB0QmxvY2soRlhfQk9PTCBiRW5jcnlwdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkKglDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBib29sIGJFbmNyeXB0KTsKLSAgICB2aXJ0dWFsIGJvb2wJCUNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCk7Ci0gICAgdmlydHVhbCBib29sCQlDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCk7CisgICAgdmlydHVhbCB2b2lkKglDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBGWF9CT09MIGJFbmNyeXB0KTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCk7CisgICAgdmlydHVhbCBGWF9CT09MCQlDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCk7CiAKICAgICB1aW50OF90CQkJCW1fRW5jcnlwdEtleVszMl07CiAKQEAgLTc1NSw3ICs3NTUsNyBAQAogQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgYm9vbCBiSGV4ID0gZmFsc2UpOworQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXggPSBGQUxTRSk7CiBDRlhfV2lkZVN0cmluZyBQREZfRGVjb2RlVGV4dChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7CiBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKICAgICByZXR1cm4gUERGX0RlY29kZVRleHQoKGNvbnN0IHVpbnQ4X3QqKWJzdHIuY19zdHIoKSwgYnN0ci5HZXRMZW5ndGgoKSwgcENoYXJNYXApOwpAQCAtNzY5LDEyICs3NjksMTIgQEAKIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogQ3JlYXRlTmV3RG9jKCk7Ci0gICAgc3RhdGljIENGREZfRG9jdW1lbnQqIFBhcnNlRmlsZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJPd25GaWxlID0gZmFsc2UpOworICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSA9IEZBTFNFKTsKICAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogCiAgICAgfkNGREZfRG9jdW1lbnQoKTsKIAotICAgIGJvb2wJCQkJCVdyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3Q7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRSb290KCkgY29uc3QKICAgICB7CkBAIC03ODUsMTAgKzc4NSwxMCBAQAogcHJvdGVjdGVkOgogCiAgICAgQ0ZERl9Eb2N1bWVudCgpOwotICAgIHZvaWQJUGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiT3duRmlsZSk7CisgICAgdm9pZAlQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJPd25GaWxlKTsKICAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BSb290RGljdDsKICAgICBJRlhfRmlsZVJlYWQqCQkJbV9wRmlsZTsKLSAgICBib29sCQkJCQltX2JPd25GaWxlOworICAgIEZYX0JPT0wJCQkJCW1fYk93bkZpbGU7CiB9OwogCiBDRlhfV2lkZVN0cmluZwlGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChjb25zdCBDUERGX09iamVjdCogcEZpbGVTcGVjKTsKQEAgLTgxNiw3ICs4MTYsNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWF9GaWxlQXZhaWwoKSB7IH0KLSAgICB2aXJ0dWFsIGJvb2wJCQlJc0RhdGFBdmFpbCggRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOwogfTsKIGNsYXNzIElGWF9Eb3dubG9hZEhpbnRzCiB7CkBAIC04MzksMTAgKzgzOSwxMCBAQAogICAgIElGWF9GaWxlQXZhaWwqIEdldEZpbGVBdmFpbCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZpbGVBdmFpbDsgfQogICAgIElGWF9GaWxlUmVhZCogR2V0RmlsZVJlYWQoKSBjb25zdCB7IHJldHVybiBtX3BGaWxlUmVhZDsgfQogCi0gICAgdmlydHVhbCBib29sCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJU2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJCUlzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJCUlzTGluZWFyaXplZCgpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0xpbmVhcml6ZWQoKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90CQlJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90CQlJc0xpbmVhcml6ZWRQREYoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJCUdldExpbmVhcml6ZWRNYWluWFJlZkluZm8oRlhfRklMRVNJWkUgKnBQb3MsIEZYX0RXT1JEICpwU2l6ZSkgPSAwOwpAQCAtODU5LDcgKzg1OSw3IEBACiAKICAgICB2b2lkIEFkZE9iak51bShGWF9EV09SRCBkd09iak51bSk7CiAKLSAgICBib29sIEZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pOworICAgIEZYX0JPT0wgRmluZChGWF9EV09SRCBkd09iak51bSk7CiAKICAgICB2b2lkIFJlbW92ZUFsbCgpCiAgICAgewpAQCAtODY3LDcgKzg2Nyw3IEBACiAgICAgfQogcHJvdGVjdGVkOgogCi0gICAgYm9vbCBCaW5hcnlTZWFyY2goRlhfRFdPUkQgdmFsdWUsIGludCAmaU5leHQpOworICAgIEZYX0JPT0wgQmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQgJmlOZXh0KTsKIHByb3RlY3RlZDoKIAogICAgIENGWF9EV29yZEFycmF5CQkJbV9udW1iZXJfYXJyYXk7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaAppbmRleCAzN2U4YTU0Li5mMzU5MDA5IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgKQEAgLTMzLDkgKzMzLDkgQEAKIAogICAgIHZpcnR1YWwgfklQREZfT0NDb250ZXh0KCkge30KIAotICAgIHZpcnR1YWwgYm9vbAlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKIAotICAgIGJvb2wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CisgICAgRlhfQk9PTCBDaGVja09iamVjdFZpc2libGUoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKIH07CiAjZGVmaW5lIFJFTkRFUl9DT0xPUl9OT1JNQUwJCTAKICNkZWZpbmUgUkVOREVSX0NPTE9SX0dSQVkJCTEKQEAgLTg5LDEwICs4OSwxMCBAQAogCiAgICAgQ1BERl9SZW5kZXJDb250ZXh0KCk7CiAKLSAgICB2b2lkCQkJQ3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIGJvb2wgYkZpcnN0TGF5ZXIgPSB0cnVlKTsKKyAgICB2b2lkCQkJQ3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIgPSBUUlVFKTsKIAogICAgIHZvaWQJCQlDcmVhdGUoQ1BERl9Eb2N1bWVudCogcERvYyA9IE5VTEwsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPSBOVUxMLCBib29sIGJGaXJzdExheWVyID0gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gTlVMTCwgRlhfQk9PTCBiRmlyc3RMYXllciA9IFRSVUUpOwogCiAgICAgfkNQREZfUmVuZGVyQ29udGV4dCgpOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAogICAgIENGWF9BcnJheVRlbXBsYXRlPHN0cnVjdCBfUERGX1JlbmRlckl0ZW0+CW1fQ29udGVudExpc3Q7CiAKLSAgICBib29sCQkJCQltX2JGaXJzdExheWVyOworICAgIEZYX0JPT0wJCQkJCW1fYkZpcnN0TGF5ZXI7CiAKICAgICB2b2lkCQkJUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpOwpAQCAtMTkyLDE3ICsxOTIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgc3RhdGljIGJvb2wJRHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgc3RhdGljIEZYX0JPT0wJRHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCwgaW50IG5GbGFnID0gMCk7CiAKLSAgICBzdGF0aWMgYm9vbAlEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgIHN0YXRpYyBGWF9CT09MCURyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLSAgICBzdGF0aWMgYm9vbAlEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgc3RhdGljIEZYX0JPT0wJRHJhd1R5cGUzVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiKTsKIH07CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgICAgbV9uVGltZUNvdW50ID0gMDsKICAgICAgICAgbV9uQ2FjaGVTaXplID0gMDsKICAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZSA9IE5VTEw7Ci0gICAgICAgIG1fYkN1ckZpbmRDYWNoZSA9IGZhbHNlOworICAgICAgICBtX2JDdXJGaW5kQ2FjaGUgPSBGQUxTRTsKICAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZXMgPSBOVUxMOwogICAgIH0KICAgICB+Q1BERl9QYWdlUmVuZGVyQ2FjaGUoKQpAQCAtMjM4LDcgKzIzOCw3IEBACiAgICAgfQogCiAgICAgdm9pZAkJCQlHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCA9IDApOwogCiAgICAgdm9pZAkJCQlSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKQEAgLTI0OSwxMSArMjQ5LDExIEBACiAgICAgfQogICAgIENGWF9NYXBQdHJUb1B0cgkJbV9JbWFnZUNhY2hlczsKIHB1YmxpYzoKLSAgICBib29sCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCi0gICAgICAgICAgICBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgRlhfQk9PTAkJCQlTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAogICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIGJvb2wJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIENQREZfSW1hZ2VDYWNoZSoJbV9wQ3VySW1hZ2VDYWNoZTsKICAgICBDRlhfUHRyQXJyYXkqICAgICAgIG1fcEN1ckltYWdlQ2FjaGVzOwogcHJvdGVjdGVkOgpAQCAtMjYyLDcgKzI2Miw3IEBACiAKICAgICBGWF9EV09SRAkJCW1fblRpbWVDb3VudDsKICAgICBGWF9EV09SRAkJCW1fbkNhY2hlU2l6ZTsKLSAgICBib29sCQkJCW1fYkN1ckZpbmRDYWNoZTsKKyAgICBGWF9CT09MCQkJCW1fYkN1ckZpbmRDYWNoZTsKIH07CiBjbGFzcyBDUERGX1JlbmRlckNvbmZpZwogewpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oCmluZGV4IGM2MDczN2QuLjVjOGNjODUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICByZXR1cm4gbV9GbGFnczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlJc1ZlcnRXcml0aW5nKCljb25zdDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1ZlcnRXcml0aW5nKCljb25zdDsKIAogCiAKQEAgLTE0MiwxNCArMTQyLDE0IEBACiAgICAgfQogCiAKLSAgICBib29sCQkJCQlJc0VtYmVkZGVkKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJc0VtYmVkZGVkKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFlQRTMgfHwgbV9wRm9udEZpbGUgIT0gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENQREZfU3RyZWFtQWNjKgkJCUdldEZvbnRGaWxlKCkgY29uc3QKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICByZXR1cm4gbV9wRm9udERpY3Q7CiAgICAgfQogCi0gICAgYm9vbAkJCQkJSXNTdGFuZGFyZEZvbnQoKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlJc1N0YW5kYXJkRm9udCgpIGNvbnN0OwogCiAgICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAogICAgIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAKIAotICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBib29sICpwVmVydEdseXBoID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MICpwVmVydEdseXBoID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKQogICAgIHsKICAgICAgICAgcmV0dXJuIEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKQEAgLTI2NSwxMSArMjY1LDExIEBACiBwcm90ZWN0ZWQ6CiAgICAgZXhwbGljaXQgQ1BERl9Gb250KGludCBmb250dHlwZSk7CiAKLSAgICBib29sCQkJCQlJbml0aWFsaXplKCk7CisgICAgRlhfQk9PTAkJCQkJSW5pdGlhbGl6ZSgpOwogCi0gICAgYm9vbAkJCQkJTG9hZCgpOworICAgIEZYX0JPT0wJCQkJCUxvYWQoKTsKIAotICAgIHZpcnR1YWwgYm9vbAkJCV9Mb2FkKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCkgPSAwOwogCiAgICAgdmlydHVhbCBGWF9XQ0hBUgkJX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0ID0gMDsKIApAQCAtMjc4LDcgKzI3OCw3IEBACiAgICAgdm9pZAkJCQkJTG9hZFVuaWNvZGVNYXAoKTsKIAogICAgIHZvaWQJCQkJCUxvYWRQREZFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nLCBpbnQmIGlCYXNlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiYgcENoYXJOYW1lcywgYm9vbCBiRW1iZWRkZWQsIGJvb2wgYlRydWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLCBGWF9CT09MIGJFbWJlZGRlZCwgRlhfQk9PTCBiVHJ1ZVR5cGUpOwogCiAgICAgdm9pZAkJCQkJTG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSopOwogCkBAIC0yOTgsNyArMjk4LDcgQEAKIAogICAgIENQREZfVG9Vbmljb2RlTWFwKgkJbV9wVG9Vbmljb2RlTWFwOwogCi0gICAgYm9vbAkJCQkJbV9iVG9Vbmljb2RlTG9hZGVkOworICAgIEZYX0JPT0wJCQkJCW1fYlRvVW5pY29kZUxvYWRlZDsKIAogCiAKQEAgLTMzOCw3ICszMzgsNyBAQAogCiAgICAgdm9pZAkJCQkJTG9hZEVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcpOwogCi0gICAgYm9vbAkJCQkJSXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0OwogCiAgICAgRlhfV0NIQVIJCQkJVW5pY29kZUZyb21DaGFyQ29kZSh1aW50OF90IGNoYXJjb2RlKSBjb25zdAogICAgIHsKQEAgLTM3MCwxMSArMzcwLDExIEBACiAgICAgfQogICAgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKICAgICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKLSAgICBib29sIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKKyAgICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgotICAgIGJvb2wgTG9hZENvbW1vbigpOworICAgIEZYX0JPT0wgTG9hZENvbW1vbigpOwogCiAgICAgdm9pZCBMb2FkU3Vic3RGb250KCk7CiAKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgIGludCBtX0Jhc2VFbmNvZGluZzsKICAgICBGWF9XT1JEIG1fQ2hhcldpZHRoWzI1Nl07CiAgICAgRlhfU01BTExfUkVDVCBtX0NoYXJCQm94WzI1Nl07Ci0gICAgYm9vbCBtX2JVc2VGb250V2lkdGg7CisgICAgRlhfQk9PTCBtX2JVc2VGb250V2lkdGg7CiB9OwogCiBjbGFzcyBDUERGX1R5cGUxRm9udCA6IHB1YmxpYyBDUERGX1NpbXBsZUZvbnQKQEAgLTQxNiw3ICs0MTYsNyBAQAogICAgIH0KICAgICB2aXJ0dWFsIGludAkJCQlHbHlwaEZyb21DaGFyQ29kZUV4dChGWF9EV09SRCBjaGFyY29kZSk7CiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sCQkJX0xvYWQoKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlfTG9hZCgpOwogCiAgICAgaW50CQkJCQkJbV9CYXNlMTRGb250OwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRHbHlwaE1hcCgpOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAKICAgICBDUERGX1RydWVUeXBlRm9udCgpOwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbAkJCV9Mb2FkKCk7CisgICAgdmlydHVhbCBGWF9CT09MCQkJX0xvYWQoKTsKICAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkR2x5cGhNYXAoKTsKIH07CiBjbGFzcyBDUERGX1R5cGUzQ2hhcgpAQCAtNDM4LDExICs0MzgsMTEgQEAKIAogICAgIH5DUERGX1R5cGUzQ2hhcigpOwogCi0gICAgYm9vbCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOworICAgIEZYX0JPT0wgTG9hZEJpdG1hcChDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0KTsKIAotICAgIGJvb2wJCQkJCW1fYkNvbG9yZWQ7CisgICAgRlhfQk9PTAkJCQkJbV9iQ29sb3JlZDsKIAotICAgIGJvb2wJCQkJCW1fYlBhZ2VSZXF1aXJlZDsKKyAgICBGWF9CT09MCQkJCQltX2JQYWdlUmVxdWlyZWQ7CiAKIAogCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICBDRlhfQWZmaW5lTWF0cml4IG1fRm9udE1hdHJpeDsKIAogcHJpdmF0ZToKLSAgICBib29sIF9Mb2FkKCkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBfTG9hZCgpIG92ZXJyaWRlOwogICAgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGUge30KIAogICAgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKQEAgLTUxMSwxMyArNTExLDEzIEBACiAKICAgICB+Q1BERl9DSURGb250KCkgb3ZlcnJpZGU7CiAKLSAgICBib29sIExvYWRHQjIzMTIoKTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKKyAgICBGWF9CT09MIExvYWRHQjIzMTIoKTsKKyAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKICAgICBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CiAgICAgRlhfV09SRCBDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwogCi0gICAgYm9vbCBJc1RydWVUeXBlKCkgY29uc3QKKyAgICBGWF9CT09MIElzVHJ1ZVR5cGUoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuICFtX2JUeXBlMTsKICAgICB9CkBAIC01MzMsMTkgKzUzMywxOSBAQAogICAgIH0KIAogICAgIGNvbnN0IHVpbnQ4X3QqIEdldENJRFRyYW5zZm9ybShGWF9XT1JEIENJRCkgY29uc3Q7Ci0gICAgYm9vbCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc2hvcnQgR2V0VmVydFdpZHRoKEZYX1dPUkQgQ0lEKSBjb25zdDsKICAgICB2b2lkIEdldFZlcnRPcmlnaW4oRlhfV09SRCBDSUQsIHNob3J0JiB2eCwgc2hvcnQmIHZ5KSBjb25zdDsKLSAgICBib29sIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgSXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICAgIEZYX0JPT0wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgRlhfQk9PTCBJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb250OwogCi0gICAgYm9vbCBfTG9hZCgpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgX0xvYWQoKSBvdmVycmlkZTsKICAgICBGWF9XQ0hBUiBfVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgRlhfRFdPUkQgX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgaW50IEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIGJvb2wgKnBWZXJ0R2x5cGgpOworICAgIGludCBHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGViLCBGWF9CT09MICpwVmVydEdseXBoKTsKICAgICB2b2lkIExvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LCBDRlhfRFdvcmRBcnJheSYgcmVzdWx0LCBpbnQgbkVsZW1lbnRzKTsKICAgICB2b2lkIExvYWRTdWJzdEZvbnQoKTsKIApAQCAtNTUzLDkgKzU1Myw5IEBACiAgICAgQ1BERl9DTWFwKiBtX3BBbGxvY2F0ZWRDTWFwOwogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIG1fcENJRDJVbmljb2RlTWFwOwogICAgIGludCBtX0NoYXJzZXQ7Ci0gICAgYm9vbCBtX2JUeXBlMTsKKyAgICBGWF9CT09MIG1fYlR5cGUxOwogICAgIENQREZfU3RyZWFtQWNjKiBtX3BDSURUb0dJRE1hcDsKLSAgICBib29sIG1fYkNJRElzR0lEOworICAgIEZYX0JPT0wgbV9iQ0lESXNHSUQ7CiAgICAgRlhfV09SRCBtX0RlZmF1bHRXaWR0aDsKICAgICBGWF9XT1JEKiBtX3BBbnNpV2lkdGhzOwogICAgIEZYX1NNQUxMX1JFQ1QgbV9DaGFyQkJveFsyNTZdOwpAQCAtNTYzLDcgKzU2Myw3IEBACiAgICAgc2hvcnQgbV9EZWZhdWx0Vlk7CiAgICAgc2hvcnQgbV9EZWZhdWx0VzE7CiAgICAgQ0ZYX0RXb3JkQXJyYXkgbV9WZXJ0TWV0cmljczsKLSAgICBib29sIG1fYkFkb2JlQ291cmllclN0ZDsKKyAgICBGWF9CT09MIG1fYkFkb2JlQ291cmllclN0ZDsKICAgICBDRlhfQ1RUR1NVQlRhYmxlKiBtX3BUVEdTVUJUYWJsZTsKIH07CiAKQEAgLTYxMiwyNyArNjEyLDI3IEBACiAgICAgICAgIG1heCA9IDEuMGY7CiAgICAgfQogCi0gICAgYm9vbAkJCQkJc1JHQigpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCXNSR0IoKSBjb25zdDsKIAogCiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKIAogCiAKLSAgICBib29sCQkJCQlHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0OwogCi0gICAgYm9vbAkJCQkJU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3Q7CiAKIAogICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywKLSAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrID0gZmFsc2UpIGNvbnN0OworICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Q7CiAKICAgICBDUERGX0FycmF5KiYJCQlHZXRBcnJheSgpCiAgICAgewpAQCAtNjQ2LDcgKzY0Niw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZAkJCUVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCk7CisgICAgdmlydHVhbCB2b2lkCQkJRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKTsKIAogICAgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwogCkBAIC02NTksMTcgKzY1OSwxNyBAQAogICAgICAgICAgIG1fZHdTdGRDb252ZXJzaW9uKDApIHsKICAgICB9CiAgICAgdmlydHVhbCB+Q1BERl9Db2xvclNwYWNlKCkge30KLSAgICB2aXJ0dWFsIGJvb2wJCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCXZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0CisgICAgdmlydHVhbCBGWF9CT09MCQkJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQl2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CisgICAgdmlydHVhbCBGWF9CT09MCQkJdl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50CQkJCQkJbV9GYW1pbHk7CkBAIC02OTIsMTQgKzY5MiwxNCBAQAogCiAgICAgfkNQREZfQ29sb3IoKTsKIAotICAgIGJvb2wJCQkJCUlzTnVsbCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSXNOdWxsKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BCdWZmZXIgPT0gTlVMTDsKICAgICB9CiAKLSAgICBib29sCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKIAotICAgIGJvb2wJCQkJCUlzUGF0dGVybigpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSXNQYXR0ZXJuKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BDUyAmJiBtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTjsKICAgICB9CkBAIC03MTIsNyArNzEyLDcgQEAKIAogICAgIHZvaWQJCQkJCVNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBjb21wLCBpbnQgbmNvbXBzKTsKIAotICAgIGJvb2wJCQkJCUdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3Q7CiAKICAgICBDUERGX1BhdHRlcm4qCQkJR2V0UGF0dGVybigpIGNvbnN0OwogCkBAIC03MzQsNyArNzM0LDcgQEAKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgfkNQREZfUGF0dGVybigpOwotICAgIHZvaWQgICAgU2V0Rm9yY2VDbGVhcihib29sIGJGb3JjZUNsZWFyKSB7IG1fYkZvcmNlQ2xlYXIgPSBiRm9yY2VDbGVhcjsgfQorICAgIHZvaWQgICAgU2V0Rm9yY2VDbGVhcihGWF9CT09MIGJGb3JjZUNsZWFyKSB7IG1fYkZvcmNlQ2xlYXIgPSBiRm9yY2VDbGVhcjsgfQogCiAgICAgQ1BERl9PYmplY3QqICAgICAgICAgICAgICAgIG1fcFBhdHRlcm5PYmo7CiAKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQ1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpOwotICAgIGJvb2wgICAgIG1fYkZvcmNlQ2xlYXI7CisgICAgRlhfQk9PTCAgICAgbV9iRm9yY2VDbGVhcjsKIH07CiAKIGNsYXNzIENQREZfVGlsaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4KQEAgLTc1OCwxMSArNzU4LDExIEBACiAKICAgICB2aXJ0dWFsIH5DUERGX1RpbGluZ1BhdHRlcm4oKTsKIAotICAgIGJvb2wJCQkJTG9hZCgpOworICAgIEZYX0JPT0wJCQkJTG9hZCgpOwogCiAKIAotICAgIGJvb2wJCQkJbV9iQ29sb3JlZDsKKyAgICBGWF9CT09MCQkJCW1fYkNvbG9yZWQ7CiAKICAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7CiAKQEAgLTc3OCwxNyArNzc4LDE3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKKyAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKIAogICAgIHZpcnR1YWwgfkNQREZfU2hhZGluZ1BhdHRlcm4oKTsKIAogICAgIENQREZfT2JqZWN0KgkJbV9wU2hhZGluZ09iajsKIAotICAgIGJvb2wJCQkJbV9iU2hhZGluZ09iajsKKyAgICBGWF9CT09MCQkJCW1fYlNoYWRpbmdPYmo7CiAKLSAgICBib29sCQkJCUxvYWQoKTsKKyAgICBGWF9CT09MCQkJCUxvYWQoKTsKIAotICAgIGJvb2wJCQkJUmVsb2FkKCk7CisgICAgRlhfQk9PTAkJCQlSZWxvYWQoKTsKIAogICAgIGludAkJCQkJbV9TaGFkaW5nVHlwZTsKIApAQCAtODEwLDcgKzgxMCw3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBib29sCQkJCUxvYWQoQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUyk7CisgICAgRlhfQk9PTAkJCQlMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwogCiAgICAgRlhfRFdPUkQJCQlHZXRGbGFnKCk7CiAKQEAgLTgyMCw3ICs4MjAsNyBAQAogCiAgICAgRlhfRFdPUkQgCQkJR2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CiAKLSAgICBib29sCQkJCUdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwgaW50IGNvdW50LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CisgICAgRlhfQk9PTAkJCQlHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsIGludCBjb3VudCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApOwogICAgIENQREZfRnVuY3Rpb24qKgltX3BGdW5jczsKICAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENTOwogICAgIEZYX0RXT1JECQkJbV9uRnVuY3MsIG1fbkNvb3JkQml0cywgbV9uQ29tcEJpdHMsIG1fbkZsYWdCaXRzLCBtX25Db21wczsKQEAgLTg1NCwxMyArODU0LDEzIEBACiAKICAgICB+Q1BERl9JbWFnZSgpOwogCi0gICAgYm9vbAkJCQkJTG9hZEltYWdlRihDUERGX1N0cmVhbSogcEltYWdlU3RyZWFtLCBib29sIGJJbmxpbmUpOworICAgIEZYX0JPT0wJCQkJCUxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKTsKIAogICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKIAogICAgIENQREZfSW1hZ2UqCQkJCUNsb25lKCk7CiAKLSAgICBib29sCQkJCQlJc0lubGluZSgpCisgICAgRlhfQk9PTAkJCQkJSXNJbmxpbmUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYklubGluZTsKICAgICB9CkBAIC05MDgsMTcgKzkwOCwxNyBAQAogICAgIH0KIAogCi0gICAgYm9vbAkJCQkJSXNNYXNrKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJc01hc2soKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYklzTWFzazsKICAgICB9CiAKLSAgICBib29sCQkJCQlJc0ludGVycG9sKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCQlJc0ludGVycG9sKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JJbnRlcnBvbGF0ZTsKICAgICB9CiAKLSAgICBDRlhfRElCU291cmNlKgkJCUxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzayA9IE5VTEwsIEZYX0RXT1JEKiBwTWF0dGVDb2xvciA9IE5VTEwsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSkgY29uc3Q7CisgICAgQ0ZYX0RJQlNvdXJjZSoJCQlMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2sgPSBOVUxMLCBGWF9EV09SRCogcE1hdHRlQ29sb3IgPSBOVUxMLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpIGNvbnN0OwogCiAKIApAQCAtOTMxLDggKzkzMSw4IEBACiAgICAgdm9pZAkJCQkJUmVzZXRDYWNoZShDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7CiAKIHB1YmxpYzoKLSAgICBib29sCQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2UsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSk7Ci0gICAgYm9vbAkJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKKyAgICBGWF9CT09MCQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ0ZYX0RJQlNvdXJjZSoJCQlEZXRhY2hCaXRtYXAoKTsKICAgICBDRlhfRElCU291cmNlKgkJCURldGFjaE1hc2soKTsKICAgICBDRlhfRElCU291cmNlKgkJCW1fcERJQlNvdXJjZTsKQEAgLTk0MSwxNiArOTQxLDE2IEBACiBwcml2YXRlOgogCiAgICAgQ1BERl9TdHJlYW0qCQkJbV9wU3RyZWFtOwotICAgIGJvb2wJCQkJCW1fYklubGluZTsKKyAgICBGWF9CT09MCQkJCQltX2JJbmxpbmU7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wSW5saW5lRGljdDsKIAogICAgIGludDMyX3QJCQkJbV9IZWlnaHQ7CiAKICAgICBpbnQzMl90CQkJCW1fV2lkdGg7CiAKLSAgICBib29sCQkJCQltX2JJc01hc2s7CisgICAgRlhfQk9PTAkJCQkJbV9iSXNNYXNrOwogCi0gICAgYm9vbAkJCQkJbV9iSW50ZXJwb2xhdGU7CisgICAgRlhfQk9PTAkJCQkJbV9iSW50ZXJwb2xhdGU7CiAKICAgICBDUERGX0RvY3VtZW50KgkJCW1fcERvY3VtZW50OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaAppbmRleCAwNmNmMjEzLi4xODc3ZWY4IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgKQEAgLTExNywzNSArMTE3LDM1IEBACiAKICAgICB2b2lkCQkJCVJlbW92ZVNlY3VyaXR5KCk7CiAKLSAgICBib29sCQkJCUNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncyA9IDApOwogCi0gICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CiAKLSAgICBib29sCQkJCUNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncyA9IDApOworICAgIEZYX0JPT0wJCQkJQ3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CiAKICAgICBpbnQzMl90CQkJQ29udGludWUoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsKIAotICAgIGJvb2wJCQkJU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKKyAgICBGWF9CT09MCQkJCVNldEZpbGVWZXJzaW9uKGludDMyX3QgZmlsZVZlcnNpb24gPSAxNyk7CiBwcm90ZWN0ZWQ6CiAKICAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CiAKICAgICBDUERGX1BhcnNlcioJCW1fcFBhcnNlcjsKIAotICAgIGJvb2wJCQkJbV9iQ29tcHJlc3M7CisgICAgRlhfQk9PTAkJCQltX2JDb21wcmVzczsKIAotICAgIGJvb2wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOworICAgIEZYX0JPT0wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKICAgICBGWF9EV09SRAkJCW1fZHdFbnJ5cHRPYmpOdW07Ci0gICAgYm9vbAkJCQltX2JFbmNyeXB0Q2xvbmVkOworICAgIEZYX0JPT0wJCQkJbV9iRW5jcnlwdENsb25lZDsKIAotICAgIGJvb2wJCQkJbV9iU3RhbmRhcmRTZWN1cml0eTsKKyAgICBGWF9CT09MCQkJCW1fYlN0YW5kYXJkU2VjdXJpdHk7CiAKICAgICBDUERGX0NyeXB0b0hhbmRsZXIqCW1fcENyeXB0b0hhbmRsZXI7Ci0gICAgYm9vbAkJCQltX2JOZXdDcnlwdG87CisgICAgRlhfQk9PTAkJCQltX2JOZXdDcnlwdG87CiAKLSAgICBib29sCQkJCW1fYkVuY3J5cHRNZXRhZGF0YTsKKyAgICBGWF9CT09MCQkJCW1fYkVuY3J5cHRNZXRhZGF0YTsKIAogICAgIENQREZfT2JqZWN0KgkJbV9wTWV0YWRhdGE7CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgIGludDMyX3QJCQltX09iamVjdFN0cmVhbVNpemU7CiAKICAgICBGWF9EV09SRAkJCW1fZHdMYXN0T2JqTnVtOwotICAgIGJvb2wJCQkJQ3JlYXRlKEZYX0RXT1JEIGZsYWdzKTsKKyAgICBGWF9CT09MCQkJCUNyZWF0ZShGWF9EV09SRCBmbGFncyk7CiAgICAgdm9pZAkJCQlSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKICAgICB2b2lkCQkJCUNsZWFyKCk7CiAgICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UgKnBQYXVzZSk7CkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogICAgIHZvaWQJCQkJQXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSk7CiAgICAgaW50MzJfdAkJCVdyaXRlT2xkSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKTsKICAgICBpbnQzMl90CQkJV3JpdGVPbGRPYmpzKElGWF9QYXVzZSAqcFBhdXNlKTsKLSAgICBpbnQzMl90CQkJV3JpdGVOZXdPYmpzKGJvb2wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSk7CisgICAgaW50MzJfdAkJCVdyaXRlTmV3T2JqcyhGWF9CT09MIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlICpwUGF1c2UpOwogICAgIGludDMyX3QJCQlXcml0ZUluZGlyZWN0T2JqKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICBpbnQzMl90CQkJV3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgYm9vbCBiRW5jcnlwdCA9IHRydWUpOworICAgIGludDMyX3QJCQlXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJFbmNyeXB0ID0gVFJVRSk7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShGWF9EV09SRCBvYmpudW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7CiAgICAgaW50MzJfdAkJCUFwcGVuZE9iamVjdE51bWJlclRvWFJlZihGWF9EV09SRCBvYmpudW0pOwotICAgIHZvaWQJCQkJSW5pdElEKGJvb2wgYkRlZmF1bHQgPSB0cnVlKTsKKyAgICB2b2lkCQkJCUluaXRJRChGWF9CT09MIGJEZWZhdWx0ID0gVFJVRSk7CiAgICAgaW50MzJfdAkJCVdyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLCBGWF9EV09SRCBvYmpudW0sIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0byk7CiAKICAgICBpbnQzMl90CQkJbV9pU3RhZ2U7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgKaW5kZXggZWIwY2E0NC4uN2NmYWVkNCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgaW50MzJfdAkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7CiAKLSAgICBib29sCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CisgICAgRlhfQk9PTAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOwogCiAgICAgaW50MzJfdAkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKIHByaXZhdGU6CkBAIC03NiwyMCArNzYsMjAgQEAKIHsKIHB1YmxpYzoKIAotICAgIHN0YXRpYyBib29sCQkJCQkJCUdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgICBzdGF0aWMgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiAKLSAgICBzdGF0aWMgYm9vbAkJCQkJCQlHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgICBzdGF0aWMgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotICAgIHN0YXRpYyBib29sCQkJCQkJCUdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CisgICAgc3RhdGljIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAogICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yLAotICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBib29sIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQgPSAwLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIEZYX0JPT0wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCA9IDAsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVCb3JkZXJBUChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCiAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IENQVlRfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQVlRfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAogICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsIGNvbnN0IENQVlRfRGFzaCAmIGRhc2gpOwogCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSk7CisgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfQVBfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCmluZGV4IDM2ZDlkMjkuLmZjOWQzYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaApAQCAtMTY0LDI2ICsxNjQsMjYgQEAKICAgICAgICAgcmV0dXJuIG1fZVVzYWdlVHlwZTsKICAgICB9CiAKLSAgICBib29sCQkJQ2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOworICAgIEZYX0JPT0wJCQlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CiAKICAgICB2b2lkCQkJUmVzZXRPQ0NvbnRleHQoKTsKIHByb3RlY3RlZDoKIAotICAgIGJvb2wJCQlMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIGJvb2wgJmJWYWxpZENvbmZpZykgY29uc3Q7CisgICAgRlhfQk9PTAkJCUxvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgRlhfQk9PTCAmYlZhbGlkQ29uZmlnKSBjb25zdDsKIAotICAgIGJvb2wJCQlMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCkgY29uc3Q7CisgICAgRlhfQk9PTAkJCUxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdDsKIAotICAgIGJvb2wJCQlHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOworICAgIEZYX0JPT0wJCQlHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpOwogCi0gICAgYm9vbAkJCUdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBib29sIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsID0gMCk7CisgICAgRlhfQk9PTAkJCUdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBGWF9CT09MIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsID0gMCk7CiAKLSAgICBib29sCQkJTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgYm9vbCBiRnJvbUNvbmZpZyk7CisgICAgRlhfQk9PTAkJCUxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NNRERpY3QsIEZYX0JPT0wgYkZyb21Db25maWcpOwogCiAgICAgQ1BERl9Eb2N1bWVudAkJKm1fcERvY3VtZW50OwogCiAgICAgVXNhZ2VUeXBlCQkJbV9lVXNhZ2VUeXBlOwogCi0gICAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgYm9vbD4gbV9PQ0dTdGF0ZXM7CisgICAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgRlhfQk9PTD4gbV9PQ0dTdGF0ZXM7CiB9OwogY2xhc3MgQ1BERl9MV2luUGFyYW0KIHsKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAgICAgQ0ZYX1dpZGVTdHJpbmcJCUdldEZpbGVQYXRoKCkgY29uc3Q7CiAKLSAgICBib29sCQkJCUdldE5ld1dpbmRvdygpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlHZXROZXdXaW5kb3coKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIk5ld1dpbmRvdyIpOwogICAgIH0KQEAgLTMwNCw3ICszMDQsNyBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFVSSShDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKIAotICAgIGJvb2wJCQkJR2V0TW91c2VNYXAoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJR2V0TW91c2VNYXAoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIklzTWFwIik7CiAgICAgfQpAQCAtMzE0LDkgKzMxNCw5IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIGJvb2wJCQkJR2V0SGlkZVN0YXR1cygpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlHZXRIaWRlU3RhdHVzKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJIIiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJIIiwgVFJVRSk7CiAgICAgfQogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWVkQWN0aW9uKCkgY29uc3QKQEAgLTM0NSwxNyArMzQ1LDE3IEBACiAgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXROdW1iZXIoIlZvbHVtZSIpOwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNTeW5jaHJvbm91cygpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlJc1N5bmNocm9ub3VzKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJTeW5jaHJvbm91cyIpOwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNSZXBlYXQoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJSXNSZXBlYXQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIlJlcGVhdCIpOwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNNaXhQbGF5KCkgY29uc3QKKyAgICBGWF9CT09MCQkJCUlzTWl4UGxheSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTWl4Iik7CiAgICAgfQpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgIERvY3VtZW50UHJpbnRlZAogICAgIH07CiAKLSAgICBib29sCQkJCUFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCUFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIAogICAgIENQREZfQWN0aW9uCQkJR2V0QWN0aW9uKEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIApAQCAtNDU1LDEzICs0NTUsMTMgQEAKICAgICAgICAgcmV0dXJuIG1fcE9iajsKICAgICB9CiAKLSAgICBib29sCQkJSXNVUkwoKSBjb25zdDsKKyAgICBGWF9CT09MCQkJSXNVUkwoKSBjb25zdDsKIAotICAgIGJvb2wJCQlHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NGaWxlTmFtZSkgY29uc3Q7CisgICAgRlhfQk9PTAkJCUdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0ZpbGVOYW1lKSBjb25zdDsKIAogICAgIENQREZfU3RyZWFtKglHZXRGaWxlU3RyZWFtKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJU2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBib29sIGJVUkwgPSBmYWxzZSk7CisgICAgdm9pZAkJCVNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMID0gRkFMU0UpOwogcHJvdGVjdGVkOgogCiAgICAgQ1BERl9PYmplY3QJCSptX3BPYmo7CkBAIC01NDMsMTMgKzU0MywxMyBAQAogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRBbm5vdERpY3QoKTsKIAotICAgIGJvb2wgRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICBGWF9CT09MIERyYXdBcHBlYXJhbmNlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0gICAgYm9vbCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCisgICAgRlhfQk9PTCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSk7CkBAIC01ODUsMjUgKzU4NSwyNSBAQAogICAgIHZvaWQJR2V0QW5ub3RSZWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLCBDUERGX1JlY3QgJnJ0QW5ub3QpIGNvbnN0OwogCiAgICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGJvb2wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCiAgICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBib29sIGJTaG93V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCBiU2hvd1dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKICAgICB7CiAgICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBOVUxMKTsKICAgICB9CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGJvb2wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MIGJTaG93V2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUICpwQ2xpcFJlY3QpCiAgICAgewogICAgICAgICBEaXNwbGF5QW5ub3RzKHBQYWdlLCBOVUxMLCBwQ29udGV4dCwgYlByaW50aW5nLCBwTWF0cml4LCBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKICAgICB9CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXBSZWN0KTsKIAogCkBAIC02MzYsOCArNjM2LDggQEAKICAgICBDRlhfUHRyQXJyYXkJCW1fQm9yZGVyczsKIAogICAgIHZvaWQJCQkJRGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBjbGlwX3JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXQsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCk7CiAgICAgZnJpZW5kIGNsYXNzCQlDUERGX0Fubm90OwogfTsKICNkZWZpbmUgQ09MT1JUWVBFX1RSQU5TUEFSRU5UCTAKQEAgLTY3OCw3ICs2NzgsNyBAQAogCiAKIAotICAgIGJvb2wJCQkJSGFzRm9udCgpOworICAgIEZYX0JPT0wJCQkJSGFzRm9udCgpOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldEZvbnRTdHJpbmcoKTsKIApAQCAtNjg3LDE4ICs2ODcsMTggQEAKIAogCiAKLSAgICBib29sCQkJCUhhc0NvbG9yKGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJSGFzQ29sb3IoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0Q29sb3JTdHJpbmcoYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBmYWxzZSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCUdldENvbG9yU3RyaW5nKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBib29sIGJTdHJva2luZ09wZXJhdGlvbiA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwgaW50JiBpQ29sb3JUeXBlLCBib29sIGJTdHJva2luZ09wZXJhdGlvbiA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCUdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwogCiAKIAogCi0gICAgYm9vbAkJCQlIYXNUZXh0TWF0cml4KCk7CisgICAgRlhfQk9PTAkJCQlIYXNUZXh0TWF0cml4KCk7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VGV4dE1hdHJpeFN0cmluZygpOwogCkBAIC03MjAsMTUgKzcyMCwxNSBAQAogewogcHVibGljOgogCi0gICAgQ1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBib29sIGJVcGRhdGVBUCk7CisgICAgQ1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJVcGRhdGVBUCk7CiAKICAgICB+Q1BERl9JbnRlckZvcm0oKTsKIAogCiAKLSAgICBzdGF0aWMgdm9pZAkJCQlFbmFibGVVcGRhdGVBUChib29sIGJVcGRhdGVBUCk7CisgICAgc3RhdGljIHZvaWQJCQkJRW5hYmxlVXBkYXRlQVAoRlhfQk9PTCBiVXBkYXRlQVApOwogCi0gICAgc3RhdGljIGJvb2wJCQlVcGRhdGluZ0FQRW5hYmxlZCgpOworICAgIHN0YXRpYyBGWF9CT09MCQkJVXBkYXRpbmdBUEVuYWJsZWQoKTsKIAogCiAgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsIGNvbnN0IEZYX0NIQVIqIGNzVHlwZSwgaW50IGlNaW5MZW4gPSAyLCBjb25zdCBGWF9DSEFSKiBjc1ByZWZpeCA9ICIiKTsKQEAgLTc1NiwxMSArNzU2LDExIEBACiAKIAogCi0gICAgYm9vbAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpOworICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlKTsKIAotICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CisgICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKTsKIAotICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOworICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOwogCiAKIApAQCAtNzcxLDcgKzc3MSw3IEBACiAKICAgICB2b2lkCQkJCQlHZXRBbGxGaWVsZE5hbWVzKENGWF9XaWRlU3RyaW5nQXJyYXkmIGFsbEZpZWxkTmFtZXMpOwogCi0gICAgYm9vbAkJCQkJSXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpOworICAgIEZYX0JPT0wJCQkJCUlzVmFsaWRGb3JtRmllbGQoY29uc3Qgdm9pZCogcEZpZWxkKTsKIAogICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7CiAKQEAgLTc4Miw3ICs3ODIsNyBAQAogCiAgICAgQ1BERl9Gb3JtQ29udHJvbCoJCUdldENvbnRyb2woRlhfRFdPUkQgaW5kZXgsIENGWF9XaWRlU3RyaW5nIGNzRmllbGROYW1lID0gTCIiKTsKIAotICAgIGJvb2wJCQkJCUlzVmFsaWRGb3JtQ29udHJvbChjb25zdCB2b2lkKiBwQ29udHJvbCk7CisgICAgRlhfQk9PTAkJCQkJSXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKTsKIAogICAgIGludAkJCQkJCUNvdW50UGFnZUNvbnRyb2xzKENQREZfUGFnZSogcFBhZ2UpIGNvbnN0OwogCkBAIC04MTcsOSArODE3LDkgQEAKIAogCiAKLSAgICBib29sCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKKyAgICBGWF9CT09MCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKIAotICAgIHZvaWQJCQkJCU5lZWRDb25zdHJ1Y3RBUChib29sIGJOZWVkQVApOworICAgIHZvaWQJCQkJCU5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApOwogCiAKIApAQCAtODQ1LDExICs4NDUsMTEgQEAKIAogICAgIENQREZfRm9udCoJCQkJR2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKLSAgICBib29sCQkJCQlGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisgICAgRlhfQk9PTAkJCQkJRmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCi0gICAgYm9vbAkJCQkJRmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKyAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCi0gICAgaW5saW5lIGJvb2wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCisgICAgaW5saW5lIEZYX0JPT0wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiAgICAgewogICAgICAgICByZXR1cm4gRmluZEZvcm1Gb250KFBERl9FbmNvZGVUZXh0KGNzRm9udE5hbWUpLCBwRm9udCwgY3NOYW1lVGFnKTsKICAgICB9CkBAIC04ODIsMjAgKzg4MiwyMCBAQAogCiAKIAotICAgIENQREZfRm9ybUZpZWxkKgkJCUNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMgPSBOVUxMLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gdHJ1ZSkgY29uc3Q7CisgICAgQ1BERl9Gb3JtRmllbGQqCQkJQ2hlY2tSZXF1aXJlZEZpZWxkcyhjb25zdCBDRlhfUHRyQXJyYXkgKmZpZWxkcyA9IE5VTEwsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFKSBjb25zdDsKIAotICAgIENGREZfRG9jdW1lbnQqIAkJCUV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OworICAgIENGREZfRG9jdW1lbnQqIAkJCUV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjID0gRkFMU0UpIGNvbnN0OwogCi0gICAgQ0ZERl9Eb2N1bWVudCoJCQlFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSA9IHRydWUsIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OworICAgIENGREZfRG9jdW1lbnQqCQkJRXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKIAotICAgIGJvb2wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCiAKIAogCi0gICAgYm9vbAkJCQkJUmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gdHJ1ZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJCVJlc2V0Rm9ybShjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSA9IFRSVUUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAotICAgIGJvb2wJCQkJCVJlc2V0Rm9ybShib29sIGJOb3RpZnkgPSBmYWxzZSk7CisgICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAogICAgIHZvaWQJCQkJCVJlbG9hZEZvcm0oKTsKIApAQCAtOTA3LDI3ICs5MDcsMjcgQEAKICAgICB2b2lkCQkJCQlTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSk7CiAKIAotICAgIGludAkJCQkJCUdldFBhZ2VXaXRoV2lkZ2V0KGludCBpQ3VyUGFnZSwgYm9vbCBiTmV4dCk7CisgICAgaW50CQkJCQkJR2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBGWF9CT09MIGJOZXh0KTsKIAogCiAKLSAgICBib29sCQkJCQlJc1VwZGF0ZWQoKQorICAgIEZYX0JPT0wJCQkJCUlzVXBkYXRlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iVXBkYXRlZDsKICAgICB9CiAKICAgICB2b2lkCQkJCQlDbGVhclVwZGF0ZWRGbGFnKCkKICAgICB7Ci0gICAgICAgIG1fYlVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9iVXBkYXRlZCA9IEZBTFNFOwogICAgIH0KIAogCi0gICAgYm9vbAkJCQkJSGFzWEZBRm9ybSgpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUhhc1hGQUZvcm0oKSBjb25zdDsKIAogICAgIHZvaWQJCQkJCUZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSk7CiBwcm90ZWN0ZWQ6CiAKLSAgICBzdGF0aWMgYm9vbAkJCW1fYlVwZGF0ZUFQOworICAgIHN0YXRpYyBGWF9CT09MCQkJbV9iVXBkYXRlQVA7CiAKICAgICB2b2lkCQkJCQlMb2FkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CiAKQEAgLTkzNyw5ICs5MzcsOSBAQAogCiAgICAgQ1BERl9Gb3JtQ29udHJvbCoJCUFkZENvbnRyb2woY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCk7CiAKLSAgICB2b2lkCQkJCQlGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UsIGludCBuTGV2ZWwgPSAwKTsKKyAgICB2b2lkCQkJCQlGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIGludCBuTGV2ZWwgPSAwKTsKIAotICAgIGJvb2wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOworICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOwogCiAgICAgaW50CQkJCQkJQ29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMik7CiAKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCiAgICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKIAotICAgIGJvb2wJCQkJCW1fYkdlbmVyYXRlQVA7CisgICAgRlhfQk9PTAkJCQkJbV9iR2VuZXJhdGVBUDsKIAogICAgIENQREZfRGljdGlvbmFyeSoJCW1fcEZvcm1EaWN0OwogCkBAIC05NTksNyArOTU5LDcgQEAKIAogICAgIENQREZfRm9ybU5vdGlmeSoJCW1fcEZvcm1Ob3RpZnk7CiAKLSAgICBib29sCQkJCQltX2JVcGRhdGVkOworICAgIEZYX0JPT0wJCQkJCW1fYlVwZGF0ZWQ7CiAgICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7CiAgICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUZpZWxkOwogfTsKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAgICAgICAgIG1fcERpY3QgPSBwRGljdDsKICAgICB9CiAKLSAgICBib29sCQkJCQlSZXNldEZpZWxkKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKKyAgICBGWF9CT09MCQkJCQlSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAogCiAKQEAgLTEwNzUsNyArMTA3NSw3IEBACiAKICAgICBDRlhfV2lkZVN0cmluZwkJCUdldERlZmF1bHRWYWx1ZSgpOwogCi0gICAgYm9vbAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CisgICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKIAogCkBAIC0xMDkwLDEzICsxMDkwLDEzIEBACiAKICAgICBpbnQJCQkJCQlHZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCk7CiAKLSAgICBib29sCQkJCQlDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkgPSBmYWxzZSk7CisgICAgRlhfQk9PTAkJCQkJQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCi0gICAgYm9vbAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KTsKKyAgICBGWF9CT09MCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpOwogCi0gICAgYm9vbAkJCQkJU2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CisgICAgRlhfQk9PTAkJCQkJU2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKLSAgICBib29sCQkJCQlJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKKyAgICBGWF9CT09MCQkJCQlJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKIAogICAgIGludAkJCQkJCUdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKIApAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAogCiAKLSAgICBib29sCQkJCQlDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIGJvb2wgYkNoZWNrZWQsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKKyAgICBGWF9CT09MCQkJCQlDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAogCiAKQEAgLTExMzAsMTEgKzExMzAsMTEgQEAKIAogICAgIGludAkJCQkJCUdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KTsKIAotICAgIGJvb2wJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCk7CisgICAgRlhfQk9PTAkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KTsKIAotICAgIGJvb2wJCQkJCVNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJCVNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCi0gICAgYm9vbAkJCQkJQ2xlYXJTZWxlY3RlZE9wdGlvbnMoYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJCUNsZWFyU2VsZWN0ZWRPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAogCiAKQEAgLTExNjksOSArMTE2OSw5IEBACiAKIAogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRWYWx1ZShib29sIGJEZWZhdWx0KTsKKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpOwogCi0gICAgYm9vbAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpOworICAgIEZYX0JPT0wJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiRGVmYXVsdCwgRlhfQk9PTCBiTm90aWZ5KTsKIAogCiAgICAgdm9pZAkJCQkJU3luY0ZpZWxkRmxhZ3MoKTsKQEAgLTExODYsOSArMTE4Niw5IEBACiAKIAogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDaGVja1ZhbHVlKGJvb2wgYkRlZmF1bHQpOworICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2hlY2tWYWx1ZShGWF9CT09MIGJEZWZhdWx0KTsKIAotICAgIGJvb2wJCQkJCVNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpOworICAgIEZYX0JPT0wJCQkJCVNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOwogCiAKICAgICBGWF9GTE9BVAkJCQltX0ZvbnRTaXplOwpAQCAtMTIyNSw3ICsxMjI1LDcgQEAKIAogCiAKLSAgICBib29sCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CisgICAgRlhfQk9PTAkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwogCiAKIApAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAogCiAKLSAgICBib29sCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CisgICAgRlhfQk9PTAkJCQkJR2V0Rml0dGluZ0JvdW5kcygpOwogCiAKICAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BEaWN0OwpAQCAtMTI4Myw5ICsxMjgzLDkgQEAKIAogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RXhwb3J0VmFsdWUoKTsKIAotICAgIGJvb2wJCQkJCUlzQ2hlY2tlZCgpOworICAgIEZYX0JPT0wJCQkJCUlzQ2hlY2tlZCgpOwogCi0gICAgYm9vbAkJCQkJSXNEZWZhdWx0Q2hlY2tlZCgpOworICAgIEZYX0JPT0wJCQkJCUlzRGVmYXVsdENoZWNrZWQoKTsKIAogCiAKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAKIAogCi0gICAgYm9vbAkJCQkJSGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKKyAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCiAKIApAQCAtMTQzNCw3ICsxNDM0LDcgQEAKIAogICAgIHZvaWQJCQkJCVNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKIAotICAgIHZvaWQJCQkJCUNoZWNrQ29udHJvbChib29sIGJDaGVja2VkKTsKKyAgICB2b2lkCQkJCQlDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCk7CiAKICAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCkBAIC0xNDQ2LDcgKzE0NDYsNyBAQAogCiAgICAgQ1BERl9TdHJlYW0qCQkJR2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKIAotICAgIENQREZfQXBTZXR0aW5ncwkJCUdldE1LKGJvb2wgYkNyZWF0ZSk7CisgICAgQ1BERl9BcFNldHRpbmdzCQkJR2V0TUsoRlhfQk9PTCBiQ3JlYXRlKTsKIAogICAgIENQREZfSW50ZXJGb3JtKgkJCW1fcEZvcm07CiAKQEAgLTE1MDcsNyArMTUwNyw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH07Ci1ib29sCQlGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKK0ZYX0JPT0wJCUZQREZfR2VuZXJhdGVBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogY2xhc3MgQ1BERl9QYWdlTGFiZWwKIHsKIHB1YmxpYzoKQEAgLTE1NTksOSArMTU1OSw5IEBACiAgICAgfkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKTsKIAogCi0gICAgYm9vbCBJc0RpcmVjdGlvblIyTCgpIGNvbnN0OworICAgIEZYX0JPT0wgSXNEaXJlY3Rpb25SMkwoKSBjb25zdDsKIAotICAgIGJvb2wgUHJpbnRTY2FsaW5nKCkgY29uc3Q7CisgICAgRlhfQk9PTCBQcmludFNjYWxpbmcoKSBjb25zdDsKIAogICAgIGludDMyX3QgTnVtQ29waWVzKCkgY29uc3Q7CiAKQEAgLTE1ODYsNyArMTU4Niw3IEBACiAgICAgICAgIHJldHVybiBtX3BEaWN0OwogICAgIH0KIAotICAgIGJvb2wJCQkJCUhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKKyAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CiAKIAogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaAppbmRleCA5NzYxZTAxLi43MDZmNWMwIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKQEAgLTg1LDE3ICs4NSwxNyBAQAogCiAgICAgdmlydHVhbCBDRlhfUHRyQXJyYXkqCQlHZXRPYmplY3RBcnJheSgpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BERl9PYmplY3QqCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRikgPSAwOworICAgIHZpcnR1YWwgQ1BERl9PYmplY3QqCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRikgPSAwOwogCiAKIAotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CisgICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQlHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CisgICAgdmlydHVhbCBpbnQJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oCmluZGV4IDdmODllOGQuLjRiYWJhNDEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgKQEAgLTM5LDEyICszOSwxMiBAQAogICAgICAgICBuU2VjSW5kZXggPSBuTGluZUluZGV4ID0gbldvcmRJbmRleCA9IC0xOwogICAgIH0KIAotICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0CisgICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB3cC5uU2VjSW5kZXggPT0gblNlY0luZGV4ICYmIHdwLm5MaW5lSW5kZXggPT0gbkxpbmVJbmRleCAmJiB3cC5uV29yZEluZGV4ID09IG5Xb3JkSW5kZXg7CiAgICAgfQogCi0gICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKKyAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdwLm5TZWNJbmRleCAhPSBuU2VjSW5kZXggfHwgd3AubkxpbmVJbmRleCAhPSBuTGluZUluZGV4IHx8IHdwLm5Xb3JkSW5kZXggIT0gbldvcmRJbmRleDsKICAgICB9CkBAIC0xNDIsMTIgKzE0MiwxMiBAQAogICAgICAgICBTd2FwV29yZFBsYWNlKCk7CiAgICAgfQogCi0gICAgYm9vbCBJc0V4aXN0KCkgY29uc3QKKyAgICBGWF9CT09MIElzRXhpc3QoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKICAgICB9CiAKLSAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKSBjb25zdAorICAgIEZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gd3IuQmVnaW5Qb3MgIT0gQmVnaW5Qb3MgfHwgd3IuRW5kUG9zICE9IEVuZFBvczsKICAgICB9CkBAIC0yOTAsNyArMjkwLDcgQEAKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKSA9IDA7CiB9OwpAQCAtMjk5LDI3ICsyOTksMjcgQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIHsgfQogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCU5leHRXb3JkKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0V29yZCgpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2V29yZCgpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldldvcmQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dExpbmUoKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRMaW5lKCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCVByZXZMaW5lKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2TGluZSgpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0U2VjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZTZWN0aW9uKCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0V29yZChjb25zdCBDUFZUX1dvcmQgJiB3b3JkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwJYm9vbAkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCQkJU2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CiAKQEAgLTM1MiwyMyArMzUyLDIzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUgPSB0cnVlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KGJvb2wgYlJpY2hUZXh0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0KSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJSW5pdGlhbGl6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlJc1ZhbGlkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJUmVhcnJhbmdlQWxsKCkgPSAwOwogCkBAIC00MTAsNyArNDEwLDcgQEAKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldExpbWl0Q2hhcigpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNdWx0aUxpbmUoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CiAKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkCQkJCQkJCVVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiUHJldk9yTmV4dCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUFqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9CT09MIGJQcmV2T3JOZXh0KSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCBiL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaAppbmRleCA4YjU0ZjJkLi4wNDkyMmM0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oCkBAIC02MSw5ICs2MSw5IEBACiBwdWJsaWM6CiAKICAgICBDUERGVGV4dF9QYXJzZU9wdGlvbnMoKTsKLSAgICBib29sCQkJbV9iR2V0Q2hhckNvZGVPbmx5OwotICAgIGJvb2wJCQltX2JOb3JtYWxpemVPYmpzOwotICAgIGJvb2wJCQltX2JPdXRwdXRIeXBoZW47CisgICAgRlhfQk9PTAkJCW1fYkdldENoYXJDb2RlT25seTsKKyAgICBGWF9CT09MCQkJbV9iTm9ybWFsaXplT2JqczsKKyAgICBGWF9CT09MCQkJbV9iT3V0cHV0SHlwaGVuOwogfTsKIGNsYXNzIElQREZfVGV4dFBhZ2UKIHsKQEAgLTc1LDEyICs3NSwxMiBAQAogICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgaW50IGZsYWdzID0gMCk7CiAgICAgc3RhdGljIElQREZfVGV4dFBhZ2UqCUNyZWF0ZVJlZmxvd1RleHRQYWdlKElQREZfUmVmbG93ZWRQYWdlKiBwUmVmUGFnZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlOb3JtYWxpemVPYmplY3RzKGJvb2wgYk5vcm1hbGl6ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlQYXJzZVRleHRQYWdlKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCVBhcnNlVGV4dFBhZ2UoKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJCUlzUGFyc2VyZWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNQYXJzZXJlZCgpIGNvbnN0ID0gMDsKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgaW50IENoYXJJbmRleEZyb21UZXh0SW5kZXgoaW50IFRleHRJbmRleCkgY29uc3QgPSAwOwpAQCAtMTA5LDExICsxMDksMTEgQEAKIAogICAgIHZpcnR1YWwJdm9pZAkJCUdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBib29sIGJDb250YWlucyA9IGZhbHNlKSA9IDA7CisgICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKSA9IDA7CiAKICAgICB2aXJ0dWFsCXZvaWQJCQlHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0ID0gMDsKIApAQCAtMTM0LDExICsxMzQsMTEgQEAKICAgICBzdGF0aWMJSVBERl9UZXh0UGFnZUZpbmQqCUNyZWF0ZVBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsCWJvb2wJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKSA9IDA7CisgICAgdmlydHVhbAlGWF9CT09MCQkJCUZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zID0gMCkgPSAwOwogCi0gICAgdmlydHVhbAlib29sCQkJCUZpbmROZXh0KCkgPSAwOworICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlGaW5kTmV4dCgpID0gMDsKIAotICAgIHZpcnR1YWwJYm9vbAkJCQlGaW5kUHJldigpID0gMDsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJRmluZFByZXYoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdCA9IDA7CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCiAgICAgc3RhdGljCUlQREZfTGlua0V4dHJhY3QqCUNyZWF0ZUxpbmtFeHRyYWN0KCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQkJRXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKSA9IDA7CiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGludAkJCQkJQ291bnRMaW5rcygpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmggYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCmluZGV4IDU1MzkwMDguLmUzZDY5ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaApAQCAtNTEsOSArNTEsOSBAQAogcHVibGljOgogCiAgICAgdmlydHVhbCB+SUNvZGVjX0Jhc2ljTW9kdWxlKCkge30KLSAgICB2aXJ0dWFsIGJvb2wJUnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCisgICAgdmlydHVhbCBGWF9CT09MCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjKSA9IDA7CkBAIC03MCw3ICs3MCw3IEBACiAKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIGludAkJCUdldFdpZHRoKCkgPSAwOwogCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICB2aXJ0dWFsIGludAkJCUdldEJQQygpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlDbGVhckltYWdlRGF0YSgpID0gMDsKIH07CkBAIC05MSwxMyArOTEsMTMgQEAKICAgICB2aXJ0dWFsIH5JQ29kZWNfRmxhdGVNb2R1bGUoKSB7fQogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlGbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlLAorICAgIHZpcnR1YWwgRlhfRFdPUkQJRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiB9OwogY2xhc3MgSUNvZGVjX0ZheE1vZHVsZQogewpAQCAtMTA2LDEwICsxMDYsMTAgQEAKICAgICB2aXJ0dWFsIH5JQ29kZWNfRmF4TW9kdWxlKCkge30KIAogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IEssIGJvb2wgRW5kT2ZMaW5lLCBib29sIEVuY29kZWRCeXRlQWxpZ24sIGJvb2wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykgPSAwOworICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykgPSAwOwogCiAKLSAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIH07CiBjbGFzcyBJQ29kZWNfSnBlZ01vZHVsZQpAQCAtMTIxLDEzICsxMjEsMTMgQEAKICAgICB2aXJ0dWFsIHZvaWQJCVNldFBvdmlkZXIoSUZYX0pwZWdQcm92aWRlciogcEpQKSA9IDA7CiAKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIGJvb2wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyID0gTlVMTCwgRlhfRFdPUkQqIGljY19sZW5ndGggPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpY2NfYnVmID0gTlVMTCwgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KCkgPSAwOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgdmlydHVhbCBpbnQJCQlTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkgPSAwOwogCiAKLSAgICB2aXJ0dWFsIGJvb2wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpID0gMDsKIAogCiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0ciA9IE5VTEwpID0gMDsKQEAgLTE1MywxMyArMTUzLDEzIEBACiAKICAgICB2aXJ0dWFsIH5JQ29kZWNfSnB4TW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgdm9pZCogCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgdXNlQ29sb3JTcGFjZSA9IGZhbHNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkKiAJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCB1c2VDb2xvclNwYWNlID0gRkFMU0UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJR2V0SW1hZ2VJbmZvKHZvaWQqIGN0eCwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOwogfTsKQEAgLTE2OSwxMCArMTY5LDEwIEBACiAKICAgICB2aXJ0dWFsIH5JQ29kZWNfSmJpZzJNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCBib29sCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCkgID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpID0gMDsKIApAQCAtMjUxLDYgKzI1MSw2IEBACiB9Owogdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKTsKIHZvaWQgQWRvYmVDTVlLX3RvX3NSR0IxKHVpbnQ4X3QgYywgdWludDhfdCBtLCB1aW50OF90IHksIHVpbnQ4X3QgaywgdWludDhfdCYgUiwgdWludDhfdCYgRywgdWludDhfdCYgQik7Ci1ib29sIE1ENUNvbXB1dGVJRChjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0pOworRlhfQk9PTCBNRDVDb21wdXRlSUQoY29uc3Qgdm9pZCogYnVmLCBGWF9EV09SRCBkd1NpemUsIHVpbnQ4X3QgSURbMTZdKTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDT0RFQ19GWF9DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKaW5kZXggYWM2OWY5YS4uMGIyMzhiNyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCkBAIC0xNCwyNSArMTQsMjUgQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKIAogCiAgICAgdmlydHVhbCB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBwRGVjb2RlcikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlEb3duU2NhbGUodm9pZCogcERlY29kZXIsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJUmV3aW5kKHZvaWQqIHBEZWNvZGVyKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQlSZXdpbmQodm9pZCogcERlY29kZXIpID0gMDsKIAogICAgIHZpcnR1YWwgdWludDhfdCoJR2V0TmV4dExpbmUodm9pZCogcERlY29kZXIpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KHZvaWQqIHBEZWNvZGVyKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCisgICAgdmlydHVhbCBGWF9CT09MCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciA9IE5VTEwsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5ID0gNzUsCisgICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5ID0gNzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1ZiA9IE5VTEwsIEZYX0RXT1JEIGljY19sZW5ndGggPSAwKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpID0gMDsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICB2aXJ0dWFsIGludAkJCVN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOwogCiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCmluZGV4IDVjNDE3MzguLjdjZTIxZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKQEAgLTE1LDkgKzE1LDkgQEAKICAgICBzdGF0aWMgSUZYX0JpZGlDaGFyKiBDcmVhdGUoKTsKICAgICB2aXJ0dWFsIH5JRlhfQmlkaUNoYXIoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFNldFBvbGljeShib29sIGJTZXBhcmF0ZU5ldXRyYWwgPSB0cnVlKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIEVuZENoYXIoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwgPSBUUlVFKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MIEVuZENoYXIoKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90IEdldEJpZGlJbmZvKGludDMyX3QgJmlTdGFydCwgaW50MzJfdCAmaUNvdW50KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKaW5kZXggYzI3MmViNS4uZDU3NWRmNiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgKQEAgLTIxOCw5ICsyMTgsOSBAQAogCiAgICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpOwogCi0gICAgYm9vbAkJCQkJSXNFT0YoKTsKKyAgICBGWF9CT09MCQkJCQlJc0VPRigpOwogCi0gICAgYm9vbAkJCQkJUmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpOworICAgIEZYX0JPT0wJCQkJCVJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKTsKIHByb3RlY3RlZDoKIAogICAgIEZYX0RXT1JECQkJCW1fTG9hZGluZ1BvczsKQEAgLTIzOSw3ICsyMzksNyBAQAogCiAgICAgdmlydHVhbCB2b2lkIENsZWFyKCk7CiAKLSAgICBib29sIEZsdXNoKCk7CisgICAgRlhfQk9PTCBGbHVzaCgpOwogCiAgICAgaW50MzJfdCBBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiBwcm90ZWN0ZWQ6CiAKLSAgICB2aXJ0dWFsIGJvb2wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MIERvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgPSAwOwogCiAgICAgRlhfU1RSU0laRSBtX0J1ZlNpemU7CiAKQEAgLTI2OSwxOCArMjY5LDE4IEBACiAKICAgICB2b2lkIENsZWFyKCkgb3ZlcnJpZGU7CiAKLSAgICBib29sIEF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgYm9vbCBiVGFrZW92ZXIgPSBmYWxzZSk7CisgICAgRlhfQk9PTCBBdHRhY2hGaWxlKElGWF9TdHJlYW1Xcml0ZSAqcEZpbGUsIEZYX0JPT0wgYlRha2VvdmVyID0gRkFMU0UpOwogCi0gICAgYm9vbCBBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CisgICAgRlhfQk9PTCBBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CiAKLSAgICBib29sIEF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOworICAgIEZYX0JPT0wgQXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSk7CiAKIHByaXZhdGU6Ci0gICAgYm9vbCBEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogICAgIElGWF9TdHJlYW1Xcml0ZSogbV9wRmlsZTsKIAotICAgIGJvb2wgbV9iVGFrZW92ZXI7CisgICAgRlhfQk9PTCBtX2JUYWtlb3ZlcjsKIH07CiAKIHN0cnVjdCBDRlhfQ2hhck1hcCB7CkBAIC0zNjIsMTcgKzM2MiwxNyBAQAogCiAgICAgfkNGWF9CYXNpY0FycmF5KCk7CiAKLSAgICBib29sCQkJU2V0U2l6ZShpbnQgbk5ld1NpemUpOworICAgIEZYX0JPT0wJCQlTZXRTaXplKGludCBuTmV3U2l6ZSk7CiAKLSAgICBib29sCQkJQXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOworICAgIEZYX0JPT0wJCQlBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CiAKLSAgICBib29sCQkJQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKKyAgICBGWF9CT09MCQkJQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKIAogICAgIHVpbnQ4X3QqCQlJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOwogCi0gICAgYm9vbAkJCVJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOworICAgIEZYX0JPT0wJCQlSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KTsKIAotICAgIGJvb2wJCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpOworICAgIEZYX0JPT0wJCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpOwogCiAgICAgY29uc3Qgdm9pZCoJCUdldERhdGFQdHIoaW50IGluZGV4KSBjb25zdDsKIHByb3RlY3RlZDoKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgICAgICByZXR1cm4gbV9uU2l6ZSAtIDE7CiAgICAgfQogCi0gICAgYm9vbAkJU2V0U2l6ZShpbnQgbk5ld1NpemUpCisgICAgRlhfQk9PTAkJU2V0U2l6ZShpbnQgbk5ld1NpemUpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUobk5ld1NpemUpOwogICAgIH0KQEAgLTQxOSwxMyArNDE5LDEzIEBACiAgICAgICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07CiAgICAgfQogCi0gICAgYm9vbAkJU2V0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQorICAgIEZYX0JPT0wJCVNldEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkKICAgICB7CiAgICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdID0gbmV3RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIFRZUEUmCQlFbGVtZW50QXQoaW50IG5JbmRleCkKQEAgLTQ0NiwzNiArNDQ2LDM2IEBACiAgICAgICAgIHJldHVybiAoVFlQRSopbV9wRGF0YTsKICAgICB9CiAKLSAgICBib29sCQlTZXRBdEdyb3coaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQorICAgIEZYX0JPT0wJCVNldEF0R3JvdyhpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpCiAgICAgewogICAgICAgICBpZiAobkluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChuSW5kZXggPj0gbV9uU2l6ZSkKICAgICAgICAgICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyAxKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICBib29sCQlBZGQoVFlQRSBuZXdFbGVtZW50KQorICAgIEZYX0JPT0wJCUFkZChUWVBFIG5ld0VsZW1lbnQpCiAgICAgewogICAgICAgICBpZiAobV9uU2l6ZSA8IG1fbk1heFNpemUpIHsKICAgICAgICAgICAgIG1fblNpemUgKys7CiAgICAgICAgIH0gZWxzZSBpZiAoIVNldFNpemUobV9uU2l6ZSArIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgKChUWVBFKiltX3BEYXRhKVttX25TaXplIC0gMV0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgYm9vbAkJQXBwZW5kKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCisgICAgRlhfQk9PTAkJQXBwZW5kKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChzcmMpOwogICAgIH0KIAotICAgIGJvb2wJCUNvcHkoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKKyAgICBGWF9CT09MCQlDb3B5KGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoc3JjKTsKICAgICB9CkBAIC01MTEsMjMgKzUxMSwyMyBAQAogICAgICAgICByZXR1cm4gKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdOwogICAgIH0KIAotICAgIGJvb2wJCUluc2VydEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCwgaW50IG5Db3VudCA9IDEpCisgICAgRlhfQk9PTAkJSW5zZXJ0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50LCBpbnQgbkNvdW50ID0gMSkKICAgICB7CiAgICAgICAgIGlmICghSW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAobkNvdW50LS0pIHsKICAgICAgICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4KytdID0gbmV3RWxlbWVudDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgYm9vbAkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCA9IDEpCisgICAgRlhfQk9PTAkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCA9IDEpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KG5JbmRleCwgbkNvdW50KTsKICAgICB9CiAKLSAgICBib29sCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCisgICAgRlhfQk9PTAkJSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KQogICAgIHsKICAgICAgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChuU3RhcnRJbmRleCwgcE5ld0FycmF5KTsKICAgICB9CkBAIC03MDAsNyArNzAwLDcgQEAKICAgICAgICAgcmV0dXJuIG1fVW5pdFNpemU7CiAgICAgfQogCi0gICAgdm9pZCoJSXRlcmF0ZShib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwogcHJpdmF0ZToKIAogICAgIGludAkJCQltX1VuaXRTaXplOwpAQCAtNzE1LDggKzcxNSw4IEBACiAKICAgICB2b2lkKgkJCW1fcEluZGV4OwogICAgIHZvaWQqKglHZXRJbmRleChpbnQgc2VnX2luZGV4KSBjb25zdDsKLSAgICB2b2lkKglJdGVyYXRlSW5kZXgoaW50IGxldmVsLCBpbnQmIHN0YXJ0LCB2b2lkKiogcEluZGV4LCBib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKLSAgICB2b2lkKglJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwgaW50IGNvdW50LCBib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlSW5kZXgoaW50IGxldmVsLCBpbnQmIHN0YXJ0LCB2b2lkKiogcEluZGV4LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgICB2b2lkKglJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwgaW50IGNvdW50LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdDsKIH07CiB0ZW1wbGF0ZSA8Y2xhc3MgRWxlbWVudFR5cGU+CiBjbGFzcyBDRlhfU2VnbWVudGVkQXJyYXkgOiBwdWJsaWMgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheQpAQCAtNzk4LDEyICs3OTgsMTIgQEAKICAgICAgICAgcmV0dXJuIG1fbkNvdW50OwogICAgIH0KIAotICAgIGJvb2wgSXNFbXB0eSgpIGNvbnN0CisgICAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX25Db3VudCA9PSAwOwogICAgIH0KIAotICAgIGJvb2wgTG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisgICAgRlhfQk9PTCBMb29rdXAodm9pZCoga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQqIEdldFZhbHVlQXQodm9pZCoga2V5KSBjb25zdDsKIApAQCAtODE0LDcgKzgxNCw3IEBACiAgICAgICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOwogICAgIH0KIAotICAgIGJvb2wgUmVtb3ZlS2V5KHZvaWQqIGtleSk7CisgICAgRlhfQk9PTCBSZW1vdmVLZXkodm9pZCoga2V5KTsKIAogICAgIHZvaWQgUmVtb3ZlQWxsKCk7CiAKQEAgLTgzMCw3ICs4MzAsNyBAQAogICAgICAgICByZXR1cm4gbV9uSGFzaFRhYmxlU2l6ZTsKICAgICB9CiAKLSAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIGJvb2wgYkFsbG9jTm93ID0gdHJ1ZSk7CisgICAgdm9pZCBJbml0SGFzaFRhYmxlKEZYX0RXT1JEIGhhc2hTaXplLCBGWF9CT09MIGJBbGxvY05vdyA9IFRSVUUpOwogcHJvdGVjdGVkOgogCiAgICAgQ0Fzc29jKiogbV9wSGFzaFRhYmxlOwpAQCAtODU4LDcgKzg1OCw3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBib29sCQkJTG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdDsKKyAgICBGWF9CT09MCQkJTG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQJCQlTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKTsKIApAQCAtODkzLDEyICs4OTMsMTIgQEAKICAgICAgICAgcmV0dXJuIG1fbkNvdW50OwogICAgIH0KIAotICAgIGJvb2wgSXNFbXB0eSgpIGNvbnN0CisgICAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX25Db3VudCA9PSAwOwogICAgIH0KIAotICAgIGJvb2wgTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgICBGWF9CT09MIExvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CiAKICAgICB2b2lkKiYgb3BlcmF0b3JbXShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CiAKQEAgLTkwNyw3ICs5MDcsNyBAQAogICAgICAgICAoKnRoaXMpW2tleV0gPSBuZXdWYWx1ZTsKICAgICB9CiAKLSAgICBib29sIFJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CisgICAgRlhfQk9PTCBSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCiAgICAgdm9pZCBSZW1vdmVBbGwoKTsKIApAQCAtOTI1LDcgKzkyNSw3IEBACiAgICAgICAgIHJldHVybiBtX25IYXNoVGFibGVTaXplOwogICAgIH0KIAotICAgIHZvaWQgSW5pdEhhc2hUYWJsZShGWF9EV09SRCBoYXNoU2l6ZSwgYm9vbCBiQWxsb2NOb3cgPSB0cnVlKTsKKyAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7CiAKICAgICBGWF9EV09SRCBIYXNoS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIHByb3RlY3RlZDoKQEAgLTk2Niw3ICs5NjYsNyBAQAogCiAgICAgdm9pZCoJCUdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CiAKLSAgICBib29sCQkJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgICBGWF9CT09MCQkJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQJCQlTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpOwogCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCiAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEJbV9wQ2FsbGJhY2s7CiAKLSAgICBib29sCQkJCQltX2JTZWxmRGVzdHJ1Y3Q7CisgICAgRlhfQk9PTAkJCQkJbV9iU2VsZkRlc3RydWN0OwogfTsKIGNsYXNzIENGWF9Qcml2YXRlRGF0YQogewpAQCAtMTEwNiwyNyArMTEwNiwyNyBAQAogCiAgICAgdm9pZCoJCQkJR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotICAgIGJvb2wJCQkJCUxvb2t1cFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogJnBEYXRhKSBjb25zdAorICAgIEZYX0JPT0wJCQkJCUxvb2t1cFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogJnBEYXRhKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKCFtb2R1bGVfaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWF9EV09SRCBuQ291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKICAgICAgICAgZm9yIChGWF9EV09SRCBuID0gMDsgbiA8IG5Db3VudDsgbiArKykgewogICAgICAgICAgICAgaWYgKG1fRGF0YUxpc3Rbbl0ubV9wTW9kdWxlSWQgPT0gbW9kdWxlX2lkKSB7CiAgICAgICAgICAgICAgICAgcERhdGEgPSBtX0RhdGFMaXN0W25dLm1fcERhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgYm9vbAkJCQkJUmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKKyAgICBGWF9CT09MCQkJCQlSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOwogcHJvdGVjdGVkOgogCiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUFJJVkFURURBVEE+CW1fRGF0YUxpc3Q7CiAKLSAgICB2b2lkCQkJCQlBZGREYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLCBib29sIGJTZWxmRGVzdHJ1Y3QpOworICAgIHZvaWQJCQkJCUFkZERhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCk7CiB9OwogY2xhc3MgQ0ZYX0JpdFN0cmVhbQogewpAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAogICAgIHZvaWQJCQkJQnl0ZUFsaWduKCk7CiAKLSAgICBib29sCQkJCUlzRU9GKCkKKyAgICBGWF9CT09MCQkJCUlzRU9GKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX0JpdFBvcyA+PSBtX0JpdFNpemU7CiAgICAgfQpAQCAtMTI1MiwxMiArMTI1MiwxMiBAQAogICAgICAgICByZXR1cm4gbV9wT2JqZWN0OwogICAgIH0KIAotICAgIGJvb2wJCQkJSXNOdWxsKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCUlzTnVsbCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID09IE5VTEw7CiAgICAgfQogCi0gICAgYm9vbAkJCQlOb3ROdWxsKCkgY29uc3QKKyAgICBGWF9CT09MCQkJCU5vdE51bGwoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9iamVjdCAhPSBOVUxMOwogICAgIH0KQEAgLTEyODgsNyArMTI4OCw3IEBACiAgICAgICAgIG1fcE9iamVjdCA9IE5VTEw7CiAgICAgfQogCi0gICAgYm9vbAkJCQlvcGVyYXRvciA9PSAoY29uc3QgUmVmJiByZWYpIGNvbnN0CisgICAgRlhfQk9PTAkJCQlvcGVyYXRvciA9PSAoY29uc3QgUmVmJiByZWYpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID09IHJlZi5tX3BPYmplY3Q7CiAgICAgfQpAQCAtMTMwMCw3ICsxMzAwLDcgQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JRlhfUGF1c2UoKSB7IH0KLSAgICB2aXJ0dWFsIGJvb2wJTmVlZFRvUGF1c2VOb3coKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCU5lZWRUb1BhdXNlTm93KCkgPSAwOwogfTsKIGNsYXNzIENGWF9EYXRhRmlsdGVyCiB7CkBAIC0xMzEwLDcgKzEzMTAsNyBAQAogCiAgICAgdm9pZAkJCVNldERlc3RGaWx0ZXIoQ0ZYX0RhdGFGaWx0ZXIqIHBGaWx0ZXIpOwogCi0gICAgYm9vbAkJCUlzRU9GKCkgY29uc3QKKyAgICBGWF9CT09MCQkJSXNFT0YoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkVPRjsKICAgICB9CkBAIC0xMzMwLDcgKzEzMzAsNyBAQAogICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOwogICAgIHZvaWQJCQlSZXBvcnRFT0YoRlhfRFdPUkQgbGVmdF9pbnB1dCk7CiAKLSAgICBib29sCQkJbV9iRU9GOworICAgIEZYX0JPT0wJCQltX2JFT0Y7CiAKICAgICBGWF9EV09SRAkJbV9TcmNQb3M7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKaW5kZXggNmVkYWY1My4uMzY4OWE0YiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKQEAgLTY4LDExICs2OCwxMSBAQAogICAgICAgICB5IC89IGxhbWRhOwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQotICAgIGZyaWVuZAlib29sCQlvcGVyYXRvciA9PSAoY29uc3QgRlhUX1BTViAmb2JqMSwgY29uc3QgRlhUX1BTViAmb2JqMikKKyAgICBmcmllbmQJRlhfQk9PTAkJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCiAgICAgewogICAgICAgICByZXR1cm4gb2JqMS54ID09IG9iajIueCAmJiBvYmoxLnkgPT0gb2JqMi55OwogICAgIH0KLSAgICBmcmllbmQJYm9vbAkJb3BlcmF0b3IgIT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCisgICAgZnJpZW5kCUZYX0JPT0wJCW9wZXJhdG9yICE9IChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQogICAgIHsKICAgICAgICAgcmV0dXJuIG9iajEueCAhPSBvYmoyLnggfHwgb2JqMS55ICE9IG9iajIueTsKICAgICB9CkBAIC0xNzQsMjEgKzE3NCwyMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiB2LnggKyBGWFRfUFNWOjp5ICogdi55OwogICAgIH0KLSAgICBib29sCQlJc1BhcmFsbGVsKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAorICAgIEZYX0JPT0wJCUlzUGFyYWxsZWwoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0CiAgICAgewogICAgICAgICBiYXNlVHlwZSB0ID0gRlhUX1BTVjo6eCAqIG90aGVyeSAtIEZYVF9QU1Y6OnkgKiBvdGhlcng7CiAgICAgICAgIHJldHVybiBGWFNZU19mYWJzKHQpIDwgMHgwMDAxZjsKICAgICB9Ci0gICAgYm9vbAkJSXNQYXJhbGxlbChjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAorICAgIEZYX0JPT0wJCUlzUGFyYWxsZWwoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBJc1BhcmFsbGVsKHYueCwgdi55KTsKICAgICB9Ci0gICAgYm9vbAkJSXNQZXJwZW5kaWN1bGFyKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAorICAgIEZYX0JPT0wJCUlzUGVycGVuZGljdWxhcihiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QKICAgICB7CiAgICAgICAgIGJhc2VUeXBlIHQgPSBEb3RQcm9kdWN0KG90aGVyeCwgb3RoZXJ5KTsKICAgICAgICAgcmV0dXJuIEZYU1lTX2ZhYnModCkgPCAweDAwMDFmOwogICAgIH0KLSAgICBib29sCQlJc1BlcnBlbmRpY3VsYXIoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKKyAgICBGWF9CT09MCQlJc1BlcnBlbmRpY3VsYXIoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBJc1BlcnBlbmRpY3VsYXIodi54LCB2LnkpOwogICAgIH0KQEAgLTM0MCwxMSArMzQwLDExIEBACiAgICAgewogICAgICAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQudG9wICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7CiAgICAgfQotICAgIGJvb2wJCUlzRW1wdHkoKSBjb25zdAorICAgIEZYX0JPT0wJCUlzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDA7CiAgICAgfQotICAgIGJvb2wJCUlzRW1wdHkoRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0CisgICAgRlhfQk9PTAkJSXNFbXB0eShGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB3aWR0aCA8PSBmRXBzaWxvbiB8fCBoZWlnaHQgPD0gZkVwc2lsb247CiAgICAgfQpAQCAtMzUyLDE1ICszNTIsMTUgQEAKICAgICB7CiAgICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMDsKICAgICB9Ci0gICAgYm9vbAkJQ29udGFpbnMoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgY29uc3QKKyAgICBGWF9CT09MCQlDb250YWlucyhiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgbGVmdCArIHdpZHRoICYmIHkgPj0gdG9wICYmIHkgPCB0b3AgKyBoZWlnaHQ7CiAgICAgfQotICAgIGJvb2wJCUNvbnRhaW5zKGNvbnN0IEZYVF9QT0lOVCAmcCkgY29uc3QKKyAgICBGWF9CT09MCQlDb250YWlucyhjb25zdCBGWFRfUE9JTlQgJnApIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gQ29udGFpbnMocC54LCBwLnkpOwogICAgIH0KLSAgICBib29sCQlDb250YWlucyhjb25zdCBGWFRfUkVDVCAmcnQpIGNvbnN0CisgICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHJ0LmxlZnQgPj0gbGVmdCAmJiBydC5yaWdodCgpIDw9IHJpZ2h0KCkgJiYgcnQudG9wID49IHRvcCAmJiBydC5ib3R0b20oKSA8PSBib3R0b20oKTsKICAgICB9CkBAIC01MDEsMjMgKzUwMSwyMyBAQAogICAgICAgICB3aWR0aCA9IHIgLSBsZWZ0OwogICAgICAgICBoZWlnaHQgPSBiIC0gdG9wOwogICAgIH0KLSAgICBib29sCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCkgY29uc3QKKyAgICBGWF9CT09MCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCkgY29uc3QKICAgICB7CiAgICAgICAgIEZYVF9SRUNUIHJlY3QgPSBydDsKICAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnRoaXMpOwogICAgICAgICByZXR1cm4gIXJlY3QuSXNFbXB0eSgpOwogICAgIH0KLSAgICBib29sCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCwgRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0CisgICAgRlhfQk9PTAkJSW50ZXJzZWN0V2l0aChjb25zdCBGWFRfUkVDVCAmcnQsIEZYX0ZMT0FUIGZFcHNpbG9uKSBjb25zdAogICAgIHsKICAgICAgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OwogICAgICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CiAgICAgICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KGZFcHNpbG9uKTsKICAgICB9Ci0gICAgZnJpZW5kCWJvb2wJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCisgICAgZnJpZW5kCUZYX0JPT0wJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCiAgICAgewogICAgICAgICByZXR1cm4gcmMxLmxlZnQgPT0gcmMyLmxlZnQgJiYgcmMxLnRvcCA9PSByYzIudG9wICYmIHJjMS53aWR0aCA9PSByYzIud2lkdGggJiYgcmMxLmhlaWdodCA9PSByYzIuaGVpZ2h0OwogICAgIH0KLSAgICBmcmllbmQJYm9vbAlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKKyAgICBmcmllbmQJRlhfQk9PTAlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKICAgICB7CiAgICAgICAgIHJldHVybiByYzEubGVmdCAhPSByYzIubGVmdCB8fCByYzEudG9wICE9IHJjMi50b3AgfHwgcmMxLndpZHRoICE9IHJjMi53aWR0aCB8fCByYzEuaGVpZ2h0ICE9IHJjMi5oZWlnaHQ7CiAgICAgfQpAQCAtNTYxLDcgKzU2MSw3IEBACiAgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CiAgICAgfQogCi0gICAgYm9vbAkJSXNFbXB0eSgpIGNvbnN0CisgICAgRlhfQk9PTAkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gcmlnaHQgPD0gbGVmdCB8fCBib3R0b20gPD0gdG9wOwogICAgIH0KQEAgLTU3Nyw3ICs1NzcsNyBAQAogCiAgICAgdm9pZAkJVW5pb24oY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCk7CiAKLSAgICBib29sCQlvcGVyYXRvciA9PSAoY29uc3QgRlhfUkVDVCYgc3JjKSBjb25zdAorICAgIEZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBGWF9SRUNUJiBzcmMpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbGVmdCA9PSBzcmMubGVmdCAmJiByaWdodCA9PSBzcmMucmlnaHQgJiYgdG9wID09IHNyYy50b3AgJiYgYm90dG9tID09IHNyYy5ib3R0b207CiAgICAgfQpAQCAtNTkwLDEyICs1OTAsMTIgQEAKICAgICAgICAgYm90dG9tICs9IGR5OwogICAgIH0KIAotICAgIGJvb2wJCUNvbnRhaW5zKGNvbnN0IEZYX1JFQ1QmIG90aGVyX3JlY3QpIGNvbnN0CisgICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBvdGhlcl9yZWN0LmxlZnQgPj0gbGVmdCAmJiBvdGhlcl9yZWN0LnJpZ2h0IDw9IHJpZ2h0ICYmIG90aGVyX3JlY3QudG9wID49IHRvcCAmJiBvdGhlcl9yZWN0LmJvdHRvbSA8PSBib3R0b207CiAgICAgfQogCi0gICAgYm9vbAkJQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdAorICAgIEZYX0JPT0wJCUNvbnRhaW5zKGludCB4LCBpbnQgeSkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB4ID49IGxlZnQgJiYgeCA8IHJpZ2h0ICYmIHkgPj0gdG9wICYmIHkgPCBib3R0b207CiAgICAgfQpAQCAtNjM3LDcgKzYzNyw3IEBACiAKICAgICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwogCi0gICAgYm9vbAkJCQlJc0VtcHR5KCkgY29uc3QKKyAgICBGWF9CT09MCQkJCUlzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgYm90dG9tID49IHRvcDsKICAgICB9CkBAIC02NDksOSArNjQ5LDkgQEAKICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKICAgICB9CiAKLSAgICBib29sCQkJCUNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJQ29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3Q7CiAKLSAgICBib29sCQkJCUNvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJQ29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3Q7CiAKICAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKIApAQCAtNzg2LDExICs3ODYsMTEgQEAKIAogICAgIHZvaWQJCQlTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXggJm0pOwogCi0gICAgdm9pZAkJCUNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CisgICAgdm9pZAkJCUNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJQ29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKKyAgICB2b2lkCQkJQ29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKKyAgICB2b2lkCQkJQ29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBtLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAgICAgdm9pZAkJCVJlc2V0KCkKICAgICB7CiAgICAgICAgIFNldElkZW50aXR5KCk7CkBAIC04MDEsMzAgKzgwMSwzMCBAQAogICAgICAgICAqdGhpcyA9IG07CiAgICAgfQogCi0gICAgYm9vbAkJCUlzSWRlbnRpdHkoKSBjb25zdAorICAgIEZYX0JPT0wJCQlJc0lkZW50aXR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBhID09IDEgJiYgYiA9PSAwICYmIGMgPT0gMCAmJiBkID09IDEgJiYgZSA9PSAwICYmIGYgPT0gMDsKICAgICB9Ci0gICAgYm9vbAkJCUlzSW52ZXJ0aWJsZSgpIGNvbnN0OworICAgIEZYX0JPT0wJCQlJc0ludmVydGlibGUoKSBjb25zdDsKIAotICAgIGJvb2wJCQlJczkwUm90YXRlZCgpIGNvbnN0OworICAgIEZYX0JPT0wJCQlJczkwUm90YXRlZCgpIGNvbnN0OwogCi0gICAgYm9vbAkJCUlzU2NhbGVkKCkgY29uc3Q7CisgICAgRlhfQk9PTAkJCUlzU2NhbGVkKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKKyAgICB2b2lkCQkJVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlUcmFuc2xhdGVJKGludDMyX3QgeCwgaW50MzJfdCB5LCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSkKKyAgICB2b2lkCQkJVHJhbnNsYXRlSShpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpCiAgICAgewogICAgICAgICBUcmFuc2xhdGUoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5LCBiUHJlcGVuZGVkKTsKICAgICB9CiAKLSAgICB2b2lkCQkJU2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CisgICAgdm9pZAkJCVNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CisgICAgdm9pZAkJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJUm90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOworICAgIHZvaWQJCQlSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJU2hlYXIoRlhfRkxPQVQgZkFscGhhUmFkaWFuLCBGWF9GTE9BVCBmQmV0YVJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOworICAgIHZvaWQJCQlTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKICAgICB2b2lkCQkJTWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QgJmRlc3QsIGNvbnN0IENGWF9GbG9hdFJlY3QgJnNyYyk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAppbmRleCBhMDRmYzUyLi5mMjRmNDU0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCkBAIC0yMSwxMSArMjEsMTEgQEAKIGludDMyX3QJCUZYU1lTX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogaW50MzJfdAkJRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogCi1pbmxpbmUgYm9vbAlGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpCitpbmxpbmUgRlhfQk9PTAlGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpCiB7CiAgICAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7CiB9Ci1pbmxpbmUgYm9vbAlGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpCitpbmxpbmUgRlhfQk9PTAlGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpCiB7CiAgICAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7CiB9CkBAIC0zOCw4ICszOCw4IEBACiAgICAgcmV0dXJuIGNoIDwgJ2EnIHx8IGNoID4gJ3onID8gY2ggOiAoY2ggLSAweDIwKTsKIH0KIAotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlID0gZmFsc2UpOwotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgYm9vbCBiSWdub3JlQ2FzZSA9IGZhbHNlKTsKK0ZYX0RXT1JECUZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKK0ZYX0RXT1JECUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UgPSBGQUxTRSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCmluZGV4IGIwNWU4NGQuLmZkZDdiMTEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKQEAgLTExLDggKzExLDggQEAKIAogdm9pZCogRlhfT3BlbkZvbGRlcihjb25zdCBGWF9DSEFSKiBwYXRoKTsKIHZvaWQqIEZYX09wZW5Gb2xkZXIoY29uc3QgRlhfV0NIQVIqIHBhdGgpOwotYm9vbCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCYgYkZvbGRlcik7Ci1ib29sIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBib29sJiBiRm9sZGVyKTsKK0ZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsIEZYX0JPT0wmIGJGb2xkZXIpOworRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9XaWRlU3RyaW5nJiBmaWxlbmFtZSwgRlhfQk9PTCYgYkZvbGRlcik7CiB2b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSk7CiBGWF9XQ0hBUiBGWF9HZXRGb2xkZXJTZXBhcmF0b3IoKTsKIHR5cGVkZWYgc3RydWN0IEZYX0hGSUxFXyB7CkBAIC01MywyMyArNTMsMjMgQEAKIHNpemVfdAkJRlhfRmlsZV9SZWFkUG9zKEZYX0hGSUxFIGhGaWxlLCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiBzaXplX3QJCUZYX0ZpbGVfV3JpdGUoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CiBzaXplX3QJCUZYX0ZpbGVfV3JpdGVQb3MoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLWJvb2wJCUZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpOwotYm9vbAkJRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKTsKLWJvb2wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1ib29sCQlGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOwotYm9vbAkJRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1ib29sCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKTsKLWJvb2wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLWJvb2wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLWJvb2wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKLWJvb2wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK0ZYX0JPT0wJCUZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpOworRlhfQk9PTAkJRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKTsKK0ZYX0JPT0wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7CitGWF9CT09MCQlGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOworRlhfQk9PTAkJRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7CitGWF9CT09MCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKTsKK0ZYX0JPT0wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK0ZYX0JPT0wJCUZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK0ZYX0JPT0wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKK0ZYX0JPT0wJCUZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KTsKIGNsYXNzIElGWF9TdHJlYW1Xcml0ZQogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWF9TdHJlYW1Xcml0ZSgpIHsgfQogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwJYm9vbAkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSA9IDA7CiB9OwogY2xhc3MgSUZYX0ZpbGVXcml0ZSA6IHB1YmxpYyBJRlhfU3RyZWFtV3JpdGUKIHsKQEAgLTc5LDEwICs3OSwxMCBAQAogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0U2l6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZsdXNoKCkgPSAwOwogCi0gICAgdmlydHVhbAlib29sCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwJYm9vbAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBXcml0ZUJsb2NrKHBEYXRhLCBHZXRTaXplKCksIHNpemUpOwogICAgIH0KQEAgLTk2LDcgKzk2LDcgQEAKIAogICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgPSAwOwogCkBAIC0xMDksOSArMTA5LDkgQEAKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKQpAQCAtMTE5LDE0ICsxMTksMTQgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFJhbmdlKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRklMRVNJWkUgc2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZAkJCUNsZWFyUmFuZ2UoKSB7fQogCi0gICAgdmlydHVhbCBib29sCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiAgICAgewpAQCAtMTQ1LDIxICsxNDUsMjEgQEAKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJCUlzRU9GKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRQb3NpdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsCWJvb2wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKLSAgICB2aXJ0dWFsCWJvb2wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiAgICAgewogICAgICAgICByZXR1cm4gV3JpdGVCbG9jayhidWZmZXIsIEdldFNpemUoKSwgc2l6ZSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sCQkJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGbHVzaCgpID0gMDsKIH07CiBJRlhfRmlsZVN0cmVhbSoJCUZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOwogSUZYX0ZpbGVTdHJlYW0qCQlGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2Rlcyk7CkBAIC0xNjcsMzEgKzE2NywzMSBAQAogewogcHVibGljOgogCi0gICAgdmlydHVhbCBib29sCQkJSXNDb25zZWN1dGl2ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQkJRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpID0gMDsKIAogICAgIHZpcnR1YWwgdWludDhfdCoJCUdldEJ1ZmZlcigpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQJCQlBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQlEZXRhY2hCdWZmZXIoKSA9IDA7CiB9OwotSUZYX01lbW9yeVN0cmVhbSoJRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgYm9vbCBiVGFrZU92ZXIgPSBmYWxzZSk7Ci1JRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUgPSBmYWxzZSk7CitJRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsKK0lGWF9NZW1vcnlTdHJlYW0qCUZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSA9IEZBTFNFKTsKIGNsYXNzIElGWF9CdWZmZXJSZWFkIDogcHVibGljIElGWF9TdHJlYW1SZWFkCiB7CiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQkJSXNFT0YoKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpID0gMDsKIAogICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJCVJlYWROZXh0QmxvY2soYm9vbCBiUmVzdGFydCA9IGZhbHNlKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZE5leHRCbG9jayhGWF9CT09MIGJSZXN0YXJ0ID0gRkFMU0UpID0gMDsKIAogICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJCUdldEJsb2NrQnVmZmVyKCkgPSAwOwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgKaW5kZXggNzM2YWEzMi4uOGQ3MzU1NSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaApAQCAtNjcwLDcgKzY3MCw3IEBACiAgICAgdm9pZAkJCQkJRW1wdHkoKTsKIAogCi0gICAgYm9vbAkJCQkJSXNFbXB0eSgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gIUdldExlbmd0aCgpOwogICAgIH0KQEAgLTg5NSw3ICs4OTUsNyBAQAogICAgIHJldHVybiByaHMgIT0gbGhzOwogfQogRlhfRkxPQVQgRlhfYXRvZihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci12b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwgYm9vbCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKK3ZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyLCBGWF9CT09MJiBiSW50ZWdlciwgdm9pZCogcERhdGEpOwogRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGYsIEZYX0NIQVIqIGJ1Zik7CiBDRlhfQnl0ZVN0cmluZwlGWF9VVEY4RW5jb2RlKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIEZYX1NUUlNJWkUgbGVuKTsKIGlubGluZSBDRlhfQnl0ZVN0cmluZwlGWF9VVEY4RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTdHIpCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgKaW5kZXggOWZjYWYxNy4uOGJjMmI0YSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaApAQCAtNzEsNiArNzEsNyBAQAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBGWF9XT1JEOyAgICAgLy8gS2VlcCAtICJhbiBlZmZpY2llbnQgc21hbGwgdHlwZSIKIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgRlhfRFdPUkQ7ICAgIC8vIEtlZXAgLSAiYW4gZWZmaWNpZW50IHR5cGUiCiB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUOyAgICAvLyBLZWVwLCBhbGxvdyB1cGdyYWRlIHRvIGRvdWJsZXMuCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0w7ICAgICAvLyBLZWVwLCBzYWRseSBub3QgYWx3YXlzIDAgb3IgMS4KIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUjsgICAgIC8vIEtlZXAsIHF1ZXN0aW9uYWJsZSBzaWduZWRuZXNzLgogdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgICBGWF9XQ0hBUjsgICAgLy8gS2VlcCwgbWF5YmUgYmFkIHBsYXRmb3JtIHdjaGFycy4KIApAQCAtODMsNiArODQsMTQgQEAKICNkZWZpbmUgX0RFQlVHCiAjZW5kaWYKIAorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUJMQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UJMAorI2VuZGlmCisKICNpZm5kZWYgTlVMTAogI2RlZmluZSBOVUxMCTAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCmluZGV4IGQ5YjU3ODEuLjdiNzMwYmIgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKQEAgLTkyLDExICs5MiwxMSBAQAogICAgIEZYX0NIQVJUWVBFX0FyYWJpYwkJCQk9ICgxMiA8PCBGWF9DSEFSVFlQRUJJVFMpLAogfTsKIEZYX0RXT1JEIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKEZYX1dDSEFSIHdjaCk7Ci1ib29sCUZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpOwotYm9vbAlGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCk7Ci1ib29sIEZYX0lzQ29tYmluYXRpb25DaGFyKEZYX1dDSEFSIHdjaCk7Ci1ib29sCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKTsKLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKTsKLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKTsKK0ZYX0JPT0wJRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7CitGWF9CT09MCUZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKTsKK0ZYX0JPT0wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKTsKK0ZYX0JPT0wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpOworRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOworRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9VQ0RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaAppbmRleCAyMzNhOGY5Li5iYTMzYjIwIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oCkBAIC0zOCwyMSArMzgsMjEgQEAKIGNsYXNzIENYTUxfQ29udGVudAogewogcHVibGljOgotICAgIENYTUxfQ29udGVudCgpIDogbV9iQ0RBVEEoZmFsc2UpLCBtX0NvbnRlbnQoKSB7fQotICAgIHZvaWQJU2V0KGJvb2wgYkNEQVRBLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnQpCisgICAgQ1hNTF9Db250ZW50KCkgOiBtX2JDREFUQShGQUxTRSksIG1fQ29udGVudCgpIHt9CisgICAgdm9pZAlTZXQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCkKICAgICB7CiAgICAgICAgIG1fYkNEQVRBID0gYkNEQVRBOwogICAgICAgICBtX0NvbnRlbnQgPSBjb250ZW50OwogICAgIH0KLSAgICBib29sCQkJbV9iQ0RBVEE7CisgICAgRlhfQk9PTAkJCW1fYkNEQVRBOwogICAgIENGWF9XaWRlU3RyaW5nCW1fQ29udGVudDsKIH07CiBjbGFzcyBDWE1MX0VsZW1lbnQKIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBiU2F2ZVNwYWNlQ2hhcnMgPSBmYWxzZSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7Ci0gICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiU2F2ZVNwYWNlQ2hhcnMgPSBmYWxzZSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7Ci0gICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIsIGJvb2wgYlNhdmVTcGFjZUNoYXJzID0gZmFsc2UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOworICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzaXplLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlciwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CiAgICAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ05hbWUpOwogICAgIENYTUxfRWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFUYWdOYW1lKTsKICAgICBDWE1MX0VsZW1lbnQoKTsKQEAgLTYzLDkgKzYzLDkgQEAKIAogCiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldFRhZ05hbWUoYm9vbCBiUXVhbGlmaWVkID0gZmFsc2UpIGNvbnN0OworICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0VGFnTmFtZShGWF9CT09MIGJRdWFsaWZpZWQgPSBGQUxTRSkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWVzcGFjZShib29sIGJRdWFsaWZpZWQgPSBmYWxzZSkgY29uc3Q7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2UoRlhfQk9PTCBiUXVhbGlmaWVkID0gRkFMU0UpIGNvbnN0OwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2VVUkkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CiAKQEAgLTgxLDkgKzgxLDkgQEAKIAogICAgIHZvaWQJCQkJCUdldEF0dHJCeUluZGV4KGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJnZhbHVlKSBjb25zdDsKIAotICAgIGJvb2wJCQkJCUhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJSGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFOYW1lKSBjb25zdDsKIAotICAgIGJvb2wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHI7CkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIGJvb2wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHI7CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIGJvb2wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIGludAkJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIGludCBhdHRyID0gMDsKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICByZXR1cm4gYXR0cjsKICAgICB9CiAKLSAgICBib29sCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKICAgICBpbnQJCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiAgICAgewogICAgICAgICBpbnQgYXR0ciA9IDA7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgcmV0dXJuIGF0dHI7CiAgICAgfQogCi0gICAgYm9vbAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgRlhfRkxPQVQJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIEZYX0ZMT0FUIGF0dHIgPSAwOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIGJvb2wJCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIEZYX0ZMT0FUCQkJCUdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiAgICAgewogICAgICAgICBGWF9GTE9BVCBhdHRyID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKaW5kZXggMTE1ZWY1NS4uZmI5YmY0ZCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKQEAgLTQxLDggKzQxLDggQEAKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldERlc2NlbnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KSA9IDA7Ci0gICAgdmlydHVhbCBib29sCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SXRhbGljQW5nbGUoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCmluZGV4IDU1NGZlMzAuLjI3ZmMyZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oCkBAIC0xNzksMTMgKzE3OSwxMyBAQAogCiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KglHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0CisgICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJU2V0RG93blNhbXBsZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdCB7fQogCkBAIC0xOTQsMjQgKzE5NCwyNCBAQAogICAgICAgICByZXR1cm4gbV9icHA7CiAgICAgfQogCi0gICAgYm9vbAkJCUlzQWxwaGFNYXNrKCkgY29uc3QKKyAgICBGWF9CT09MCQkJSXNBbHBoYU1hc2soKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnID09IDE7CiAgICAgfQogCi0gICAgYm9vbAkJCUhhc0FscGhhKCkgY29uc3QKKyAgICBGWF9CT09MCQkJSGFzQWxwaGEoKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnICYgMiA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnICYgMiA/IFRSVUUgOiBGQUxTRTsKICAgICB9CiAKLSAgICBib29sCQkJSXNPcGFxdWVJbWFnZSgpIGNvbnN0CisgICAgRlhfQk9PTAkJCUlzT3BhcXVlSW1hZ2UoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuICEobV9BbHBoYUZsYWcgJiAzKTsKICAgICB9CiAKLSAgICBib29sCQkJSXNDbXlrSW1hZ2UoKSBjb25zdAorICAgIEZYX0JPT0wJCQlJc0NteWtJbWFnZSgpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiA0ID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiA0ID8gVFJVRSA6IEZBTFNFOwogICAgIH0KIAogCkBAIC0yNDgsMTEgKzI0OCwxMSBAQAogCiAgICAgQ0ZYX0RJQml0bWFwKglHZXRBbHBoYU1hc2soY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAotICAgIGJvb2wJCQlDb3B5QWxwaGFNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2ssIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCk7CisgICAgRlhfQk9PTAkJCUNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKTsKIAotICAgIENGWF9ESUJpdG1hcCoJU3dhcFhZKGJvb2wgYlhGbGlwLCBib29sIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKKyAgICBDRlhfRElCaXRtYXAqCVN3YXBYWShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXAsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CiAKLSAgICBDRlhfRElCaXRtYXAqCUZsaXBJbWFnZShib29sIGJYRmxpcCwgYm9vbCBiWUZsaXApIGNvbnN0OworICAgIENGWF9ESUJpdG1hcCoJRmxpcEltYWdlKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCkgY29uc3Q7CiAKICAgICB2b2lkCQkJR2V0T3ZlcmxhcFJlY3QoaW50JiBkZXN0X2xlZnQsIGludCYgZGVzdF90b3AsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LCBpbnQgc3JjX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwgaW50JiBzcmNfbGVmdCwgaW50JiBzcmNfdG9wLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKICAgICB2b2lkCQkJQnVpbGRQYWxldHRlKCk7CiAKLSAgICBib29sCQkJQnVpbGRBbHBoYU1hc2soKTsKKyAgICBGWF9CT09MCQkJQnVpbGRBbHBoYU1hc2soKTsKIAogICAgIGludAkJCQlGaW5kUGFsZXR0ZShGWF9EV09SRCBjb2xvcikgY29uc3Q7CiAKQEAgLTI5Miw5ICsyOTIsOSBAQAogCiAgICAgQ0ZYX0RJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCYgc3JjKTsKIAotICAgIGJvb2wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyID0gTlVMTCwgaW50IHBpdGNoID0gMCk7CisgICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMLCBpbnQgcGl0Y2ggPSAwKTsKIAotICAgIGJvb2wJCQlDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOworICAgIEZYX0JPT0wJCQlDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOwogCiAgICAgdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdAogICAgIHsKQEAgLTMwNywxMSArMzA3LDExIEBACiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwogCiAgICAgdm9pZAkJCVRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCk7CiAKLSAgICBib29sCQkJQ29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgRlhfQk9PTAkJCUNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGZvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAgICAgdm9pZAkJCUNsZWFyKEZYX0RXT1JEIGNvbG9yKTsKIApAQCAtMzE5LDQwICszMTksNDAgQEAKIAogICAgIHZvaWQJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKTsKIAotICAgIGJvb2wJCQlMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpOworICAgIEZYX0JPT0wJCQlMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpOwogCi0gICAgYm9vbAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CisgICAgRlhfQk9PTAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CiAKLSAgICBib29sCQkJTXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpOworICAgIEZYX0JPT0wJCQlNdWx0aXBseUFscGhhKGludCBhbHBoYSk7CiAKLSAgICBib29sCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKKyAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKIAotICAgIGJvb2wJCQlUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBGWF9CT09MCQkJVHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIGJvb2wJCQlDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgRlhfQk9PTAkJCUNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gTlVMTCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgYm9vbAkJCVRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBGWF9CT09MCQkJVHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIGJvb2wJCQlDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIEZYX0JPT0wJCQlDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gTlVMTCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJQ29tcG9zaXRlUmVjdChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgIEZYX0JPT0wJCQlDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJQ29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLCBGWF9EV09SRCBiYWNrY29sb3IpOworICAgIEZYX0JPT0wJCQlDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7CiAKLSAgICBib29sCQkJRGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0ID0gTlVMTCk7CisgICAgRlhfQk9PTAkJCURpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBhbF9zaXplLCBjb25zdCBGWF9SRUNUKiBwUmVjdCA9IE5VTEwpOwogcHJvdGVjdGVkOgogCiAgICAgdWludDhfdCoJCW1fcEJ1ZmZlcjsKIAotICAgIGJvb2wJCQltX2JFeHRCdWY7CisgICAgRlhfQk9PTAkJCW1fYkV4dEJ1ZjsKIAotICAgIGJvb2wJCQlHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgRlhfQk9PTAkJCUdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIH07CiBjbGFzcyBDRlhfRElCRXh0cmFjdG9yCiB7CkBAIC0zNzksNyArMzc5LDcgQEAKIAogICAgIH5DRlhfRmlsdGVyZWRESUIoKTsKIAotICAgIHZvaWQJCQkJCUxvYWRTcmMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgYm9vbCBiQXV0b0Ryb3BTcmMgPSBmYWxzZSk7CisgICAgdm9pZAkJCQkJTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyA9IEZBTFNFKTsKIAogICAgIHZpcnR1YWwgRlhESUJfRm9ybWF0CUdldERlc3RGb3JtYXQoKSA9IDA7CiAKQEAgLTM5MiwxMSArMzkyLDExIEBACiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZAkJCURvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwogCiAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJbV9wU3JjOwogCi0gICAgYm9vbAkJCQkJbV9iQXV0b0Ryb3BTcmM7CisgICAgRlhfQk9PTAkJCQkJbV9iQXV0b0Ryb3BTcmM7CiAKICAgICB1aW50OF90KgkJCQltX3BTY2FubGluZTsKIH07CkBAIC00MDcsNyArNDA3LDcgQEAKIAogICAgIHZpcnR1YWwJdm9pZAkJQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAkJU2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKSA9IDA7CiB9OwogY2xhc3MgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcgogewpAQCAtNDE2LDggKzQxNiw4IEBACiAKICAgICB+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOwogCi0gICAgYm9vbAkJCQlJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIGludDMyX3Qgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIGJvb2wgYkNsaXAsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICBGWF9CT09MCQkJCUluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgRlhfQk9PTCBiQ2xpcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAKICAgICB2b2lkCQkJCUNvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCkBAIC00NDksNyArNDQ5LDcgQEAKICAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07CiAgICAgdWludDhfdCoJCQltX3BDYWNoZVNjYW5saW5lOwogICAgIGludAkJCQkJbV9DYWNoZVNpemU7Ci0gICAgYm9vbCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CiB9OwogY2xhc3MgQ0ZYX0JpdG1hcENvbXBvc2VyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyCiB7CkBAIC00NjEsMTEgKzQ2MSwxMSBAQAogCiAKICAgICB2b2lkCQkJCUNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIGJvb2wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwgYm9vbCBiRmxpcFksIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFksIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKIAogCiAgICAgdmlydHVhbAl2b2lkCQlDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKTsKQEAgLTQ4MCwxMCArNDgwLDEwIEBACiAgICAgRlhfRFdPUkQJCQltX01hc2tDb2xvcjsKICAgICBjb25zdCBDRlhfRElCaXRtYXAqCW1fcENsaXBNYXNrOwogICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IJbV9Db21wb3NpdG9yOwotICAgIGJvb2wJCQkJbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKKyAgICBGWF9CT09MCQkJCW1fYlZlcnRpY2FsLCBtX2JGbGlwWCwgbV9iRmxpcFk7CiAgICAgaW50CQkJCQltX0FscGhhRmxhZzsKICAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07Ci0gICAgYm9vbCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CiAgICAgaW50CQkJCQltX0JsZW5kVHlwZTsKICAgICB2b2lkCQkJCUNvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCk7CiAgICAgdWludDhfdCogbV9wU2NhbmxpbmVWOwpAQCAtNTAxLDcgKzUwMSw3IEBACiAKICAgICB2aXJ0dWFsCXZvaWQJCUNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpOwogCi0gICAgdmlydHVhbCBib29sCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CiAKICAgICBDRlhfRElCaXRtYXAqCQlHZXRCaXRtYXAoKQogICAgIHsKQEAgLTUyMSwyMiArNTIxLDIyIEBACiAgICAgQ0ZYX0ltYWdlU3RyZXRjaGVyKCk7CiAgICAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOwogCi0gICAgYm9vbCBTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgRlhfQk9PTCBTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKTsKIAotICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGJvb2wgU3RhcnRRdWlja1N0cmV0Y2goKTsKLSAgICBib29sIFN0YXJ0U3RyZXRjaCgpOwotICAgIGJvb2wgQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGJvb2wgQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIFN0YXJ0UXVpY2tTdHJldGNoKCk7CisgICAgRlhfQk9PTCBTdGFydFN0cmV0Y2goKTsKKyAgICBGWF9CT09MIENvbnRpbnVlUXVpY2tTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIENvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7CiAKICAgICBJRlhfU2NhbmxpbmVDb21wb3NlcioJbV9wRGVzdDsKICAgICBjb25zdCBDRlhfRElCU291cmNlKgltX3BTb3VyY2U7CiAgICAgQ1N0cmV0Y2hFbmdpbmUqCQltX3BTdHJldGNoRW5naW5lOwogICAgIEZYX0RXT1JECQltX0ZsYWdzOwotICAgIGJvb2wJCQltX2JGbGlwWDsKLSAgICBib29sICAgICAgICAgbV9iRmxpcFk7CisgICAgRlhfQk9PTAkJCW1fYkZsaXBYOworICAgIEZYX0JPT0wgICAgICAgICBtX2JGbGlwWTsKICAgICBpbnQJCQkJbV9EZXN0V2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgIG1fRGVzdEhlaWdodDsKICAgICBGWF9SRUNUCQkJbV9DbGlwUmVjdDsKQEAgLTU1MiwxMCArNTUyLDEwIEBACiAgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKICAgICB+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKIAotICAgIGJvb2wgU3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICBGWF9CT09MIFN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKIAotICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgQ0ZYX0FmZmluZU1hdHJpeCogbV9wTWF0cml4OwogICAgIEZYX1JFQ1QJCW1fU3RyZXRjaENsaXA7CkBAIC01NzUsMTQgKzU3NSwxNCBAQAogICAgIENGWF9JbWFnZVJlbmRlcmVyKCk7CiAgICAgfkNGWF9JbWFnZVJlbmRlcmVyKCk7CiAKLSAgICBib29sIFN0YXJ0KENGWF9ESUJpdG1hcCogcERldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgIEZYX0JPT0wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCiAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkaWJfZmxhZ3MsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAgICAgRlhfRFdPUkQJCQltX0ZsYWdzOwogICAgIGludAkJCQkJbV9BbHBoYUZsYWc7CiAgICAgdm9pZCoJCQkJbV9wSWNjVHJhbnNmb3JtOwotICAgIGJvb2wJCQkJbV9iUmdiQnl0ZU9yZGVyOworICAgIEZYX0JPT0wJCQkJbV9iUmdiQnl0ZU9yZGVyOwogICAgIGludAkJCQkJbV9CbGVuZFR5cGU7CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKaW5kZXggMjBlZjVkNC4uMjgzMmZiZiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaApAQCAtNTYsMTIgKzU2LDEyIEBACiAgICAgQ0ZYX0ZvbnQoKTsKICAgICB+Q0ZYX0ZvbnQoKTsKIAotICAgIGJvb2wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIGJvb2wgYlZlcnRpY2FsID0gZmFsc2UpOworICAgIEZYX0JPT0wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0UpOwogCi0gICAgYm9vbAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOworICAgIEZYX0JPT0wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKIAotICAgIGJvb2wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpOworICAgIEZYX0JPT0wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpOwogCiAgICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAogICAgIHsKQEAgLTgyLDE1ICs4MiwxNSBAQAogCiAgICAgaW50CQkJCQkJR2V0RGVzY2VudCgpIGNvbnN0OwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgR2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRHbHlwaEJCb3goRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QgJmJib3gpOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgSXNJdGFsaWMoKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0l0YWxpYygpOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgSXNCb2xkKCk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNCb2xkKCk7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICBJc0ZpeGVkV2lkdGgoKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0ZpeGVkV2lkdGgoKTsKIAotICAgIGJvb2wJCQkJCUlzVmVydGljYWwoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJCUlzVmVydGljYWwoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYlZlcnRpY2FsOwogICAgIH0KQEAgLTEwMyw5ICsxMDMsOSBAQAogICAgIENGWF9CeXRlU3RyaW5nICAgICAgICAgIEdldEZhY2VOYW1lKCkgY29uc3Q7CiAKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgIElzVFRGb250KCk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNUVEZvbnQoKTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgIEdldEJCb3goRlhfUkVDVCAmYmJveCk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0QkJveChGWF9SRUNUICZiYm94KTsKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldEhlaWdodCgpOwogCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICBGWEZUX0ZhY2UJCQkJbV9GYWNlOwogCiAgICAgQ0ZYX1N1YnN0Rm9udCoJCQltX3BTdWJzdEZvbnQ7Ci0gICAgYm9vbAkJCQkJSXNFbWJlZGRlZCgpCisgICAgRlhfQk9PTAkJCQkJSXNFbWJlZGRlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iRW1iZWRkZWQ7CiAgICAgfQpAQCAtMTMzLDE0ICsxMzMsMTQgQEAKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BQbGF0Zm9ybUZvbnQ7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BEd0ZvbnQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgbV9iRHdMb2FkZWQ7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgbV9iRHdMb2FkZWQ7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKIAogICAgIHZvaWQJCQkJCURlbGV0ZUZhY2UoKTsKIHByb3RlY3RlZDoKIAotICAgIGJvb2wJCQkJCW1fYkVtYmVkZGVkOwotICAgIGJvb2wJCQkJCW1fYlZlcnRpY2FsOworICAgIEZYX0JPT0wJCQkJCW1fYkVtYmVkZGVkOworICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOwogICAgIHZvaWQqCQkJCQltX3BPd25lZFN0cmVhbTsKIH07CiAjZGVmaW5lIEVOQ09ESU5HX0lOVEVSTkFMCQkwCkBAIC0xODIsMTEgKzE4MiwxMSBAQAogCiAgICAgaW50CQkJCQkJbV9JdGFsaWNBbmdsZTsKIAotICAgIGJvb2wJCQkJCW1fYlN1YnN0T2ZDSks7CisgICAgRlhfQk9PTAkJCQkJbV9iU3Vic3RPZkNKSzsKIAogICAgIGludAkJCQkJCW1fV2VpZ2h0Q0pLOwogCi0gICAgYm9vbAkJCQkJbV9iSXRsaWNDSks7CisgICAgRlhfQk9PTAkJCQkJbV9iSXRsaWNDSks7CiB9OwogI2RlZmluZSBGWF9GT05UX0ZMQUdfU0VSSUYgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgRlhfRk9OVF9GTEFHX0ZJWEVEUElUQ0gJCQkweDAyCkBAIC0yMDYsOSArMjA2LDkgQEAKICAgICB+Q0ZYX0ZvbnRNZ3IoKTsKICAgICB2b2lkCQkJSW5pdEZUTGlicmFyeSgpOwogICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiYgcEZvbnREYXRhKTsKICAgICBGWEZUX0ZhY2UJCUFkZENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpOwogICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsIEZYX0RXT1JEIGNoZWNrc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCwgdWludDhfdComIHBGb250RGF0YSk7CiAgICAgRlhGVF9GYWNlCQlBZGRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCkBAIC0yMTcsMTIgKzIxNywxMiBAQAogICAgIEZYRlRfRmFjZQkJR2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CiAgICAgdm9pZAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKICAgICB2b2lkCQkJU2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pOwotICAgIEZYRlRfRmFjZQkJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgRlhGVF9GYWNlCQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKIAogICAgIHZvaWQJCQlGcmVlQ2FjaGUoKTsKIAotICAgIGJvb2wJCQlHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwgRlhfRFdPUkQmIHNpemUsIGludCBpbmRleCk7CisgICAgRlhfQk9PTAkJCUdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KTsKICAgICBDRlhfRm9udE1hcHBlcioJbV9wQnVpbHRpbk1hcHBlcjsKICAgICBJRlhfRm9udE1hcHBlcioJbV9wRXh0TWFwcGVyOwogICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9GYWNlTWFwOwpAQCAtMjM1LDcgKzIzNSw3IEBACiAKICAgICB2aXJ0dWFsIH5JRlhfRm9udE1hcHBlcigpIHt9CiAKLSAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKKyAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgPSAwOwogCiAgICAgQ0ZYX0ZvbnRNZ3IqCQltX3BGb250TWdyOwpAQCAtMjc3LDE0ICsyNzcsMTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BGb250RW51bWVyYXRvcjsKICAgICB9Ci0gICAgdmlydHVhbCBGWEZUX0ZhY2UJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgdmlydHVhbCBGWEZUX0ZhY2UJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOwogcHJpdmF0ZToKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0UFNOYW1lRnJvbVRUKHZvaWQqIGhGb250KTsKICAgICBDRlhfQnl0ZVN0cmluZwkJTWF0Y2hJbnN0YWxsZWRGb250cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbm9ybV9uYW1lKTsKICAgICBGWEZUX0ZhY2UJCQlVc2VJbnRlcm5hbFN1YnN0KENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQsIGludCBpQmFzZUZvbnQsIGludCBpdGFsaWNfYW5nbGUsIGludCB3ZWlnaHQsIGludCBwaWN0aGZhbWlseSk7CiAKLSAgICBib29sCQkJCW1fYkxpc3RMb2FkZWQ7CisgICAgRlhfQk9PTAkJCQltX2JMaXN0TG9hZGVkOwogICAgIEZYRlRfRmFjZQkJCW1fTU1GYWNlc1syXTsKICAgICBDRlhfQnl0ZVN0cmluZwkJbV9MYXN0RmFtaWx5OwogICAgIENGWF9EV29yZEFycmF5CQltX0NoYXJzZXRBcnJheTsKQEAgLTI5OSwxMiArMjk5LDEyIEBACiAgICAgc3RhdGljIElGWF9TeXN0ZW1Gb250SW5mbyoJQ3JlYXRlRGVmYXVsdCgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwJYm9vbAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkgPSAwOworICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSA9IDA7CiAgICAgdmlydHVhbCBpbnQJCQlHZXRGYWNlSW5kZXgodm9pZCogaEZvbnQpCiAgICAgewogICAgICAgICByZXR1cm4gMDsKQEAgLTMyNiwxNSArMzI2LDE1IEBACiAKICAgICAvLyBJRlhfU3l0ZW1Gb250SW5mbzoKICAgICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKLSAgICBib29sIEVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgb3ZlcnJpZGU7Ci0gICAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LAorICAgIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCiAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGJFeGFjdCkgb3ZlcnJpZGU7CiAgICAgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSBvdmVycmlkZTsKICAgICBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKSBvdmVycmlkZTsKICAgICB2b2lkIERlbGV0ZUZvbnQodm9pZCogaEZvbnQpIG92ZXJyaWRlOwotICAgIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKLSAgICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgICBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRMaXN0OwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAgICAgfkNGWF9Gb250Q2FjaGUoKTsKICAgICBDRlhfRmFjZUNhY2hlKgkJCUdldENhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KTsKICAgICB2b2lkCQkJCQlSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOwotICAgIHZvaWQJCQkJCUZyZWVDYWNoZShib29sIGJSZWxlYXNlID0gZmFsc2UpOworICAgIHZvaWQJCQkJCUZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOwogCiBwcml2YXRlOgogICAgIHVzaW5nIENGWF9GVENhY2hlTWFwID0gc3RkOjptYXA8RlhGVF9GYWNlLCBDRlhfQ291bnRlZEZhY2VDYWNoZSo+OwpAQCAtMzkxLDcgKzM5MSw3IEBACiB7CiBwdWJsaWM6CiAgICAgfkNGWF9GYWNlQ2FjaGUoKTsKLSAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqCUxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBib29sIGJGb250U3R5bGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKglMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncyk7CiAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKgkJTG9hZEdseXBoUGF0aChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCk7CiAKQEAgLTM5OSwxMiArMzk5LDEyIEBACiAgICAgQ0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSk7CiBwcml2YXRlOgogICAgIEZYRlRfRmFjZQkJCQltX0ZhY2U7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLAorICAgIENGWF9HbHlwaEJpdG1hcCoJCVJlbmRlckdseXBoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOwogICAgIENGWF9HbHlwaEJpdG1hcCoJCVJlbmRlckdseXBoX05hdGl2ZXRleHQoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwKICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7CiAgICAgQ0ZYX0dseXBoQml0bWFwKiAgICAgICAgTG9va1VwR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfQnl0ZVN0cmluZ0MmIEZhY2VHbHlwaHNLZXksCi0gICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOworICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fU2l6ZU1hcDsKICAgICBDRlhfTWFwUHRyVG9QdHIJCQltX1BhdGhNYXA7CiAgICAgQ0ZYX0RJQml0bWFwKiAgICAgICAgICAgbV9wQml0bWFwOwpAQCAtNDE4LDE2ICs0MTgsMTYgQEAKICAgICBGWF9GTE9BVAkJCW1fZk9yaWdpblgsIG1fZk9yaWdpblk7CiB9IEZYVEVYVF9HTFlQSFBPUzsKIEZYX1JFQ1QgRlhHRV9HZXRHbHlwaHNCQm94KEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzLCBpbnQgYW50aV9hbGlhcywgRlhfRkxPQVQgcmV0aW5hU2NhbGVYID0gMS4wZiwgRlhfRkxPQVQgcmV0aW5hU2NhbGVZID0gMS4wZik7Ci1ib29sCU91dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCitGWF9CT09MCU91dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIHVuc2lnbmVkIGxvbmcgZ2x5cGhfaW5kZXgsIHVuc2lnbmVkIGxvbmcgYXJnYik7Ci1ib29sCU91dHB1dFRleHQodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKK0ZYX0JPT0wJT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0X21hdHJpeCwgdW5zaWduZWQgc2hvcnQgY29uc3QqIHRleHQsIHVuc2lnbmVkIGxvbmcgYXJnYik7CiBjbGFzcyBJRlhfR1NVQlRhYmxlCiB7CiBwdWJsaWM6CiAgICAgc3RhdGljIElGWF9HU1VCVGFibGUqIENyZWF0ZShDRlhfRm9udCogcEZvbnQpOwogICAgIHZpcnR1YWwgfklGWF9HU1VCVGFibGUoKSB7IH0KLSAgICB2aXJ0dWFsIGJvb2wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZPTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oCmluZGV4IDU5NjU2NDEuLmZkOWMxNDggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaApAQCAtMTkzLDExICsxOTMsMTEgQEAKIAogICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwogCi0gICAgYm9vbAkJCQlJc1JlY3QoKSBjb25zdDsKKyAgICBGWF9CT09MCQkJCUlzUmVjdCgpIGNvbnN0OwogCi0gICAgYm9vbAkJCQlHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBib29sJmJUaGluLCBib29sIGJBZGp1c3QpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJR2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCZiVGhpbiwgRlhfQk9PTCBiQWRqdXN0KSBjb25zdDsKIAotICAgIGJvb2wJCQkJSXNSZWN0KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHJlY3QpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJSXNSZWN0KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHJlY3QpIGNvbnN0OwogCiAgICAgdm9pZCBBcHBlbmQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKICAgICB2b2lkIEFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKTsKQEAgLTI5NCwxMCArMjk0LDEwIEBACiAgICAgRlhfRFdPUkQJCQltX0dseXBoSW5kZXg7CiAgICAgRlhfRkxPQVQJCQltX09yaWdpblgsIG1fT3JpZ2luWTsKICAgICBpbnQJCQkJCW1fRm9udENoYXJXaWR0aDsKLSAgICBib29sCQkJCW1fYkdseXBoQWRqdXN0OworICAgIEZYX0JPT0wJCQkJbV9iR2x5cGhBZGp1c3Q7CiAgICAgRlhfRkxPQVQJCQltX0FkanVzdE1hdHJpeFs0XTsKICAgICBGWF9EV09SRAkJCW1fRXh0R0lEOwotICAgIGJvb2wJCQkJbV9iRm9udFN0eWxlOworICAgIEZYX0JPT0wJCQkJbV9iRm9udFN0eWxlOwogfSBGWFRFWFRfQ0hBUlBPUzsKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2UKIHsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOwogICAgIH0KIAotICAgIGJvb2wJCQlTdGFydFJlbmRlcmluZygpOworICAgIEZYX0JPT0wJCQlTdGFydFJlbmRlcmluZygpOwogCiAgICAgdm9pZAkJCUVuZFJlbmRlcmluZygpOwogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogICAgIHZvaWQJCQlTYXZlU3RhdGUoKTsKIAotICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkID0gZmFsc2UpOworICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOwogCiAKIApAQCAtMzY1LDI2ICszNjUsMjYgQEAKICAgICAgICAgbV9wQml0bWFwID0gcEJpdG1hcDsKICAgICB9CiAKLSAgICBib29sCQkJQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3Q7CisgICAgRlhfQk9PTAkJCUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OwogCiAgICAgY29uc3QgRlhfUkVDVCYJR2V0Q2xpcEJveCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9DbGlwQm94OwogICAgIH0KIAotICAgIGJvb2wJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIEZYX0JPT0wJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBib29sCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKKyAgICBGWF9CT09MCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKIAotICAgIGJvb2wJCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgRlhfQk9PTAkJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgYm9vbAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIEZYX0JPT0wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC0zOTUsNDYgKzM5NSw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTAogICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBib29sCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGNvbG9yLAorICAgIEZYX0JPT0wJCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIGJvb2wJCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MCQkJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSA9IDAsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIGJvb2wJCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgIEZYX0JPT0wJCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAgICAgQ0ZYX0RJQml0bWFwKiAgIEdldEJhY2tEcm9wKCk7CiAKLSAgICBib29sCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICBGWF9CT09MCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIGJvb2wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAorICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIGJvb2wJCQlTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MCQkJU2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCisgICAgRlhfQk9PTAkJCVN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwgRlhfRFdPUkQgZmxhZ3MgPSAwLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIGJvb2wJCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MCQkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBib29sCQkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgRlhfQk9PTAkJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgdm9pZAkJCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOwogCi0gICAgYm9vbAkJCURyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICBGWF9CT09MCQkJRHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0RXT1JEIHRleHRfZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgYm9vbAkJCURyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgRlhfQk9PTAkJCURyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTQ3NywxMiArNDc3LDEyIEBACiAKICAgICB+Q0ZYX0Z4Z2VEZXZpY2UoKTsKIAotICAgIGJvb2wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgYm9vbCBiR3JvdXBLbm9ja291dCA9IGZhbHNlKTsKKyAgICBGWF9CT09MCQkJQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzID0gMCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQgPSBGQUxTRSk7CiAKLSAgICBib29sCQkJQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzID0gMCwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCk7CisgICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwogcHJvdGVjdGVkOgogCi0gICAgYm9vbAkJCW1fYk93bmVkQml0bWFwOworICAgIEZYX0JPT0wJCQltX2JPd25lZEJpdG1hcDsKIH07CiBjbGFzcyBDRlhfU2tpYURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCiB7CkBAIC00OTIsMTkgKzQ5MiwxOSBAQAogCiAgICAgfkNGWF9Ta2lhRGV2aWNlKCk7CiAKLSAgICBib29sCQkJQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzID0gMCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIGJvb2wgYkdyb3VwS25vY2tvdXQgPSBmYWxzZSk7CisgICAgRlhfQk9PTAkJCUF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cyA9IDAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOwogCi0gICAgYm9vbAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOworICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKIHByb3RlY3RlZDoKIAotICAgIGJvb2wJCQltX2JPd25lZEJpdG1hcDsKKyAgICBGWF9CT09MCQkJbV9iT3duZWRCaXRtYXA7CiB9OwogY2xhc3MgSUZYX1JlbmRlckRldmljZURyaXZlcgogewogcHVibGljOgogCi0gICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCQlDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCi0gICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBib29sIGJHcm91cEtub2Nrb3V0ID0gZmFsc2UpOworICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKgkJQ3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAorICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKIAogICAgIHZpcnR1YWwgfklGWF9SZW5kZXJEZXZpY2VEcml2ZXIoKSB7fQogICAgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHsgfQpAQCAtNTE3LDE0ICs1MTcsMTQgQEAKICAgICAgICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbAlTdGFydFJlbmRlcmluZygpCisgICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJRW5kUmVuZGVyaW5nKCkge30KQEAgLTUzNCwyMyArNTM0LDIzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQJU2F2ZVN0YXRlKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpID0gMDsKIAogCi0gICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC01NjEsNTkgKzU2MSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBib29sIGJERWRnZSA9IGZhbHNlKQorICAgIHZpcnR1YWwgRlhfQk9PTAlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgdmlydHVhbCBGWF9CT09MCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBib29sCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCisgICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkge30KIAotICAgIHZpcnR1YWwgYm9vbCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCkBAIC02NDYsMTMgKzY0NiwxMyBAQAogCiAgICAgfkNGWF9QU1JlbmRlcmVyKCk7CiAKLSAgICB2b2lkCQkJSW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc19sZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJDbXlrT3V0cHV0KTsKLSAgICBib29sCQkJU3RhcnRSZW5kZXJpbmcoKTsKKyAgICB2b2lkCQkJSW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc19sZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJDbXlrT3V0cHV0KTsKKyAgICBGWF9CT09MCQkJU3RhcnRSZW5kZXJpbmcoKTsKICAgICB2b2lkCQkJRW5kUmVuZGVyaW5nKCk7CiAKICAgICB2b2lkCQkJU2F2ZVN0YXRlKCk7CiAKLSAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCA9IGZhbHNlKTsKKyAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKIAogICAgIHZvaWQJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLApAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgIHJldHVybiBtX0NsaXBCb3g7CiAgICAgfQogCi0gICAgYm9vbAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIEZYX0JPT0wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC02NzksMTggKzY3OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBib29sCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgRlhfQk9PTAkJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBib29sCQkJRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MCQkJRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIGJvb2wJCQlEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgIEZYX0JPT0wJCQlEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiBwcml2YXRlOgpAQCAtNzAxLDExICs3MDEsMTEgQEAKIAogICAgIENGWF9HcmFwaFN0YXRlRGF0YQltX0N1ckdyYXBoU3RhdGU7CiAKLSAgICBib29sCQkJbV9iR3JhcGhTdGF0ZVNldDsKKyAgICBGWF9CT09MCQkJbV9iR3JhcGhTdGF0ZVNldDsKIAotICAgIGJvb2wJCQltX2JDbXlrT3V0cHV0OworICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OwogCi0gICAgYm9vbAkJCW1fYkNvbG9yU2V0OworICAgIEZYX0JPT0wJCQltX2JDb2xvclNldDsKIAogICAgIEZYX0RXT1JECQltX0xhc3RDb2xvcjsKIApAQCAtNzE0LDcgKzcxNCw3IEBACiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BTRm9udCo+CW1fUFNGb250TGlzdDsKIAogICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX1JFQ1Q+CW1fQ2xpcEJveFN0YWNrOwotICAgIGJvb2wJCQltX2JJbml0ZWQ7CisgICAgRlhfQk9PTAkJCW1fYkluaXRlZDsKIAogICAgIHZvaWQJCQlPdXRwdXRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oCmluZGV4IGViZTYxY2MuLjBmYjhiZWQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaApAQCAtMTMsMTUgKzEzLDE1IEBACiBwdWJsaWM6CiAgICAgQ0ZYX1F1YXJ0ekRldmljZSgpOwogICAgIH5DRlhfUXVhcnR6RGV2aWNlKCk7Ci0gICAgYm9vbCBBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzID0gRlhEQ19ESVNQTEFZKTsKLSAgICBib29sIEF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotICAgIGJvb2wgQ3JlYXRlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0KTsKKyAgICBGWF9CT09MIEF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOworICAgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7CisgICAgRlhfQk9PTCBDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOwogCiAgICAgQ0dDb250ZXh0UmVmIEdldENvbnRleHQoKTsKIAogcHJvdGVjdGVkOgogICAgIENHQ29udGV4dFJlZiBtX3BDb250ZXh0OwotICAgIGJvb2wgbV9iT3duZWRCaXRtYXA7CisgICAgRlhfQk9PTCBtX2JPd25lZEJpdG1hcDsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgKaW5kZXggODAyM2JkOC4uNWIxNjE0NiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oCkBAIC03MiwxMyArNzIsMTMgQEAKIGNsYXNzIENGWF9XaW5kb3dzRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UKIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlcioJQ3JlYXRlRHJpdmVyKEhEQyBoREMsIGJvb2wgYkNteWtPdXRwdXQgPSBmYWxzZSk7CisgICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCUNyZWF0ZURyaXZlcihIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0ID0gRkFMU0UpOwogCi0gICAgQ0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCA9IGZhbHNlLCBib29sIGJGb3JjZVBTT3V0cHV0ID0gZmFsc2UsIGludCBwc0xldmVsID0gMik7CisgICAgQ0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFLCBGWF9CT09MIGJGb3JjZVBTT3V0cHV0ID0gRkFMU0UsIGludCBwc0xldmVsID0gMik7CiAKICAgICBIREMJCUdldERDKCkgY29uc3Q7CiAKLSAgICBib29sIG1fYkZvcmNlUFNPdXRwdXQ7CisgICAgRlhfQk9PTCBtX2JGb3JjZVBTT3V0cHV0OwogCiAgICAgc3RhdGljIGludCBtX3BzTGV2ZWw7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2ptb3JlY2ZnLmggYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaAppbmRleCBlMGE4NzFlLi44OGQyMTA5IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaAorKysgYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaApAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAogLyoKLSAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBmYWxzZSwgdHJ1ZSBtYXkgYXBwZWFyCisgKiBPbiBhIGZldyBzeXN0ZW1zLCB0eXBlIGJvb2xlYW4gYW5kL29yIGl0cyB2YWx1ZXMgRkFMU0UsIFRSVUUgbWF5IGFwcGVhcgogICogaW4gc3RhbmRhcmQgaGVhZGVyIGZpbGVzLiAgT3IgeW91IG1heSBoYXZlIGNvbmZsaWN0cyB3aXRoIGFwcGxpY2F0aW9uLQogICogc3BlY2lmaWMgaGVhZGVyIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSB0b2dldGhlciB3aXRoIHRoZXNlIGZpbGVzLgogICogRGVmaW5pbmcgSEFWRV9CT09MRUFOIGJlZm9yZSBpbmNsdWRpbmcganBlZ2xpYi5oIHNob3VsZCBtYWtlIGl0IHdvcmsuCkBAIC0yMzksMTEgKzIzOSwxMSBAQAogI2lmbmRlZiBIQVZFX0JPT0xFQU4KIHR5cGVkZWYgaW50IGJvb2xlYW47CiAjZW5kaWYKLSNpZm5kZWYgZmFsc2UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCi0jZGVmaW5lIGZhbHNlCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCisjaWZuZGVmIEZBTFNFCQkJLyogaW4gY2FzZSB0aGVzZSBtYWNyb3MgYWxyZWFkeSBleGlzdCAqLworI2RlZmluZSBGQUxTRQkwCQkvKiB2YWx1ZXMgb2YgYm9vbGVhbiAqLwogI2VuZGlmCi0jaWZuZGVmIHRydWUKLSNkZWZpbmUgdHJ1ZQkxCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRQkxCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdpbnQuaAppbmRleCA3NDVhNGMwLi45NWIwMGQ0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oCisrKyBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmgKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAogCQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpKTsKIAotICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiB0cnVlIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCisgIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KIH07CiAKIC8qIEZvcndhcmQgRENUIChhbHNvIGNvbnRyb2xzIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbikgKi8KQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAgIC8qIFRoaXMgaXMgaGVyZSB0byBzaGFyZSBjb2RlIGJldHdlZW4gYmFzZWxpbmUgYW5kIHByb2dyZXNzaXZlIGRlY29kZXJzOyAqLwogICAvKiBvdGhlciBtb2R1bGVzIHByb2JhYmx5IHNob3VsZCBub3QgdXNlIGl0ICovCi0gIGJvb2xlYW4gaW5zdWZmaWNpZW50X2RhdGE7CS8qIHNldCB0cnVlIGFmdGVyIGVtaXR0aW5nIHdhcm5pbmcgKi8KKyAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IFRSVUUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLwogfTsKIAogLyogSW52ZXJzZSBEQ1QgKGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24pICovCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAogCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwogCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIHRydWUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLwogfTsKIAogLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2xpYi5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdsaWIuaAppbmRleCA3ODgzMWFjLi43ZGU1YWI3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2xpYi5oCisrKyBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnbGliLmgKQEAgLTE1MywxMiArMTUzLDEyIEBACiAgICAqIENBVVRJT046IElKRyB2ZXJzaW9ucyBwcmlvciB0byB2NmEga2VwdCB0aGlzIGFycmF5IGluIHppZ3phZyBvcmRlci4KICAgICovCiAgIFVJTlQxNiBxdWFudHZhbFtEQ1RTSVpFMl07CS8qIHF1YW50aXphdGlvbiBzdGVwIGZvciBlYWNoIGNvZWZmaWNpZW50ICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgZmFsc2Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCB0cnVlIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLgorICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KICAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCiAgICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiB0cnVlIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KIH0gSlFVQU5UX1RCTDsKIAogCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogICBVSU5UOCBiaXRzWzE3XTsJCS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlcyBvZiAqLwogCQkJCS8qIGxlbmd0aCBrIGJpdHM7IGJpdHNbMF0gaXMgdW51c2VkICovCiAgIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsJCS8qIFRoZSBzeW1ib2xzLCBpbiBvcmRlciBvZiBpbmNyIGNvZGUgbGVuZ3RoICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgZmFsc2Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCB0cnVlIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLgorICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KICAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCiAgICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiB0cnVlIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KIH0gSkhVRkZfVEJMOwogCiAKQEAgLTM4NCwxMCArMzg0LDEwIEBACiAgICAqIHNldCBudW1fc2NhbnMgYW5kIHNjYW5faW5mbyB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb25zLgogICAgKi8KIAotICBib29sZWFuIHJhd19kYXRhX2luOwkJLyogdHJ1ZT1jYWxsZXIgc3VwcGxpZXMgZG93bnNhbXBsZWQgZGF0YSAqLwotICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiB0cnVlPWFyaXRobWV0aWMgY29kaW5nLCBmYWxzZT1IdWZmbWFuICovCi0gIGJvb2xlYW4gb3B0aW1pemVfY29kaW5nOwkvKiB0cnVlPW9wdGltaXplIGVudHJvcHkgZW5jb2RpbmcgcGFybXMgKi8KLSAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiB0cnVlPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9pbjsJCS8qIFRSVUU9Y2FsbGVyIHN1cHBsaWVzIGRvd25zYW1wbGVkIGRhdGEgKi8KKyAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLworICBib29sZWFuIG9wdGltaXplX2NvZGluZzsJLyogVFJVRT1vcHRpbWl6ZSBlbnRyb3B5IGVuY29kaW5nIHBhcm1zICovCisgIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCiAgIGludCBzbW9vdGhpbmdfZmFjdG9yOwkJLyogMS4uMTAwLCBvciAwIGZvciBubyBpbnB1dCBzbW9vdGhpbmcgKi8KICAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIERDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KIApAQCAtNDI3LDcgKzQyNyw3IEBACiAgIC8qCiAgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAKICAgICovCi0gIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogdHJ1ZSBpZiBzY2FuIHNjcmlwdCB1c2VzIHByb2dyZXNzaXZlIG1vZGUgKi8KKyAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwogICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLwogICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLwogCkBAIC01MDAsMTcgKzUwMCwxNyBAQAogCiAgIGRvdWJsZSBvdXRwdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSB3YW50ZWQgaW4gb3V0cHV0ICovCiAKLSAgYm9vbGVhbiBidWZmZXJlZF9pbWFnZTsJLyogdHJ1ZT1tdWx0aXBsZSBvdXRwdXQgcGFzc2VzICovCi0gIGJvb2xlYW4gcmF3X2RhdGFfb3V0OwkJLyogdHJ1ZT1kb3duc2FtcGxlZCBkYXRhIHdhbnRlZCAqLworICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiBUUlVFPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiBUUlVFPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCiAKICAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIElEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCi0gIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogdHJ1ZT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCi0gIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiB0cnVlPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCisgIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogVFJVRT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCisgIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiBUUlVFPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCiAKLSAgYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnM7CS8qIHRydWU9Y29sb3JtYXBwZWQgb3V0cHV0IHdhbnRlZCAqLworICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCiAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KICAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCi0gIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIHRydWU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLworICBib29sZWFuIHR3b19wYXNzX3F1YW50aXplOwkvKiBUUlVFPXVzZSB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKi8KICAgaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsJLyogbWF4ICMgY29sb3JzIHRvIHVzZSBpbiBjcmVhdGVkIGNvbG9ybWFwICovCiAgIC8qIHRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGU6ICovCiAgIGJvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAxLXBhc3MgcXVhbnRpemVyICovCkBAIC02MDIsOCArNjAyLDggQEAKICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKICAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCiAKLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiB0cnVlIGlmIFNPRm4gc3BlY2lmaWVzIHByb2dyZXNzaXZlIG1vZGUgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogdHJ1ZT1hcml0aG1ldGljIGNvZGluZywgZmFsc2U9SHVmZm1hbiAqLworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCiAKICAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCiAgIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwpAQCAtNjE0LDE3ICs2MTQsMTcgQEAKICAgLyogVGhlc2UgZmllbGRzIHJlY29yZCBkYXRhIG9idGFpbmVkIGZyb20gb3B0aW9uYWwgbWFya2VycyByZWNvZ25pemVkIGJ5CiAgICAqIHRoZSBKUEVHIGxpYnJhcnkuCiAgICAqLwotICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogdHJ1ZSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLwotICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyB0cnVlOiAqLworICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogVFJVRSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLworICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyBUUlVFOiAqLwogICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KICAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwogICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KICAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwogICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIHRydWUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KKyAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiBUUlVFIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCiAgIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KIAotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIHRydWU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwogCiAgIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCiAgICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKQEAgLTEwMzQsNyArMTAzNCw3IEBACiAjZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCiAjZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KICNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KLS8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSB0cnVlIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKKy8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKICAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgogICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCiAgKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCmluZGV4IGYxOTQ0NWYuLjgzYTQyMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcAorKysgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAKQEAgLTI0OSw4ICsyNDksOCBAQAogICAgIENSWVBUX01ENVVwZGF0ZSgmY3R4LCBpbnB1dCwgbGVuZ3RoKTsKICAgICBDUllQVF9NRDVGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KLXN0YXRpYyBib29sICgqZ19QdWJLZXlEZWNyeXB0b3IpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Ci12b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihib29sICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKQorc3RhdGljIEZYX0JPT0wgKCpnX1B1YktleURlY3J5cHRvcikoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pID0gTlVMTDsKK3ZvaWQgQ1JZUFRfU2V0UHViS2V5RGVjcnlwdG9yKEZYX0JPT0wgKCpmdW5jKShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCogZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX2xlbikpCiB7CiAgICAgZ19QdWJLZXlEZWNyeXB0b3IgPSBmdW5jOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcCBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKaW5kZXggOWYxNDIyMi4uNGJkODcxMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcAorKysgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCkBAIC05ODgsNyArOTg4LDcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KGN0eC0+aXYsIGl2LCBzaXplb2YoaXYpKTsKIH0KLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgYm9vbCBiRW5jcnlwdCkKK3ZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgRlhfQk9PTCBiRW5jcnlwdCkKIHsKICAgICBhZXNfc2V0dXAoKEFFU0NvbnRleHQqKWNvbnRleHQsIGJsb2NrbGVuLCBrZXksIGtleWxlbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcAppbmRleCBkZTFlYzA4Li5iMjIzNDhhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA+PSAnQScgJiYgc3RyW2ldIDw9ICdGJykgewogICAgICAgICAgICAgcmV0IHw9IChzdHJbaV0gLSAnQScgKyAxMCkgJiAweEZGOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9iYXNpY19tb2R1bGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKaW5kZXggODMwMzRhZi4uMDNjZmQ2NiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKQEAgLTQ0LDE0ICs0NCwxNCBAQAogewogfQogCi12b2lkIENQREZfTW9kdWxlTWdyOjpTZXREb3dubG9hZENhbGxiYWNrKGJvb2wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKQordm9pZCBDUERGX01vZHVsZU1ncjo6U2V0RG93bmxvYWRDYWxsYmFjayhGWF9CT09MICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSkKIHsKICAgICBtX3BEb3dubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CiB9Ci1ib29sIENQREZfTW9kdWxlTWdyOjpEb3dubG9hZE1vZHVsZShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkKK0ZYX0JPT0wgQ1BERl9Nb2R1bGVNZ3I6OkRvd25sb2FkTW9kdWxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKQogewogICAgIGlmIChtX3BEb3dubG9hZENhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX3BEb3dubG9hZENhbGxiYWNrKG1vZHVsZV9uYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaAppbmRleCBiYzRjNzJhLi40YWVjMzJhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oCkBAIC0xMiw3ICsxMiw3IEBACiBwdWJsaWM6CiAgICAgQ1BERl9PYmplY3RTdHJlYW0oKTsKIAotICAgIGJvb2wJCQkJU3RhcnQoKTsKKyAgICBGWF9CT09MCQkJCVN0YXJ0KCk7CiAKICAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmopOwogICAgIGludDMyX3QJCQlDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpOwpAQCAtMzQsMTUgKzM0LDE1IEBACiAKICAgICBDUERGX1hSZWZTdHJlYW0oKTsKIAotICAgIGJvb2wJCQkJU3RhcnQoKTsKKyAgICBGWF9CT09MCQkJCVN0YXJ0KCk7CiAKICAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpOwogCiAgICAgaW50MzJfdAkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSwgQ1BERl9DcmVhdG9yICpwQ3JlYXRvcik7CiAKLSAgICBib29sCQkJCUVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBib29sIGJFT0YgPSBmYWxzZSk7Ci0gICAgYm9vbAkJCQlBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKTsKLSAgICBib29sCQkJCUVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CisgICAgRlhfQk9PTAkJCQlFbmQoQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GID0gRkFMU0UpOworICAgIEZYX0JPT0wJCQkJQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSk7CisgICAgRlhfQk9PTAkJCQlFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCiAKICAgICBDRlhfRFdvcmRBcnJheQkJbV9JbmRleEFycmF5OwpAQCAtNTEsOCArNTEsOCBAQAogICAgIEZYX0RXT1JECQkJbV9kd1RlbXBPYmpOdW07CiAKIHByb3RlY3RlZDoKLSAgICBpbnQzMl90CQkJRW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIGJvb2wgYkVPRiA9IHRydWUpOwotICAgIGJvb2wJCQkJR2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRik7CisgICAgaW50MzJfdAkJCUVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBUUlVFKTsKKyAgICBGWF9CT09MCQkJCUdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpOwogICAgIGludDMyX3QJCQltX2lTZWc7CiAgICAgQ1BERl9PYmplY3RTdHJlYW0JbV9PYmpTdHJlYW07CiAgICAgQ0ZYX0J5dGVUZXh0QnVmCQltX0J1ZmZlcjsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcAppbmRleCBiODQ5MzZjLi42NWY3OGRhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwCkBAIC0yOCwxMCArMjgsMTAgQEAKIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6fkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpCiB7CiB9Ci1ib29sIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6SW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KQorRlhfQk9PTCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6Okluc2VydFBhZ2VPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCkKIHsKICAgICBpZiAoIXBQYWdlT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gbV9wYWdlT2JqZWN0cy5BZGQocFBhZ2VPYmplY3QpOwogfQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBwUGFnZURpY3QtPlJlbW92ZUF0KCJDb250ZW50cyIpOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOworICAgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CiAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwogICAgIHBQYWdlRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICBQcm9jZXNzRm9ybShidWYsIGNvbnRlbnRTdHJlYW0uR2V0RGF0YSgpLCBjb250ZW50U3RyZWFtLkdldFNpemUoKSwgbWF0cml4KTsKICAgICB9CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgcFN0cmVhbS0+U2V0RGF0YShidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwogICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKICAgICBtX3BQYWdlLT5tX3BGb3JtRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKaW5kZXggYjE5N2IyNS4uMjI4MjZhMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKIGV4dGVybiB2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19kYXRhLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1leHRlcm4gYm9vbCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CitleHRlcm4gRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiBpbnQzMl90IFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlLCBGWF9GSUxFU0laRSYgb2Zmc2V0KQogewogICAgIGludDMyX3QgbGVuID0gMDsKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBib29sIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBhY2MuTG9hZEFsbERhdGEocCwgVFJVRSk7CiAgICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2OCwxMiArMTY4LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gMTsKIH0KLWludDMyX3QgUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLCBDUERGX0FycmF5KiBwSURBcnJheSwgYm9vbCBiQ29tcHJlc3MpCitpbnQzMl90IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwgQ1BERl9BcnJheSogcElEQXJyYXksIEZYX0JPT0wgYkNvbXByZXNzKQogewogICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CiAgICAgaW50MzJfdCBsZW4gPSAwOwpAQCAtMjg1LDEwICsyODUsMTAgQEAKICAgICBvZmZzZXQgKz0gbGVuICsgNjsKICAgICByZXR1cm4gb2Zmc2V0OwogfQotYm9vbCBQREZfR2VuZXJhdGVGaWxlSUQoRlhfRFdPUkQgZHdTZWVkMSwgRlhfRFdPUkQgZHdTZWVkMiwgRlhfRFdPUkQqIHBCdWZmZXIpCitGWF9CT09MIFBERl9HZW5lcmF0ZUZpbGVJRChGWF9EV09SRCBkd1NlZWQxLCBGWF9EV09SRCBkd1NlZWQyLCBGWF9EV09SRCogcEJ1ZmZlcikKIHsKICAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHZvaWQqIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZDEpOwogICAgIGludDMyX3QgaSA9IDA7CkBAIC0zMDEsMjEgKzMwMSwyMSBAQAogICAgICAgICAqcEJ1ZmZlcisrID0gRlhfUmFuZG9tX01UX0dlbmVyYXRlKHBDb250ZXh0KTsKICAgICB9CiAgICAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGNsYXNzIENQREZfRmxhdGVFbmNvZGVyCiB7CiBwdWJsaWM6CiAgICAgQ1BERl9GbGF0ZUVuY29kZXIoKTsKICAgICB+Q1BERl9GbGF0ZUVuY29kZXIoKTsKLSAgICBib29sCQlJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSk7Ci0gICAgYm9vbAkJSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBib29sIGJGbGF0ZUVuY29kZSwgYm9vbCBiWFJlZlN0cmVhbSA9IGZhbHNlKTsKKyAgICBGWF9CT09MCQlJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJGbGF0ZUVuY29kZSk7CisgICAgRlhfQk9PTAkJSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJGbGF0ZUVuY29kZSwgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IEZBTFNFKTsKICAgICB2b2lkCQlDbG9uZURpY3QoKTsKICAgICB1aW50OF90KgkJCW1fcERhdGE7CiAgICAgRlhfRFdPUkQJCQltX2R3U2l6ZTsKICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci0gICAgYm9vbAkJCQltX2JDbG9uZWQ7Ci0gICAgYm9vbAkJCQltX2JOZXdEYXRhOworICAgIEZYX0JPT0wJCQkJbV9iQ2xvbmVkOworICAgIEZYX0JPT0wJCQkJbV9iTmV3RGF0YTsKICAgICBDUERGX1N0cmVhbUFjYwkJbV9BY2M7CiB9OwogQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkKQEAgLTMyMywxOSArMzIzLDE5IEBACiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwogICAgIG1fcERpY3QgPSBOVUxMOwotICAgIG1fYkNsb25lZCA9IGZhbHNlOwotICAgIG1fYk5ld0RhdGEgPSBmYWxzZTsKKyAgICBtX2JDbG9uZWQgPSBGQUxTRTsKKyAgICBtX2JOZXdEYXRhID0gRkFMU0U7CiB9CiB2b2lkIENQREZfRmxhdGVFbmNvZGVyOjpDbG9uZURpY3QoKQogewogICAgIGlmICghbV9iQ2xvbmVkKSB7CiAgICAgICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BEaWN0LT5DbG9uZSgpOwotICAgICAgICBtX2JDbG9uZWQgPSB0cnVlOworICAgICAgICBtX2JDbG9uZWQgPSBUUlVFOwogICAgIH0KIH0KLWJvb2wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYkZsYXRlRW5jb2RlKQorRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpCiB7Ci0gICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgdHJ1ZSk7CisgICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgVFJVRSk7CiAgICAgaWYgKChwU3RyZWFtICYmIHBTdHJlYW0tPkdldERpY3QoKSAmJiBwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSkgfHwgIWJGbGF0ZUVuY29kZSkgewogICAgICAgICBpZiAocFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdCgiRmlsdGVyIikgJiYgIWJGbGF0ZUVuY29kZSkgewogICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgZGVzdEFjYzsKQEAgLTM0NCw0MCArMzQ0LDQwIEBACiAgICAgICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKWRlc3RBY2MuRGV0YWNoRGF0YSgpOwogICAgICAgICAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKTsKICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgICAgICBtX2JOZXdEYXRhID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fYkNsb25lZCA9IHRydWU7CisgICAgICAgICAgICBtX2JOZXdEYXRhID0gVFJVRTsKKyAgICAgICAgICAgIG1fYkNsb25lZCA9IFRSVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fQWNjLkdldERhdGEoKTsKICAgICAgICAgICAgIG1fZHdTaXplID0gbV9BY2MuR2V0U2l6ZSgpOwogICAgICAgICAgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIG1fcERhdGEgPSBOVUxMOwogICAgIG1fZHdTaXplID0gMDsKLSAgICBtX2JOZXdEYXRhID0gdHJ1ZTsKLSAgICBtX2JDbG9uZWQgPSB0cnVlOworICAgIG1fYk5ld0RhdGEgPSBUUlVFOworICAgIG1fYkNsb25lZCA9IFRSVUU7CiAgICAgOjpGbGF0ZUVuY29kZShtX0FjYy5HZXREYXRhKCksIG1fQWNjLkdldFNpemUoKSwgbV9wRGF0YSwgbV9kd1NpemUpOwogICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CiAgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtX2R3U2l6ZSk7CiAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRmxhdGVEZWNvZGUiKTsKICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiRGVjb2RlUGFybXMiKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiRmxhdGVFbmNvZGUsIGJvb2wgYlhSZWZTdHJlYW0pCitGWF9CT09MIENQREZfRmxhdGVFbmNvZGVyOjpJbml0aWFsaXplKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkZsYXRlRW5jb2RlLCBGWF9CT09MIGJYUmVmU3RyZWFtKQogewogICAgIGlmICghYkZsYXRlRW5jb2RlKSB7CiAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopcEJ1ZmZlcjsKICAgICAgICAgbV9kd1NpemUgPSBzaXplOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIG1fYk5ld0RhdGEgPSB0cnVlOworICAgIG1fYk5ld0RhdGEgPSBUUlVFOwogICAgIGlmIChiWFJlZlN0cmVhbSkgewogICAgICAgICA6OkZsYXRlRW5jb2RlKHBCdWZmZXIsIHNpemUsIDEyLCAxLCA4LCA3LCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgOjpGbGF0ZUVuY29kZShwQnVmZmVyLCBzaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ1BERl9GbGF0ZUVuY29kZXI6On5DUERGX0ZsYXRlRW5jb2RlcigpCiB7CkBAIC0zOTMsMzMgKzM5MywzMyBAQAogcHVibGljOgogICAgIENQREZfRW5jcnlwdG9yKCk7CiAgICAgfkNQREZfRW5jcnlwdG9yKCk7Ci0gICAgYm9vbAkJSW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpOworICAgIEZYX0JPT0wJCUluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwgaW50IG9iam51bSwgdWludDhfdCogc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19zaXplKTsKICAgICB1aW50OF90KgkJCW1fcERhdGE7CiAgICAgRlhfRFdPUkQJCQltX2R3U2l6ZTsKLSAgICBib29sCQkJCW1fYk5ld0J1ZjsKKyAgICBGWF9CT09MCQkJCW1fYk5ld0J1ZjsKIH07CiBDUERGX0VuY3J5cHRvcjo6Q1BERl9FbmNyeXB0b3IoKQogewogICAgIG1fcERhdGEgPSBOVUxMOwogICAgIG1fZHdTaXplID0gMDsKLSAgICBtX2JOZXdCdWYgPSBmYWxzZTsKKyAgICBtX2JOZXdCdWYgPSBGQUxTRTsKIH0KLWJvb2wgQ1BERl9FbmNyeXB0b3I6OkluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwgaW50IG9iam51bSwgdWludDhfdCogc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19zaXplKQorRlhfQk9PTCBDUERGX0VuY3J5cHRvcjo6SW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpCiB7CiAgICAgaWYgKHNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAocEhhbmRsZXIgPT0gTlVMTCkgewogICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKXNyY19kYXRhOwogICAgICAgICBtX2R3U2l6ZSA9IHNyY19zaXplOwotICAgICAgICBtX2JOZXdCdWYgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIG1fYk5ld0J1ZiA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgbV9kd1NpemUgPSBwSGFuZGxlci0+RW5jcnlwdEdldFNpemUob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUpOwogICAgIG1fcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3U2l6ZSk7CiAgICAgcEhhbmRsZXItPkVuY3J5cHRDb250ZW50KG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7Ci0gICAgbV9iTmV3QnVmID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX2JOZXdCdWYgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQogQ1BERl9FbmNyeXB0b3I6On5DUERGX0VuY3J5cHRvcigpCiB7CkBAIC00MzIsMTQgKzQzMiwxNCBAQAogICAgICwgbV9pbmRleCgwKQogewogfQotYm9vbCBDUERGX09iamVjdFN0cmVhbTo6U3RhcnQoKQorRlhfQk9PTCBDUERGX09iamVjdFN0cmVhbTo6U3RhcnQoKQogewogICAgIG1fT2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgbV9PZmZzZXRBcnJheS5SZW1vdmVBbGwoKTsKICAgICBtX0J1ZmZlci5DbGVhcigpOwogICAgIG1fZHdPYmpOdW0gPSAwOwogICAgIG1faW5kZXggPSAwOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogaW50MzJfdCBDUERGX09iamVjdFN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmopCiB7CkBAIC01NDcsMTIgKzU0NywxMiBAQAogICAgICwgbV9pU2VnKDApCiB7CiB9Ci1ib29sIENQREZfWFJlZlN0cmVhbTo6U3RhcnQoKQorRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OlN0YXJ0KCkKIHsKICAgICBtX0luZGV4QXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgbV9CdWZmZXIuQ2xlYXIoKTsKICAgICBtX2lTZWcgPSAwOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0ICpwT2JqLCBDUERGX0NyZWF0b3IgKnBDcmVhdG9yKQogewpAQCAtNTc4LDcgKzU3OCw3IEBACiAgICAgfQogICAgIHJldHVybiBFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IpOwogfQotc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MChDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgYm9vbCBiRmlyc3RPYmplY3QgPSAgdHJ1ZSkKK3N0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYkZpcnN0T2JqZWN0ID0gIFRSVUUpCiB7CiAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CiAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CkBAIC02MTMsNyArNjEzLDcgQEAKICAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChpbmRleCkpOwogICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKGluZGV4KSk7CiB9Ci1pbnQzMl90IENQREZfWFJlZlN0cmVhbTo6RW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIGJvb2wgYkVPRikKK2ludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpFbmRPYmplY3RTdHJlYW0oQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKQogewogICAgIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IDA7CiAgICAgaWYgKGJFT0YpIHsKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgyKG1fQnVmZmVyLCBkd09ialN0bU51bSwgaW5kZXgrKyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpU2l6ZSA+IDAgJiYgYkVPRikgewpAQCAtNjgyLDEyICs2ODIsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIDE7CiB9Ci1ib29sIENQREZfWFJlZlN0cmVhbTo6R2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRikKK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKQogewogICAgIEZYX0ZJTEVTSVpFIG9mZnNldF90bXAgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CiAgICAgRlhfRFdPUkQgb2JqbnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07CiAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlICpwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOwotICAgIGJvb2wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOworICAgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOwogICAgIGlmIChiSW5jcmVtZW50YWwpIHsKICAgICAgICAgQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CiAgICAgfSBlbHNlIHsKQEAgLTY5Niw3ICs2OTYsNyBAQAogICAgICAgICAgICAgaWYgKG9mZnNldCkgewogICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzA0LDQ5ICs3MDQsNDkgQEAKICAgICBGWF9GSUxFU0laRSAmb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OwogICAgIGludDMyX3QgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSk7CiAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuPDwvVHlwZSAvWFJlZi9XWzEgNCAyXS9JbmRleFsiKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICBpZiAoIWJJbmNyZW1lbnRhbCkgewogICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgwKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSBsZW47CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50MzJfdCBpU2VnID0gbV9JbmRleEFycmF5LkdldFNpemUoKSAvIDI7CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWc7IGkrKykgewogICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwogICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9TaXplICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSArIDEpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW4gKyA3OwogICAgIGlmIChtX1ByZXZPZmZzZXQgPiAwKSB7CkBAIC03NjIsMjYgKzc2MiwyNiBAQAogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OwogICAgIH0KLSAgICBib29sIGJQcmVkaWN0b3IgPSB0cnVlOworICAgIEZYX0JPT0wgYlByZWRpY3RvciA9IFRSVUU7CiAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKICAgICBlbmNvZGVyLkluaXRpYWxpemUobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpLCBwQ3JlYXRvci0+bV9iQ29tcHJlc3MsIGJQcmVkaWN0b3IpOwogICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSAyMDsKICAgICAgICAgaWYgKGJQcmVkaWN0b3IpIHsKICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0xlbmd0aCAiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNvZGVyLm1fZHdTaXplKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuICsgODsKICAgICBpZiAoYkVPRikgewpAQCAtODAxLDI3ICs4MDEsMjcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIj4+c3RyZWFtXHJcbiIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuOwogICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG9mZnNldCArPSBlbmNvZGVyLm1fZHdTaXplICsgbGVuOwogICAgIG1fUHJldk9mZnNldCA9IG9mZnNldF90bXA7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfWFJlZlN0cmVhbTo6RW5kKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIGJvb2wgYkVPRiApCitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6RW5kKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRiApCiB7CiAgICAgaWYgKEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvciwgYkVPRikgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBiRU9GKTsKIH0KLWJvb2wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpCitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6RW5kWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yKQogewogICAgIGlmICghKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewogICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyKTsKQEAgLTgzMCw3ICs4MzAsNyBAQAogICAgICAgICAgICAgaWYgKG9mZnNldCkgewogICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTg0Myw5ICs4NDMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIGZhbHNlKTsKKyAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBGQUxTRSk7CiB9Ci1ib29sIENQREZfWFJlZlN0cmVhbTo6QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSkKK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKQogewogICAgIGludDMyX3QgaVNpemUgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpOwogICAgIGlmIChpU2l6ZSA9PSAwKSB7CkBAIC04NjIsMTMgKzg2MiwxMyBAQAogICAgICAgICAgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfQ3JlYXRvcjo6Q1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICAgIG1fcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+bV9wUGFyc2VyOwotICAgIG1fYkNvbXByZXNzID0gdHJ1ZTsKKyAgICBtX2JDb21wcmVzcyA9IFRSVUU7CiAgICAgaWYgKG1fcFBhcnNlcikgewogICAgICAgICBtX3BFbmNyeXB0RGljdCA9IG1fcFBhcnNlci0+R2V0RW5jcnlwdERpY3QoKTsKICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IG1fcFBhcnNlci0+R2V0Q3J5cHRvSGFuZGxlcigpOwpAQCAtODc2LDExICs4NzYsMTEgQEAKICAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwogICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKICAgICB9Ci0gICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gZmFsc2U7Ci0gICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IGZhbHNlOworICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IEZBTFNFOworICAgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBGQUxTRTsKICAgICBtX3BNZXRhZGF0YSA9IE5VTEw7Ci0gICAgbV9iRW5jcnlwdENsb25lZCA9IGZhbHNlOwotICAgIG1fYkVuY3J5cHRNZXRhZGF0YSA9IGZhbHNlOworICAgIG1fYkVuY3J5cHRDbG9uZWQgPSBGQUxTRTsKKyAgICBtX2JFbmNyeXB0TWV0YWRhdGEgPSBGQUxTRTsKICAgICBtX09mZnNldCA9IDA7CiAgICAgbV9pU3RhZ2UgPSAtMTsKICAgICBtX2R3RmxhZ3MgPSAwOwpAQCAtODkyLDcgKzg5Miw3IEBACiAgICAgbV9wSURBcnJheSA9IE5VTEw7CiAgICAgbV9GaWxlVmVyc2lvbiA9IDA7CiAgICAgbV9kd0VucnlwdE9iak51bSA9IDA7Ci0gICAgbV9iTmV3Q3J5cHRvID0gZmFsc2U7CisgICAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7CiB9CiBDUERGX0NyZWF0b3I6On5DUERGX0NyZWF0b3IoKQogewpAQCAtOTAzLDEwICs5MDMsMTAgQEAKICAgICB9CiAgICAgQ2xlYXIoKTsKIH0KLXN0YXRpYyBib29sIF9Jc1hSZWZOZWVkRW5kKENQREZfWFJlZlN0cmVhbSogcFhSZWYsIEZYX0RXT1JEIGZsYWcpCitzdGF0aWMgRlhfQk9PTCBfSXNYUmVmTmVlZEVuZChDUERGX1hSZWZTdHJlYW0qIHBYUmVmLCBGWF9EV09SRCBmbGFnKQogewogICAgIGlmICghKGZsYWcgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50MzJfdCBpU2l6ZSA9IHBYUmVmLT5tX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKICAgICBpbnQzMl90IGlDb3VudCA9IDA7CkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLCBGWF9EV09SRCBvYmpudW0sIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0bykKIHsKICAgICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyOwotICAgIGVuY29kZXIuSW5pdGlhbGl6ZSgoQ1BERl9TdHJlYW0qKXBTdHJlYW0sIHBTdHJlYW0gPT0gbV9wTWV0YWRhdGEgPyBmYWxzZSA6IG1fYkNvbXByZXNzKTsKKyAgICBlbmNvZGVyLkluaXRpYWxpemUoKENQREZfU3RyZWFtKilwU3RyZWFtLCBwU3RyZWFtID09IG1fcE1ldGFkYXRhID8gRkFMU0UgOiBtX2JDb21wcmVzcyk7CiAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOwogICAgIGlmKCFlbmNyeXB0b3IuSW5pdGlhbGl6ZShwQ3J5cHRvLCBvYmpudW0sIGVuY29kZXIubV9wRGF0YSwgZW5jb2Rlci5tX2R3U2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlSW5kaXJlY3RPYmoocE9iai0+R2V0T2JqTnVtKCksIHBPYmopOwogfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIGJvb2wgYkVuY3J5cHQpCitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiRW5jcnlwdCkKIHsKICAgICBpbnQzMl90IGxlbiA9IDA7CiAgICAgaWYgKHBPYmogPT0gTlVMTCkgewpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBib29sIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKICAgICAgICAgICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8ICFiRW5jcnlwdCkgewogICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoY29udGVudCkpIDwgMCkgewpAQCAtMTIwNiwxMCArMTIwNiwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtX09mZnNldCArPSAyOwogICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgICAgICAgICAgYm9vbCBiU2lnbkRpY3QgPSBJc1NpZ25hdHVyZURpY3QocCk7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnbkRpY3QgPSBJc1NpZ25hdHVyZURpY3QocCk7CiAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKICAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpZ25WYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaWduVmFsdWUgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwogICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiLyIpKSA8IDApIHsKQEAgLTEyMjAsNyArMTIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJTaWduRGljdCAmJiBrZXkgPT0gRlhfQlNUUkMoIkNvbnRlbnRzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTaWduVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewpAQCAtMTI1NSw4ICsxMjU1LDggQEAKICAgICB9CiAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fT2Zmc2V0OwogICAgIHZvaWQqIHZhbHVldGVtcCA9IE5VTEw7Ci0gICAgYm9vbCBiRXhpc3RJbk1hcCA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZXRlbXApOwotICAgIGJvb2wgYk9ialN0bSA9IChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07CisgICAgRlhfQk9PTCBiRXhpc3RJbk1hcCA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZXRlbXApOworICAgIEZYX0JPT0wgYk9ialN0bSA9IChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07CiAgICAgaWYobV9wUGFyc2VyLT5tX2JWZXJzaW9uVXBkYXRlZCB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwgYk9ialN0bSkgewogICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0pOwogICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZU5ld09ianMoYm9vbCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSAqcFBhdXNlKQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2JqcyhGWF9CT09MIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlICpwUGF1c2UpCiB7CiAgICAgaW50MzJfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKICAgICBpbnQzMl90IGluZGV4ID0gKGludDMyX3QpKHVpbnRwdHJfdCltX1BvczsKQEAgLTEzODUsOCArMTM4NSw4IEBACiB9CiB2b2lkIENQREZfQ3JlYXRvcjo6SW5pdE5ld09iak51bU9mZnNldHMoKQogewotICAgIGJvb2wgYkluY3JlbWVudGFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7Ci0gICAgYm9vbCBiTm9PcmlnaW5hbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSAhPSAwOworICAgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7CisgICAgRlhfQk9PTCBiTm9PcmlnaW5hbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSAhPSAwOwogICAgIEZYX0RXT1JEIG5PbGRTaXplID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5tX0Nyb3NzUmVmLkdldFNpemUoKSA6IDA7CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC0xNDE0LDcgKzE0MTQsNyBAQAogICAgIH0KICAgICBpbnQzMl90IGkgPSAwOwogICAgIEZYX0RXT1JEIGR3U3RhcnRPYmpOdW0gPSAwOwotICAgIGJvb2wgYkNyb3NzUmVmVmFsaWQgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID4gMDsKKyAgICBGWF9CT09MIGJDcm9zc1JlZlZhbGlkID0gbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA+IDA7CiAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKICAgICAgICAgZHdTdGFydE9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwogICAgICAgICBpZiAoKGJJbmNyZW1lbnRhbCAmJiAoYk5vT3JpZ2luYWwgfHwgYkNyb3NzUmVmVmFsaWQpKSB8fCAhbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdTdGFydE9iak51bSkpIHsKQEAgLTE0MjcsMTAgKzE0MjcsMTAgQEAKICAgICB9CiAgICAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gZHdTdGFydE9iak51bTsKICAgICBpKys7Ci0gICAgYm9vbCBiTmV3U3RhcnQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJOZXdTdGFydCA9IEZBTFNFOwogICAgIGZvciAoOyBpIDwgaUNvdW50OyBpKyspIHsKICAgICAgICAgRlhfRFdPUkQgZHdDdXJPYmpOdW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgYm9vbCBiRXhpc3QgPSAoZHdDdXJPYmpOdW0gPCBuT2xkU2l6ZSAmJiBtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd0N1ck9iak51bSkgIT0gTlVMTCk7CisgICAgICAgIEZYX0JPT0wgYkV4aXN0ID0gKGR3Q3VyT2JqTnVtIDwgbk9sZFNpemUgJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdDdXJPYmpOdW0pICE9IE5VTEwpOwogICAgICAgICBpZiAoYkV4aXN0IHx8IGR3Q3VyT2JqTnVtIC0gZHdMYXN0T2JqTnVtID4gMSkgewogICAgICAgICAgICAgaWYgKCFiTmV3U3RhcnQpIHsKICAgICAgICAgICAgICAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwpAQCAtMTU0Niw3ICsxNTQ2LDcgQEAKICAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSA9PSAwICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CiAgICAgICAgICAgICBJbml0T2xkT2JqTnVtT2Zmc2V0cygpOwogICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmQgPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICAgICAgICAgIGJvb2wgYk9ialN0bSA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgIT0gMDsKKyAgICAgICAgICAgIEZYX0JPT0wgYk9ialN0bSA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgIT0gMDsKICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgb2JqbnVtID0gMDsgb2JqbnVtIDw9IGR3RW5kOyBvYmpudW0rKykgewogICAgICAgICAgICAgICAgIGlmIChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMCB8fCBtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTYyMiw3ICsxNjIyLDcgQEAKICAgICBpZiAobV9pU3RhZ2UgPT0gODApIHsKICAgICAgICAgbV9YcmVmU3RhcnQgPSBtX09mZnNldDsKICAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7Ci0gICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgVFJVRSk7CiAgICAgICAgICAgICBtX1hyZWZTdGFydCA9IG1fcFhSZWZTdHJlYW0tPm1fUHJldk9mZnNldDsKICAgICAgICAgICAgIG1faVN0YWdlID0gOTA7CiAgICAgICAgIH0gZWxzZSBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDAgfHwgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKQEAgLTE3NjUsNyArMTc2NSw3IEBACiB7CiAgICAgRlhTWVNfYXNzZXJ0KG1faVN0YWdlID49IDkwKTsKICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSA9PSAwKSB7Ci0gICAgICAgIGJvb2wgYlhSZWZTdHJlYW0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOworICAgICAgICBGWF9CT09MIGJYUmVmU3RyZWFtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAgJiYgbV9wUGFyc2VyLT5Jc1hSZWZTdHJlYW0oKTsKICAgICAgICAgaWYgKCFiWFJlZlN0cmVhbSkgewogICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInRyYWlsZXJcclxuPDwiKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTk3NiwzOSArMTk3NiwzOSBAQAogICAgICAgICBtX3BJREFycmF5ID0gTlVMTDsKICAgICB9CiB9Ci1ib29sIENQREZfQ3JlYXRvcjo6Q3JlYXRlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKK0ZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQogewogICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBib29sIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOworICAgIEZYX0JPT0wgYlJldCA9IENyZWF0ZShmbGFncyk7CiAgICAgaWYgKCFiUmV0IHx8ICEoZmxhZ3MgJiBGUERGQ1JFQVRFX1BST0dSRVNTSVZFKSkgewogICAgICAgICBDbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KLWJvb2wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKK0ZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncykKIHsKICAgICBpZiAoIW1fRmlsZS5BdHRhY2hGaWxlKGZpbGVuYW1lKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgYm9vbCBiUmV0ID0gQ3JlYXRlKGZsYWdzKTsKKyAgICBGWF9CT09MIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOwogICAgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKICAgICAgICAgQ2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1ib29sIENQREZfQ3JlYXRvcjo6Q3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzKQorRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncykKIHsKICAgICBpZiAoIXBGaWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAoIW1fRmlsZS5BdHRhY2hGaWxlKHBGaWxlLCBmYWxzZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUsIEZBTFNFKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBDcmVhdGUoZmxhZ3MpOwogfQotYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9EV09SRCBmbGFncykKK0ZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpCiB7CiAgICAgbV9kd0ZsYWdzID0gZmxhZ3M7CiAgICAgbV9pU3RhZ2UgPSAwOwpAQCAtMjAxOSwxNCArMjAxOSwxNCBAQAogICAgIG1fTmV3T2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgSW5pdElEKCk7CiAgICAgaWYgKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBDb250aW51ZShOVUxMKSA+IC0xOwogfQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXRJRChib29sIGJEZWZhdWx0ICkKK3ZvaWQgQ1BERl9DcmVhdG9yOjpJbml0SUQoRlhfQk9PTCBiRGVmYXVsdCApCiB7CiAgICAgQ1BERl9BcnJheSogcE9sZElEQXJyYXkgPSBtX3BQYXJzZXIgPyBtX3BQYXJzZXItPkdldElEQXJyYXkoKSA6IE5VTEw7Ci0gICAgYm9vbCBiTmV3SWQgPSAhbV9wSURBcnJheTsKKyAgICBGWF9CT09MIGJOZXdJZCA9ICFtX3BJREFycmF5OwogICAgIGlmICghbV9wSURBcnJheSkgewogICAgICAgICBGWF9EV09SRCogcEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIG1fcElEQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKQEAgLTIwMzcsNyArMjAzNyw3IEBACiAgICAgICAgICAgICBwQnVmZmVyID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQpOwogICAgICAgICAgICAgUERGX0dlbmVyYXRlRmlsZUlEKChGWF9EV09SRCkodWludHB0cl90KXRoaXMsIG1fZHdMYXN0T2JqTnVtLCBwQnVmZmVyKTsKICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0J1ZmZlcigoY29uc3QgdWludDhfdCopcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIHRydWUpLCBtX3BEb2N1bWVudCk7CisgICAgICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAocEJ1ZmZlcikgewogICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKQEAgLTIwNTUsNyArMjA1NSw3IEBACiAgICAgICAgIEZYX0RXT1JEKiBwQnVmZmVyID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQpOwogICAgICAgICBQREZfR2VuZXJhdGVGaWxlSUQoKEZYX0RXT1JEKSh1aW50cHRyX3QpdGhpcywgbV9kd0xhc3RPYmpOdW0sIHBCdWZmZXIpOwogICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNCdWZmZXIoKGNvbnN0IHVpbnQ4X3QqKXBCdWZmZXIsIDQgKiBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIHRydWUpLCBtX3BEb2N1bWVudCk7CisgICAgICAgIG1fcElEQXJyYXktPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGJzQnVmZmVyLCBUUlVFKSwgbV9wRG9jdW1lbnQpOwogICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjA3MSw4ICsyMDcxLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5Jbml0KG1fcEVuY3J5cHREaWN0LCAmaGFuZGxlcik7Ci0gICAgICAgICAgICBtX2JOZXdDcnlwdG8gPSB0cnVlOwotICAgICAgICAgICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5ld0NyeXB0byA9IFRSVUU7CisgICAgICAgICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjEwMywxOCArMjEwMywxOCBAQAogICAgIH0KICAgICByZXR1cm4gbV9pU3RhZ2U7CiB9Ci1ib29sIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiApCitGWF9CT09MIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiApCiB7CiAgICAgaWYgKGZpbGVWZXJzaW9uIDwgMTAgfHwgZmlsZVZlcnNpb24gPiAxNykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9GaWxlVmVyc2lvbiA9IGZpbGVWZXJzaW9uOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX0NyZWF0b3I6OlJlbW92ZVNlY3VyaXR5KCkKIHsKICAgICBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKLSAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSB0cnVlOworICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IFRSVUU7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwogICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogfQpAQCAtMjEyNCw3ICsyMTI0LDcgQEAKICAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7CiAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogICAgIH0KLSAgICBtX2JOZXdDcnlwdG8gPSBmYWxzZTsKKyAgICBtX2JOZXdDcnlwdG8gPSBGQUxTRTsKICAgICBpZiAoIW1fYlN0YW5kYXJkU2VjdXJpdHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIxMzIsNSArMjEzMiw1IEBACiAgICAgICAgIG1fcEVuY3J5cHREaWN0LT5SZWxlYXNlKCk7CiAgICAgICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKICAgICB9Ci0gICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IGZhbHNlOworICAgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKaW5kZXggMzYyMWM3OS4uNWE1ZmI5NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIHsKICAgICBtX3BSb290RGljdCA9IE5VTEw7CiAgICAgbV9wSW5mb0RpY3QgPSBOVUxMOwotICAgIG1fYkxpbmVhcml6ZWQgPSBmYWxzZTsKKyAgICBtX2JMaW5lYXJpemVkID0gRkFMU0U7CiAgICAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKICAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gMDsKICAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICB9CiAgICAgRlhfRnJlZSh3aWR0aHMpOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUpCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkKIHsKICAgICBMT0dGT05UQSBsZmE7CiAgICAgRlhTWVNfbWVtY3B5KCZsZmEsIHBMb2dGb250LCAoY2hhciopbGZhLmxmRmFjZU5hbWUgLSAoY2hhciopJmxmYSk7CkBAIC0yMzksNyArMjM5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkV2luZG93c0ZvbnQoTE9HRk9OVEEqIHBMb2dGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lKQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCiB7CiAgICAgcExvZ0ZvbnQtPmxmSGVpZ2h0ID0gLTEwMDA7CiAgICAgcExvZ0ZvbnQtPmxmV2lkdGggPSAwOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDB4ZjgpID09IEZGX1NDUklQVCkgewogICAgICAgICBmbGFncyB8PSBQREZGT05UX1NDUklQVDsKICAgICB9Ci0gICAgYm9vbCBiQ0pLID0gcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBDSElORVNFQklHNV9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gR0IyMzEyX0NIQVJTRVQgfHwKKyAgICBGWF9CT09MIGJDSksgPSBwTG9nRm9udC0+bGZDaGFyU2V0ID09IENISU5FU0VCSUc1X0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCB8fAogICAgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gSEFOR0VVTF9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVDsKICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKICAgICBpZiAoYlRyYW5zbGF0ZU5hbWUgJiYgYkNKSykgewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgZGVzdCA9IChGWF9DSEFSKilwQnVmZmVyOwogICAgIGZyZWUocEJ1ZmZlcik7CiB9Ci1ib29sIElzSGFzQ2hhclNldChDRkFycmF5UmVmIGxhbmd1YWdlcywgY29uc3QgQ0ZYX0RXb3JkQXJyYXkgJmNoYXJTZXRzKQorRlhfQk9PTCBJc0hhc0NoYXJTZXQoQ0ZBcnJheVJlZiBsYW5ndWFnZXMsIGNvbnN0IENGWF9EV29yZEFycmF5ICZjaGFyU2V0cykKIHsKICAgICBpbnQgaUNvdW50ID0gY2hhclNldHMuR2V0U2l6ZSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0ZBcnJheUdldENvdW50KGxhbmd1YWdlcyk7ICsraSkgewpAQCAtNTU3LDExICs1NTcsMTEgQEAKICAgICAgICAgRlhfRFdPUkQgQ2hhclNldCA9IEZYX0dldENoYXJzZXRGcm9tTGFuZyhDRlN0cmluZ0dldENTdHJpbmdQdHIobGFuZ3VhZ2UsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pLCAtMSk7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaUNvdW50OyArK2opIHsKICAgICAgICAgICAgIGlmIChDaGFyU2V0ID09IGNoYXJTZXRzW2pdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHZvaWQgRlhfR2V0Q2hhcldpZHRoKENURm9udFJlZiBmb250LCBVbmlDaGFyIHN0YXJ0LCBVbmlDaGFyIGVuZCwgaW50KiB3aWR0aCkKIHsKQEAgLTU5OSw3ICs1OTksNyBAQAogICAgIH0KICAgICBGWF9GcmVlKHdpZHRocyk7CiB9Ci1DUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lKQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkKIHsKICAgICBDVEZvbnRSZWYgZm9udCA9IChDVEZvbnRSZWYpcEZvbnQ7CiAgICAgQ1RGb250RGVzY3JpcHRvclJlZiBkZXNjcmlwdG9yID0gQ1RGb250Q29weUZvbnREZXNjcmlwdG9yKGZvbnQpOwpAQCAtNjA3LDcgKzYwNyw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKLSAgICBib29sIGJDSksgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKICAgICBpbnQgZmxhZ3MgPSAwLCBpdGFsaWNhbmdsZSA9IDAsIGFzY2VuZCA9IDAsIGRlc2NlbmQgPSAwLCBjYXBoZWlnaHQgPSAwLCBiYm94WzRdOwogICAgIEZYU1lTX21lbXNldChiYm94LCAwLCBzaXplb2YoaW50KSAqIDQpOwogICAgIENGQXJyYXlSZWYgbGFuZ3VhZ2VzID0gKENGQXJyYXlSZWYpQ1RGb250RGVzY3JpcHRvckNvcHlBdHRyaWJ1dGUoZGVzY3JpcHRvciwga0NURm9udExhbmd1YWdlc0F0dHJpYnV0ZSk7CkBAIC02MjEsNyArNjIxLDcgQEAKICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CiAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKICAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgIGJDSksgPSB0cnVlOworICAgICAgICBiQ0pLID0gVFJVRTsKICAgICB9CiAgICAgQ0ZSZWxlYXNlKGRlc2NyaXB0b3IpOwogICAgIENGRGljdGlvbmFyeVJlZiB0cmFpdHMgPSAoQ0ZEaWN0aW9uYXJ5UmVmKUNURm9udENvcHlUcmFpdHMoZm9udCk7CkBAIC03MzcsNyArNzM3LDcgQEAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7CiAgICAgICAgIGludCBzdXBwbGVtZW50OwotICAgICAgICBib29sIGJGb3VuZCA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOwogICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG5ldyBDUERGX0FycmF5OwogICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKICAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKQEAgLTc0Nyw3ICs3NDcsNyBAQAogICAgICAgICAgICAgc3VwcGxlbWVudCA9IDQ7CiAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBiRm91bmQgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOwogICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoODE0KTsKICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBiRm91bmQgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CkBAIC03NjgsNyArNzY4LDcgQEAKICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSAyOwogICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMSk7CiAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBiRm91bmQgPSB0cnVlOworICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsKICAgICAgICAgfQogICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKICAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKQEAgLTg2NywxMiArODY3LDEyIEBACiAgICAgfQogICAgIEZYX0ZyZWUod2lkdGhzKTsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkRm9udChDRlhfRm9udCogcEZvbnQsIGludCBjaGFyc2V0LCBib29sIGJWZXJ0KQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpCiB7CiAgICAgaWYgKHBGb250ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGJvb2wgYkNKSyA9IGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKKyAgICBGWF9CT09MIGJDSksgPSBjaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8CiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQ7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQgPSBwRm9udC0+R2V0RmFtaWx5TmFtZSgpOwogICAgIGJhc2Vmb250LlJlcGxhY2UoIiAiLCAiIik7CkBAIC0xMDUyLDcgKzEwNTIsNyBAQAogICAgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOwogfQogc3RhdGljIGludCBJbnNlcnREZWxldGVQREZQYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBib29sIGJJbnNlcnQsIENGWF9QdHJBcnJheSYgc3RhY2tMaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBGWF9CT09MIGJJbnNlcnQsIENGWF9QdHJBcnJheSYgc3RhY2tMaXN0KQogewogICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOwogICAgIGlmICghcEtpZExpc3QpIHsKQEAgLTExMjIsNyArMTEyMiw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwogICAgICAgICBzdGFjay5BZGQocFBhZ2VzKTsKLSAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcFBhZ2VzLCBpUGFnZSwgcFBhZ2VEaWN0LCB0cnVlLCBzdGFjaykgPCAwKSB7CisgICAgICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHBEb2MsIHBQYWdlcywgaVBhZ2UsIHBQYWdlRGljdCwgVFJVRSwgc3RhY2spIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE2NSw3ICsxMTY1LDcgQEAKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwogICAgIHN0YWNrLkFkZChwUGFnZXMpOwotICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHRoaXMsIHBQYWdlcywgaVBhZ2UsIE5VTEwsIGZhbHNlLCBzdGFjaykgPCAwKSB7CisgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UodGhpcywgcFBhZ2VzLCBpUGFnZSwgTlVMTCwgRkFMU0UsIHN0YWNrKSA8IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX1BhZ2VMaXN0LlJlbW92ZUF0KGlQYWdlKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCmluZGV4IDIxY2UzMWUuLmRhZDczMjYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcApAQCAtMTYsNyArMTYsNyBAQAogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3QgbnVtX2NvbXBzOwogICAgIGludDMyX3QgYml0czsKLSAgICBib29sIGNvbG9yX3RyYW5zOworICAgIEZYX0JPT0wgY29sb3JfdHJhbnM7CiAgICAgaWYgKCFDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+CiAgICAgICAgICAgICBMb2FkSW5mbyhwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIHBEaWN0LT5TZXRBdCgiRGVjb2RlUGFybXMiLCBwUGFybXMpOwogICAgICAgICBwUGFybXMtPlNldEF0SW50ZWdlcigiQ29sb3JUcmFuc2Zvcm0iLCAwKTsKICAgICB9Ci0gICAgbV9iSXNNYXNrID0gZmFsc2U7CisgICAgbV9iSXNNYXNrID0gRkFMU0U7CiAgICAgbV9XaWR0aCA9IHdpZHRoOwogICAgIG1fSGVpZ2h0ID0gaGVpZ2h0OwogICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgewpAQCAtOTIsNyArOTIsNyBAQAogdm9pZCBfRENURW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSAqcEJpdG1hcERpY3QsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHF1YWxpdHksIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUpCiB7CiB9Ci12b2lkIF9KQklHMkVuY29kZUJpdG1hcChDUERGX0RpY3Rpb25hcnkgKnBCaXRtYXBEaWN0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIENQREZfRG9jdW1lbnQgKnBEb2MsIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUsIGJvb2wgYkxvc3NMZXNzKQordm9pZCBfSkJJRzJFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5ICpwQml0bWFwRGljdCwgY29uc3QgQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBDUERGX0RvY3VtZW50ICpwRG9jLCB1aW50OF90KiAmYnVmLCBGWF9TVFJTSVpFICZzaXplLCBGWF9CT09MIGJMb3NzTGVzcykKIHsKIH0KIHZvaWQgQ1BERl9JbWFnZTo6U2V0SW1hZ2UoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90IGlDb21wcmVzcywgSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIGNvbnN0IENGWF9ESUJpdG1hcCogcE1hc2ssIGNvbnN0IENQREZfSW1hZ2VTZXRQYXJhbSogcFBhcmFtKQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgdWludDhfdCogc3JjX2J1ZiA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICAgIGludDMyX3Qgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKICAgICBpbnQzMl90IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIGJvb2wgYlVzZU1hdHRlID0gcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICAgIEZYX0JPT0wgYlVzZU1hdHRlID0gcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7CiAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiSW1hZ2UiKSk7CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICAgIEFyZ2JEZWNvZGUocEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoMSksIHNldF9hLCBzZXRfciwgc2V0X2csIHNldF9iKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2V0X2EgPT0gMCB8fCByZXNldF9hID09IDApIHsKLSAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiSW1hZ2VNYXNrIiksIG5ldyBDUERGX0Jvb2xlYW4odHJ1ZSkpOworICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJJbWFnZU1hc2siKSwgbmV3IENQREZfQm9vbGVhbihUUlVFKSk7CiAgICAgICAgICAgICBpZiAocmVzZXRfYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CiAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEpOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBwQnVmWzRdID0gKEZYX0NIQVIpc2V0X2c7CiAgICAgICAgICAgICBwQnVmWzVdID0gKEZYX0NIQVIpc2V0X2I7CiAgICAgICAgICAgICBjdC5SZWxlYXNlQnVmZmVyKDYpOwotICAgICAgICAgICAgcENTLT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShjdCwgdHJ1ZSkpOworICAgICAgICAgICAgcENTLT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShjdCwgVFJVRSkpOwogICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIHBDUyk7CiAgICAgICAgIH0KICAgICAgICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCAxKTsKQEAgLTE5NCwxMCArMTk0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFza0JpdG1hcCA9IE5VTEw7Ci0gICAgYm9vbCBiRGVsZXRlTWFzayA9IGZhbHNlOworICAgIEZYX0JPT0wgYkRlbGV0ZU1hc2sgPSBGQUxTRTsKICAgICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSkgewogICAgICAgICBwTWFza0JpdG1hcCA9IHBCaXRtYXAtPkdldEFscGhhTWFzaygpOwotICAgICAgICBiRGVsZXRlTWFzayA9IHRydWU7CisgICAgICAgIGJEZWxldGVNYXNrID0gVFJVRTsKICAgICB9CiAgICAgaWYgKCFwTWFza0JpdG1hcCAmJiBwTWFzaykgewogICAgICAgICBGWERJQl9Gb3JtYXQgbWFza0Zvcm1hdCA9IHBNYXNrLT5HZXRGb3JtYXQoKTsKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICBpZiAocE1hc2tCaXRtYXAtPkdldEJQUCgpID09IDggJiYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9NQVNLX0xPU1NZX0NPTVBSRVNTKSAhPSAwKSB7CiAgICAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwgbWFza19idWYsIG1hc2tfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAocE1hc2tCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrKSB7Ci0gICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgbV9wRG9jdW1lbnQsIG1hc2tfYnVmLCBtYXNrX3NpemUsIHRydWUpOworICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIG1fcERvY3VtZW50LCBtYXNrX2J1ZiwgbWFza19zaXplLCBUUlVFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1hc2tfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBtYXNrSGVpZ2h0LCBtYXNrV2lkdGgpOwogICAgICAgICAgICAgbWFza19zaXplID0gbWFza0hlaWdodCAqIG1hc2tXaWR0aDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KQEAgLTI0NSwxNSArMjQ1LDE1IEBACiAgICAgICAgICAgICBkZWxldGUgcE1hc2tCaXRtYXA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgYm9vbCBiU3RyZWFtID0gcEZpbGVXcml0ZSAhPSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMOworICAgIEZYX0JPT0wgYlN0cmVhbSA9IHBGaWxlV3JpdGUgIT0gTlVMTCAmJiBwRmlsZVJlYWQgIT0gTlVMTDsKICAgICBpZiAob3BUeXBlID09IDApIHsKICAgICAgICAgaWYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUykgewogICAgICAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBUUlVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBtX3BEb2N1bWVudCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIEZBTFNFKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPj0gOCAmJiBwQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKICAgICAgICAgICAgICAgICBwTmV3Qml0bWFwLT5Db3B5KHBCaXRtYXApOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgKaW5kZXggZTUyNTQwOC4uZjU3ZTUyNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oCkBAIC0xMiwxNSArMTIsMTUgQEAKIHB1YmxpYzoKICAgICBDUERGX0NNYXBNYW5hZ2VyKCk7CiAgICAgfkNQREZfQ01hcE1hbmFnZXIoKTsKLSAgICB2b2lkKgkJCQlHZXRQYWNrYWdlKGJvb2wgYlByb21wdCk7Ci0gICAgQ1BERl9DTWFwKgkJCQlHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiUHJvbXB0KTsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKglHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0KTsKKyAgICB2b2lkKgkJCQlHZXRQYWNrYWdlKEZYX0JPT0wgYlByb21wdCk7CisgICAgQ1BERl9DTWFwKgkJCQlHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiUHJvbXB0KTsKKyAgICBDUERGX0NJRDJVbmljb2RlTWFwKglHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0KTsKICAgICB2b2lkCQkJCQlSZWxvYWRBbGwoKTsKIHByaXZhdGU6Ci0gICAgQ1BERl9DTWFwKgkJCQlMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsICBib29sIGJQcm9tcHQpOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0KTsKLSAgICB2b2lkCQkJCQlEcm9wQWxsKGJvb2wgYlJlbG9hZCk7Ci0gICAgYm9vbAkJCQkJbV9iUHJvbXB0ZWQ7CisgICAgQ1BERl9DTWFwKgkJCQlMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsICBGWF9CT09MIGJQcm9tcHQpOworICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0KTsKKyAgICB2b2lkCQkJCQlEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCk7CisgICAgRlhfQk9PTAkJCQkJbV9iUHJvbXB0ZWQ7CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0NNYXBzOwogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCW1fQ0lEMlVuaWNvZGVNYXBzWzZdOwogfTsKQEAgLTU2LDcgKzU2LDcgQEAKIHB1YmxpYzoKICAgICBDUERGX0NNYXBQYXJzZXIoKTsKICAgICB+Q1BERl9DTWFwUGFyc2VyKCkge30KLSAgICBib29sCUluaXRpYWxpemUoQ1BERl9DTWFwKik7CisgICAgRlhfQk9PTAlJbml0aWFsaXplKENQREZfQ01hcCopOwogICAgIHZvaWQJUGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKICAgICBDRlhfQmluYXJ5QnVmCW1fQWRkTWFwczsKIHByaXZhdGU6CkBAIC04MCwxMCArODAsMTAgQEAKIHsKIHB1YmxpYzoKICAgICBDUERGX0NNYXAoKTsKLSAgICBib29sCQkJCQlMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBuYW1lLCBib29sIGJQcm9tcHRDSkspOwotICAgIGJvb2wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgICBGWF9CT09MCQkJCQlMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspOworICAgIEZYX0JPT0wJCQkJCUxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKICAgICB2b2lkCQkJCQlSZWxlYXNlKCk7Ci0gICAgYm9vbAkJCQkJSXNMb2FkZWQoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJCUlzTG9hZGVkKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JMb2FkZWQ7CiAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fQ2hhcnNldDsKICAgICB9Ci0gICAgYm9vbAkJCQkJSXNWZXJ0V3JpdGluZygpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJSXNWZXJ0V3JpdGluZygpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmVydGljYWw7CiAgICAgfQpAQCAtMTA5LDE0ICsxMDksMTQgQEAKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NJREZvbnQ7CiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1ByZWRlZmluZWRDTWFwOwotICAgIGJvb2wJCQkJCW1fYlZlcnRpY2FsOworICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOwogICAgIGludAkJCQkJCW1fQ2hhcnNldCwgbV9Db2Rpbmc7CiAgICAgQ29kaW5nU2NoZW1lCQkJbV9Db2RpbmdTY2hlbWU7CiAgICAgaW50CQkJCQkJbV9uQ29kZVJhbmdlczsKICAgICB1aW50OF90KgkJCQltX3BMZWFkaW5nQnl0ZXM7CiAgICAgRlhfV09SRCoJCQkJbV9wTWFwcGluZzsKICAgICB1aW50OF90KgkJCQltX3BBZGRNYXBwaW5nOwotICAgIGJvb2wJCQkJCW1fYkxvYWRlZDsKKyAgICBGWF9CT09MCQkJCQltX2JMb2FkZWQ7CiAgICAgY29uc3QgRlhDTUFQX0NNYXAqCQltX3BFbWJlZE1hcDsKICAgICBDUERGX0NNYXAqCQkJCW1fcFVzZU1hcDsKIH07CkBAIC0xNDYsOSArMTQ2LDkgQEAKIHB1YmxpYzoKICAgICBDUERGX0NJRDJVbmljb2RlTWFwKCk7CiAgICAgfkNQREZfQ0lEMlVuaWNvZGVNYXAoKTsKLSAgICBib29sCQlJbml0aWFsaXplKCk7Ci0gICAgYm9vbAkJSXNMb2FkZWQoKTsKLSAgICB2b2lkCQlMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGludCBjaGFyc2V0LCBib29sIGJQcm9tcHRDSkspOworICAgIEZYX0JPT0wJCUluaXRpYWxpemUoKTsKKyAgICBGWF9CT09MCQlJc0xvYWRlZCgpOworICAgIHZvaWQJCUxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSyk7CiAgICAgRlhfV0NIQVIJVW5pY29kZUZyb21DSUQoRlhfV09SRCBDSUQpOwogcHJvdGVjdGVkOgogICAgIGludAkJCW1fQ2hhcnNldDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnQuY3BwCmluZGV4IGFmY2NlNmQuLjgwMzdhOGMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcApAQCAtMTIsMTYgKzEyLDE2IEBACiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJmb250X2ludC5oIgogCi1ib29sIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpCitGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSArKykgewogICAgICAgICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IHBsYXRmb3JtX2lkICYmCiAgICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZ0lEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IGVuY29kaW5nX2lkKSB7CiAgICAgICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogQ1BERl9Gb250R2xvYmFsczo6Q1BERl9Gb250R2xvYmFscygpCiAgICAgOiBtX3BDb250cmFzdFJhbXBzKE5VTEwpCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICBtX3BGb250RmlsZSA9IE5VTEw7CiAgICAgbV9GbGFncyA9IDA7CiAgICAgbV9wVG9Vbmljb2RlTWFwID0gTlVMTDsKLSAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSBmYWxzZTsKKyAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSBGQUxTRTsKICAgICBtX3BDaGFyTWFwID0gbmV3IENQREZfRm9udENoYXJNYXAodGhpcyk7CiB9CiBDUERGX0ZvbnQ6On5DUERGX0ZvbnQoKQpAQCAtMTM1LDkgKzEzNSw5IEBACiAgICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoKENQREZfU3RyZWFtKiltX3BGb250RmlsZS0+R2V0U3RyZWFtKCkpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9Gb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9Gb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKIHsKLSAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOworICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IEdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTIzNiwzMyArMjM2LDMzIEBACiB7CiAgICAgbV9GbGFncyA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmxhZ3MiKSwgUERGRk9OVF9OT05TWU1CT0xJQyk7CiAgICAgaW50IEl0YWxpY0FuZ2xlID0gMDsKLSAgICBib29sIGJFeGlzdEl0YWxpY0FuZ2xlID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRXhpc3RJdGFsaWNBbmdsZSA9IEZBTFNFOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJJdGFsaWNBbmdsZSIpKSkgewogICAgICAgICBJdGFsaWNBbmdsZSA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiSXRhbGljQW5nbGUiKSk7Ci0gICAgICAgIGJFeGlzdEl0YWxpY0FuZ2xlID0gdHJ1ZTsKKyAgICAgICAgYkV4aXN0SXRhbGljQW5nbGUgPSBUUlVFOwogICAgIH0KICAgICBpZiAoSXRhbGljQW5nbGUgPCAwKSB7CiAgICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CiAgICAgICAgIG1fSXRhbGljQW5nbGUgPSBJdGFsaWNBbmdsZTsKICAgICB9Ci0gICAgYm9vbCBiRXhpc3RTdGVtViA9IGZhbHNlOworICAgIEZYX0JPT0wgYkV4aXN0U3RlbVYgPSBGQUxTRTsKICAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiU3RlbVYiKSkpIHsKICAgICAgICAgbV9TdGVtViA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RlbVYiKSk7Ci0gICAgICAgIGJFeGlzdFN0ZW1WID0gdHJ1ZTsKKyAgICAgICAgYkV4aXN0U3RlbVYgPSBUUlVFOwogICAgIH0KLSAgICBib29sIGJFeGlzdEFzY2VudCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkV4aXN0QXNjZW50ID0gRkFMU0U7CiAgICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkFzY2VudCIpKSkgewogICAgICAgICBtX0FzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQXNjZW50IikpOwotICAgICAgICBiRXhpc3RBc2NlbnQgPSB0cnVlOworICAgICAgICBiRXhpc3RBc2NlbnQgPSBUUlVFOwogICAgIH0KLSAgICBib29sIGJFeGlzdERlc2NlbnQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdERlc2NlbnQgPSBGQUxTRTsKICAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiRGVzY2VudCIpKSkgewogICAgICAgICBtX0Rlc2NlbnQgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkRlc2NlbnQiKSk7Ci0gICAgICAgIGJFeGlzdERlc2NlbnQgPSB0cnVlOworICAgICAgICBiRXhpc3REZXNjZW50ID0gVFJVRTsKICAgICB9Ci0gICAgYm9vbCBiRXhpc3RDYXBIZWlnaHQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdENhcEhlaWdodCA9IEZBTFNFOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJDYXBIZWlnaHQiKSkpIHsKLSAgICAgICAgYkV4aXN0Q2FwSGVpZ2h0ID0gdHJ1ZTsKKyAgICAgICAgYkV4aXN0Q2FwSGVpZ2h0ID0gVFJVRTsKICAgICB9CiAgICAgaWYgKGJFeGlzdEl0YWxpY0FuZ2xlICYmIGJFeGlzdEFzY2VudCAmJiBiRXhpc3RDYXBIZWlnaHQgJiYgYkV4aXN0RGVzY2VudCAmJiBiRXhpc3RTdGVtVikgewogICAgICAgICBtX0ZsYWdzIHw9IFBERkZPTlRfVVNFRVhURVJOQVRUUjsKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICAgICAgbV9Bc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CiAgICAgICAgICAgICBtX0Rlc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCBiRmlyc3QgPSB0cnVlOworICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3Q7CiAgICAgICAgICAgICAgICAgR2V0Q2hhckJCb3goaSwgcmVjdCk7CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdCkgewogICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94ID0gcmVjdDsKLSAgICAgICAgICAgICAgICAgICAgYkZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRCQm94LnRvcCA8IHJlY3QudG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94LnRvcCA9IHJlY3QudG9wOwpAQCAtMzYxLDcgKzM2MSw3IEBACiB9CiB2b2lkIENQREZfRm9udDo6TG9hZFVuaWNvZGVNYXAoKQogewotICAgIG1fYlRvVW5pY29kZUxvYWRlZCA9IHRydWU7CisgICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gVFJVRTsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcEZvbnREaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQ2NiwxMCArNDY2LDEwIEBACiAgICAgfQogICAgIHJldHVybiBwRm9udDsKIH0KLWJvb2wgQ1BERl9Gb250OjpMb2FkKCkKK0ZYX0JPT0wgQ1BERl9Gb250OjpMb2FkKCkKIHsKICAgICBpZiAobV9wRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7CiAgICAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwpAQCAtNjIzLDcgKzYyMyw3IEBACiB7CiAgICAgaW50IENJRFNldCA9IDA7CiAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CisgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKICAgICBDUERGX1NpbXBsZVBhcnNlciBwYXJzZXIoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSk7CiAgICAgbV9NYXAuRXN0aW1hdGVTaXplKHN0cmVhbS5HZXRTaXplKCkgLyA4LCAxMDI0KTsKICAgICB3aGlsZSAoMSkgewpAQCAtNzE5LDEyICs3MTksMTIgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoQ0lEU2V0KSB7Ci0gICAgICAgIG1fcEJhc2VNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChDSURTZXQsIGZhbHNlKTsKKyAgICAgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgRkFMU0UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcEJhc2VNYXAgPSBOVUxMOwogICAgIH0KIH0KLXN0YXRpYyBib29sIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKK3N0YXRpYyBGWF9CT09MIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKIHsKICAgICBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpKSB7CiAgICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7CkBAIC03MzUsMTIgKzczNSwxMiBAQAogICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIlBERkRvY0VuY29kaW5nIikpIHsKICAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9Gb250OjpMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywgaW50JiBpQmFzZUVuY29kaW5nLCBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVtYmVkZGVkLCBib29sIGJUcnVlVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW1iZWRkZWQsIEZYX0JPT0wgYlRydWVUeXBlKQogewogICAgIGlmIChwRW5jb2RpbmcgPT0gTlVMTCkgewogICAgICAgICBpZiAobV9CYXNlRm9udCA9PSBGWF9CU1RSQygiU3ltYm9sIikpIHsKQEAgLTgwMiwxOCArODAyLDE4IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfRm9udDo6SXNTdGFuZGFyZEZvbnQoKSBjb25zdAorRlhfQk9PTCBDUERGX0ZvbnQ6OklzU3RhbmRhcmRGb250KCkgY29uc3QKIHsKICAgICBpZiAobV9Gb250VHlwZSAhPSBQREZGT05UX1RZUEUxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wRm9udEZpbGUgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCgoQ1BERl9UeXBlMUZvbnQqKXRoaXMpLT5HZXRCYXNlMTRGb250KCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfU2ltcGxlRm9udDo6Q1BERl9TaW1wbGVGb250KGludCBmb250dHlwZSkgOiBDUERGX0ZvbnQoZm9udHR5cGUpCiB7CkBAIC04MjgsMTAgKzgyOCwxMCBAQAogewogICAgIGRlbGV0ZVtdIG1fcENoYXJOYW1lczsKIH0KLWludCBDUERGX1NpbXBsZUZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBib29sICpwVmVydEdseXBoKQoraW50IENQREZfU2ltcGxlRm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCiB7CiAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBmYWxzZTsKKyAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKICAgICB9CiAgICAgaWYgKGNoYXJjb2RlID4gMHhmZikgewogICAgICAgICByZXR1cm4gLTE7CkBAIC05MjMsNyArOTIzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG5hbWU7CiB9Ci1ib29sIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCitGWF9CT09MIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7CiAgICAgaWYgKHBGb250RGVzYykgewpAQCAtOTMxLDkgKzkzMSw5IEBACiAgICAgfQogICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaWR0aHMiKSk7CiAgICAgaW50IHdpZHRoX3N0YXJ0ID0gMCwgd2lkdGhfZW5kID0gLTE7Ci0gICAgbV9iVXNlRm9udFdpZHRoID0gdHJ1ZTsKKyAgICBtX2JVc2VGb250V2lkdGggPSBUUlVFOwogICAgIGlmIChwV2lkdGhBcnJheSkgewotICAgICAgICBtX2JVc2VGb250V2lkdGggPSBmYWxzZTsKKyAgICAgICAgbV9iVXNlRm9udFdpZHRoID0gRkFMU0U7CiAgICAgICAgIGlmIChwRm9udERlc2MgJiYgcEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiTWlzc2luZ1dpZHRoIikpKSB7CiAgICAgICAgICAgICBpbnQgTWlzc2luZ1dpZHRoID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNaXNzaW5nV2lkdGgiKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewpAQCAtOTcwLDcgKzk3MCw3IEBACiAgICAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOwogICAgIG1fcENoYXJOYW1lcyA9IE5VTEw7CiAgICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9BTExDQVApIHsKICAgICAgICAgdW5zaWduZWQgY2hhciBsb3dlcmNhc2VzW10gPSB7J2EnLCAneicsIDB4ZTAsIDB4ZjYsIDB4ZjgsIDB4ZmR9OwpAQCAtOTg4LDcgKzk4OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQ2hlY2tGb250TWV0cmljcygpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX1NpbXBsZUZvbnQ6OkxvYWRTdWJzdEZvbnQoKQogewpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICBpZiAobV9Gb250Lm1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX05PTlNZTUJPTCkgewogICAgIH0KIH0KLWJvb2wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOICYmIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmCiAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIHsKICAgICBtX0Jhc2UxNEZvbnQgPSAtMTsKIH0KLWJvb2wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKK0ZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKIHsKICAgICBtX0Jhc2UxNEZvbnQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUobV9CYXNlRm9udCk7CiAgICAgaWYgKG1fQmFzZTE0Rm9udCA+PSAwKSB7CkBAIC0xMDQ2LDIxICsxMDQ2LDIxIEBACiAgICAgfQogICAgIHJldHVybiBMb2FkQ29tbW9uKCk7CiB9Ci1zdGF0aWMgYm9vbCBGVF9Vc2VUeXBlMUNoYXJtYXAoRlhGVF9GYWNlIGZhY2UpCitzdGF0aWMgRlhfQk9PTCBGVF9Vc2VUeXBlMUNoYXJtYXAoRlhGVF9GYWNlIGZhY2UpCiB7CiAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKSA9PSAxICYmCiAgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pID09IEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7CiAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVsxXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBleHRlcm4gRlhfV0NIQVIgRlRfVW5pY29kZUZyb21DaGFyQ29kZShpbnQgZW5jb2RpbmcsIEZYX0RXT1JEIGNoYXJjb2RlKTsKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTExMTIsMjEgKzExMTIsMjEgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBib29sIGJDb3JlVGV4dCA9IHRydWU7CisgICAgRlhfQk9PTCBiQ29yZVRleHQgPSBUUlVFOwogICAgIENRdWFydHoyRCAmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKICAgICBpZiAoIW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQpIHsKICAgICAgICAgaWYgKG1fRm9udC5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7Ci0gICAgICAgICAgICBiQ29yZVRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJDb3JlVGV4dCA9IEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG1fRm9udC5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KG1fRm9udC5tX3BGb250RGF0YSwgbV9Gb250Lm1fZHdTaXplKTsKICAgICAgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgYkNvcmVUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgogICAgIGlmICghSXNFbWJlZGRlZCgpICYmIChtX0Jhc2UxNEZvbnQgPCAxMikgJiYgbV9Gb250LklzVFRGb250KCkpIHsKICAgICAgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKSkgewotICAgICAgICAgICAgYm9vbCBiR290T25lID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKICAgICAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7CkBAIC0xMTQzLDcgKzExNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEyMzcsOSArMTIzNyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCBiVW5pY29kZSA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7CiAgICAgICAgIGlmICgwID09IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICAgICAgYlVuaWNvZGUgPSB0cnVlOworICAgICAgICAgICAgYlVuaWNvZGUgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CkBAIC0xMzE1LDkgKzEzMTUsOSBAQAogI2VuZGlmCiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBiVW5pY29kZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYlVuaWNvZGUgPSBGQUxTRTsKICAgICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKLSAgICAgICAgYlVuaWNvZGUgPSB0cnVlOworICAgICAgICBiVW5pY29kZSA9IFRSVUU7CiAgICAgfQogICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAgICAgICAgICAgICBtX1VuaWNvZGVzW2ldID0gcFNyY1tpXTsKICAgICAgICAgfQogfQotYm9vbCBDUERGX0ZvbnRFbmNvZGluZzo6SXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdAorRlhfQk9PTCBDUERGX0ZvbnRFbmNvZGluZzo6SXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9Vbmljb2RlcywgcEFub3RoZXItPm1fVW5pY29kZXMsIHNpemVvZihtX1VuaWNvZGVzKSkgPT0gMDsKIH0KQEAgLTEzNzIsMTAgKzEzNzIsMTAgQEAKICAgICBpbnQgcHJlZGVmaW5lZCA9IDA7CiAgICAgZm9yIChpbnQgY3MgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7IGNzIDwgUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFM7IGNzICsrKSB7CiAgICAgICAgIGNvbnN0IEZYX1dPUkQqIHBTcmMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChjcyk7Ci0gICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgICAgICBGWF9CT09MIG1hdGNoID0gVFJVRTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICAgICAgICAgaWYgKG1fVW5pY29kZXNbaV0gIT0gcFNyY1tpXSkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBGQUxTRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIENQREZfVHJ1ZVR5cGVGb250OjpDUERGX1RydWVUeXBlRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFJVRVRZUEUpCiB7CiB9Ci1ib29sIENQREZfVHJ1ZVR5cGVGb250OjpfTG9hZCgpCitGWF9CT09MIENQREZfVHJ1ZVR5cGVGb250OjpfTG9hZCgpCiB7CiAgICAgcmV0dXJuIExvYWRDb21tb24oKTsKIH0KQEAgLTE0MjYsMTQgKzE0MjYsMTQgQEAKICAgICBpZiAobV9wRm9udEZpbGUgJiYgbV9Gb250Lm1fRmFjZS0+bnVtX2NoYXJtYXBzID4gMAogICAgICAgICAgICAgJiYgKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIHx8IGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpCiAgICAgICAgICAgICAmJiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7Ci0gICAgICAgIGJvb2wgYlN1cHBvcnRXaW4gPSBmYWxzZTsKLSAgICAgICAgYm9vbCBiU3VwcG9ydE1hYyA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJTdXBwb3J0V2luID0gRkFMU0U7CisgICAgICAgIEZYX0JPT0wgYlN1cHBvcnRNYWMgPSBGQUxTRTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKTsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgcGxhdGZvcm1faWQgPSBGWEZUX0dldF9DaGFybWFwX1BsYXRmb3JtSUQoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhtX0ZvbnQubV9GYWNlKVtpXSk7CiAgICAgICAgICAgICBpZiAocGxhdGZvcm1faWQgPT0gMCB8fCBwbGF0Zm9ybV9pZCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgYlN1cHBvcnRXaW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGJTdXBwb3J0V2luID0gVFJVRTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1faWQgPT0gMCB8fCBwbGF0Zm9ybV9pZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYlN1cHBvcnRNYWMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJTdXBwb3J0TWFjID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSAmJiAhYlN1cHBvcnRXaW4pIHsKQEAgLTE0NTksOCArMTQ1OSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOwotICAgICAgICBib29sIGJNYWNSb21hbiA9IGZhbHNlLCBiTVNTeW1ib2wgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOworICAgICAgICBGWF9CT09MIGJNYWNSb21hbiA9IEZBTFNFLCBiTVNTeW1ib2wgPSBGQUxTRTsKICAgICAgICAgaWYgKCFiTVNVbmljb2RlKSB7CiAgICAgICAgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpIHsKICAgICAgICAgICAgICAgICBiTWFjUm9tYW4gPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCk7CkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9ICFiTVNTeW1ib2wgJiYgRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJvb2wgYlRvVW5pY29kZSA9IG1fcEZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVG9Vbmljb2RlIikpOworICAgICAgICBGWF9CT09MIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CkBAIC0xNTIzLDEzICsxNTIzLDEzIEBACiAgICAgfQogICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07Ci0gICAgICAgIGJvb2wgYkdvdE9uZSA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaiArKykgewogICAgICAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOwogICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwogICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTU1MiwxMiArMTU1MiwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCkpIHsKLSAgICAgICAgYm9vbCBiR290T25lID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwogICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOwogICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobV9wRm9udEZpbGUgfHwgYkdvdE9uZSkgewpAQCAtMTU2NSw3ICsxNTY1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpID09IDApIHsKLSAgICAgICAgYm9vbCBiR290T25lID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwogICAgICAgICBjb25zdCBGWF9XT1JEKiBwVW5pY29kZXMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChiYXNlRW5jb2RpbmcpOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwpIHsKQEAgLTE1ODAsNyArMTU4MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKTsKICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgYkdvdE9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJHb3RPbmUpIHsKQEAgLTE2MTQsNyArMTYxNCw3IEBACiAgICAgICAgIGRlbGV0ZSAoQ1BERl9UeXBlM0NoYXIqKWtleTsKICAgICB9CiB9Ci1ib29sIENQREZfVHlwZTNGb250OjpfTG9hZCgpCitGWF9CT09MIENQREZfVHlwZTNGb250OjpfTG9hZCgpCiB7CiAgICAgbV9wRm9udFJlc291cmNlcyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CiAgICAgQ1BERl9BcnJheSogcE1hdHJpeCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRm9udE1hdHJpeCIpKTsKQEAgLTE2NDgsNyArMTY0OCw3IEBACiAgICAgbV9wQ2hhclByb2NzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNoYXJQcm9jcyIpKTsKICAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7CiAgICAgaWYgKHBFbmNvZGluZykgewotICAgICAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBGQUxTRSwgRkFMU0UpOwogICAgICAgICBpZiAobV9wQ2hhck5hbWVzKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewogICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShtX3BDaGFyTmFtZXNbaV0pOwpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9UeXBlM0ZvbnQ6OkNoZWNrVHlwZTNGb250TWV0cmljcygpCiB7CkBAIC0xNzM2LDggKzE3MzYsOCBAQAogewogICAgIG1fcEZvcm0gPSBOVUxMOwogICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgbV9iUGFnZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgbV9iQ29sb3JlZCA9IGZhbHNlOworICAgIG1fYlBhZ2VSZXF1aXJlZCA9IEZBTFNFOworICAgIG1fYkNvbG9yZWQgPSBGQUxTRTsKIH0KIENQREZfVHlwZTNDaGFyOjp+Q1BERl9UeXBlM0NoYXIoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAppbmRleCA4Zjk1ZTU5Li5mNzBiOWVjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcApAQCAtMTMsMTggKzEzLDE4IEBACiAjaW5jbHVkZSAiZm9udF9pbnQuaCIKIAogZXh0ZXJuIHNob3J0IFRUMlBERihpbnQgbSwgRlhGVF9GYWNlIGZhY2UpOwotZXh0ZXJuIGJvb2wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCk7CitleHRlcm4gRlhfQk9PTCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKTsKIAogQ1BERl9DTWFwTWFuYWdlcjo6Q1BERl9DTWFwTWFuYWdlcigpCiB7Ci0gICAgbV9iUHJvbXB0ZWQgPSBmYWxzZTsKKyAgICBtX2JQcm9tcHRlZCA9IEZBTFNFOwogICAgIEZYU1lTX21lbXNldChtX0NJRDJVbmljb2RlTWFwcywgMCwgc2l6ZW9mIG1fQ0lEMlVuaWNvZGVNYXBzKTsKIH0KIENQREZfQ01hcE1hbmFnZXI6On5DUERGX0NNYXBNYW5hZ2VyKCkKIHsKLSAgICBEcm9wQWxsKGZhbHNlKTsKKyAgICBEcm9wQWxsKEZBTFNFKTsKIH0KLUNQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGJvb2wgYlByb21wdENKSykKK0NQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKIHsKICAgICBDUERGX0NNYXAqIHBDTWFwOwogICAgIGlmIChtX0NNYXBzLkxvb2t1cChuYW1lLCAodm9pZComKXBDTWFwKSkgewpAQCAtMzcsNyArMzcsNyBAQAogICAgIG1fQ01hcHMuU2V0QXQobmFtZSwgcENNYXApOwogICAgIHJldHVybiBwQ01hcDsKIH0KLUNQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6TG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJQcm9tcHRDSkspCitDUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiUHJvbXB0Q0pLKQogewogICAgIENQREZfQ01hcCogcENNYXAgPSBuZXcgQ1BERl9DTWFwOwogICAgIGNvbnN0IEZYX0NIQVIqIHBuYW1lID0gbmFtZTsKQEAgLTU5LDkgKzU5LDkgQEAKIH0KIHZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6UmVsb2FkQWxsKCkKIHsKLSAgICBEcm9wQWxsKHRydWUpOworICAgIERyb3BBbGwoVFJVRSk7CiB9Ci12b2lkIENQREZfQ01hcE1hbmFnZXI6OkRyb3BBbGwoYm9vbCBiUmVsb2FkKQordm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCkKIHsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NNYXBzLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlJlbG9hZCkgewotICAgICAgICAgICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIG5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBuYW1lLCBGQUxTRSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZWxldGUgcENNYXA7CiAgICAgICAgIH0KQEAgLTgzLDIwICs4MywyMCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJSZWxvYWQpIHsKLSAgICAgICAgICAgIHBNYXAtPkxvYWQodGhpcywgaSwgZmFsc2UpOworICAgICAgICAgICAgcE1hcC0+TG9hZCh0aGlzLCBpLCBGQUxTRSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZWxldGUgcE1hcDsKICAgICAgICAgfQogICAgIH0KIH0KLUNQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBib29sIGJQcm9tcHRDSkspCitDUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQogewogICAgIGlmIChtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XSA9PSBOVUxMKSB7CiAgICAgICAgIG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID0gTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIGJQcm9tcHRDSkspOwogICAgIH0KICAgICByZXR1cm4gbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF07CiB9Ci1DUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIGJvb2wgYlByb21wdENKSykKK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQogewogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIHBNYXAgPSBuZXcgQ1BERl9DSUQyVW5pY29kZU1hcCgpOwogICAgIGlmICghcE1hcC0+SW5pdGlhbGl6ZSgpKSB7CkBAIC0xMTIsMTMgKzExMiwxMyBAQAogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX0NvZGVTZXEgPSAwOwogfQotYm9vbAlDUERGX0NNYXBQYXJzZXI6OkluaXRpYWxpemUoQ1BERl9DTWFwKiBwQ01hcCkKK0ZYX0JPT0wJQ1BERl9DTWFwUGFyc2VyOjpJbml0aWFsaXplKENQREZfQ01hcCogcENNYXApCiB7CiAgICAgbV9wQ01hcCA9IHBDTWFwOwogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX0NvZGVTZXEgPSAwOwogICAgIG1fQWRkTWFwcy5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogc3RhdGljIEZYX0RXT1JEIENNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCiB7CkBAIC0xNDcsMTAgKzE0NywxMCBAQAogICAgIH0KICAgICByZXR1cm4gbnVtOwogfQotc3RhdGljIGJvb2wgX0NNYXBfR2V0Q29kZVJhbmdlKF9DTWFwX0NvZGVSYW5nZSYgcmFuZ2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlyc3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKQorc3RhdGljIEZYX0JPT0wgX0NNYXBfR2V0Q29kZVJhbmdlKF9DTWFwX0NvZGVSYW5nZSYgcmFuZ2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlyc3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKQogewogICAgIGlmIChmaXJzdC5HZXRMZW5ndGgoKSA9PSAwIHx8IGZpcnN0LkdldEF0KDApICE9ICc8JykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMTsgaSA8IGZpcnN0LkdldExlbmd0aCgpOyBpICsrKQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgICAgIH0KICAgICByYW5nZS5tX0NoYXJTaXplID0gKGkgLSAxKSAvIDI7CiAgICAgaWYgKHJhbmdlLm1fQ2hhclNpemUgPiA0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgaSArKykgewogICAgICAgICB1aW50OF90IGRpZ2l0MSA9IGZpcnN0LkdldEF0KGkgKiAyICsgMSk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArICgoZGlnaXQyID49ICcwJyAmJiBkaWdpdDIgPD0gJzknKSA/IChkaWdpdDIgLSAnMCcpIDogKChkaWdpdDIgJiAweGRmKSAtICdBJyArIDEwKSk7CiAgICAgICAgIHJhbmdlLm1fVXBwZXJbaV0gPSBieXRlOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBDTWFwX0dldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCiB7CkBAIC0yODIsNyArMjgyLDcgQEAKICAgICBtX0NvZGluZyA9IENJRENPRElOR19VTktOT1dOOwogICAgIG1fQ29kaW5nU2NoZW1lID0gVHdvQnl0ZXM7CiAgICAgbV9iVmVydGljYWwgPSAwOwotICAgIG1fYkxvYWRlZCA9IGZhbHNlOworICAgIG1fYkxvYWRlZCA9IEZBTFNFOwogICAgIG1fcE1hcHBpbmcgPSBOVUxMOwogICAgIG1fcExlYWRpbmdCeXRlcyA9IE5VTEw7CiAgICAgbV9wQWRkTWFwcGluZyA9IE5VTEw7CkBAIC0zNDYsMTQgKzM0NiwxNCBAQAogfTsKIGV4dGVybiB2b2lkIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhcnNldCwgaW50IGNvZGluZywgY29uc3QgRlhDTUFQX0NNYXAqJiBwTWFwKTsKIGV4dGVybiBGWF9XT1JEIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9EV09SRCBjaGFyY29kZSk7Ci1ib29sIENQREZfQ01hcDo6TG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgY29uc3QgRlhfQ0hBUiogcE5hbWUsIGJvb2wgYlByb21wdENKSykKK0ZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBwTmFtZSwgRlhfQk9PTCBiUHJvbXB0Q0pLKQogewogICAgIG1fUHJlZGVmaW5lZENNYXAgPSBwTmFtZTsKICAgICBpZiAobV9QcmVkZWZpbmVkQ01hcCA9PSBGWF9CU1RSQygiSWRlbnRpdHktSCIpIHx8IG1fUHJlZGVmaW5lZENNYXAgPT0gRlhfQlNUUkMoIklkZW50aXR5LVYiKSkgewogICAgICAgICBtX0NvZGluZyA9IENJRENPRElOR19DSUQ7CiAgICAgICAgIG1fYlZlcnRpY2FsID0gcE5hbWVbOV0gPT0gJ1YnOwotICAgICAgICBtX2JMb2FkZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgbV9iTG9hZGVkID0gVFJVRTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7CiAgICAgbV9iVmVydGljYWwgPSBjbWFwaWQuUmlnaHQoMSkgPT0gRlhfQlNUUkMoIlYiKTsKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIGludCBpbmRleCA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XS5tX3BOYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAoY21hcGlkID09IENGWF9CeXRlU3RyaW5nQyhnX1ByZWRlZmluZWRDTWFwc1tpbmRleF0ubV9wTmFtZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzg0LDEwICszODQsMTAgQEAKICAgICB9CiAgICAgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKHBOYW1lLCBtX0NoYXJzZXQsIG1fQ29kaW5nLCBtX3BFbWJlZE1hcCk7CiAgICAgaWYgKG1fcEVtYmVkTWFwKSB7Ci0gICAgICAgIG1fYkxvYWRlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBtX2JMb2FkZWQgPSBUUlVFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIGV4dGVybiAiQyIgewogICAgIHN0YXRpYyBpbnQgY29tcGFyZV9kd29yZChjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpCkBAIC0zOTUsNyArMzk1LDcgQEAKICAgICAgICAgcmV0dXJuICgqKEZYX0RXT1JEKilkYXRhMSkgLSAoKihGWF9EV09SRCopZGF0YTIpOwogICAgIH0KIH07Ci1ib29sIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQorRlhfQk9PTCBDUERGX0NNYXA6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKICAgICBtX3BNYXBwaW5nID0gRlhfQWxsb2MoRlhfV09SRCwgNjU1MzYpOwogICAgIENQREZfQ01hcFBhcnNlciBwYXJzZXI7CkBAIC00MTQsNyArNDE0LDcgQEAKICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldEJ1ZmZlcigpLCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSk7CiAgICAgICAgIEZYU1lTX3Fzb3J0KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDgsIDgsIGNvbXBhcmVfZHdvcmQpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGV4dGVybiAiQyIgewogICAgIHN0YXRpYyBpbnQgY29tcGFyZUNJRChjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCkBAIC02NjgsMTEgKzY2OCwxMSBAQAogQ1BERl9DSUQyVW5pY29kZU1hcDo6fkNQREZfQ0lEMlVuaWNvZGVNYXAoKQogewogfQotYm9vbCBDUERGX0NJRDJVbmljb2RlTWFwOjpJbml0aWFsaXplKCkKK0ZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SW5pdGlhbGl6ZSgpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfQ0lEMlVuaWNvZGVNYXA6OklzTG9hZGVkKCkKK0ZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SXNMb2FkZWQoKQogewogICAgIHJldHVybiBtX0VtYmVkZGVkQ291bnQgIT0gMDsKIH0KQEAgLTY4Nyw3ICs2ODcsNyBAQAogICAgIHJldHVybiAwOwogfQogdm9pZCBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgY29uc3QgRlhfV09SRComIHBNYXAsIEZYX0RXT1JEJiBjb3VudCk7Ci12b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIGJvb2wgYlByb21wdENKSykKK3ZvaWQgQ1BERl9DSUQyVW5pY29kZU1hcDo6TG9hZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQogewogICAgIG1fQ2hhcnNldCA9IGNoYXJzZXQ7CiAgICAgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgbV9wRW1iZWRkZWRNYXAsIG1fRW1iZWRkZWRDb3VudCk7CkBAIC03MDAsOCArNzAwLDggQEAKICAgICBtX3BDSUQyVW5pY29kZU1hcCA9IE5VTEw7CiAgICAgbV9wQW5zaVdpZHRocyA9IE5VTEw7CiAgICAgbV9wQ0lEVG9HSURNYXAgPSBOVUxMOwotICAgIG1fYkNJRElzR0lEID0gZmFsc2U7Ci0gICAgbV9iQWRvYmVDb3VyaWVyU3RkID0gZmFsc2U7CisgICAgbV9iQ0lESXNHSUQgPSBGQUxTRTsKKyAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBGQUxTRTsKICAgICBtX3BUVEdTVUJUYWJsZSA9IE5VTEw7CiAgICAgRlhTWVNfbWVtc2V0KG1fQ2hhckJCb3gsIDB4ZmYsIDI1NiAqIHNpemVvZihGWF9TTUFMTF9SRUNUKSk7CiB9CkBAIC03MjEsOSArNzIxLDkgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fcENNYXAtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CiB9Ci1ib29sIENQREZfQ0lERm9udDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0CitGWF9CT09MIENQREZfQ0lERm9udDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fcENNYXAgPyBtX3BDTWFwLT5Jc1ZlcnRXcml0aW5nKCkgOiBmYWxzZTsKKyAgICByZXR1cm4gbV9wQ01hcCA/IG1fcENNYXAtPklzVmVydFdyaXRpbmcoKSA6IEZBTFNFOwogfQogZXh0ZXJuIEZYX0RXT1JEIEZQREZBUElfQ2hhckNvZGVGcm9tQ0lEKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9XT1JEIGNpZCk7CiBzdGF0aWMgRlhfRFdPUkQgX0VtYmVkZGVkQ2hhcmNvZGVGcm9tVW5pY29kZShjb25zdCBGWENNQVBfQ01hcCogcEVtYmVkTWFwLCBpbnQgY2hhcnNldCwgRlhfV0NIQVIgdW5pY29kZSkKQEAgLTg3MywyNyArODczLDI3IEBACiAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgKkZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9DSURGb250OjpfTG9hZCgpCitGWF9CT09MIENQREZfQ0lERm9udDo6X0xvYWQoKQogewogICAgIGlmIChtX3BGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJUcnVlVHlwZSIpKSB7CiAgICAgICAgIHJldHVybiBMb2FkR0IyMzEyKCk7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBGb250cyA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVzY2VuZGFudEZvbnRzIikpOwogICAgIGlmIChwRm9udHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBGb250cy0+R2V0Q291bnQoKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURGb250RGljdCA9IHBGb250cy0+R2V0RGljdCgwKTsKICAgICBpZiAocENJREZvbnREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fQmFzZUZvbnQgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7CiAgICAgaWYgKChtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQiKSA9PSAwIHx8IG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1Cb2xkIikgPT0gMAogICAgICAgICAgICAgfHwgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIikgPT0gMCB8fCBtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQtT2JsaXF1ZSIpID09IDApCiAgICAgICAgICAgICAmJiAhSXNFbWJlZGRlZCgpKSB7Ci0gICAgICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IHRydWU7CisgICAgICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IFRSVUU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcENJREZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKICAgICBpZiAocEZvbnREZXNjKSB7CkBAIC05MDEsMTIgKzkwMSwxMiBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7CiAgICAgaWYgKHBFbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBzdWJ0eXBlID0gcENJREZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7Ci0gICAgbV9iVHlwZTEgPSBmYWxzZTsKKyAgICBtX2JUeXBlMSA9IEZBTFNFOwogICAgIGlmIChzdWJ0eXBlID09IEZYX0JTVFJDKCJDSURGb250VHlwZTAiKSkgewotICAgICAgICBtX2JUeXBlMSA9IHRydWU7CisgICAgICAgIG1fYlR5cGUxID0gVFJVRTsKICAgICB9CiAgICAgaWYgKHBFbmNvZGluZy0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNtYXAgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwpAQCAtOTE2LDEzICs5MTYsMTMgQEAKICAgICAgICAgbV9wQWxsb2NhdGVkQ01hcCA9IG1fcENNYXAgPSBuZXcgQ1BERl9DTWFwOwogICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcEVuY29kaW5nOwogICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CiAgICAgICAgIG1fcENNYXAtPkxvYWRFbWJlZGRlZChhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcENNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9DaGFyc2V0ID0gbV9wQ01hcC0+bV9DaGFyc2V0OwogICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX1VOS05PV04pIHsKQEAgLTk1NSwxNCArOTU1LDE0IEBACiAgICAgICAgICAgICBpZiAocG1hcCkgewogICAgICAgICAgICAgICAgIGlmIChwbWFwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICAgICAgICAgICAgICBtX3BDSURUb0dJRE1hcCA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICAgICAgICAgICAgICAgICAgbV9wQ0lEVG9HSURNYXAtPkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcG1hcCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtX3BDSURUb0dJRE1hcC0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwbWFwLCBGQUxTRSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbWFwLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygiSWRlbnRpdHkiKSkgewogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogICAgICAgICAgICAgICAgICAgICBpZiAobV9wRm9udEZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNJRElzR0lEID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNJRElzR0lEID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CiAjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05ODMsNyArOTgzLDcgQEAKICAgICAgICAgICAgIG1fRGVmYXVsdFcxID0gLTEwMDA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBGWF9GTE9BVCBfQ0lEVHJhbnNmb3JtVG9GbG9hdCh1aW50OF90IGNoKQogewpAQCAtMTAwMSw3ICsxMDAxLDcgQEAKICAgICAgICAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBiVmVydCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlZlcnQgPSBGQUxTRTsKICAgICBpbnQgZ2x5cGhfaW5kZXggPSBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSwgJmJWZXJ0KTsKICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJlY3QgPSBGWF9SRUNUKDAsIDAsIDAsIDApOwpAQCAtMTEyMCwxMCArMTEyMCwxMCBAQAogICAgIHZ4ID0gKHNob3J0KWR3V2lkdGggLyAyOwogICAgIHZ5ID0gKHNob3J0KW1fRGVmYXVsdFZZOwogfQotaW50CUNQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBib29sICpwVmVydEdseXBoKQoraW50CUNQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBGWF9CT09MICpwVmVydEdseXBoKQogewogICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gZmFsc2U7CisgICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7CiAgICAgfQogICAgIGludCBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSApOwogICAgIGlmICh1bmljb2RlID09IDB4MjUwMikgewpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKICAgICAgICAgICAgIGlmICh2aW5kZXgpIHsKICAgICAgICAgICAgICAgICBpbmRleCA9IHZpbmRleDsKICAgICAgICAgICAgICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAgICAgICAgICAgICAqcFZlcnRHbHlwaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CkBAIC0xMTU3LDIxICsxMTU3LDIxIEBACiAgICAgICAgICAgICBpZiAodmluZGV4KSB7CiAgICAgICAgICAgICAgICAgaW5kZXggPSB2aW5kZXg7CiAgICAgICAgICAgICAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBWZXJ0R2x5cGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcFZlcnRHbHlwaCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CiAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBmYWxzZTsKKyAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIGluZGV4OwogfQotaW50IENQREZfQ0lERm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGgpCitpbnQgQ1BERl9DSURGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCkKIHsKICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IGZhbHNlOworICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCAmJiBtX3BDSURUb0dJRE1hcCA9PSBOVUxMKSB7CiAgICAgICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKQEAgLTEyMDYsOCArMTIwNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjaGFyY29kZSArPSAzMTsKICAgICAgICAgICAgIGludCBpbmRleCA9IDAsIGlCYXNlRW5jb2Rpbmc7Ci0gICAgICAgICAgICBib29sIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7Ci0gICAgICAgICAgICBib29sIGJNYWNSb21hbiA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOworICAgICAgICAgICAgRlhfQk9PTCBiTWFjUm9tYW4gPSBGQUxTRTsKICAgICAgICAgICAgIGlmICghYk1TVW5pY29kZSkgewogICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKICAgICAgICAgICAgIH0KQEAgLTEzMjcsMTYgKzEzMjcsMTYgQEAKIHsKICAgICByZXR1cm4gbV9wQ01hcC0+QXBwZW5kQ2hhcihzdHIsIGNoYXJjb2RlKTsKIH0KLWJvb2wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgbV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKICAgICAgICAgcmV0dXJuIG1fcENNYXAtPm1fQ29kaW5nICE9IENJRENPRElOR19VTktOT1dOOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9DSURGb250OjpJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKK0ZYX0JPT0wgQ1BERl9DSURGb250OjpJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9DSURGb250OjpMb2FkU3Vic3RGb250KCkKIHsKQEAgLTEzOTAsNyArMTM5MCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpCitGWF9CT09MIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpCiB7CiAgICAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwpAQCAtMTM5OCwxMCArMTM5OCwxMCBAQAogICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKICAgICB9CiAgICAgbV9DaGFyc2V0ID0gQ0lEU0VUX0dCMTsKLSAgICBtX2JUeXBlMSA9IGZhbHNlOworICAgIG1fYlR5cGUxID0gRkFMU0U7CiAgICAgbV9wQ01hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKAotICAgICAgICAgICAgICAgICAgRlhfQlNUUkMoIkdCSy1FVUMtSCIpLCBmYWxzZSk7Ci0gICAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChtX0NoYXJzZXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgIEZYX0JTVFJDKCJHQkstRVVDLUgiKSwgRkFMU0UpOworICAgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBGQUxTRSk7CiAgICAgaWYgKCFJc0VtYmVkZGVkKCkpIHsKICAgICAgICAgTG9hZFN1YnN0Rm9udCgpOwogICAgIH0KQEAgLTE0MTEsNyArMTQxMSw3IEBACiAgICAgZm9yIChpbnQgaSA9IDMyOyBpIDwgMTI3OyBpICsrKSB7CiAgICAgICAgIG1fcEFuc2lXaWR0aHNbaV0gPSA1MDA7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY29uc3Qgc3RydWN0IF9DSURUcmFuc2Zvcm0gewogICAgIEZYX1dPUkQJCUNJRDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcAppbmRleCA5ODBlMTZjLi5hNjUzNTljIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwCkBAIC00OCwxNSArNDgsMTUgQEAKICAgICB9CiAgICAgbV9CdWZmZXIuSW5zZXJ0QmxvY2sobG93ICogc2l6ZW9mKF9JbnRQYWlyKSwgJnBhaXIsIHNpemVvZihfSW50UGFpcikpOwogfQotYm9vbCBDRlhfR2x5cGhNYXA6Okxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKQorRlhfQk9PTCBDRlhfR2x5cGhNYXA6Okxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKQogewogICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0ludFBhaXIpLCBfQ29tcGFyZUludCk7CiAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdmFsdWUgPSAoKEZYX0RXT1JEKilwUmVzdWx0KVsxXTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6TG9hZEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKQogewpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IHRydWU7CisgICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IFRSVUU7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CiAgICAgd2hpbGUgKHBvcykgewpAQCAtNDIwLDcgKzQyMCw3IEBACiAgICAgICAgIHJlYy0+U3Vic3RpdHV0ZVtpXSA9IEdldFVJbnQxNihzcCk7CiAgICAgfQogfQotYm9vbCBDRlhfR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKQorRlhfQk9PTCBDRlhfR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKQogewogICAgIHJldHVybiBtX0dzdWJJbXAuR2V0VmVydGljYWxHbHlwaChnbHlwaG51bSwgdmdseXBobnVtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oCmluZGV4IDEzMzY2N2IuLjFiMThmODIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAgICAgQ0ZYX0dseXBoTWFwKCk7CiAgICAgfkNGWF9HbHlwaE1hcCgpOwogICAgIHZvaWQJU2V0QXQoaW50IGtleSwgaW50IHZhbHVlKTsKLSAgICBib29sCUxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKTsKKyAgICBGWF9CT09MCUxvb2t1cChpbnQga2V5LCBpbnQgJnZhbHVlKTsKIHByb3RlY3RlZDoKICAgICBDRlhfQmluYXJ5QnVmCW1fQnVmZmVyOwogfTsKIGNsYXNzIENGWF9DVFRHU1VCVGFibGUKIHsKIHB1YmxpYzoKLSAgICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpOiBtX2JGZWF1dHVyZU1hcExvYWQoZmFsc2UpLCBsb2FkZWQoZmFsc2UpIHt9OwotICAgIENGWF9DVFRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik6IG1fYkZlYXV0dXJlTWFwTG9hZChmYWxzZSksIGxvYWRlZChmYWxzZSkKKyAgICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpOiBtX2JGZWF1dHVyZU1hcExvYWQoRkFMU0UpLCBsb2FkZWQoZmFsc2UpIHt9OworICAgIENGWF9DVFRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik6IG1fYkZlYXV0dXJlTWFwTG9hZChGQUxTRSksIGxvYWRlZChmYWxzZSkKICAgICB7CiAgICAgICAgIExvYWRHU1VCVGFibGUoZ3N1Yik7CiAgICAgfQpAQCAtMzk1LDcgKzM5NSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIENGWF9DTWFwRFdvcmRUb0RXb3JkIG1fZmVhdHVyZU1hcDsKLSAgICBib29sCW1fYkZlYXV0dXJlTWFwTG9hZDsKKyAgICBGWF9CT09MCW1fYkZlYXV0dXJlTWFwTG9hZDsKICAgICBib29sIGxvYWRlZDsKICAgICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgaGVhZGVyOwogICAgIHN0cnVjdCBUU2NyaXB0TGlzdCBTY3JpcHRMaXN0OwpAQCAtNDA2LDcgKzQwNiw3IEBACiB7CiBwdWJsaWM6CiAgICAgfkNGWF9HU1VCVGFibGUoKSBvdmVycmlkZSB7fQotICAgIHZpcnR1YWwgYm9vbCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgb3ZlcnJpZGU7CiAKICAgICBDRlhfQ1RUR1NVQlRhYmxlIG1fR3N1YkltcDsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcAppbmRleCA3MjllOTZjLi5mNDA0MzUyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICBtX1RvcCA9IHBTcmMtPm1fVG9wOwogICAgIG1fQm90dG9tID0gcFNyYy0+bV9Cb3R0b207CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBib29sIGJBdXRvTWVyZ2UpCit2b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpCiB7CiAgICAgbV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIHR5cGUsIGJBdXRvTWVyZ2UpOwogfQpAQCAtMzUzLDcgKzM1Myw3IEBACiB7CiAgICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CisgICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgICAgICByZXR1cm4gR2V0Q2hhcldpZHRoKGNoYXJDb2RlKTsKICAgICB9CiAgICAgRlhfRkxPQVQgZm9udFNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gNDAwMC4wZjsKLSAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOworICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC0zODgsNyArMzg4LDcgQEAKIHZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFyUmVjdChpbnQgaW5kZXgsIENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOworICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC00NDEsNyArNDQxLDcgQEAKICAgICBGWF9GTE9BVCBtaW5feSA9IDEwMDAwICogMS4wZjsKICAgICBGWF9GTE9BVCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOworICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC01NzAsNyArNTcwLDcgQEAKIHZvaWQgQ1BERl9UZXh0T2JqZWN0OjpDYWxjQ2hhclBvcyhGWF9GTE9BVCogcFBvc0FycmF5KSBjb25zdAogewogICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOwogICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwogICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAgICAgbV9SaWdodCA9IGZvcm1fcmVjdC5yaWdodDsKICAgICBtX1RvcCA9IGZvcm1fcmVjdC50b3A7CiB9Ci1DUERGX1BhZ2VPYmplY3RzOjpDUERGX1BhZ2VPYmplY3RzKGJvb2wgYlJlbGVhc2VNZW1iZXJzKQorQ1BERl9QYWdlT2JqZWN0czo6Q1BERl9QYWdlT2JqZWN0cyhGWF9CT09MIGJSZWxlYXNlTWVtYmVycykKICAgICA6IG1fcEZvcm1EaWN0KG51bGxwdHIpLAogICAgICAgbV9wRm9ybVN0cmVhbShudWxscHRyKSwKICAgICAgIG1fcERvY3VtZW50KG51bGxwdHIpLApAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICBtX3BSZXNvdXJjZXMobnVsbHB0ciksCiAgICAgICBtX1RyYW5zcGFyZW5jeSgwKSwKICAgICAgIG1fT2JqZWN0TGlzdCgxMjgpLAotICAgICAgbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkKGZhbHNlKSwKKyAgICAgIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZChGQUxTRSksCiAgICAgICBtX2JSZWxlYXNlTWVtYmVycyhiUmVsZWFzZU1lbWJlcnMpLAogICAgICAgbV9wUGFyc2VyKG51bGxwdHIpLAogICAgICAgbV9QYXJzZVN0YXRlKENPTlRFTlRfTk9UX1BBUlNFRCkKQEAgLTg1Niw3ICs4NTYsNyBAQAogewogICAgIG1fcFBhZ2VSZW5kZXIgPSBOVUxMOwogfQotdm9pZCBDUERGX1BhZ2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgYm9vbCBiUGFnZUNhY2hlKQordm9pZCBDUERGX1BhZ2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgRlhfQk9PTCBiUGFnZUNhY2hlKQogewogICAgIG1fcERvY3VtZW50ID0gKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudDsKICAgICBtX3BGb3JtRGljdCA9IHBQYWdlRGljdDsKQEAgLTkyMyw3ICs5MjMsNyBAQAogICAgIG1fVHJhbnNwYXJlbmN5ID0gUERGVFJBTlNfSVNPTEFURUQ7CiAgICAgTG9hZFRyYW5zSW5mbygpOwogfQotdm9pZCBDUERGX1BhZ2U6OlN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBib29sIGJSZVBhcnNlKQordm9pZCBDUERGX1BhZ2U6OlN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBGWF9CT09MIGJSZVBhcnNlKQogewogICAgIGlmIChiUmVQYXJzZSkgewogICAgICAgICBDbGVhckNhY2hlT2JqZWN0cygpOwpAQCAtOTM1LDcgKzkzNSw3IEBACiAgICAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwT3B0aW9ucyk7CiAgICAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTSU5HOwogfQotdm9pZCBDUERGX1BhZ2U6OlBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIGJvb2wgYlJlUGFyc2UpCit2b2lkIENQREZfUGFnZTo6UGFyc2VDb250ZW50KENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkKIHsKICAgICBTdGFydFBhcnNlKHBPcHRpb25zLCBiUmVQYXJzZSk7CiAgICAgQ29udGludWVQYXJzZShOVUxMKTsKQEAgLTEwNjgsOCArMTA2OCw4IEBACiB9CiBDUERGX1BhcnNlT3B0aW9uczo6Q1BERl9QYXJzZU9wdGlvbnMoKQogewotICAgIG1fYlRleHRPbmx5ID0gZmFsc2U7Ci0gICAgbV9iTWFya2VkQ29udGVudCA9IHRydWU7Ci0gICAgbV9iU2VwYXJhdGVGb3JtID0gdHJ1ZTsKLSAgICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IGZhbHNlOworICAgIG1fYlRleHRPbmx5ID0gRkFMU0U7CisgICAgbV9iTWFya2VkQ29udGVudCA9IFRSVUU7CisgICAgbV9iU2VwYXJhdGVGb3JtID0gVFJVRTsKKyAgICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2NvbG9ycy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAppbmRleCBiMWM4ODM3Li4xOTgwNTRlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBmYW1pbHksIENvbXBvbmVudHNGb3JGYW1pbHkoZmFtaWx5KSkgewogfQogCi1ib29sIENQREZfRGV2aWNlQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICAgICAgUiA9IHBCdWZbMF07CkBAIC04MSw1NiArODEsNTYgQEAKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlQobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTik7CiAgICAgICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKIHsKICAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgYyA9IHBCdWZbMF07CiAgICAgbSA9IHBCdWZbMV07CiAgICAgeSA9IHBCdWZbMl07CiAgICAgayA9IHBCdWZbM107Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGV2aWNlQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICAgICAgcEJ1ZlswXSA9IFI7CiAgICAgICAgIHBCdWZbMV0gPSBHOwogICAgICAgICBwQnVmWzJdID0gQjsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewogICAgICAgICBpZiAoUiA9PSBHICYmIFIgPT0gQikgewogICAgICAgICAgICAgKnBCdWYgPSBSOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKICAgICAgICAgc1JHQl90b19BZG9iZUNNWUsoUiwgRywgQiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EZXZpY2VDUzo6dl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAorRlhfQk9PTCBDUERGX0RldmljZUNTOjp2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CiB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQihjLCBtLCB5LCBrLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgICAgICBwQnVmWzBdID0gYzsKICAgICAgICAgcEJ1ZlsxXSA9IG07CiAgICAgICAgIHBCdWZbMl0gPSB5OwogICAgICAgICBwQnVmWzNdID0gazsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogc3RhdGljIHZvaWQgUmV2ZXJzZVJHQih1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscykKIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgcFNyY0J1ZiArPSAzOwogICAgICAgICB9CiB9Ci12b2lkIENQREZfRGV2aWNlQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfRGV2aWNlQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgaWYgKGJUcmFuc01hc2sgJiYgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewpAQCAtMjc0LDExICsyNzQsMTEgQEAKICAgICBleHBsaWNpdCBDUERGX0NhbEdyYXkoQ1BERl9Eb2N1bWVudCogcERvYykKICAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfQ0FMR1JBWSwgMSkgewogICAgIH0KLSAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CkBAIC0yODYsNyArMjg2LDcgQEAKICAgICBGWF9GTE9BVCBtX0dhbW1hOwogfTsKIAotYm9vbCBDUERGX0NhbEdyYXk6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitGWF9CT09MIENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOwogICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKQEAgLTMwMiwyMiArMzAyLDIyIEBACiAgICAgaWYgKG1fR2FtbWEgPT0gMCkgewogICAgICAgICBtX0dhbW1hID0gMS4wZjsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfQ2FsR3JheTo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorRlhfQk9PTCBDUERGX0NhbEdyYXk6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBSID0gRyA9IEIgPSAqcEJ1ZjsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9DYWxHcmF5OjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CitGWF9CT09MIENQREZfQ2FsR3JheTo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIGlmIChSID09IEcgJiYgUiA9PSBCKSB7CiAgICAgICAgICpwQnVmID0gUjsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBDUERGX0NhbEdyYXk6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfQ2FsR3JheTo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewogICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwpAQCAtMzMxLDI0ICszMzEsMjQgQEAKICAgICBleHBsaWNpdCBDUERGX0NhbFJHQihDUERGX0RvY3VtZW50KiBwRG9jKQogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxSR0IsIDMpIHsKICAgICB9Ci0gICAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CiAgICAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOwogICAgIEZYX0ZMT0FUIG1fR2FtbWFbM107CiAgICAgRlhfRkxPQVQgbV9NYXRyaXhbOV07Ci0gICAgYm9vbCBtX2JHYW1tYTsKLSAgICBib29sIG1fYk1hdHJpeDsKKyAgICBGWF9CT09MIG1fYkdhbW1hOworICAgIEZYX0JPT0wgbV9iTWF0cml4OwogfTsKLWJvb2wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitGWF9CT09MIENQREZfQ2FsUkdCOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7CiAgICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CiAgICAgaW50IGk7CkBAIC0zNjEsMjUgKzM2MSwyNSBAQAogICAgIH0KICAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkdhbW1hIikpOwogICAgIGlmIChwUGFyYW0pIHsKLSAgICAgICAgbV9iR2FtbWEgPSB0cnVlOworICAgICAgICBtX2JHYW1tYSA9IFRSVUU7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7CiAgICAgICAgICAgICBtX0dhbW1hW2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtX2JHYW1tYSA9IGZhbHNlOworICAgICAgICBtX2JHYW1tYSA9IEZBTFNFOwogICAgIH0KICAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIk1hdHJpeCIpKTsKICAgICBpZiAocFBhcmFtKSB7Ci0gICAgICAgIG1fYk1hdHJpeCA9IHRydWU7CisgICAgICAgIG1fYk1hdHJpeCA9IFRSVUU7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpICsrKSB7CiAgICAgICAgICAgICBtX01hdHJpeFtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyKGkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9iTWF0cml4ID0gZmFsc2U7CisgICAgICAgIG1fYk1hdHJpeCA9IEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9DYWxSR0I6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9DYWxSR0I6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBGWF9GTE9BVCBBXyA9IHBCdWZbMF07CiAgICAgRlhfRkxPQVQgQl8gPSBwQnVmWzFdOwpAQCAtNDAwLDE2ICs0MDAsMTYgQEAKICAgICAgICAgWiA9IENfOwogICAgIH0KICAgICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLCBtX1doaXRlUG9pbnRbMl0pOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorRlhfQk9PTCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewogICAgIHBCdWZbMF0gPSBSOwogICAgIHBCdWZbMV0gPSBHOwogICAgIHBCdWZbMl0gPSBCOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotdm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9DYWxSR0I6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgaWYgKGJUcmFuc01hc2spIHsKICAgICAgICAgRlhfRkxPQVQgQ2FsWzNdOwpAQCAtNDM1LDIxICs0MzUsMjEgQEAKICAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfTEFCLCAzKSB7CiAgICAgfQogICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgYm9vbAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIEZYX0JPT0wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBGWF9CT09MCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OwogCiAgICAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOwogICAgIEZYX0ZMT0FUIG1fQmxhY2tQb2ludFszXTsKICAgICBGWF9GTE9BVCBtX1Jhbmdlc1s0XTsKIH07Ci1ib29sIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitGWF9CT09MIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKICAgICBpZiAoIXBEaWN0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CiAgICAgaW50IGk7CkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewogICAgICAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogZGVmX3Jhbmdlc1tpXTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENQREZfTGFiQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdAogewpAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfTGFiQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIEZYX0ZMT0FUIExzdGFyID0gcEJ1ZlswXTsKICAgICBGWF9GTE9BVCBhc3RhciA9IHBCdWZbMV07CkBAIC01MDksMTMgKzUwOSwxMyBAQAogICAgICAgICBaID0gMS4wODg5ZiAqIE4gKiBOICogTjsKICAgICB9CiAgICAgWFlaX3RvX3NSR0IoWCwgWSwgWiwgUiwgRywgQik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfTGFiQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci12b2lkIENQREZfTGFiQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfTGFiQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKICAgICAgICAgRlhfRkxPQVQgbGFiWzNdOwpAQCAtNTMyLDEyICs1MzIsMTIgQEAKICAgICB9CiB9CiBDUERGX0ljY1Byb2ZpbGU6OkNQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKToKLSAgICBtX2JzUkdCKGZhbHNlKSwKKyAgICBtX2JzUkdCKEZBTFNFKSwKICAgICBtX3BUcmFuc2Zvcm0oTlVMTCksCiAgICAgbV9uU3JjQ29tcG9uZW50cygwKQogewogICAgIGlmIChkd1NpemUgPT0gMzE0NCAmJiBGWFNZU19tZW1jbXAocERhdGEgKyAweDE5MCwgInNSR0IgSUVDNjE5NjYtMi4xIiwgMTcpID09IDApIHsKLSAgICAgICAgbV9ic1JHQiA9IHRydWU7CisgICAgICAgIG1fYnNSR0IgPSBUUlVFOwogICAgICAgICBtX25TcmNDb21wb25lbnRzID0gMzsKICAgICB9CiAgICAgZWxzZSBpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKSkgewpAQCAtNTU5LDIzICs1NTksMjMgQEAKICAgICAgICAgICBtX3BQcm9maWxlKG51bGxwdHIpLAogICAgICAgICAgIG1fcENhY2hlKG51bGxwdHIpLAogICAgICAgICAgIG1fcFJhbmdlcyhudWxscHRyKSwKLSAgICAgICAgICBtX2JPd24oZmFsc2UpIHsKKyAgICAgICAgICBtX2JPd24oRkFMU0UpIHsKICAgICB9CiAgICAgfkNQREZfSUNDQmFzZWRDUygpIG92ZXJyaWRlOwogCi0gICAgYm9vbAl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpIG92ZXJyaWRlOworICAgIEZYX0JPT0wJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIEZYX0JPT0wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBGWF9CT09MCXZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKICAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdGVyQ1M7CiAgICAgQ1BERl9JY2NQcm9maWxlKiBtX3BQcm9maWxlOwogICAgIHVpbnQ4X3QqIG1fcENhY2hlOwogICAgIEZYX0ZMT0FUKiBtX3BSYW5nZXM7Ci0gICAgYm9vbAltX2JPd247CisgICAgRlhfQk9PTAltX2JPd247CiB9OwogCiBDUERGX0lDQ0Jhc2VkQ1M6On5DUERGX0lDQ0Jhc2VkQ1MoKQpAQCAtNTk0LDE1ICs1OTQsMTUgQEAKICAgICB9CiB9CiAKLWJvb2wgQ1BERl9JQ0NCYXNlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbSgxKTsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BQcm9maWxlID0gcERvYy0+TG9hZEljY1Byb2ZpbGUocFN0cmVhbSk7CiAgICAgaWYgKCFtX3BQcm9maWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX25Db21wb25lbnRzID0gbV9wUHJvZmlsZS0+R2V0Q29tcG9uZW50cygpOyAvL1RyeSB1c2luZyB0aGUgbkNvbXBvbmVudHMgZnJvbSBJQ0MgcHJvZmlsZQogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CkBAIC02MTUsMTMgKzYxNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpID4gMCkgeyAvLyBVc2UgQWx0ZXJuYXRpdmUgY29sb3JzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JPd24gPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBObyB2YWxpZCBhbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICBwQWx0ZXJDUy0+UmVsZWFzZUNTKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5EaWN0Q29tcG9uZW50cyA9IHBEaWN0ID8gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk4iKSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5EaWN0Q29tcG9uZW50cyAhPSAxICYmIG5EaWN0Q29tcG9uZW50cyAhPSAzICYmIG5EaWN0Q29tcG9uZW50cyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBuRGljdENvbXBvbmVudHM7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iT3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02NjEsMTUgKzY2MSwxNSBAQAogICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gMDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9JQ0NCYXNlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CitGWF9CT09MIENQREZfSUNDQmFzZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX3BQcm9maWxlICYmIG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKICAgICAgICAgUiA9IHBCdWZbMF07CiAgICAgICAgIEcgPSBwQnVmWzFdOwogICAgICAgICBCID0gcEJ1ZlsyXTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBJQ29kZWNfSWNjTW9kdWxlICpwSWNjTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKTsKICAgICBpZiAobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtID09IE5VTEwgfHwgcEljY01vZHVsZSA9PSBOVUxMKSB7CkBAIC02NzgsNyArNjc4LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFIgPSBHID0gQiA9IDAuMGY7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9GTE9BVCByZ2JbM107CiAgICAgcEljY01vZHVsZS0+U2V0Q29tcG9uZW50cyhtX25Db21wb25lbnRzKTsKQEAgLTY4NiwzMSArNjg2LDMxIEBACiAgICAgUiA9IHJnYlswXTsKICAgICBHID0gcmdiWzFdOwogICAgIEIgPSByZ2JbMl07Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfSUNDQmFzZWRDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKK0ZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogewogICAgIGlmIChtX25Db21wb25lbnRzICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGMgPSBwQnVmWzBdOwogICAgIG0gPSBwQnVmWzFdOwogICAgIHkgPSBwQnVmWzJdOwogICAgIGsgPSBwQnVmWzNdOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0lDQ0Jhc2VkQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgQ1BERl9JQ0NCYXNlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCit2b2lkIENQREZfSUNDQmFzZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEFsdGVyQ1MpIHsKICAgICAgICAgbV9wQWx0ZXJDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgfQogfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfSUNDQmFzZWRDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBpZiAobV9wUHJvZmlsZS0+bV9ic1JHQikgewogICAgICAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOwpAQCAtNzY1LDEwICs3NjUsMTAgQEAKICAgICB9CiAgICAgfkNQREZfSW5kZXhlZENTKCkgb3ZlcnJpZGU7CiAKLSAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIGJvb2wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIEZYX0JPT0wJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKICAgICBDUERGX0NvbG9yU3BhY2UqIEdldEJhc2VDUygpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKICAgICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBtX3BDb3VudGVkQmFzZUNTOwpAQCAtNzg3LDE5ICs3ODcsMTkgQEAKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogfQotYm9vbCBDUERGX0luZGV4ZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK0ZYX0JPT0wgQ1BERl9JbmRleGVkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQmFzZU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgIGlmIChwQmFzZU9iaiA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VPYmosIE5VTEwpOwogICAgIGlmIChtX3BCYXNlQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKICAgICBtX25CYXNlQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCk7CkBAIC04MTIsMjkgKzgxMiwyOSBAQAogICAgIG1fTWF4SW5kZXggPSBwQXJyYXktPkdldEludGVnZXIoMik7CiAgICAgQ1BERl9PYmplY3QqIHBUYWJsZU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpOwogICAgIGlmIChwVGFibGVPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBUYWJsZU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKICAgICAgICAgbV9UYWJsZSA9ICgoQ1BERl9TdHJpbmcqKXBUYWJsZU9iaiktPkdldFN0cmluZygpOwogICAgIH0gZWxzZSBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBUYWJsZU9iaiwgZmFsc2UpOworICAgICAgICBhY2MuTG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwVGFibGVPYmosIEZBTFNFKTsKICAgICAgICAgbV9UYWJsZSA9IENGWF9CeXRlU3RyaW5nQyhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BERl9JbmRleGVkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9JbmRleGVkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpbnQgaW5kZXggPSAoaW50MzJfdCkoKnBCdWYpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBtX01heEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9uQmFzZUNvbXBvbmVudHMpIHsKICAgICAgICAgaWYgKGluZGV4ID09IElOVF9NQVggfHwgKGluZGV4ICsgMSkgPiBJTlRfTUFYIC8gbV9uQmFzZUNvbXBvbmVudHMgfHwKICAgICAgICAgICAgICAgICAoaW5kZXggKyAxKSptX25CYXNlQ29tcG9uZW50cyA+IChpbnQpbV9UYWJsZS5HZXRMZW5ndGgoKSkgewogICAgICAgICAgICAgUiA9IEcgPSBCID0gMDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gQ29tcHMobV9uQmFzZUNvbXBvbmVudHMpOwpAQCAtODQ0LDEzICs4NDQsMTMgQEAKICAgICAgICAgY29tcHNbaV0gPSBtX3BDb21wTWluTWF4W2kgKiAyXSArIG1fcENvbXBNaW5NYXhbaSAqIDIgKyAxXSAqIHBUYWJsZVtpbmRleCAqIG1fbkJhc2VDb21wb25lbnRzICsgaV0gLyAyNTU7CiAgICAgfQogICAgIG1fcEJhc2VDUy0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfQ29sb3JTcGFjZSpDUERGX0luZGV4ZWRDUzo6R2V0QmFzZUNTKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9wQmFzZUNTOwogfQotdm9pZCBDUERGX0luZGV4ZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQordm9pZCBDUERGX0luZGV4ZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEJhc2VDUykgewpAQCAtODcxLDM5ICs4NzEsMzkgQEAKIAkgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogfQotYm9vbCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK0ZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBCYXNlQ1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICBpZiAocEJhc2VDUyA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VDUywgTlVMTCk7CiAgICAgaWYgKG1fcEJhc2VDUykgewogICAgICAgICBpZiAobV9wQmFzZUNTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgKyAxOwogICAgICAgICBpZiAobV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSA+IE1BWF9QQVRURVJOX0NPTE9SQ09NUFMpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpZiAobV9wQmFzZUNTKSB7CiAgICAgICAgIEFTU0VSVChtX3BCYXNlQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pOwogICAgICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKXBCdWY7CiAgICAgICAgIGlmIChtX3BCYXNlQ1MtPkdldFJHQihwdmFsdWUtPm1fQ29tcHMsIFIsIEcsIEIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIFIgPSBHID0gQiA9IDAuNzVmOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDUERGX0NvbG9yU3BhY2UqIENQREZfUGF0dGVybkNTOjpHZXRCYXNlQ1MoKSBjb25zdAogewpAQCAtOTE5LDkgKzkxOSw5IEBACiAgICAgfQogICAgIH5DUERGX1NlcGFyYXRpb25DUygpIG92ZXJyaWRlOwogICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKKyAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdENTOwogICAgIENQREZfRnVuY3Rpb24qIG1fcEZ1bmM7CkBAIC05NDAsNyArOTQwLDcgQEAKICAgICBtaW4gPSAwOwogICAgIG1heCA9IDEuMGY7CiB9Ci1ib29sIENQREZfU2VwYXJhdGlvbkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorRlhfQk9PTCBDUERGX1NlcGFyYXRpb25DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEFycmF5LT5HZXRTdHJpbmcoMSk7CiAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIk5vbmUiKSkgewpAQCAtOTQ5LDExICs5NDksMTEgQEAKICAgICAgICAgbV9UeXBlID0gQ29sb3JhbnQ7CiAgICAgICAgIENQREZfT2JqZWN0KiBwQWx0Q1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgyKTsKICAgICAgICAgaWYgKHBBbHRDUyA9PSBtX3BBcnJheSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG1fcEFsdENTID0gTG9hZChwRG9jLCBwQWx0Q1MpOwogICAgICAgICBpZiAoIW1fcEFsdENTKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMyk7CiAgICAgICAgIGlmIChwRnVuY09iaiAmJiBwRnVuY09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKSB7CkBAIC05NjQsMTYgKzk2NCwxNiBAQAogICAgICAgICAgICAgbV9wRnVuYyA9IE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU2VwYXJhdGlvbkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CitGWF9CT09MIENQREZfU2VwYXJhdGlvbkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fVHlwZSA9PSBOb25lKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaW50IG5Db21wcyA9IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKTsKICAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobkNvbXBzKTsKQEAgLTk4MSwyMiArOTgxLDIyIEBACiAgICAgICAgICAgICByZXN1bHRzW2ldID0gKnBCdWY7CiAgICAgICAgIH0KICAgICAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CiAgICAgaW50IG5yZXN1bHRzID0gMDsKICAgICBtX3BGdW5jLT5DYWxsKHBCdWYsIDEsIHJlc3VsdHMsIG5yZXN1bHRzKTsKICAgICBpZiAobnJlc3VsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcEFsdENTKSB7CiAgICAgICAgIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgUiA9IEcgPSBCID0gMDsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQordm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEFsdENTKSB7CkBAIC0xMDEzLDkgKzEwMTMsOSBAQAogICAgIH0KICAgICB+Q1BERl9EZXZpY2VOQ1MoKSBvdmVycmlkZTsKICAgICB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOwogCiAgICAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRDUzsKICAgICBDUERGX0Z1bmN0aW9uKiBtX3BGdW5jOwpAQCAtMTAzMyw0NSArMTAzMyw0NSBAQAogICAgIG1pbiA9IDA7CiAgICAgbWF4ID0gMS4wZjsKIH0KLWJvb2wgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitGWF9CT09MIENQREZfRGV2aWNlTkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CiAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9uQ29tcG9uZW50cyA9ICgoQ1BERl9BcnJheSopcE9iaiktPkdldENvdW50KCk7CiAgICAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDIpOwogICAgIGlmICghcEFsdENTIHx8IHBBbHRDUyA9PSBtX3BBcnJheSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7CiAgICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMykpOwogICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMIHx8IG1fcEZ1bmMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpIDwgbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK0ZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CiAgICAgaW50IG5yZXN1bHRzID0gMDsKICAgICBtX3BGdW5jLT5DYWxsKHBCdWYsIG1fbkNvbXBvbmVudHMsIHJlc3VsdHMsIG5yZXN1bHRzKTsKICAgICBpZiAobnJlc3VsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9EZXZpY2VOQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkKK3ZvaWQgQ1BERl9EZXZpY2VOQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKIHsKICAgICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwogICAgIGlmIChtX3BBbHRDUykgewpAQCAtMTE5NywzMyArMTE5NywzMyBAQAogICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKICAgICByZXR1cm4gKEZYX0ZMT0FUKilwQnVmOwogfQotYm9vbCBDUERGX0NvbG9yU3BhY2U6OnNSR0IoKSBjb25zdAorRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OnNSR0IoKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSUNDQkFTRUQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfSUNDQmFzZWRDUyogcENTID0gKENQREZfSUNDQmFzZWRDUyopdGhpczsKICAgICByZXR1cm4gcENTLT5tX3BQcm9maWxlLT5tX2JzUkdCOwogfQotYm9vbCBDUERGX0NvbG9yU3BhY2U6OkdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAorRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OkdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogewogICAgIGlmICh2X0dldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9GTE9BVCBSLCBHLCBCOwogICAgIGlmICghR2V0UkdCKHBCdWYsIFIsIEcsIEIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBjLCBtLCB5LCBrKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9Db2xvclNwYWNlOjpTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAorRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OlNldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CiB7CiAgICAgaWYgKHZfU2V0Q01ZSyhwQnVmLCBjLCBtLCB5LCBrKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYX0ZMT0FUIFIsIEcsIEI7CiAgICAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgUiwgRywgQik7CkBAIC0xMjQ3LDcgKzEyNDcsNyBAQAogICAgIENQREZfSW5kZXhlZENTKiBwQ1MgPSAoQ1BERl9JbmRleGVkQ1MqKXRoaXM7CiAgICAgcmV0dXJuIHBDUy0+bV9NYXhJbmRleDsKIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrKSBjb25zdAordm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0CiB7CiAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHNyY2J1ZihtX25Db21wb25lbnRzKTsKICAgICBGWF9GTE9BVCogc3JjID0gc3JjYnVmOwpAQCAtMTI2NSw3ICsxMjY1LDcgQEAKICAgICAgICAgKmRlc3RfYnVmICsrID0gKGludDMyX3QpKFIgKiAyNTUpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCit2b2lkIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQogewogICAgIGlmIChiRW5hYmxlZCkgewogICAgICAgICBtX2R3U3RkQ29udmVyc2lvbiArKzsKQEAgLTEzOTcsMjMgKzEzOTcsMjMgQEAKICAgICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKICAgICAgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7CiAgICAgICAgIGlmIChwdmFsdWUtPm1fcFBhdHRlcm4gJiYgcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudCkgewotICAgICAgICAgICAgcHZhbHVlLT5tX3BQYXR0ZXJuID0gcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0UGF0dGVybihwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcFBhdHRlcm5PYmosIGZhbHNlLCAmcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX1BhcmVudE1hdHJpeCk7CisgICAgICAgICAgICBwdmFsdWUtPm1fcFBhdHRlcm4gPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wUGF0dGVybk9iaiwgRkFMU0UsICZwdmFsdWUtPm1fcFBhdHRlcm4tPm1fUGFyZW50TWF0cml4KTsKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0CitGWF9CT09MIENQREZfQ29sb3I6OkdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdAogewogICAgIGlmIChtX3BDUyA9PSBOVUxMIHx8IG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9GTE9BVCByPTAuMGYsIGc9MC4wZiwgYj0wLjBmOwogICAgIGlmICghbV9wQ1MtPkdldFJHQihtX3BCdWZmZXIsIHIsIGcsIGIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBSID0gKGludDMyX3QpKHIgKiAyNTUgKyAwLjVmKTsKICAgICBHID0gKGludDMyX3QpKGcgKiAyNTUgKyAwLjVmKTsKICAgICBCID0gKGludDMyX3QpKGIgKiAyNTUgKyAwLjVmKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfUGF0dGVybiogQ1BERl9Db2xvcjo6R2V0UGF0dGVybigpIGNvbnN0CiB7CkBAIC0xNDM4LDEwICsxNDM4LDEwIEBACiAgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7CiAgICAgcmV0dXJuIHB2YWx1ZS0+bV9uQ29tcHMgPyBwdmFsdWUtPm1fQ29tcHMgOiBOVUxMOwogfQotYm9vbCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdAorRlhfQk9PTCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdAogewogICAgIGlmIChtX3BDUyAhPSBvdGhlci5tX3BDUyB8fCBtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gRlhTWVNfbWVtY21wKG1fcEJ1ZmZlciwgb3RoZXIubV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2RvYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAppbmRleCA1Njg4NjNhLi4wNTIzM2ExIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcApAQCAtNzgsNyArNzgsNyBAQAogfQogdm9pZCBDUERGX1BhZ2VNb2R1bGU6OkNsZWFyRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpCiB7Ci0gICAgcERvYy0+R2V0UGFnZURhdGEoKS0+Q2xlYXIoZmFsc2UpOworICAgIHBEb2MtPkdldFBhZ2VEYXRhKCktPkNsZWFyKEZBTFNFKTsKIH0KIHZvaWQgQ1BERl9QYWdlTW9kdWxlOjpOb3RpZnlDSktBdmFpbGFibGUoKQogewpAQCAtODgsNyArODgsNyBAQAogQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkKIHsKICAgICBBU1NFUlQocEZvbnREaWN0KTsKLSAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRGb250KHBGb250RGljdCwgZmFsc2UpOworICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnREaWN0LCBGQUxTRSk7CiB9CiAKIENQREZfU3RyZWFtQWNjKiBDUERGX0RvY3VtZW50OjpMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pCkBAIC0xMDEsNyArMTAxLDcgQEAKIHsKICAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRDb2xvclNwYWNlKHBDU09iaiwgcFJlc291cmNlcyk7CiB9Ci1DUERGX1BhdHRlcm4qIENQREZfRG9jdW1lbnQ6OkxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KQorQ1BERl9QYXR0ZXJuKiBDUERGX0RvY3VtZW50OjpMb2FkUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIEZYX0JPT0wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkKIHsKICAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHBQYXR0ZXJuT2JqLCBiU2hhZGluZywgbWF0cml4KTsKIH0KQEAgLTEyNiwxNCArMTI2LDE0IEBACiB9CiBDUERGX0RvY1BhZ2VEYXRhOjpDUERGX0RvY1BhZ2VEYXRhKENQREZfRG9jdW1lbnQqIHBQREZEb2MpCiAgICAgOiBtX3BQREZEb2MocFBERkRvYyksCi0gICAgICBtX2JGb3JjZUNsZWFyKGZhbHNlKQorICAgICAgbV9iRm9yY2VDbGVhcihGQUxTRSkKIHsKIH0KIAogQ1BERl9Eb2NQYWdlRGF0YTo6fkNQREZfRG9jUGFnZURhdGEoKQogewotICAgIENsZWFyKGZhbHNlKTsKLSAgICBDbGVhcih0cnVlKTsKKyAgICBDbGVhcihGQUxTRSk7CisgICAgQ2xlYXIoVFJVRSk7CiAKICAgICBmb3IgKGF1dG8mIGl0IDogbV9QYXR0ZXJuTWFwKQogICAgICAgICBkZWxldGUgaXQuc2Vjb25kOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgbV9Db2xvclNwYWNlTWFwLmNsZWFyKCk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6Q2xlYXIoYm9vbCBiRm9yY2VSZWxlYXNlKQordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpDbGVhcihGWF9CT09MIGJGb3JjZVJlbGVhc2UpCiB7CiAgICAgbV9iRm9yY2VDbGVhciA9IGJGb3JjZVJlbGVhc2U7CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgIH0KIH0KIAotQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBib29sIGZpbmRPbmx5KQorQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBGWF9CT09MIGZpbmRPbmx5KQogewogICAgIGlmICghcEZvbnREaWN0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDMyLDcgKzQzMiw3IEBACiAgICAgfQogfQogCi1DUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCitDUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCiB7CiAgICAgaWYgKCFwUGF0dGVybk9iaikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1RpbGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgbWF0cml4KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcFBhdHRlcm4gPSBuZXcgQ1BERl9TaGFkaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBmYWxzZSwgbWF0cml4KTsKKyAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIEZBTFNFLCBtYXRyaXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTAxLDcgKzUwMSw3IEBACiAgICAgfQogCiAgICAgQ1BERl9JbWFnZSogcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wUERGRG9jKTsKLSAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKilwSW1hZ2VTdHJlYW0sIGZhbHNlKTsKKyAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKilwSW1hZ2VTdHJlYW0sIEZBTFNFKTsKIAogICAgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZURhdGEgPSBuZXcgQ1BERl9Db3VudGVkSW1hZ2UocEltYWdlKTsKICAgICBtX0ltYWdlTWFwW2R3SW1hZ2VPYmpOdW1dID0gaW1hZ2VEYXRhOwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgICAgfQogCiAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgZmFsc2UpOworICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgRkFMU0UpOwogICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsKICAgICBDUERGX1N0cmVhbSogcENvcGllZFN0cmVhbSA9IG51bGxwdHI7CiAgICAgQ1JZUFRfU0hBMUdlbmVyYXRlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCksIGRpZ2VzdCk7CkBAIC01OTAsMTQgKzU5MCwxNCBAQAogICAgICAgICBvcmdfc2l6ZSA9IDA7CiAKICAgICBDUERGX1N0cmVhbUFjYyogcEZvbnRGaWxlID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIHBGb250RmlsZS0+TG9hZEFsbERhdGEocEZvbnRTdHJlYW0sIGZhbHNlLCBvcmdfc2l6ZSk7CisgICAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgRkFMU0UsIG9yZ19zaXplKTsKIAogICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZnREYXRhID0gbmV3IENQREZfQ291bnRlZFN0cmVhbUFjYyhwRm9udEZpbGUpOwogICAgIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gZnREYXRhOwogICAgIHJldHVybiBmdERhdGEtPkFkZFJlZigpOwogfQogCi12b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIGJvb2wgYkZvcmNlKQordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLCBGWF9CT09MIGJGb3JjZSkKIHsKICAgICBpZiAoIXBGb250U3RyZWFtKQogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAKaW5kZXggYTkyMjE5ZC4uYzk2MWY4YiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcApAQCAtMjUsOCArMjUsOCBAQAogewogcHVibGljOgogICAgIH5DUERGX1BTUHJvYygpOwotICAgIGJvb2wJUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7Ci0gICAgYm9vbAlFeGVjdXRlKENQREZfUFNFbmdpbmUqIHBFbmdpbmUpOworICAgIEZYX0JPT0wJUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7CisgICAgRlhfQk9PTAlFeGVjdXRlKENQREZfUFNFbmdpbmUqIHBFbmdpbmUpOwogICAgIENGWF9QdHJBcnJheQkJbV9PcGVyYXRvcnM7CiB9OwogI2RlZmluZSBQU0VOR0lORV9TVEFDS1NJWkUgMTAwCkBAIC0zNSwxMiArMzUsMTIgQEAKIHB1YmxpYzoKICAgICBDUERGX1BTRW5naW5lKCk7CiAgICAgfkNQREZfUFNFbmdpbmUoKTsKLSAgICBib29sCVBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpOwotICAgIGJvb2wJRXhlY3V0ZSgpCisgICAgRlhfQk9PTAlQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKTsKKyAgICBGWF9CT09MCUV4ZWN1dGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fTWFpblByb2MuRXhlY3V0ZSh0aGlzKTsKICAgICB9Ci0gICAgYm9vbAlEb09wZXJhdG9yKFBERl9QU09QIG9wKTsKKyAgICBGWF9CT09MCURvT3BlcmF0b3IoUERGX1BTT1Agb3ApOwogICAgIHZvaWQJUmVzZXQoKQogICAgIHsKICAgICAgICAgbV9TdGFja0NvdW50ID0gMDsKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkKK0ZYX0JPT0wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkKIHsKICAgICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgIGkgKys7CiAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRikgewogICAgICAgICAgICAgaWYgKGkgPCAyIHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CiAgICAgICAgICAgICAgICAgKChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSAtIDFdKS0+RXhlY3V0ZShwRW5naW5lKTsKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0lGRUxTRSkgewogICAgICAgICAgICAgaWYgKGkgPCA0IHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DIHx8CiAgICAgICAgICAgICAgICAgICAgIG1fT3BlcmF0b3JzW2kgLSA0XSAhPSAodm9pZCopUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CiAgICAgICAgICAgICAgICAgKChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSAtIDNdKS0+RXhlY3V0ZShwRW5naW5lKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICAgICAgcEVuZ2luZS0+RG9PcGVyYXRvcihvcCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkKIHsKQEAgLTE0NSwzMSArMTQ1LDMxIEBACiAgICAgeyJjb3B5IiwgUFNPUF9DT1BZfSwgeyJpbmRleCIsIFBTT1BfSU5ERVh9LCB7InJvbGwiLCBQU09QX1JPTEx9LAogICAgIHtOVUxMLCBQU09QX1BST0N9CiB9OwotYm9vbCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKQorRlhfQk9PTCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKQogewogICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcigodWludDhfdCopc3RyaW5nLCBzaXplKTsKICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7CiAgICAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoInsiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIG1fTWFpblByb2MuUGFyc2UocGFyc2VyKTsKIH0KLWJvb2wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyJiBwYXJzZXIpCitGWF9CT09MIENQREZfUFNQcm9jOjpQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKQogewogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIn0iKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieyIpKSB7CiAgICAgICAgICAgICBDUERGX1BTUHJvYyogcFByb2MgPSBuZXcgQ1BERl9QU1Byb2M7CiAgICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQoKHZvaWQqKVBTT1BfUFJPQyk7CiAgICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQocFByb2MpOwogICAgICAgICAgICAgaWYgKCFwUHJvYy0+UGFyc2UocGFyc2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgaSA9IDA7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICB9CiB9CiAjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NWYKLWJvb2wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkKK0ZYX0JPT0wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkKIHsKICAgICBpbnQgaTEsIGkyOwogICAgIEZYX0ZMT0FUIGQxLCBkMjsKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogc3RhdGljIEZYX0ZMT0FUIFBERl9JbnRlcnBvbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB4bWluLCBGWF9GTE9BVCB4bWF4LCBGWF9GTE9BVCB5bWluLCBGWF9GTE9BVCB5bWF4KQogewpAQCAtNDQ1LDggKzQ0NSw4IEBACiBwdWJsaWM6CiAgICAgQ1BERl9TYW1wbGVkRnVuYygpOwogICAgIHZpcnR1YWwgfkNQREZfU2FtcGxlZEZ1bmMoKTsKLSAgICB2aXJ0dWFsIGJvb2wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBib29sCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgU2FtcGxlRW5jb2RlSW5mbyoJbV9wRW5jb2RlSW5mbzsKICAgICBTYW1wbGVEZWNvZGVJbmZvKgltX3BEZWNvZGVJbmZvOwogICAgIEZYX0RXT1JECW1fbkJpdHNQZXJTYW1wbGU7CkBAIC00NjksMTAgKzQ2OSwxMCBAQAogICAgICAgICBGWF9GcmVlKG1fcERlY29kZUluZm8pOwogICAgIH0KIH0KLWJvb2wgQ1BERl9TYW1wbGVkRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQorRlhfQk9PTCBDUERGX1NhbXBsZWRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCiB7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwpAQCAtNDgxLDExICs0ODEsMTEgQEAKICAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7CiAgICAgbV9uQml0c1BlclNhbXBsZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyU2FtcGxlIikpOwogICAgIGlmIChtX25CaXRzUGVyU2FtcGxlID4gMzIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fU2FtcGxlTWF4ID0gMHhmZmZmZmZmZiA+PiAoMzIgLSBtX25CaXRzUGVyU2FtcGxlKTsKICAgICBtX3BTYW1wbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CisgICAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CiAgICAgbV9wRW5jb2RlSW5mbyA9IEZYX0FsbG9jKFNhbXBsZUVuY29kZUluZm8sIG1fbklucHV0cyk7CiAgICAgRlhfU0FGRV9EV09SRCBuVG90YWxTYW1wbGVCaXRzID0gMTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSArKykgewpAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgaWYgKCFuVG90YWxTYW1wbGVCeXRlcy5Jc1ZhbGlkKCkgfHwKICAgICAgICAgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID09IDAgfHwKICAgICAgICAgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID4gbV9wU2FtcGxlU3RyZWFtLT5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fcERlY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVEZWNvZGVJbmZvLCBtX25PdXRwdXRzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKQEAgLTUyNiw5ICs1MjYsOSBAQAogICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKK0ZYX0JPT0wgQ1BERl9TYW1wbGVkRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAogewogICAgIGludCBwb3MgPSAwOwogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBlbmNvZGVkX2lucHV0X2J1ZihtX25JbnB1dHMpOwpAQCAtNTU1LDIxICs1NTUsMjEgQEAKICAgICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKICAgICBiaXRzX3RvX291dHB1dCAqPSBtX25CaXRzUGVyU2FtcGxlOwogICAgIGlmICghYml0c190b19vdXRwdXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9TQUZFX0lOVDMyIGJpdHBvcyA9IHBvczsKICAgICBiaXRwb3MgKj0gYml0c190b19vdXRwdXQuVmFsdWVPckRpZSgpOwogICAgIGlmICghYml0cG9zLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfU0FGRV9JTlQzMiByYW5nZV9jaGVjayA9IGJpdHBvczsKICAgICByYW5nZV9jaGVjayArPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CiAgICAgaWYgKCFyYW5nZV9jaGVjay5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7CiAgICAgaWYgKCFwU2FtcGxlRGF0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqICsrKSB7CiAgICAgICAgIEZYX0RXT1JEIHNhbXBsZSA9IF9HZXRCaXRzMzIocFNhbXBsZURhdGEsIGJpdHBvcy5WYWx1ZU9yRGllKCkgKyBqICogbV9uQml0c1BlclNhbXBsZSwgbV9uQml0c1BlclNhbXBsZSk7CkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgICAgICAgICBiaXRwb3MyICs9IGo7CiAgICAgICAgICAgICAgICAgYml0cG9zMiAqPSBtX25CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgICAgIGlmICghYml0cG9zMi5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNhbXBsZTEgPSBfR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MyLlZhbHVlT3JEaWUoKSwgbV9uQml0c1BlclNhbXBsZSk7CiAgICAgICAgICAgICAgICAgZW5jb2RlZCArPSAoZW5jb2RlZF9pbnB1dFtpXSAtIGluZGV4W2ldKSAqICgoRlhfRkxPQVQpc2FtcGxlMSAtIChGWF9GTE9BVClzYW1wbGUpOwpAQCAtNTk1LDIzICs1OTUsMjMgQEAKICAgICAgICAgcmVzdWx0c1tqXSA9IFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tqXS5kZWNvZGVfbWluLCBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGNsYXNzIENQREZfUFNGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGJvb2wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBib29sCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgQ1BERl9QU0VuZ2luZSBtX1BTOwogfTsKLWJvb2wgQ1BERl9QU0Z1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKK0ZYX0JPT0wgQ1BERl9QU0Z1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKIHsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKKyAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwogICAgIHJldHVybiBtX1BTLlBhcnNlKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKIH0KLWJvb2wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKK0ZYX0JPT0wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKIHsKICAgICBDUERGX1BTRW5naW5lJiBQUyA9IChDUERGX1BTRW5naW5lJiltX1BTOwogICAgIFBTLlJlc2V0KCk7CkBAIC02MjEsMjAgKzYyMSwyMCBAQAogICAgIH0KICAgICBQUy5FeGVjdXRlKCk7CiAgICAgaWYgKFBTLkdldFN0YWNrU2l6ZSgpIDwgbV9uT3V0cHV0cykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKICAgICAgICAgcmVzdWx0c1ttX25PdXRwdXRzIC0gaSAtIDFdID0gUFMuUG9wKCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY2xhc3MgQ1BERl9FeHBJbnRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KIHsKIHB1YmxpYzoKICAgICBDUERGX0V4cEludEZ1bmMoKTsKICAgICB2aXJ0dWFsIH5DUERGX0V4cEludEZ1bmMoKTsKLSAgICB2aXJ0dWFsIGJvb2wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBib29sCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgRlhfRkxPQVQJbV9FeHBvbmVudDsKICAgICBGWF9GTE9BVCoJbV9wQmVnaW5WYWx1ZXM7CiAgICAgRlhfRkxPQVQqCW1fcEVuZFZhbHVlczsKQEAgLTY1NCwxMSArNjU0LDExIEBACiAgICAgICAgIEZYX0ZyZWUobV9wRW5kVmFsdWVzKTsKICAgICB9CiB9Ci1ib29sIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQorRlhfQk9PTCBDUERGX0V4cEludEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwogICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwQXJyYXkwID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDMCIpKTsKICAgICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7CkBAIC02NzcsMjcgKzY3NywyNyBAQAogICAgIG1fRXhwb25lbnQgPSBwRGljdC0+R2V0RmxvYXQoRlhfQlNUUkMoIk4iKSk7CiAgICAgbV9uT3JpZ091dHB1dHMgPSBtX25PdXRwdXRzOwogICAgIGlmIChtX25PdXRwdXRzICYmIG1fbklucHV0cyA+IElOVF9NQVggLyBtX25PdXRwdXRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX25PdXRwdXRzICo9IG1fbklucHV0czsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9FeHBJbnRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0CitGWF9CT09MIENQREZfRXhwSW50RnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKQogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbk9yaWdPdXRwdXRzOyBqICsrKSB7CiAgICAgICAgICAgICByZXN1bHRzW2kgKiBtX25PcmlnT3V0cHV0cyArIGpdID0gbV9wQmVnaW5WYWx1ZXNbal0gKyAoRlhfRkxPQVQpRlhTWVNfcG93KGlucHV0c1tpXSwgbV9FeHBvbmVudCkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BFbmRWYWx1ZXNbal0gLSBtX3BCZWdpblZhbHVlc1tqXSk7CiAgICAgICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGNsYXNzIENQREZfU3RpdGNoRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uCiB7CiBwdWJsaWM6CiAgICAgQ1BERl9TdGl0Y2hGdW5jKCk7CiAgICAgdmlydHVhbCB+Q1BERl9TdGl0Y2hGdW5jKCk7Ci0gICAgdmlydHVhbCBib29sCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZpcnR1YWwgYm9vbAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7CisgICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OwogICAgIGludAkJCW1fblN1YnM7CiAgICAgQ1BERl9GdW5jdGlvbioqIG1fcFN1YkZ1bmN0aW9uczsKICAgICBGWF9GTE9BVCoJbV9wQm91bmRzOwpAQCAtNzI0LDE5ICs3MjQsMTkgQEAKICAgICAgICAgRlhfRnJlZShtX3BFbmNvZGUpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9TdGl0Y2hGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCitGWF9CT09MIENQREZfU3RpdGNoRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CiAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRnVuY3Rpb25zIikpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9uU3VicyA9IHBBcnJheS0+R2V0Q291bnQoKTsKICAgICBpZiAobV9uU3VicyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BTdWJGdW5jdGlvbnMgPSBGWF9BbGxvYyhDUERGX0Z1bmN0aW9uKiwgbV9uU3Vicyk7CiAgICAgbV9uT3V0cHV0cyA9IDA7CkBAIC03NDQsMTEgKzc0NCwxMSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzOyBpICsrKSB7CiAgICAgICAgIENQREZfT2JqZWN0KiBwU3ViID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7CiAgICAgICAgIGlmIChwU3ViID09IHBPYmopIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBtX3BTdWJGdW5jdGlvbnNbaV0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpOwogICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldLT5Db3VudE91dHB1dHMoKSA+IG1fbk91dHB1dHMpIHsKICAgICAgICAgICAgIG1fbk91dHB1dHMgPSBtX3BTdWJGdW5jdGlvbnNbaV0tPkNvdW50T3V0cHV0cygpOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgbV9wQm91bmRzWzBdID0gbV9wRG9tYWluc1swXTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJvdW5kcyIpKTsKICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzIC0gMTsgaSArKykgewogICAgICAgICBtX3BCb3VuZHNbaSArIDFdID0gcEFycmF5LT5HZXRGbG9hdChpKTsKQEAgLTc2NywxNCArNzY3LDE0IEBACiAgICAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uU3VicywgMik7CiAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFbmNvZGUiKSk7CiAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3VicyAqIDI7IGkgKyspIHsKICAgICAgICAgbV9wRW5jb2RlW2ldID0gcEFycmF5LT5HZXRGbG9hdChpKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU3RpdGNoRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiBvdXRwdXRzKSBjb25zdAorRlhfQk9PTCBDUERGX1N0aXRjaEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogb3V0cHV0cykgY29uc3QKIHsKICAgICBGWF9GTE9BVCBpbnB1dCA9IGlucHV0c1swXTsKICAgICBpbnQgaTsKQEAgLTc4MywxMiArNzgzLDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChtX3BTdWJGdW5jdGlvbnNbaV0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW5wdXQgPSBQREZfSW50ZXJwb2xhdGUoaW5wdXQsIG1fcEJvdW5kc1tpXSwgbV9wQm91bmRzW2kgKyAxXSwgbV9wRW5jb2RlW2kgKiAyXSwgbV9wRW5jb2RlW2kgKiAyICsgMV0pOwogICAgIGludCBucmVzdWx0czsKICAgICBtX3BTdWJGdW5jdGlvbnNbaV0tPkNhbGwoJmlucHV0LCBtX25JbnB1dHMsIG91dHB1dHMsIG5yZXN1bHRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfRnVuY3Rpb24qIENQREZfRnVuY3Rpb246OkxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKQogewpAQCAtODM3LDcgKzgzNyw3IEBACiAgICAgICAgIG1fcFJhbmdlcyA9IE5VTEw7CiAgICAgfQogfQotYm9vbCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKQorRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Q7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CkBAIC04NDcsMTEgKzg0NywxMSBAQAogICAgIH0KICAgICBDUERGX0FycmF5KiBwRG9tYWlucyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwogICAgIGlmIChwRG9tYWlucyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX25JbnB1dHMgPSBwRG9tYWlucy0+R2V0Q291bnQoKSAvIDI7CiAgICAgaWYgKG1fbklucHV0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BEb21haW5zID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uSW5wdXRzLCAyKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkgKyspIHsKQEAgLTg2OCw3ICs4NjgsNyBAQAogICAgIH0KICAgICBGWF9EV09SRCBvbGRfb3V0cHV0cyA9IG1fbk91dHB1dHM7CiAgICAgaWYgKCF2X0luaXQocE9iaikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BSYW5nZXMgJiYgbV9uT3V0cHV0cyA+IChpbnQpb2xkX291dHB1dHMpIHsKICAgICAgICAgbV9wUmFuZ2VzID0gRlhfUmVhbGxvYyhGWF9GTE9BVCwgbV9wUmFuZ2VzLCBtX25PdXRwdXRzICogMik7CkBAIC04NzYsMTIgKzg3NiwxMiBAQAogICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLCBzaXplb2YoRlhfRkxPQVQpICogKG1fbk91dHB1dHMgLSBvbGRfb3V0cHV0cykgKiAyKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9GdW5jdGlvbjo6Q2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0CitGWF9CT09MIENQREZfRnVuY3Rpb246OkNhbGwoRlhfRkxPQVQqIGlucHV0cywgaW50IG5pbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzLCBpbnQmIG5yZXN1bHRzKSBjb25zdAogewogICAgIGlmIChtX25JbnB1dHMgIT0gbmlucHV0cykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7CkBAIC05MDEsNSArOTAxLDUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwCmluZGV4IDMyNjRiZTQuLmI0ZDAzMGUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcApAQCAtOTcsNyArOTcsNyBAQAogQ1BERl9SZWN0IENQREZfQ2xpcFBhdGg6OkdldENsaXBCb3goKSBjb25zdAogewogICAgIENQREZfUmVjdCByZWN0OwotICAgIGJvb2wgYlN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7CiAgICAgaW50IGNvdW50ID0gR2V0UGF0aENvdW50KCk7CiAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7CkBAIC0xMDUsMjYgKzEwNSwyNiBAQAogICAgICAgICAgICAgQ1BERl9SZWN0IHBhdGhfcmVjdCA9IEdldFBhdGgoaSkuR2V0Qm91bmRpbmdCb3goKTsKICAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KHBhdGhfcmVjdCk7CiAgICAgICAgIH0KLSAgICAgICAgYlN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CiAgICAgfQogICAgIGNvdW50ID0gR2V0VGV4dENvdW50KCk7CiAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgIENQREZfUmVjdCBsYXllcl9yZWN0OwotICAgICAgICBib29sIGJMYXllclN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiTGF5ZXJTdGFydGVkID0gRkFMU0U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBHZXRUZXh0KGkpOwogICAgICAgICAgICAgaWYgKHBUZXh0T2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlY3QgPSBsYXllcl9yZWN0OwotICAgICAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByZWN0LkludGVyc2VjdChsYXllcl9yZWN0KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBGQUxTRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCFiTGF5ZXJTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QgPSBwVGV4dE9iai0+R2V0QkJveChOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QuVW5pb24ocFRleHRPYmotPkdldEJCb3goTlVMTCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICByZXR1cm4gcmVjdDsKIH0KLXZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIGJvb2wgYkF1dG9NZXJnZSkKK3ZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSkKIHsKICAgICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKICAgICBpZiAocERhdGEtPm1fUGF0aENvdW50ICYmIGJBdXRvTWVyZ2UpIHsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CiAgICAgcERhdGEtPm1fRmlsbENvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwogICAgIGludCBSLCBHLCBCOwotICAgIGJvb2wgcmV0ID0gcERhdGEtPm1fRmlsbENvbG9yLkdldFJHQihSLCBHLCBCKTsKKyAgICBGWF9CT09MIHJldCA9IHBEYXRhLT5tX0ZpbGxDb2xvci5HZXRSR0IoUiwgRywgQik7CiAgICAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7CiAgICAgICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSAweDAwQkZCRkJGOwogICAgICAgICByZXR1cm47CkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwogICAgIHBEYXRhLT5tX1N0cm9rZUNvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwogICAgIGludCBSLCBHLCBCOwotICAgIGJvb2wgcmV0ID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpOworICAgIEZYX0JPT0wgcmV0ID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpOwogICAgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSAxICYmICgoQ1BERl9UaWxpbmdQYXR0ZXJuKilwUGF0dGVybiktPm1fYkNvbG9yZWQgJiYgIXJldCkgewogICAgICAgICBwRGF0YS0+bV9TdHJva2VSR0IgPSAweDAwQkZCRkJGOwogICAgICAgICByZXR1cm47CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KHRoaXMsICZzcmMsIHNpemVvZihDUERGX1RleHRTdGF0ZURhdGEpKTsKICAgICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgewotICAgICAgICBtX3BGb250ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEZvbnQobV9wRm9udC0+R2V0Rm9udERpY3QoKSwgZmFsc2UpOworICAgICAgICBtX3BGb250ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEZvbnQobV9wRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOwogICAgIH0KIH0KIENQREZfVGV4dFN0YXRlRGF0YTo6fkNQREZfVGV4dFN0YXRlRGF0YSgpCkBAIC01NDUsNyArNTQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5TZXRCbGVuZE1vZGUobW9kZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA+IEZYRElCX0JMRU5EX01VTFRJUExZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5HZXRPYmplY3RMaXN0KCktPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5HZXRPYmplY3RMaXN0KCktPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjMxLDEyICs2MzEsMTIgQEAKICAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKW1fcFBhcmFtKS0+UmVsZWFzZSgpOwogICAgIH0KIH0KLWJvb2wJQ1BERl9Db250ZW50TWFya0l0ZW06Okhhc01DSUQoKSBjb25zdAorRlhfQk9PTAlDUERGX0NvbnRlbnRNYXJrSXRlbTo6SGFzTUNJRCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcmFtICYmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0IHx8IG1fUGFyYW1UeXBlID09IFByb3BlcnRpZXNEaWN0KSkgewogICAgICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkgKiltX3BQYXJhbSktPktleUV4aXN0KEZYX0JTVFJDKCJNQ0lEIikpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogQ1BERl9Db250ZW50TWFya0RhdGE6OkNQREZfQ29udGVudE1hcmtEYXRhKGNvbnN0IENQREZfQ29udGVudE1hcmtEYXRhJiBzcmMpCiB7CkBAIC02NTgsNyArNjU4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotdm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgYm9vbCBiRGlyZWN0KQordm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQk9PTCBiRGlyZWN0KQogewogICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9NYXJrcy5BZGQoKTsKICAgICBpdGVtLlNldE5hbWUobmFtZSk7CkBAIC02NzYsMjMgKzY3NiwyMyBAQAogICAgIH0KICAgICBtX01hcmtzLlJlbW92ZUF0KHNpemUgLSAxKTsKIH0KLWJvb2wgQ1BERl9Db250ZW50TWFyazo6SGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0CitGWF9CT09MIENQREZfQ29udGVudE1hcms6Okhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdAogewogICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BPYmplY3QtPkNvdW50SXRlbXMoKTsgaSArKykgewogICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fcE9iamVjdC0+R2V0SXRlbShpKTsKICAgICAgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IG1hcmspIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9Db250ZW50TWFyazo6TG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdAorRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpICsrKSB7CiAgICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9wT2JqZWN0LT5HZXRJdGVtKGkpOwpAQCAtNzAyLDggKzcwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QpIHsKICAgICAgICAgICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwCmluZGV4IDczOWEwYmQuLmFhYmZkMTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcApAQCAtNTcsNyArNTcsNyBAQAogICAgIENQREZfSW1hZ2UqIHBJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKICAgICBwSW1hZ2UtPkxvYWRJbWFnZUYoKENQREZfU3RyZWFtKikoKENQREZfT2JqZWN0KiltX3BTdHJlYW0pLT5DbG9uZSgpLCBtX2JJbmxpbmUpOwogICAgIGlmIChtX2JJbmxpbmUpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwSW5saW5lRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcElubGluZURpY3QtPkNsb25lKHRydWUpOworICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wSW5saW5lRGljdC0+Q2xvbmUoVFJVRSk7CiAgICAgICAgIHBJbWFnZS0+U2V0SW5saW5lRGljdChwSW5saW5lRGljdCk7CiAgICAgfQogICAgIHJldHVybiBwSW1hZ2U7CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICAgIG1fcFN0cmVhbSA9IE5VTEw7CiAgICAgbV9wT0MgPSBOVUxMOwotICAgIG1fYklubGluZSA9IGZhbHNlOworICAgIG1fYklubGluZSA9IEZBTFNFOwogICAgIG1fcElubGluZURpY3QgPSBOVUxMOwogICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7CiAgICAgbV9wTWFzayA9IE5VTEw7CkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfSW1hZ2U6OkxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYklubGluZSkKK0ZYX0JPT0wgQ1BERl9JbWFnZTo6TG9hZEltYWdlRihDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKQogewogICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07CiAgICAgaWYgKG1fYklubGluZSAmJiBtX3BJbmxpbmVEaWN0KSB7CkBAIC0xMDEsNSArMTAxLDUgQEAKICAgICBtX2JJbnRlcnBvbGF0ZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJJbnRlcnBvbGF0ZSIpKTsKICAgICBtX0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7CiAgICAgbV9XaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKaW5kZXggYjI3Zjk1OC4uODkyZTIxNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgogCi0jZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IG1fYkFib3J0ID0gdHJ1ZTsgcmV0dXJuOyB9CisjZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IG1fYkFib3J0ID0gVFJVRTsgcmV0dXJuOyB9CiAKIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgIG1fTGV2ZWwobGV2ZWwpLAogICAgICAgbV9QYXJhbVN0YXJ0UG9zKDApLAogICAgICAgbV9QYXJhbUNvdW50KDApLAotICAgICAgbV9iQWJvcnQoZmFsc2UpLAorICAgICAgbV9iQWJvcnQoRkFMU0UpLAogICAgICAgbV9wQ3VyU3RhdGVzKG5ldyBDUERGX0FsbFN0YXRlcyksCiAgICAgICBtX3BMYXN0VGV4dE9iamVjdChudWxscHRyKSwKICAgICAgIG1fRGVmRm9udFNpemUoMCksCkBAIC00Myw5ICs0Myw5IEBACiAgICAgICBtX3BMYXN0SW1hZ2UobnVsbHB0ciksCiAgICAgICBtX3BMYXN0SW1hZ2VEaWN0KG51bGxwdHIpLAogICAgICAgbV9wTGFzdENsb25lSW1hZ2VEaWN0KG51bGxwdHIpLAotICAgICAgbV9iUmVsZWFzZUxhc3REaWN0KHRydWUpLAotICAgICAgbV9iQ29sb3JlZChmYWxzZSksCi0gICAgICBtX2JSZXNvdXJjZU1pc3NpbmcoZmFsc2UpCisgICAgICBtX2JSZWxlYXNlTGFzdERpY3QoVFJVRSksCisgICAgICBtX2JDb2xvcmVkKEZBTFNFKSwKKyAgICAgIG1fYlJlc291cmNlTWlzc2luZyhGQUxTRSkKIHsKICAgICBpZiAocG10Q29udGVudFRvVXNlcikgewogICAgICAgICBtX210Q29udGVudFRvVXNlciA9ICpwbXRDb250ZW50VG9Vc2VyOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgaWYgKHBhcmFtLm1fVHlwZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBwYXJhbS5tX3BPYmplY3Q7CiAgICAgfQotICAgIEFTU0VSVChmYWxzZSk7CisgICAgQVNTRVJUKEZBTFNFKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIENGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0U3RyaW5nKEZYX0RXT1JEIGluZGV4KQpAQCAtMjI2LDcgKzIyNiw3IEBACiB7CiAgICAgcmV0dXJuIEdldE51bWJlcihpbmRleCk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6U2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYkNvbG9yLCBib29sIGJUZXh0LCBib29sIGJHcmFwaCkKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiQ29sb3IsIEZYX0JPT0wgYlRleHQsIEZYX0JPT0wgYkdyYXBoKQogewogICAgIHBPYmotPm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKICAgICBwT2JqLT5tX0NsaXBQYXRoID0gbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAgICAge0ZYQlNUUl9JRCgndycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCiAgICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTN9LAogfTsKLWJvb2wgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPbk9wZXJhdG9yKGNvbnN0IEZYX0NIQVIqIG9wKQorRlhfQk9PTCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApCiB7CiAgICAgaW50IGkgPSAwOwogICAgIEZYX0RXT1JEIG9waWQgPSAwOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgICAgIGludCBjb21wYXJlID0gb3BpZCAtIGdfT3BDb2Rlc1ttaWRkbGVdLm1fT3BJZDsKICAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewogICAgICAgICAgICAgKHRoaXMtPipnX09wQ29kZXNbbWlkZGxlXS5tX09wSGFuZGxlcikoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbXBhcmUgPCAwKSB7CiAgICAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTsKQEAgLTM1MiwxNCArMzUyLDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIHRydWUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsU3Ryb2tlUGF0aCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIHRydWUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKQogewpAQCAtMzY3LDE0ICszNjcsMTQgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCB0cnVlKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIFRSVUUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FT0ZpbGxTdHJva2VQYXRoKCkKIHsKICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCB0cnVlKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIFRSVUUpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSgpCiB7CkBAIC0zODYsMTMgKzM4NiwxMyBAQAogICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgYkRpcmVjdCA9IHRydWU7CisgICAgRlhfQk9PTCBiRGlyZWN0ID0gVFJVRTsKICAgICBpZiAocFByb3BlcnR5LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKICAgICAgICAgcFByb3BlcnR5ID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJQcm9wZXJ0aWVzIiksIHBQcm9wZXJ0eS0+R2V0U3RyaW5nKCkpOwogICAgICAgICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiRGlyZWN0ID0gZmFsc2U7CisgICAgICAgIGJEaXJlY3QgPSBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBQcm9wZXJ0eS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHRhZyA9IEdldFN0cmluZygwKTsKLSAgICBtX0N1ckNvbnRlbnRNYXJrLkdldE1vZGlmeSgpLT5BZGRNYXJrKHRhZywgTlVMTCwgZmFsc2UpOworICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCBOVUxMLCBGQUxTRSk7CiB9CiBzdHJ1Y3QgX0ZYX0JTVFIgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fUHRyOwpAQCAtNjIyLDIwICs2MjIsMjAgQEAKIHsKICAgICBtX1R5cGUzRGF0YVswXSA9IEdldE51bWJlcigxKTsKICAgICBtX1R5cGUzRGF0YVsxXSA9IEdldE51bWJlcigwKTsKLSAgICBtX2JDb2xvcmVkID0gdHJ1ZTsKKyAgICBtX2JDb2xvcmVkID0gVFJVRTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKICAgICAgICAgbV9UeXBlM0RhdGFbaV0gPSBHZXROdW1iZXIoNSAtIGkpOwogICAgIH0KLSAgICBtX2JDb2xvcmVkID0gZmFsc2U7CisgICAgbV9iQ29sb3JlZCA9IEZBTFNFOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdCgpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKICAgICBpZiAobmFtZSA9PSBtX0xhc3RJbWFnZU5hbWUgJiYgbV9wTGFzdEltYWdlICYmIG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCkgJiYgbV9wTGFzdEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgQWRkSW1hZ2UoTlVMTCwgbV9wTGFzdEltYWdlLCBmYWxzZSk7CisgICAgICAgIEFkZEltYWdlKE5VTEwsIG1fcExhc3RJbWFnZSwgRkFMU0UpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKQEAgLTY3MywxNCArNjczLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJvb2wgYkZvcm07CisgICAgICAgIEZYX0JPT0wgYkZvcm07CiAgICAgICAgIGlmIChtX3BEb2N1bWVudC0+SXNGb3JtU3RyZWFtKCgoQ1BERl9SZWZlcmVuY2UqKXBSZXMpLT5HZXRSZWZPYmpOdW0oKSwgYkZvcm0pICYmICFiRm9ybSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwWE9iamVjdCA9IChDUERGX1N0cmVhbSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJYT2JqZWN0IiksIG5hbWUpOwogICAgIGlmIChwWE9iamVjdCA9PSBOVUxMIHx8IHBYT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOworICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nQyB0eXBlID0gcFhPYmplY3QtPkdldERpY3QoKSA/IHBYT2JqZWN0LT5HZXREaWN0KCktPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpIDogQ0ZYX0J5dGVTdHJpbmdDKCk7CkBAIC02ODgsNyArNjg4LDcgQEAKICAgICAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBPYmogPSBBZGRJbWFnZShwWE9iamVjdCwgTlVMTCwgZmFsc2UpOworICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIEZBTFNFKTsKICAgICAgICAgbV9MYXN0SW1hZ2VOYW1lID0gbmFtZTsKICAgICAgICAgbV9wTGFzdEltYWdlID0gcE9iai0+bV9wSW1hZ2U7CiAgICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJGb3JtIikpIHsKQEAgLTcxOSwxMCArNzE5LDEwIEBACiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMuZ2V0KCksIG1fTGV2ZWwgKyAxKTsKICAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DVE0gPSBmb3JtX21hdHJpeDsKICAgICAgICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgewotICAgICAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgdHJ1ZSk7CisgICAgICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKICAgICAgICAgfQogICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CisgICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CiAgICAgICAgIGlmIChzdHJlYW0uR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzQwLDEzICs3NDAsMTMgQEAKICAgICBzdGF0dXMubV9UZXh0U3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlOwogICAgIHBGb3JtT2JqLT5tX3BGb3JtLT5QYXJzZUNvbnRlbnQoJnN0YXR1cywgTlVMTCwgTlVMTCwgJm1fT3B0aW9ucywgbV9MZXZlbCArIDEpOwogICAgIGlmICghbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkICYmIHBGb3JtT2JqLT5tX3BGb3JtLT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQpIHsKLSAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gVFJVRTsKICAgICB9CiAgICAgcEZvcm1PYmotPkNhbGNCb3VuZGluZ0JveCgpOwotICAgIFNldEdyYXBoaWNTdGF0ZXMocEZvcm1PYmosIHRydWUsIHRydWUsIHRydWUpOworICAgIFNldEdyYXBoaWNTdGF0ZXMocEZvcm1PYmosIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBGb3JtT2JqKTsKIH0KLUNQREZfSW1hZ2VPYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgYm9vbCBiSW5saW5lKQorQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJJbmxpbmUpCiB7CiAgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCAmJiBwSW1hZ2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc2Myw3ICs3NjMsNyBAQAogICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wRG9jdW1lbnQpOwogICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlLT5Mb2FkSW1hZ2VGKHBTdHJlYW0sIGJJbmxpbmUpOwogICAgIH0KLSAgICBTZXRHcmFwaGljU3RhdGVzKHBJbWFnZU9iaiwgcEltYWdlT2JqLT5tX3BJbWFnZS0+SXNNYXNrKCksIGZhbHNlLCBmYWxzZSk7CisgICAgU2V0R3JhcGhpY1N0YXRlcyhwSW1hZ2VPYmosIHBJbWFnZU9iai0+bV9wSW1hZ2UtPklzTWFzaygpLCBGQUxTRSwgRkFMU0UpOwogICAgIHBJbWFnZU9iai0+bV9NYXRyaXggPSBJbWFnZU1hdHJpeDsKICAgICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOwogICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBJbWFnZU9iaik7CkBAIC04MTcsMjEgKzgxNywyMSBAQAogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBmYWxzZSk7CisgICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgRkFMU0UpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aE9sZCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIGZhbHNlKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBGQUxTRSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFBhdGgoKQogewogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIGZhbHNlKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9GaWxsKCkKIHsKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBHZXRTdHJpbmcoMCk7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwR1MgPSAoQ1BERl9EaWN0aW9uYXJ5KilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkV4dEdTdGF0ZSIpLCBuYW1lKTsKICAgICBpZiAocEdTID09IE5VTEwgfHwgcEdTLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gdHJ1ZTsKKyAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BDdXJTdGF0ZXMtPlByb2Nlc3NFeHRHUyhwR1MsIHRoaXMpOwpAQCAtOTM0LDcgKzkzNCw3IEBACiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgZmFsc2UpOworICAgIEFkZFBhdGhPYmplY3QoMCwgRkFMU0UpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpCiB7CkBAIC05OTksMTQgKzk5OSwxNCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEhhbmRsZV9DbG9zZVBhdGgoKTsKLSAgICBBZGRQYXRoT2JqZWN0KDAsIHRydWUpOworICAgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1N0cm9rZVBhdGgoKQogewogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KDAsIHRydWUpOworICAgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX0ZpbGwoKQogewpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBmYWxzZSk7CisgICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKICAgICAgICAgaWYgKHBQYXR0ZXJuKSB7CiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsUGF0dGVybihwUGF0dGVybiwgdmFsdWVzLCBudmFsdWVzKTsKICAgICAgICAgfQpAQCAtMTA5Myw3ICsxMDkzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBmYWxzZSk7CisgICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKICAgICAgICAgaWYgKHBQYXR0ZXJuKSB7CiAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOwogICAgICAgICB9CkBAIC0xMTExLDcgKzExMTEsNyBAQAogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCB0cnVlKTsKKyAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKICAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKICAgICB9CiAgICAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKICAgICBwT2JqLT5tX3BTaGFkaW5nID0gcFNoYWRpbmc7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwT2JqLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBPYmosIEZBTFNFLCBGQUxTRSwgRkFMU0UpOwogICAgIHBPYmotPm1fTWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTTsKICAgICBwT2JqLT5tX01hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOwogICAgIENGWF9GbG9hdFJlY3QgYmJveDsKQEAgLTEyMDYsNyArMTIwNiw3IEBACiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkZvbnQiKSwgbmFtZSk7CiAgICAgaWYgKHBGb250RGljdCA9PSBOVUxMIHx8IHBGb250RGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CiAgICAgICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudCwgRlhfQlNUUkMoIkhlbHZldGljYSIpKTsKICAgICB9CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOwpAQCAtMTIzOCwxNyArMTIzOCwxNyBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcENTT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG5hbWUpOwogICAgIGlmIChwQ1NPYmogPT0gTlVMTCkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOworICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJTaGFkaW5nKQorQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKQogewogICAgIENQREZfT2JqZWN0KiBwUGF0dGVybiA9IEZpbmRSZXNvdXJjZU9iaihiU2hhZGluZyA/IEZYX0JTVFJDKCJTaGFkaW5nIikgOiBGWF9CU1RSQygiUGF0dGVybiIpLCBuYW1lKTsKICAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCB8fCAocFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRQYXR0ZXJuKHBQYXR0ZXJuLCBiU2hhZGluZywgJm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXgpOwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKICAgICB9CiAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IG5ldyBDUERGX1RleHRPYmplY3Q7CiAgICAgbV9wTGFzdFRleHRPYmplY3QgPSBwVGV4dDsKLSAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCBUUlVFLCBUUlVFLCBUUlVFKTsKICAgICBpZiAodGV4dG1vZGUgJiYgdGV4dG1vZGUgIT0gMyAmJiB0ZXh0bW9kZSAhPSA0ICYmIHRleHRtb2RlICE9IDcpIHsKICAgICAgICAgRlhfRkxPQVQqIHBDVE0gPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fQ1RNOwogICAgICAgICBwQ1RNWzBdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5hOwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKICAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9IHg7CiAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFkgPSB5OwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBib29sIGJTdHJva2UpCit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSkKIHsKICAgICBpbnQgUGF0aFBvaW50Q291bnQgPSBtX1BhdGhQb2ludENvdW50LCBQYXRoQ2xpcFR5cGUgPSBtX1BhdGhDbGlwVHlwZTsKICAgICBtX1BhdGhQb2ludENvdW50ID0gMDsKQEAgLTE1MTAsNyArMTUxMCw3IEBACiAgICAgICAgIGlmIChQYXRoUG9pbnRDb3VudCAmJiBQYXRoQ2xpcFR5cGUpIHsKICAgICAgICAgICAgIENQREZfUGF0aCBwYXRoOwogICAgICAgICAgICAgcGF0aC5OZXcoKS0+QXBwZW5kUmVjdCgwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCB0cnVlKTsKKyAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTUyOSw3ICsxNTI5LDcgQEAKICAgICAgICAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGaWxsVHlwZTsKICAgICAgICAgcFBhdGhPYmotPm1fUGF0aCA9IFBhdGg7CiAgICAgICAgIHBQYXRoT2JqLT5tX01hdHJpeCA9IG1hdHJpeDsKLSAgICAgICAgU2V0R3JhcGhpY1N0YXRlcyhwUGF0aE9iaiwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICBTZXRHcmFwaGljU3RhdGVzKHBQYXRoT2JqLCBUUlVFLCBGQUxTRSwgVFJVRSk7CiAgICAgICAgIHBQYXRoT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKICAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocFBhdGhPYmopOwogICAgIH0KQEAgLTE1MzgsMTMgKzE1MzgsMTMgQEAKICAgICAgICAgICAgIFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwogICAgICAgICAgICAgbWF0cml4LlNldElkZW50aXR5KCk7CiAgICAgICAgIH0KLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoUGF0aCwgUGF0aENsaXBUeXBlLCB0cnVlKTsKKyAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoUGF0aCwgUGF0aENsaXBUeXBlLCBUUlVFKTsKICAgICB9CiB9CiBDRlhfQnl0ZVN0cmluZyBfRlBERl9CeXRlU3RyaW5nRnJvbUhleChDRlhfQmluYXJ5QnVmJiBzcmNfYnVmKQogewogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgYm9vbCBiRmlyc3QgPSB0cnVlOworICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKICAgICBpbnQgY29kZSA9IDA7CiAgICAgY29uc3QgdWludDhfdCogc3RyID0gc3JjX2J1Zi5HZXRCdWZmZXIoKTsKICAgICBGWF9EV09SRCBzaXplID0gc3JjX2J1Zi5HZXRTaXplKCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAKaW5kZXggY2E1ZTlmZS4uYjJjZmNlNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcApAQCAtMTgsMTggKzE4LDE4IEBACiAgICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgogICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIKICAgICAiSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkiOwotYm9vbCBfUERGX0hhc0ludmFsaWRPcENoYXIoY29uc3QgRlhfQ0hBUiogb3ApCitGWF9CT09MIF9QREZfSGFzSW52YWxpZE9wQ2hhcihjb25zdCBGWF9DSEFSKiBvcCkKIHsKICAgICBpZighb3ApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHVpbnQ4X3QgY2g7CiAgICAgd2hpbGUoKGNoID0gKm9wKyspKSB7CiAgICAgICAgIGlmKF9QREZfT3BDaGFyVHlwZVtjaF0gPT0gJ0knKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBjbGFzcyBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyIHsKICAgcHVibGljOgpAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwogICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZDoKICAgICAgICAgICAgICAgICBpZighT25PcGVyYXRvcigoY2hhciopc3ludGF4LkdldFdvcmRCdWYoKSkgJiYgX1BERl9IYXNJbnZhbGlkT3BDaGFyKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSkgewotICAgICAgICAgICAgICAgICAgICBtX2JBYm9ydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1fYkFib3J0ID0gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1fYkFib3J0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiSW1hZ2UiKSk7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCAqcEltZ09iaiA9IEFkZEltYWdlKHBTdHJlYW0sIE5VTEwsIHRydWUpOworICAgIENQREZfSW1hZ2VPYmplY3QgKnBJbWdPYmogPSBBZGRJbWFnZShwU3RyZWFtLCBOVUxMLCBUUlVFKTsKICAgICBpZiAoIXBJbWdPYmopIHsKICAgICAgICAgaWYgKHBTdHJlYW0pIHsKICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgIGludCBsYXN0X3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgQ1BERl9TdHJlYW1QYXJzZXI6OlN5bnRheFR5cGUgdHlwZSA9IG1fcFN5bnRheC0+UGFyc2VOZXh0RWxlbWVudCgpOwotICAgICAgICBib29sIGJQcm9jZXNzZWQgPSB0cnVlOworICAgICAgICBGWF9CT09MIGJQcm9jZXNzZWQgPSBUUlVFOwogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YToKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMikgewpAQCAtMjA2LDEwICsyMDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQYXRoUmVjdChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChiUHJvY2Vzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CkBAIC0yMjAsMTQgKzIyMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoblBhcmFtcyA9PSA2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBib29sIGJJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlZ2VyOwogICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIEZYX2F0b251bShDRlhfQnl0ZVN0cmluZ0MobV9wU3ludGF4LT5HZXRXb3JkQnVmKCksIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSksIGJJbnRlZ2VyLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiUHJvY2Vzc2VkKSB7CiAgICAgICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhsYXN0X3Bvcyk7CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKIEZYX0RXT1JEIF9BODVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBGWF9EV09SRCBfSGV4RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotRlhfRFdPUkQgRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENQREZfRGljdGlvbmFyeSogcFBhcmFtcywKK0ZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBGWF9EV09SRCBQREZfRGVjb2RlSW5saW5lU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIGxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyLApAQCAtMjk2LDEwICsyOTYsMTAgQEAKICAgICAgICAgcmV0dXJuIF9IZXhEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIH0KICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJGbCIpKSB7Ci0gICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoZmFsc2UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiAgICAgfQogICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJMWldEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJMWlciKSkgewotICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKHRydWUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIH0KICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENURGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRENUIikpIHsKICAgICAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgIGRlc3RfYnVmID0gMDsKICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgYm9vbCBiRGVjb2RlKQorQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIEZYX0JPT0wgYkRlY29kZSkKIHsKICAgICBpZiAobV9Qb3MgPT0gbV9TaXplKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgICAgICAgIG1fcExhc3RPYmogPSBOVUxMOwogICAgIH0KICAgICBtX1dvcmRTaXplID0gMDsKLSAgICBib29sIGJJc051bWJlciA9IHRydWU7CisgICAgRlhfQk9PTCBiSXNOdW1iZXIgPSBUUlVFOwogICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKICAgICAgICAgcmV0dXJuIEVuZE9mRGF0YTsKICAgICB9CkBAIC00ODUsNyArNDg1LDcgQEAKICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICBiSXNOdW1iZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGJJc051bWJlciA9IEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAgICAgfQogICAgIGlmIChtX1dvcmRTaXplID09IDQpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKLSAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKICAgICAgICAgICAgIHJldHVybiBPdGhlcnM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX05VTEwpIHsKQEAgLTUxNSw3ICs1MTUsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtX1dvcmRTaXplID09IDUpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShGQUxTRSk7CiAgICAgICAgICAgICByZXR1cm4gT3RoZXJzOwogICAgICAgICB9CiAgICAgfQpAQCAtNTg0LDkgKzU4NCw5IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KGJvb2wgYkFsbG93TmVzdGVkQXJyYXksIGJvb2wgYkluQXJyYXkpCitDUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KEZYX0JPT0wgYkFsbG93TmVzdGVkQXJyYXksIEZYX0JPT0wgYkluQXJyYXkpCiB7Ci0gICAgYm9vbCBiSXNOdW1iZXI7CisgICAgRlhfQk9PTCBiSXNOdW1iZXI7CiAgICAgR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjA0LDcgKzYwNCw3IEBACiAgICAgfQogICAgIGlmIChmaXJzdF9jaGFyID09ICc8JykgewogICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShSZWFkSGV4U3RyaW5nKCksIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoUmVhZEhleFN0cmluZygpLCBUUlVFKTsKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KHRydWUpOworICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChUUlVFKTsKICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAocERpY3QpIHsKICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKQEAgLTY0Miw3ICs2NDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChiQWxsb3dOZXN0ZWRBcnJheSwgdHJ1ZSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KGJBbGxvd05lc3RlZEFycmF5LCBUUlVFKTsKICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwIHx8IG1fV29yZEJ1ZmZlclswXSA9PSAnXScpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBBcnJheTsKQEAgLTY1NywyMiArNjU3LDIyIEBACiAgICAgfQogICAgIGlmIChtX1dvcmRTaXplID09IDQpIHsKICAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIENQREZfTnVsbDo6Q3JlYXRlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1fV29yZFNpemUgPT0gNSkgewogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfRkFMUyAmJiBtX1dvcmRCdWZmZXJbNF0gPT0gJ2UnKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKEZBTFNFKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcikKK3ZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcikKIHsKICAgICBtX1dvcmRTaXplID0gMDsKLSAgICBiSXNOdW1iZXIgPSB0cnVlOworICAgIGJJc051bWJlciA9IFRSVUU7CiAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIH0KICAgICBpZiAodHlwZSA9PSAnRCcpIHsKLSAgICAgICAgYklzTnVtYmVyID0gZmFsc2U7CisgICAgICAgIGJJc051bWJlciA9IEZBTFNFOwogICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICAgICAgICB3aGlsZSAoMSkgewpAQCAtNzQ2LDcgKzc0Niw3IEBACiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgYklzTnVtYmVyID0gZmFsc2U7CisgICAgICAgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC04NjIsNyArODYyLDcgQEAKICAgICB9CiAgICAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOwogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgYm9vbCBiRmlyc3QgPSB0cnVlOworICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKICAgICBpbnQgY29kZSA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGNoID09ICc+JykgewpAQCAtOTQ3LDcgKzk0Nyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9wT2JqZWN0cyA9IHBQYWdlOwotICAgIG1fYkZvcm0gPSBmYWxzZTsKKyAgICBtX2JGb3JtID0gRkFMU0U7CiAgICAgaWYgKHBPcHRpb25zKSB7CiAgICAgICAgIG1fT3B0aW9ucyA9ICpwT3B0aW9uczsKICAgICB9CkBAIC05NjIsNyArOTYyLDcgQEAKICAgICBpZiAocENvbnRlbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIG1fblN0cmVhbXMgPSAwOwogICAgICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCwgZmFsc2UpOworICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcENvbnRlbnQsIEZBTFNFKTsKICAgICB9IGVsc2UgaWYgKHBDb250ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudDsKICAgICAgICAgbV9uU3RyZWFtcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKQEAgLTk4MSw3ICs5ODEsNyBAQAogewogICAgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7CiAgICAgbV9wT2JqZWN0cyA9IHBGb3JtOwotICAgIG1fYkZvcm0gPSB0cnVlOworICAgIG1fYkZvcm0gPSBUUlVFOwogICAgIENGWF9BZmZpbmVNYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwogICAgIGlmIChwR3JhcGhpY1N0YXRlcykgewogICAgICAgICBmb3JtX21hdHJpeC5Db25jYXQocEdyYXBoaWNTdGF0ZXMtPm1fQ1RNKTsKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DVE0gPSBmb3JtX21hdHJpeDsKICAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX1BhcmVudE1hdHJpeCA9IGZvcm1fbWF0cml4OwogICAgIGlmIChDbGlwUGF0aC5Ob3ROdWxsKCkpIHsKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgdHJ1ZSk7CisgICAgICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChDbGlwUGF0aCwgRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwogICAgIH0KICAgICBpZiAocEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApIHsKICAgICAgICAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwRGF0YSA9IG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwpAQCAtMTAyMyw5ICsxMDIzLDkgQEAKICAgICBtX25TdHJlYW1zID0gMDsKICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CiAgICAgaWYgKHBGb3JtLT5tX3BEb2N1bWVudCkgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBmYWxzZSk7CisgICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIEZBTFNFKTsKICAgICB9IGVsc2UgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBmYWxzZSk7CisgICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIEZBTFNFKTsKICAgICB9CiAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX3BTaW5nbGVTdHJlYW0tPkdldERhdGEoKTsKICAgICBtX1NpemUgPSBtX3BTaW5nbGVTdHJlYW0tPkdldFNpemUoKTsKQEAgLTEwNzAsNyArMTA3MCw3IEBACiAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcENvbnRlbnQgPSBtX3BPYmplY3RzLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbnRlbnRzIikpOwogICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW1PYmogPSAoQ1BERl9TdHJlYW0qKShwQ29udGVudCA/IHBDb250ZW50LT5HZXRFbGVtZW50VmFsdWUobV9DdXJyZW50T2Zmc2V0KSA6IE5VTEwpOwotICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0tPkxvYWRBbGxEYXRhKHBTdHJlYW1PYmosIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtX3BTdHJlYW1BcnJheVttX0N1cnJlbnRPZmZzZXRdLT5Mb2FkQWxsRGF0YShwU3RyZWFtT2JqLCBGQUxTRSk7CiAgICAgICAgICAgICAgICAgbV9DdXJyZW50T2Zmc2V0ICsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAKaW5kZXggODI5MmQyZC4uNDhiM2E0MCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcApAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlICJwYWdlaW50LmgiCiAKIENQREZfUGF0dGVybjo6Q1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpIDoKLSAgICBtX3BQYXR0ZXJuT2JqKE5VTEwpLCBtX1BhdHRlcm5UeXBlKFBBVFRFUk5fVElMSU5HKSwgbV9wRG9jdW1lbnQoTlVMTCksIG1fYkZvcmNlQ2xlYXIoZmFsc2UpCisgICAgbV9wUGF0dGVybk9iaihOVUxMKSwgbV9QYXR0ZXJuVHlwZShQQVRURVJOX1RJTElORyksIG1fcERvY3VtZW50KE5VTEwpLCBtX2JGb3JjZUNsZWFyKEZBTFNFKQogewogICAgIGlmIChwUGFyZW50TWF0cml4KSB7CiAgICAgICAgIG1fUGFyZW50TWF0cml4ID0gKnBQYXJlbnRNYXRyaXg7CkBAIC0zNywyOCArMzcsMjggQEAKICAgICBkZWxldGUgbV9wRm9ybTsKICAgICBtX3BGb3JtID0gTlVMTDsKIH0KLWJvb2wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkKK0ZYX0JPT0wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkKIHsKICAgICBpZiAobV9wRm9ybSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYWludFR5cGUiKSkgPT0gMTsKICAgICBtX1hTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiWFN0ZXAiKSkpOwogICAgIG1fWVN0ZXAgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhwRGljdC0+R2V0TnVtYmVyKEZYX0JTVFJDKCJZU3RlcCIpKSk7CiAgICAgaWYgKG1fcFBhdHRlcm5PYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopbV9wUGF0dGVybk9iajsKICAgICBtX3BGb3JtID0gbmV3IENQREZfRm9ybShtX3BEb2N1bWVudCwgTlVMTCwgcFN0cmVhbSk7CiAgICAgbV9wRm9ybS0+UGFyc2VDb250ZW50KE5VTEwsICZtX1BhcmVudE1hdHJpeCwgTlVMTCwgTlVMTCk7CiAgICAgbV9CQm94ID0gcERpY3QtPkdldFJlY3QoRlhfQlNUUkMoIkJCb3giKSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KSA6IENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCitDUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KSA6IENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCiB7CiAgICAgbV9QYXR0ZXJuVHlwZSA9IFBBVFRFUk5fU0hBRElORzsKICAgICBtX3BQYXR0ZXJuT2JqID0gYlNoYWRpbmcgPyBOVUxMIDogcFBhdHRlcm5PYmo7CkBAIC0xMDIsMTQgKzEwMiwxNCBAQAogICAgIG1fcENvdW50ZWRDUyA9IE5VTEw7CiAgICAgbV9uRnVuY3MgPSAwOwogfQotYm9vbCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkKK0ZYX0JPT0wgQ1BERl9TaGFkaW5nUGF0dGVybjo6TG9hZCgpCiB7CiAgICAgaWYgKG1fU2hhZGluZ1R5cGUgIT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFNoYWRpbmdEaWN0ID0gbV9wU2hhZGluZ09iaiA/IG1fcFNoYWRpbmdPYmotPkdldERpY3QoKSA6IE5VTEw7CiAgICAgaWYgKHBTaGFkaW5nRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9uRnVuY3MpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25GdW5jczsgaSArKykKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICBDUERGX09iamVjdCogcENTT2JqID0gcFNoYWRpbmdEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CiAgICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKICAgICBtX3BDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIE5VTEwpOwpAQCAtMTQxLDE0ICsxNDEsMTQgQEAKICAgICAgICAgbV9wQ291bnRlZENTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BDUy0+R2V0QXJyYXkoKSk7CiAgICAgfQogICAgIG1fU2hhZGluZ1R5cGUgPSBwU2hhZGluZ0RpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlNoYWRpbmdUeXBlIikpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKQorRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKQogewogICAgIENsZWFyKCk7CiAgICAgcmV0dXJuIExvYWQoKTsKIH0KLWJvb2wgQ1BERl9NZXNoU3RyZWFtOjpMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCitGWF9CT09MIENQREZfTWVzaFN0cmVhbTo6TG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsIENQREZfQ29sb3JTcGFjZSogcENTKQogewogICAgIG1fU3RyZWFtLkxvYWRBbGxEYXRhKHBTaGFkaW5nU3RyZWFtKTsKICAgICBtX0JpdFN0cmVhbS5Jbml0KG1fU3RyZWFtLkdldERhdGEoKSwgbV9TdHJlYW0uR2V0U2l6ZSgpKTsKQEAgLTE2MCwyMSArMTYwLDIxIEBACiAgICAgbV9uQ29tcEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKTsKICAgICBtX25GbGFnQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyRmxhZyIpKTsKICAgICBpZiAoIW1fbkNvb3JkQml0cyB8fCAhbV9uQ29tcEJpdHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBuQ29tcHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgIGlmIChuQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX25Db21wcyA9IG5GdW5jcyA/IDEgOiBuQ29tcHM7CiAgICAgaWYgKCgoaW50KW1fbkNvbXBzIDwgMCkgfHwgbV9uQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX0Nvb3JkTWF4ID0gbV9uQ29vcmRCaXRzID09IDMyID8gLTEgOiAoMSA8PCBtX25Db29yZEJpdHMpIC0gMTsKICAgICBtX0NvbXBNYXggPSAoMSA8PCBtX25Db21wQml0cykgLSAxOwogICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKICAgICBpZiAocERlY29kZSA9PSBOVUxMIHx8IHBEZWNvZGUtPkdldENvdW50KCkgIT0gNCArIG1fbkNvbXBzICogMikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV94bWluID0gcERlY29kZS0+R2V0TnVtYmVyKDApOwogICAgIG1feG1heCA9IHBEZWNvZGUtPkdldE51bWJlcigxKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgICBtX0NvbG9yTWluW2ldID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgNCk7CiAgICAgICAgIG1fQ29sb3JNYXhbaV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA1KTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBGWF9EV09SRCBDUERGX01lc2hTdHJlYW06OkdldEZsYWcoKQogewpAQCAtMjMxLDE4ICsyMzEsMTggQEAKICAgICBtX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKICAgICByZXR1cm4gZmxhZzsKIH0KLWJvb2wgQ1BERl9NZXNoU3RyZWFtOjpHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsIGludCBjb3VudCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApCitGWF9CT09MIENQREZfTWVzaFN0cmVhbTo6R2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKICAgICAgICAgaWYgKG1fQml0U3RyZWFtLklzRU9GKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBHZXRDb29yZHModmVydGV4W2ldLngsIHZlcnRleFtpXS55KTsKICAgICAgICAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybSh2ZXJ0ZXhbaV0ueCwgdmVydGV4W2ldLnkpOwogICAgICAgICBHZXRDb2xvcih2ZXJ0ZXhbaV0uciwgdmVydGV4W2ldLmcsIHZlcnRleFtpXS5iKTsKICAgICAgICAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ0ZYX0Zsb2F0UmVjdCBfR2V0U2hhZGluZ0JCb3goQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGludCB0eXBlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCkBAIC0yNTUsOCArMjU1LDggQEAKICAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBib29sIGJTdGFydGVkID0gZmFsc2U7Ci0gICAgYm9vbCBiR291cmF1ZCA9IHR5cGUgPT0gNCB8fCB0eXBlID09IDU7CisgICAgRlhfQk9PTCBiU3RhcnRlZCA9IEZBTFNFOworICAgIEZYX0JPT0wgYkdvdXJhdWQgPSB0eXBlID09IDQgfHwgdHlwZSA9PSA1OwogICAgIGludCBmdWxsX3BvaW50X2NvdW50ID0gdHlwZSA9PSA3ID8gMTYgOiAodHlwZSA9PSA2ID8gMTIgOiAxKTsKICAgICBpbnQgZnVsbF9jb2xvcl9jb3VudCA9ICh0eXBlID09IDYgfHwgdHlwZSA9PSA3KSA/IDQgOiAxOwogICAgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdCh4LCB5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVjdC5Jbml0UmVjdCh4LCB5KTsKLSAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5Ta2lwQml0cyhzdHJlYW0ubV9uQ29tcHMgKiBzdHJlYW0ubV9uQ29tcEJpdHMgKiBjb2xvcl9jb3VudCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgKaW5kZXggMDIxYjMzYS4uOGNkMzkzYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaApAQCAtMjEsNyArMjEsNyBAQAogICAgIENQREZfU3RyZWFtUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogICAgIH5DUERGX1N0cmVhbVBhcnNlcigpOwogCi0gICAgQ1BERl9TdHJlYW0qCQlSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIGJvb2wgYkRlY29kZSk7CisgICAgQ1BERl9TdHJlYW0qCQlSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIEZYX0JPT0wgYkRlY29kZSk7CiAgICAgdHlwZWRlZiBlbnVtIHsgRW5kT2ZEYXRhLCBOdW1iZXIsIEtleXdvcmQsIE5hbWUsIE90aGVycyB9IFN5bnRheFR5cGU7CiAKICAgICBTeW50YXhUeXBlCQkJUGFyc2VOZXh0RWxlbWVudCgpOwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAgICAgICAgIG1fUG9zID0gcG9zOwogICAgIH0KIAotICAgIENQREZfT2JqZWN0KgkJUmVhZE5leHRPYmplY3QoYm9vbCBiQWxsb3dOZXN0ZWRBcnJheSA9IGZhbHNlLCBib29sIGJJbkFycmF5ID0gZmFsc2UpOworICAgIENQREZfT2JqZWN0KgkJUmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSA9IEZBTFNFLCBGWF9CT09MIGJJbkFycmF5ID0gRkFMU0UpOwogICAgIHZvaWQJCQkJU2tpcFBhdGhPYmplY3QoKTsKIHByb3RlY3RlZDoKLSAgICB2b2lkCQkJCUdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcik7CisgICAgdm9pZAkJCQlHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpOwogICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkU3RyaW5nKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRIZXhTdHJpbmcoKTsKICAgICBjb25zdCB1aW50OF90KgkJbV9wQnVmOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgaW50CQkJbV9UeXBlOwogICAgIHVuaW9uIHsKICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIGJvb2wJCW1fYkludGVnZXI7CisgICAgICAgICAgICBGWF9CT09MCQltX2JJbnRlZ2VyOwogICAgICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIGludAkJbV9JbnRlZ2VyOwogICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CkBAIC0xMzcsMTAgKzEzNywxMCBAQAogICAgICAgICBpbnQgbGV2ZWwpOwogICAgIH5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKTsKIAotICAgIGJvb2wgU2hvdWxkQWJvcnQoKSBjb25zdCB7IHJldHVybiBtX2JBYm9ydDsgfQorICAgIEZYX0JPT0wgU2hvdWxkQWJvcnQoKSBjb25zdCB7IHJldHVybiBtX2JBYm9ydDsgfQogICAgIENQREZfUGFnZU9iamVjdHMqIEdldE9iamVjdExpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3RMaXN0OyB9CiAgICAgQ1BERl9BbGxTdGF0ZXMqIEdldEN1clN0YXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcEN1clN0YXRlcy5nZXQoKTsgfQotICAgIGJvb2wgSXNDb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQorICAgIEZYX0JPT0wgSXNDb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQogICAgIGNvbnN0IEZYX0ZMT0FUKiBHZXRUeXBlM0RhdGEoKSBjb25zdCB7IHJldHVybiBtX1R5cGUzRGF0YTsgfQogCiAgICAgdm9pZAkJCQlBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gKGludDMyX3QpKEdldE51bWJlcihpbmRleCkpOwogICAgIH0KLSAgICBib29sCQkJCU9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApOworICAgIEZYX0JPT0wJCQkJT25PcGVyYXRvcihjb25zdCBGWF9DSEFSKiBvcCk7CiAgICAgdm9pZAkJCQlCaWdDYXNlQ2FsbGVyKGludCBpbmRleCk7CiAgICAgRlhfRFdPUkQJCQlHZXRQYXJzZVBvcygpCiAgICAgewpAQCAtMTcxLDE2ICsxNzEsMTYgQEAKICAgICB2b2lkCQkJCVBhcnNlUGF0aE9iamVjdCgpOwogICAgIHZvaWQJCQkJQWRkUGF0aFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKICAgICB2b2lkCQkJCUFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHcsIEZYX0ZMT0FUIGgpOwotICAgIHZvaWQJCQkJQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIGJvb2wgYlN0cm9rZSk7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCoJQWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgYm9vbCBiSW5saW5lKTsKKyAgICB2b2lkCQkJCUFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBGWF9CT09MIGJTdHJva2UpOworICAgIENQREZfSW1hZ2VPYmplY3QqCUFkZEltYWdlKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0ltYWdlKiBwSW1hZ2UsIEZYX0JPT0wgYklubGluZSk7CiAgICAgdm9pZAkJCQlBZGREdXBsaWNhdGVJbWFnZSgpOwogICAgIHZvaWQJCQkJQWRkRm9ybShDUERGX1N0cmVhbSopOwotICAgIHZvaWQJCQkJU2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYkNvbG9yLCBib29sIGJUZXh0LCBib29sIGJHcmFwaCk7CisgICAgdm9pZAkJCQlTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiQ29sb3IsIEZYX0JPT0wgYlRleHQsIEZYX0JPT0wgYkdyYXBoKTsKICAgICB2b2lkCQkJCVNhdmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKICAgICB2b2lkCQkJCVJlc3RvcmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKICAgICBDUERGX0ZvbnQqCQkJRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwogICAgIENQREZfQ29sb3JTcGFjZSoJRmluZENvbG9yU3BhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIENQREZfUGF0dGVybioJCUZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJTaGFkaW5nKTsKKyAgICBDUERGX1BhdHRlcm4qCQlGaW5kUGF0dGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiU2hhZGluZyk7CiAgICAgQ1BERl9PYmplY3QqCQlGaW5kUmVzb3VyY2VPYmooY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0eXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAKIHByb3RlY3RlZDoKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICAgIF9Db250ZW50UGFyYW0gbV9QYXJhbUJ1ZjFbUEFSQU1fQlVGX1NJWkVdOwogICAgIEZYX0RXT1JEIG1fUGFyYW1TdGFydFBvczsKICAgICBGWF9EV09SRCBtX1BhcmFtQ291bnQ7Ci0gICAgYm9vbCBtX2JBYm9ydDsKKyAgICBGWF9CT09MIG1fYkFib3J0OwogICAgIENQREZfU3RyZWFtUGFyc2VyKiBtX3BTeW50YXg7CiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENQREZfQWxsU3RhdGVzPiBtX3BDdXJTdGF0ZXM7CiAgICAgQ1BERl9Db250ZW50TWFyayBtX0N1ckNvbnRlbnRNYXJrOwpAQCAtMjk5LDExICsyOTksMTEgQEAKICAgICBDRlhfQmluYXJ5QnVmIG1fTGFzdEltYWdlRGF0YTsKICAgICBDUERGX0RpY3Rpb25hcnkqIG1fcExhc3RJbWFnZURpY3Q7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BMYXN0Q2xvbmVJbWFnZURpY3Q7Ci0gICAgYm9vbCBtX2JSZWxlYXNlTGFzdERpY3Q7Ci0gICAgYm9vbCBtX2JTYW1lTGFzdERpY3Q7Ci0gICAgYm9vbCBtX2JDb2xvcmVkOworICAgIEZYX0JPT0wgbV9iUmVsZWFzZUxhc3REaWN0OworICAgIEZYX0JPT0wgbV9iU2FtZUxhc3REaWN0OworICAgIEZYX0JPT0wgbV9iQ29sb3JlZDsKICAgICBGWF9GTE9BVCBtX1R5cGUzRGF0YVs2XTsKLSAgICBib29sIG1fYlJlc291cmNlTWlzc2luZzsKKyAgICBGWF9CT09MIG1fYlJlc291cmNlTWlzc2luZzsKICAgICBDRlhfUHRyQXJyYXkgbV9TdGF0ZVN0YWNrOwogfTsKIGNsYXNzIENQREZfQ29udGVudFBhcnNlcgpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgdm9pZAkJCQlDbGVhcigpOwogICAgIFBhcnNlU3RhdHVzCQkJbV9TdGF0dXM7CiAgICAgQ1BERl9QYWdlT2JqZWN0cyoJbV9wT2JqZWN0czsKLSAgICBib29sCQkJCW1fYkZvcm07CisgICAgRlhfQk9PTAkJCQltX2JGb3JtOwogICAgIENQREZfUGFyc2VPcHRpb25zCW1fT3B0aW9uczsKICAgICBDUERGX1R5cGUzQ2hhcioJCW1fcFR5cGUzQ2hhcjsKICAgICBpbnQJCQkJCW1fSW50ZXJuYWxTdGFnZTsKQEAgLTM2MywyMiArMzYzLDIyIEBACiAgICAgZXhwbGljaXQgQ1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50ICpwUERGRG9jKTsKICAgICB+Q1BERl9Eb2NQYWdlRGF0YSgpOwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyKGJvb2wgYlJlbGVhc2UgPSBmYWxzZSk7Ci0gICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgICAgIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIGJvb2wgZmluZE9ubHkpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOworICAgIENQREZfRm9udCogICAgICAgICAgICAgICAgICBHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBGWF9CT09MIGZpbmRPbmx5KTsKICAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICAgICAgR2V0U3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZm9udE5hbWUsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CiAgICAgQ1BERl9Db2xvclNwYWNlKiAgICAgICAgICAgIEdldENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKTsKICAgICBDUERGX0NvbG9yU3BhY2UqICAgICAgICAgICAgR2V0Q29waWVkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUNvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDb2xvclNwYWNlKTsKLSAgICBDUERGX1BhdHRlcm4qICAgICAgICAgICAgICAgR2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIGJvb2wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7CisgICAgQ1BERl9QYXR0ZXJuKiAgICAgICAgICAgICAgIEdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopOwogICAgIENQREZfSW1hZ2UqICAgICAgICAgICAgICAgICBHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pOwogICAgIENQREZfSWNjUHJvZmlsZSogICAgICAgICAgICBHZXRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VJY2NQcm9maWxlKENQREZfSWNjUHJvZmlsZSogcEljY1Byb2ZpbGUpOwogICAgIENQREZfU3RyZWFtQWNjKiAgICAgICAgICAgICBHZXRGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLCBib29sIGJGb3JjZSA9IGZhbHNlKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgSXNGb3JjZUNsZWFyKCkgY29uc3Qge3JldHVybiBtX2JGb3JjZUNsZWFyO30KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiRm9yY2UgPSBGQUxTRSk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzRm9yY2VDbGVhcigpIGNvbnN0IHtyZXR1cm4gbV9iRm9yY2VDbGVhcjt9CiAgICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogICAgIEZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0OwogICAgIENQREZfQ291bnRlZFBhdHRlcm4qICAgICAgICBGaW5kUGF0dGVyblB0cihDUERGX09iamVjdCogcFBhdHRlcm5PYmopIGNvbnN0OwogCkBAIC0zOTcsNyArMzk3LDcgQEAKIAogICAgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcFBERkRvYzsKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fSGFzaFByb2ZpbGVNYXA7Ci0gICAgYm9vbCBtX2JGb3JjZUNsZWFyOworICAgIEZYX0JPT0wgbV9iRm9yY2VDbGVhcjsKIAogICAgIENQREZfQ29sb3JTcGFjZU1hcCBtX0NvbG9yU3BhY2VNYXA7CiAgICAgQ1BERl9Gb250RmlsZU1hcCBtX0ZvbnRGaWxlTWFwOwpAQCAtNDEyLDcgKzQxMiw3IEBACiBwdWJsaWM6CiAgICAgc3RhdGljIENQREZfRnVuY3Rpb24qCUxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKTsKICAgICB2aXJ0dWFsIH5DUERGX0Z1bmN0aW9uKCk7Ci0gICAgYm9vbAkJQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0OworICAgIEZYX0JPT0wJCUNhbGwoRlhfRkxPQVQqIGlucHV0cywgaW50IG5pbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzLCBpbnQmIG5yZXN1bHRzKSBjb25zdDsKICAgICBpbnQJCQlDb3VudElucHV0cygpCiAgICAgewogICAgICAgICByZXR1cm4gbV9uSW5wdXRzOwpAQCAtNDI2LDkgKzQyNiw5IEBACiAgICAgaW50CQkJbV9uSW5wdXRzLCBtX25PdXRwdXRzOwogICAgIEZYX0ZMT0FUKgltX3BEb21haW5zOwogICAgIEZYX0ZMT0FUKgltX3BSYW5nZXM7Ci0gICAgYm9vbAkJSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBib29sCXZfSW5pdChDUERGX09iamVjdCogcE9iaikgPSAwOwotICAgIHZpcnR1YWwgYm9vbAl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0ID0gMDsKKyAgICBGWF9CT09MCQlJbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgPSAwOwogfTsKIGNsYXNzIENQREZfSWNjUHJvZmlsZQogewpAQCAtNDM2LDcgKzQzNiw3IEBACiAgICAgQ1BERl9JY2NQcm9maWxlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogICAgIH5DUERGX0ljY1Byb2ZpbGUoKTsKICAgICBpbnQzMl90IEdldENvbXBvbmVudHMoKSBjb25zdCB7IHJldHVybiBtX25TcmNDb21wb25lbnRzOyB9Ci0gICAgYm9vbAkJCQkJbV9ic1JHQjsKKyAgICBGWF9CT09MCQkJCQltX2JzUkdCOwogICAgIHZvaWQqCQkJCW1fcFRyYW5zZm9ybTsKIHByaXZhdGU6CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtX25TcmNDb21wb25lbnRzOwpAQCAtNDQ3LDIwICs0NDcsMjAgQEAKIHB1YmxpYzoKICAgICBDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpOwogCi0gICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAogICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICBGWF9CT09MIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbCB2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgRlhfQk9PTCB2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCkBAIC00NzAsNyArNDcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDUERGX1BhdHRlcm5DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKQEAgLTQ4Miw4ICs0ODIsOCBAQAogICAgICAgICAgIG1fcENvdW50ZWRCYXNlQ1MobnVsbHB0cikgewogICAgIH0KICAgICB+Q1BERl9QYXR0ZXJuQ1MoKSBvdmVycmlkZTsKLSAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oCmluZGV4IGMyN2FkZTguLjJlYzU0ZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgKQEAgLTMxLDExICszMSwxMSBAQAogY2xhc3MgQ1BERl9MendGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIKIHsKIHB1YmxpYzoKLSAgICBDUERGX0x6d0ZpbHRlcihib29sIGJFYXJseUNoYW5nZSk7CisgICAgQ1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpOwogICAgIHZpcnR1YWwgfkNQREZfTHp3RmlsdGVyKCkge30KICAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBib29sCQkJbV9iRWFybHlDaGFuZ2U7CisgICAgRlhfQk9PTAkJCW1fYkVhcmx5Q2hhbmdlOwogICAgIEZYX0RXT1JECQltX0NvZGVBcnJheVs1MDIxXTsKICAgICBGWF9EV09SRAkJbV9uQ29kZXM7CiAgICAgRlhfRFdPUkQJCW1fQ29kZUxlbjsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICB2aXJ0dWFsIH5DUERGX1ByZWRpY3RvckZpbHRlcigpOwogICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIGJvb2wJCQltX2JUaWZmOworICAgIEZYX0JPT0wJCQltX2JUaWZmOwogICAgIEZYX0RXT1JECQltX1BpdGNoLCBtX0JwcDsKICAgICB1aW50OF90KgkJbV9wUmVmTGluZTsKICAgICB1aW50OF90KgkJbV9wQ3VyTGluZTsKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAgICAgQ0ZYX0JpbmFyeUJ1ZgltX0lucHV0QnVmOwogICAgIHVpbnQ4X3QqCQltX3BTY2FubGluZTsKICAgICBpbnQJCQkJbV9QaXRjaCwgbV9IZWlnaHQsIG1fV2lkdGgsIG1fbkNvbXBzLCBtX2lMaW5lOwotICAgIGJvb2wJCQltX2JHb3RIZWFkZXI7CisgICAgRlhfQk9PTAkJCW1fYkdvdEhlYWRlcjsKIH07CiBjbGFzcyBDUERGX0ZheEZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgogewogcHVibGljOgogICAgIENQREZfRmF4RmlsdGVyKCk7CiAgICAgdmlydHVhbCB+Q1BERl9GYXhGaWx0ZXIoKTsKLSAgICBib29sCQkJSW5pdGlhbGl6ZShpbnQgRW5jb2RpbmcsIGludCBiRW5kT2ZMaW5lLCBpbnQgYkJ5dGVBbGlnbiwgaW50IGJCbGFjaywgaW50IG5Sb3dzLCBpbnQgbkNvbHVtbnMpOworICAgIEZYX0JPT0wJCQlJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucyk7CiAgICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogICAgIGludAkJCQltX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7CkBAIC0xMTgsOSArMTE4LDkgQEAKIAl1aW50OF90KgkJbV9wUmVmQnVmOwogICAgIENGWF9CaW5hcnlCdWYJbV9JbnB1dEJ1ZjsKICAgICBpbnQJCQkJbV9JbnB1dEJpdFBvczsKLSAgICB2b2lkCQkJUHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBib29sIGJGaW5pc2gsCisgICAgdm9pZAkJCVByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgRlhfQk9PTCBiRmluaXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgYm9vbAkJCVJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7CisgICAgRlhfQk9PTAkJCVJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9QQVJTRVJfRklMVEVSU19JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcAppbmRleCBlNjA4ODhhLi40N2MwOGZiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIH0KICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKCB1aW50OF90LCBpIC8gMiArIDEpOwogICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgYm9vbCBiRmlyc3REaWdpdCA9IHRydWU7CisgICAgRlhfQk9PTCBiRmlyc3REaWdpdCA9IFRSVUU7CiAgICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKSB7CiAgICAgICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOwogICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXHInKSB7CkBAIC0xODYsOSArMTg2LDkgQEAKICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQogewogICAgIGludCBLID0gMDsKLSAgICBib29sIEVuZE9mTGluZSA9IGZhbHNlOwotICAgIGJvb2wgQnl0ZUFsaWduID0gZmFsc2U7Ci0gICAgYm9vbCBCbGFja0lzMSA9IGZhbHNlOworICAgIEZYX0JPT0wgRW5kT2ZMaW5lID0gRkFMU0U7CisgICAgRlhfQk9PTCBCeXRlQWxpZ24gPSBGQUxTRTsKKyAgICBGWF9CT09MIEJsYWNrSXMxID0gRkFMU0U7CiAgICAgaW50IENvbHVtbnMgPSAxNzI4OwogICAgIGludCBSb3dzID0gMDsKICAgICBpZiAocFBhcmFtcykgewpAQCAtMjA4LDI1ICsyMDgsMjUgQEAKICAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGYXhNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgIEssIEVuZE9mTGluZSwgQnl0ZUFsaWduLCBCbGFja0lzMSwgQ29sdW1ucywgUm93cyk7CiB9Ci1zdGF0aWMgYm9vbCBDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKK3N0YXRpYyBGWF9CT09MIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGlmIChDb2x1bW5zIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGNoZWNrID0gQ29sdW1uczsKICAgICBpZiAoQ29sb3JzIDwgMCB8fCAoY2hlY2sgPiAwICYmIENvbG9ycyA+IElOVF9NQVggLyBjaGVjaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGNoZWNrICo9IENvbG9yczsKICAgICBpZiAoQml0c1BlckNvbXBvbmVudCA8IDAgfHwKICAgICAgICAgICAgIChjaGVjayA+IDAgJiYgQml0c1BlckNvbXBvbmVudCA+IElOVF9NQVggLyBjaGVjaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGNoZWNrICo9IEJpdHNQZXJDb21wb25lbnQ7CiAgICAgaWYgKGNoZWNrID4gSU5UX01BWCAtIDcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQpAQCAtMjQ1LDExICsyNDUsMTEgQEAKICAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGbGF0ZU1vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgbkNvbXBzLCBicGMsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKIH0KLUZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShib29sIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCitGWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgaW50IHByZWRpY3RvciA9IDA7Ci0gICAgYm9vbCBiRWFybHlDaGFuZ2UgPSB0cnVlOworICAgIEZYX0JPT0wgYkVhcmx5Q2hhbmdlID0gVFJVRTsKICAgICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOwogICAgIGlmIChwUGFyYW1zKSB7CiAgICAgICAgIHByZWRpY3RvciA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJlZGljdG9yIikpOwpAQCAtMjY1LDE0ICsyNjUsMTQgQEAKICAgICAgICAgICAgIGJFYXJseUNoYW5nZSwgcHJlZGljdG9yLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMsIGVzdGltYXRlZF9zaXplLAogICAgICAgICAgICAgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiB9Ci1ib29sIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorRlhfQk9PTCBQREZfRGF0YURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBDRlhfQnl0ZVN0cmluZyYgSW1hZ2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcEltYWdlUGFybXMsIEZYX0RXT1JEIGxhc3RfZXN0aW1hdGVkX3NpemUsIGJvb2wgYkltYWdlQWNjKQorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgbGFzdF9lc3RpbWF0ZWRfc2l6ZSwgRlhfQk9PTCBiSW1hZ2VBY2MpCiAKIHsKICAgICBDUERGX09iamVjdCogcERlY29kZXIgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKSA6IE5VTEw7CiAgICAgaWYgKHBEZWNvZGVyID09IE5VTEwgfHwgKHBEZWNvZGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZICYmIHBEZWNvZGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX09iamVjdCogcFBhcmFtcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSkgOiBOVUxMOwogICAgIENGWF9CeXRlU3RyaW5nQXJyYXkgRGVjb2Rlckxpc3Q7CkBAIC0zMTAsMTEgKzMxMCwxMSBAQAogICAgICAgICAgICAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOwogICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKICAgICAgICAgICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShmYWxzZSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgICAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXIikpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZSh0cnVlLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoVFJVRSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwogICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBODUiKSkgewogICAgICAgICAgICAgb2Zmc2V0ID0gX0E4NURlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUlIZXhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBSHgiKSkgewpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CiAgICAgICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwogICAgICAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2Zmc2V0ID0gUnVuTGVuZ3RoRGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTM0MCwxMyArMzQwLDEzIEBACiAgICAgICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKICAgICAgICAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOwogICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAobGFzdF9idWYgIT0gc3JjX2J1ZikgewogICAgICAgICAgICAgRlhfRnJlZShsYXN0X2J1Zik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGxhc3RfYnVmID0gbmV3X2J1ZjsKICAgICAgICAgbGFzdF9zaXplID0gbmV3X3NpemU7CkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICBwSW1hZ2VQYXJtcyA9IE5VTEw7CiAgICAgZGVzdF9idWYgPSBsYXN0X2J1ZjsKICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBleHRlcm4gY29uc3QgRlhfV09SRCBQREZEb2NFbmNvZGluZ1syNTZdID0gewogICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LCAweDAwMDgsIDB4MDAwOSwKQEAgLTM4OSw3ICszODksNyBAQAogewogICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKICAgICBpZiAoc3JjX2xlbiA+PSAyICYmICgoc3JjX2RhdGFbMF0gPT0gMHhmZSAmJiBzcmNfZGF0YVsxXSA9PSAweGZmKSB8fCAoc3JjX2RhdGFbMF0gPT0gMHhmZiAmJiBzcmNfZGF0YVsxXSA9PSAweGZlKSkpIHsKLSAgICAgICAgYm9vbCBiQkUgPSBzcmNfZGF0YVswXSA9PSAweGZlOworICAgICAgICBGWF9CT09MIGJCRSA9IHNyY19kYXRhWzBdID09IDB4ZmU7CiAgICAgICAgIEZYX0RXT1JEIG1heF9jaGFycyA9IChzcmNfbGVuIC0gMikgLyAyOwogICAgICAgICBpZiAoIW1heF9jaGFycykgewogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ3Miw3ICs0NzIsNyBAQAogICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGVuY0xlbik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgYm9vbCBiSGV4KQorQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXgpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdDsKICAgICBpbnQgc3JjbGVuID0gc3JjLkdldExlbmd0aCgpOwpAQCAtNTIxLDcgKzUyMSw3IEBACiB7CiAgICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwogICAgIGlmIChwRW5jb2RlcnMpIHsKLSAgICAgICAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShmYWxzZSwgc3JjX2J1Ziwgc3JjX3NpemUsIGZhbHNlLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShGQUxTRSwgc3JjX2J1Ziwgc3JjX3NpemUsIEZBTFNFLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCmluZGV4IDBlYTY5MmUuLmMwZjQ1YzUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCkBAIC0xMiw3ICsxMiw3IEBACiAgICAgQVNTRVJUKHBQYXJzZXIgIT0gTlVMTCk7CiAgICAgbV9wUm9vdERpY3QgPSBOVUxMOwogICAgIG1fcEluZm9EaWN0ID0gTlVMTDsKLSAgICBtX2JMaW5lYXJpemVkID0gZmFsc2U7CisgICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwogICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CiAgICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7CiAgICAgbV9wRG9jUGFnZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOwpAQCAtNTgsNyArNTgsNyBAQAogfQogdm9pZCBDUERGX0RvY3VtZW50OjpMb2FkQXN5bkRvYyhDUERGX0RpY3Rpb25hcnkgKnBMaW5lYXJpemVkKQogewotICAgIG1fYkxpbmVhcml6ZWQgPSB0cnVlOworICAgIG1fYkxpbmVhcml6ZWQgPSBUUlVFOwogICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwogICAgIENQREZfT2JqZWN0KiBpbmRpcmVjdE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0Um9vdE9iak51bSgpKTsKICAgICBtX3BSb290RGljdCA9IGluZGlyZWN0T2JqID8gaW5kaXJlY3RPYmotPkdldERpY3QoKSA6IE5VTEw7CkBAIC0yMjgsNyArMjI4LDcgQEAKIHsKICAgICBGWF9EV09SRCBuUGFnZXMgPSBtX1BhZ2VMaXN0LkdldFNpemUoKTsKICAgICBGWF9EV09SRCBza2lwX2NvdW50ID0gMDsKLSAgICBib29sIGJTa2lwcGVkID0gZmFsc2U7CisgICAgRlhfQk9PTCBiU2tpcHBlZCA9IEZBTFNFOwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuUGFnZXM7IGkgKyspIHsKICAgICAgICAgRlhfRFdPUkQgb2JqbnVtMSA9IG1fUGFnZUxpc3QuR2V0QXQoaSk7CiAgICAgICAgIGlmIChvYmpudW0xID09IG9iam51bSkgewpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiU2tpcHBlZCAmJiBvYmpudW0xID09IDApIHsKICAgICAgICAgICAgIHNraXBfY291bnQgPSBpOwotICAgICAgICAgICAgYlNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgYlNraXBwZWQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIF9Db3VudFBhZ2VzKHBQYWdlcywgMCk7CiB9Ci1ib29sIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzUGFnZURpY3QpCitGWF9CT09MIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzUGFnZURpY3QpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhZ2VMaXN0LkdldFNpemUoKTsgaSArKykgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IEdldFBhZ2UoaSk7CkBAIC0zMTYsNDIgKzMxNiw0MiBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCgoQ1BERl9SZWZlcmVuY2UqKSBwUmVmKS0+R2V0UmVmT2JqTnVtKCkgPT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocENvbnRlbnRzLT5HZXRPYmpOdW0oKSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLUZYX0RXT1JEIENQREZfRG9jdW1lbnQ6OkdldFVzZXJQZXJtaXNzaW9ucyhib29sIGJDaGVja1JldmlzaW9uKSBjb25zdAorRlhfRFdPUkQgQ1BERl9Eb2N1bWVudDo6R2V0VXNlclBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24pIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFBhcnNlci0+R2V0UGVybWlzc2lvbnMoYkNoZWNrUmV2aXNpb24pOwogfQotYm9vbCBDUERGX0RvY3VtZW50OjpJc093bmVyKCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNPd25lcigpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFBhcnNlci0+SXNPd25lcigpOwogfQotYm9vbCBDUERGX0RvY3VtZW50OjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBib29sJiBiRm9ybSkgY29uc3QKK0ZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIGNvbnN0CiB7CiAgICAgewogICAgICAgICBDUERGX09iamVjdCogcE9iajsKICAgICAgICAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcE9iaikpIHsKICAgICAgICAgICAgIGJGb3JtID0gcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0gJiYKICAgICAgICAgICAgICAgICAgICAgKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJGb3JtIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICBiRm9ybSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYkZvcm0gPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBtX3BQYXJzZXItPklzRm9ybVN0cmVhbShvYmpudW0sIGJGb3JtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwCmluZGV4IGZmNmYwZTEuLjlmMzU2YTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICAgIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2EKIH07CiB2b2lkIENhbGNFbmNyeXB0S2V5KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHQsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbiwgYm9vbCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbiwgRlhfQk9PTCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCiB7CiAgICAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiAgICAgdWludDhfdCBwYXNzY29kZVszMl07CkBAIC01Nyw3ICs1Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBfUERGX0NSWVBUT0lURU0gIHsKICAgICBpbnQzMl90CW1fQ2lwaGVyOwogICAgIGludDMyX3QJbV9LZXlMZW47Ci0gICAgYm9vbAkJbV9iQ2hlY2tlZDsKKyAgICBGWF9CT09MCQltX2JDaGVja2VkOwogICAgIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKgltX3BDcnlwdG9IYW5kbGVyOwogfSBQREZfQ1JZUFRPSVRFTTsKIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKQpAQCAtNjYsNyArNjYsNyBAQAogICAgIG1fUmV2aXNpb24gPSAwOwogICAgIG1fcFBhcnNlciA9IE5VTEw7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIG1fYk93bmVyID0gZmFsc2U7CisgICAgbV9iT3duZXIgPSBGQUxTRTsKICAgICBtX1Blcm1pc3Npb25zID0gMDsKICAgICBtX0NpcGhlciA9IEZYQ0lQSEVSX05PTkU7CiAgICAgbV9LZXlMZW4gPSAwOwpAQCAtNzQsMzYgKzc0LDM2IEBACiBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjp+Q1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpCiB7CiB9Ci1ib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCiB7CiAgICAgbV9wUGFyc2VyID0gcFBhcnNlcjsKICAgICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIENoZWNrU2VjdXJpdHkobV9LZXlMZW4pOwogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1NlY3VyaXR5KGludDMyX3Qga2V5X2xlbikKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgcGFzc3dvcmQgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7Ci0gICAgaWYgKENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCB0cnVlLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7CisgICAgaWYgKENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBUUlVFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7CiAgICAgICAgIGlmIChwYXNzd29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmICghQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIGZhbHNlLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCFDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgRkFMU0UsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbV9iT3duZXIgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgbV9iT3duZXIgPSBUUlVFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBmYWxzZSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIEZBTFNFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOwogfQogRlhfRFdPUkQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0UGVybWlzc2lvbnMoKQogewogICAgIHJldHVybiBtX1Blcm1pc3Npb25zOwogfQotc3RhdGljIGJvb2wgX0xvYWRDcnlwdEluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBjaXBoZXIsIGludCYga2V5bGVuKQorc3RhdGljIEZYX0JPT0wgX0xvYWRDcnlwdEluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBjaXBoZXIsIGludCYga2V5bGVuKQogewogICAgIGludCBWZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwogICAgIGNpcGhlciA9IEZYQ0lQSEVSX1JDNDsKQEAgLTExMSwxNCArMTExLDE0IEBACiAgICAgaWYgKFZlcnNpb24gPj0gNCkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDcnlwdEZpbHRlcnMgPSBwRW5jcnlwdERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNGIikpOwogICAgICAgICBpZiAocENyeXB0RmlsdGVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIklkZW50aXR5IikpIHsKICAgICAgICAgICAgIGNpcGhlciA9IEZYQ0lQSEVSX05PTkU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEZWZGaWx0ZXIgPSBwQ3J5cHRGaWx0ZXJzLT5HZXREaWN0KG5hbWUpOwogICAgICAgICAgICAgaWYgKHBEZWZGaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbktleUJpdHMgPSAwOwogICAgICAgICAgICAgaWYgKFZlcnNpb24gPT0gNCkgewpAQCAtMTQyLDE0ICsxNDIsMTQgQEAKICAgICAgICAga2V5bGVuID0gVmVyc2lvbiA+IDEgPyBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCA0MCkgLyA4IDogNTsKICAgICB9CiAgICAgaWYgKGtleWxlbiA+IDMyIHx8IGtleWxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6TG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCiB7CiAgICAgbV9wRW5jcnlwdERpY3QgPSBwRW5jcnlwdERpY3Q7Ci0gICAgbV9iT3duZXIgPSBmYWxzZTsKKyAgICBtX2JPd25lciA9IEZBTFNFOwogICAgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKICAgICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOwogICAgIG1fUGVybWlzc2lvbnMgPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSwgLTEpOwpAQCAtMTU5LDE3ICsxNTksMTcgQEAKICAgICBDRlhfQnl0ZVN0cmluZyBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RyRiIpKTsKICAgICBpZiAoc3RtZl9uYW1lICE9IHN0cmZfbmFtZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgbV9DaXBoZXIsIG1fS2V5TGVuKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCB0eXBlLCBpbnQmIGNpcGhlciwgaW50JiBrZXlfbGVuKQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbikKIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IGZhbHNlOworICAgIG1fYk93bmVyID0gRkFMU0U7CiAgICAgbV9WZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwogICAgIG1fUmV2aXNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiAgICAgbV9QZXJtaXNzaW9ucyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUCIpLCAtMSk7CkBAIC0xNzgsMjMgKzE3OCwyMyBAQAogICAgICAgICBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKICAgICAgICAgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN0ckYiKSk7CiAgICAgICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgY2lwaGVyLCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9DaXBoZXIgPSBjaXBoZXI7CiAgICAgbV9LZXlMZW4gPSBrZXlfbGVuOwotICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKQogewogICAgIGNpcGhlciA9IG1fQ2lwaGVyOwogICAgIGJ1ZmZlciA9IG1fRW5jcnlwdEtleTsKICAgICBrZXlsZW4gPSBtX0tleUxlbjsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KICNkZWZpbmUgRlhfR0VUXzMyV09SRChuLGIsaSkJCQkJCQkJCVwKICAgICB7CQkJCQkJCQkJCQkJCQlcCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgICAgICAgICBjb250ZW50LkFwcGVuZEJsb2NrKHZlY3RvciwgNDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCB0cnVlKTsKKyAgICAgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMTYsIFRSVUUpOwogICAgICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIEUsIGNvbnRlbnQuR2V0QnVmZmVyKCksIGlCdWZMZW4pOwogICAgICAgICBpbnQgaUhhc2ggPSAwOwpAQCAtMjg4LDE2ICsyODgsMTYgQEAKICAgICAgICAgRlhTWVNfbWVtY3B5KGhhc2gsIGlucHV0LCAzMik7CiAgICAgfQogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwKLSAgICAgICAgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsCisgICAgICAgIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CiAgICAgaWYgKG9rZXkuR2V0TGVuZ3RoKCkgPCA0OCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVSIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CiAgICAgaWYgKHVrZXkuR2V0TGVuZ3RoKCkgPCA0OCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgY29uc3QgdWludDhfdCogcGtleSA9IGJPd25lciA/IChjb25zdCB1aW50OF90Kilva2V5IDogKGNvbnN0IHVpbnQ4X3QqKXVrZXk7CiAgICAgdWludDhfdCBzaGFbMTI4XTsKQEAgLTMxNCwxMCArMzE0LDEwIEBACiAgICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7CiAgICAgfQogICAgIGlmIChGWFNZU19tZW1jbXAoZGlnZXN0LCBwa2V5LCAzMikgIT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fUmV2aXNpb24gPj0gNikgewogICAgICAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyA0MCwgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdCk7CkBAIC0zMzIsMTkgKzMzMiwxOSBAQAogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBla2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKGJPd25lciA/IEZYX0JTVFJDKCJPRSIpIDogRlhfQlNUUkMoIlVFIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKICAgICBpZiAoZWtleS5HZXRMZW5ndGgoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwgZGlnZXN0LCAzMiwgZmFsc2UpOworICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QsIDMyLCBGQUxTRSk7CiAgICAgdWludDhfdCBpdlsxNl07CiAgICAgRlhTWVNfbWVtc2V0KGl2LCAwLCAxNik7CiAgICAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7CiAgICAgQ1JZUFRfQUVTRGVjcnlwdChhZXMsIGtleSwgZWtleSwgMzIpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDMyLCBmYWxzZSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIEZBTFNFKTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKICAgICBDRlhfQnl0ZVN0cmluZyBwZXJtcyA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIikpOwogICAgIGlmIChwZXJtcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHVpbnQ4X3QgcGVybXNfYnVmWzE2XTsKICAgICBGWFNZU19tZW1zZXQocGVybXNfYnVmLCAwLCBzaXplb2YocGVybXNfYnVmKSk7CkBAIC0zNTcsMjEgKzM1NywyMSBAQAogICAgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBidWYsIHBlcm1zX2J1ZiwgMTYpOwogICAgIEZYX0ZyZWUoYWVzKTsKICAgICBpZiAoYnVmWzldICE9ICdhJyB8fCBidWZbMTBdICE9ICdkJyB8fCBidWZbMTFdICE9ICdiJykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKEZYRFdPUkRfR0VUX0xTQkZJUlNUKGJ1ZikgIT0gbV9QZXJtaXNzaW9ucykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChidWZbOF0gPT0gJ1QnICYmICFJc01ldGFkYXRhRW5jcnlwdGVkKCkpIHx8IChidWZbOF0gPT0gJ0YnICYmIElzTWV0YWRhdGFFbmNyeXB0ZWQoKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotaW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKK2ludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpCiB7CiAgICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwgYk93bmVyLCBrZXksIG1fS2V5TGVuKTsKIH0KLWludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCitpbnQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKQogewogICAgIGlmIChtX1JldmlzaW9uID49IDUpIHsKICAgICAgICAgcmV0dXJuIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBiT3duZXIsIGtleSk7CkBAIC0zODMsMTYgKzM4MywxNiBAQAogICAgIGlmIChiT3duZXIpIHsKICAgICAgICAgcmV0dXJuIENoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwga2V5LCBrZXlfbGVuKTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBmYWxzZSwga2V5LCBrZXlfbGVuKSB8fCBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgdHJ1ZSwga2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIEZBTFNFLCBrZXksIGtleV9sZW4pIHx8IENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBUUlVFLCBrZXksIGtleV9sZW4pOwogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1VzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICBib29sIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgIEZYX0JPT0wgYklnbm9yZUVuY3J5cHRNZXRhLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKIHsKICAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgcGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5LCBrZXlfbGVuLCBiSWdub3JlRW5jcnlwdE1ldGEsCiAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRJREFycmF5KCkpOwogICAgIENGWF9CeXRlU3RyaW5nIHVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwogICAgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgMTYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHVpbnQ4X3QgdWtleWJ1ZlszMl07CiAgICAgaWYgKG1fUmV2aXNpb24gPT0gMikgewpAQCAtNDI1LDkgKzQyNSw5IEBACiAgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAodGVzdCwgdWtleWJ1ZiwgMTYpID09IDA7CiAgICAgfQogICAgIGlmIChGWFNZU19tZW1jbXAoKHZvaWQqKXVrZXkuY19zdHIoKSwgdWtleWJ1ZiwgMTYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIHBhc3Nfc2l6ZSkKIHsKQEAgLTQ4MCwxOCArNDgwLDE4IEBACiAgICAgfQogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhva2V5YnVmLCBsZW4pOwogfQotYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tPd25lclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCiAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKQogewogICAgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IEdldFVzZXJQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBrZXlfbGVuKTsKLSAgICBpZiAoQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIGZhbHNlLCBrZXksIGtleV9sZW4pKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgRkFMU0UsIGtleSwga2V5X2xlbikpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgdHJ1ZSwga2V5LCBrZXlfbGVuKTsKKyAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIFRSVUUsIGtleSwga2V5X2xlbik7CiB9Ci1ib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OklzTWV0YWRhdGFFbmNyeXB0ZWQoKQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpJc01ldGFkYXRhRW5jcnlwdGVkKCkKIHsKLSAgICByZXR1cm4gbV9wRW5jcnlwdERpY3QtPkdldEJvb2xlYW4oRlhfQlNUUkMoIkVuY3J5cHRNZXRhZGF0YSIpLCB0cnVlKTsKKyAgICByZXR1cm4gbV9wRW5jcnlwdERpY3QtPkdldEJvb2xlYW4oRlhfQlNUUkMoIkVuY3J5cHRNZXRhZGF0YSIpLCBUUlVFKTsKIH0KIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKIHsKQEAgLTQ5OSw3ICs0OTksNyBAQAogfQogdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAotICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBib29sIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKQorICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKQogewogICAgIGludCBjaXBoZXIgPSAwLCBrZXlfbGVuID0gMDsKICAgICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCwgdHlwZSwgY2lwaGVyLCBrZXlfbGVuKSkgewpAQCAtNTE3LDEwICs1MTcsMTAgQEAKICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgbV9FbmNyeXB0S2V5LCAzMik7CiAgICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsICh1aW50OF90KikidGhlcmUiLCA1KTsKICAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIGZhbHNlLCBtX0VuY3J5cHRLZXkpOworICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgRkFMU0UsIG1fRW5jcnlwdEtleSk7CiAgICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgdHJ1ZSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIHRydWUpLCBtX0VuY3J5cHRLZXkpOworICAgICAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwgbV9FbmNyeXB0S2V5KTsKKyAgICAgICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIFRSVUUpLCBtX0VuY3J5cHRLZXkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01NTQsNyArNTU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJPIiksIENGWF9CeXRlU3RyaW5nKHBhc3Njb2RlLCAzMikpOwogICAgIH0KLSAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgKHVpbnQ4X3QqKXVzZXJfcGFzcywgdXNlcl9zaXplLCBtX0VuY3J5cHRLZXksIGtleV9sZW4sIGZhbHNlLCBwSWRBcnJheSk7CisgICAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsICh1aW50OF90Kil1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuLCBGQUxTRSwgcElkQXJyYXkpOwogICAgIGlmIChtX1JldmlzaW9uIDwgMykgewogICAgICAgICB1aW50OF90IHRlbXBidWZbMzJdOwogICAgICAgICBGWFNZU19tZW1jcHkodGVtcGJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKQEAgLTU4NiwxMyArNTg2LDEzIEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAogICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9EV09SRCB0eXBlKQogewotICAgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCB0cnVlLCB0eXBlKTsKKyAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwgdHlwZSk7CiB9CiB2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsIEZYX0RXT1JEIHR5cGUpCiB7Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIGZhbHNlLCB0eXBlKTsKKyAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgTlVMTCwgMCwgRkFMU0UsIHR5cGUpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KQordm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KQogewogICAgIHVpbnQ4X3Qgc2hhWzEyOF07CiAgICAgQ1JZUFRfU0hBMVN0YXJ0KHNoYSk7CkBAIC02MjcsNyArNjI3LDcgQEAKICAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0MSk7CiAgICAgfQogICAgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QxLCAzMiwgdHJ1ZSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCBUUlVFKTsKICAgICB1aW50OF90IGl2WzE2XTsKICAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKQEAgLTYzNiw3ICs2MzYsNyBAQAogICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0MSwgMzIpKTsKIH0KIHZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9ucywKLSAgICAgICAgYm9vbCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpCisgICAgICAgIEZYX0JPT0wgYkVuY3J5cHRNZXRhZGF0YSwgY29uc3QgdWludDhfdCoga2V5KQogewogICAgIHVpbnQ4X3QgYnVmWzE2XTsKICAgICBidWZbMF0gPSAodWludDhfdClwZXJtaXNzaW9uczsKQEAgLTY1Miw3ICs2NTIsNyBAQAogICAgIGJ1ZlsxMF0gPSAnZCc7CiAgICAgYnVmWzExXSA9ICdiJzsKICAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgdHJ1ZSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIFRSVUUpOwogICAgIHVpbnQ4X3QgaXZbMTZdLCBidWYxWzE2XTsKICAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKQEAgLTY2MCw3ICs2NjAsNyBAQAogICAgIEZYX0ZyZWUoYWVzKTsKICAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJQZXJtcyIpLCBDRlhfQnl0ZVN0cmluZyhidWYxLCAxNikpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRCbG9jayhib29sIGJFbmNyeXB0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCit2b2lkIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKQEAgLTcyMCwxOCArNzIwLDE4IEBACiB9CiB0eXBlZGVmIHN0cnVjdCBfQUVTQ3J5cHRDb250ZXh0IHsKICAgICB1aW50OF90CQltX0NvbnRleHRbMjA0OF07Ci0gICAgYm9vbAkJbV9iSVY7CisgICAgRlhfQk9PTAkJbV9iSVY7CiAgICAgdWludDhfdAkJbV9CbG9ja1sxNl07CiAgICAgRlhfRFdPUkQJbV9CbG9ja09mZnNldDsKIH0gQUVTQ3J5cHRDb250ZXh0Owotdm9pZCogQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGJvb2wgYkVuY3J5cHQpCit2b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCkKIHsKICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyAmJiBtX0tleUxlbiA9PSAzMikgewogICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gdHJ1ZTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIG1fRW5jcnlwdEtleSwgMzIsIGJFbmNyeXB0KTsKICAgICAgICAgaWYgKGJFbmNyeXB0KSB7CkBAIC03NTcsNyArNzU3LDcgQEAKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewogICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gdHJ1ZTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIHJlYWxrZXksIDE2LCBiRW5jcnlwdCk7CiAgICAgICAgIGlmIChiRW5jcnlwdCkgewpAQCAtNzcyLDI1ICs3NzIsMjUgQEAKICAgICBDUllQVF9BcmNGb3VyU2V0dXAocENvbnRleHQsIHJlYWxrZXksIHJlYWxrZXlsZW4pOwogICAgIHJldHVybiBwQ29udGV4dDsKIH0KLWJvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCkKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCkKIHsKICAgICBpZiAoIWNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CiAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKHNyY19idWYsIHNyY19zaXplKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CiAgICAgICAgIGludCBvbGRfc2l6ZSA9IGRlc3RfYnVmLkdldFNpemUoKTsKICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwogICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHQoY29udGV4dCwgZGVzdF9idWYuR2V0QnVmZmVyKCkgKyBvbGRfc2l6ZSwgc3JjX3NpemUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSAoQUVTQ3J5cHRDb250ZXh0Kiljb250ZXh0OwogICAgIGlmIChwQ29udGV4dC0+bV9iSVYgJiYgYkVuY3J5cHQpIHsKICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2socENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gZmFsc2U7CisgICAgICAgIHBDb250ZXh0LT5tX2JJViA9IEZBTFNFOwogICAgIH0KICAgICBGWF9EV09SRCBzcmNfb2ZmID0gMDsKICAgICBGWF9EV09SRCBzcmNfbGVmdCA9IHNyY19zaXplOwpAQCAtODA2LDcgKzgwNiw3IEBACiAgICAgICAgIGlmIChwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9PSAxNikgewogICAgICAgICAgICAgaWYgKCFiRW5jcnlwdCAmJiBwQ29udGV4dC0+bV9iSVYpIHsKICAgICAgICAgICAgICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYklWID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNfb2ZmIDwgc3JjX3NpemUpIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGJsb2NrX2J1ZlsxNl07CkBAIC04MjMsMTkgKzgyMywxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgYm9vbCBiRW5jcnlwdCkKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KQogewogICAgIGlmICghY29udGV4dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CiAgICAgICAgIEZYX0ZyZWUoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IChBRVNDcnlwdENvbnRleHQqKWNvbnRleHQ7CiAgICAgaWYgKGJFbmNyeXB0KSB7CkBAIC04NTYsMjQgKzg1NiwyNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIEZYX0ZyZWUocENvbnRleHQpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCogQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkKIHsKLSAgICByZXR1cm4gQ3J5cHRTdGFydChvYmpudW0sIGdlbm51bSwgZmFsc2UpOworICAgIHJldHVybiBDcnlwdFN0YXJ0KG9iam51bSwgZ2VubnVtLCBGQUxTRSk7CiB9CiBGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpCiB7CiAgICAgcmV0dXJuIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IHNyY19zaXplIC0gMTYgOiBzcmNfc2l6ZTsKIH0KLWJvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpCiB7CiAgICAgY29uc3QgdWludDhfdCoga2V5OwogICAgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRJbmZvKG1fQ2lwaGVyLCBrZXksIG1fS2V5TGVuKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fS2V5TGVuID4gMzIgfHwgbV9LZXlMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgIT0gRlhDSVBIRVJfTk9ORSkgewogICAgICAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKQEAgLTg4MSw5ICs4ODEsOSBAQAogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoaW50IGNpcGhlciwgY29uc3QgdWludDhfdCoga2V5LCBpbnQga2V5bGVuKQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pCiB7CiAgICAgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgc3dpdGNoKGtleWxlbikgewpAQCAtODkyLDE1ICs4OTIsMTUgQEAKICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMyKSB7CiAgICAgICAgIGlmIChrZXlsZW4gIT0gMzIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgewogICAgICAgICBpZiAoa2V5bGVuIDwgNSB8fCBrZXlsZW4gPiAxNikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGtleWxlbiA+IDMyKSB7CkBAIC05MTMsMTYgKzkxMywxNiBAQAogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKICAgICAgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitGWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICByZXR1cm4gQ3J5cHRTdHJlYW0oY29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBmYWxzZSk7CisgICAgcmV0dXJuIENyeXB0U3RyZWFtKGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgRkFMU0UpOwogfQotYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7Ci0gICAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBmYWxzZSk7CisgICAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBGQUxTRSk7CiB9CiBGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkKIHsKQEAgLTkzMSwxMSArOTMxLDExIEBACiAgICAgfQogICAgIHJldHVybiBzcmNfc2l6ZTsKIH0KLWJvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7Ci0gICAgQ3J5cHRCbG9jayh0cnVlLCBvYmpudW0sIGdlbm51bSwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIHJldHVybiB0cnVlOworICAgIENyeXB0QmxvY2soVFJVRSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBDRlhfQnl0ZVN0cmluZyYgc3RyKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCmluZGV4IGZmY2U0NmIuLjE5NThmYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKQEAgLTksNyArOSw3IEBACiB7CiAgICAgbV9wUm9vdERpY3QgPSBOVUxMOwogICAgIG1fcEZpbGUgPSBOVUxMOwotICAgIG1fYk93bkZpbGUgPSBmYWxzZTsKKyAgICBtX2JPd25GaWxlID0gRkFMU0U7CiB9CiBDRkRGX0RvY3VtZW50Ojp+Q0ZERl9Eb2N1bWVudCgpCiB7CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgcERvYy0+bV9wUm9vdERpY3QtPlNldEF0KEZYX0JTVFJDKCJGREYiKSwgcEZERkRpY3QpOwogICAgIHJldHVybiBwRG9jOwogfQotQ0ZERl9Eb2N1bWVudCogQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIGJvb2wgYk93bkZpbGUpCitDRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKIHsKICAgaWYgKCFwRmlsZSkgewogICAgIHJldHVybiBOVUxMOwpAQCAtNDEsMTYgKzQxLDE2IEBACiB9CiBDRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKLSAgICByZXR1cm4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIHNpemUpLCB0cnVlKTsKKyAgICByZXR1cm4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIHNpemUpLCBUUlVFKTsKIH0KLXZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiT3duRmlsZSkKK3ZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKIHsKICAgICBtX3BGaWxlID0gcEZpbGU7CiAgICAgbV9iT3duRmlsZSA9IGJPd25GaWxlOwogICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKICAgICBwYXJzZXIuSW5pdFBhcnNlcihtX3BGaWxlLCAwKTsKICAgICB3aGlsZSAoMSkgewotICAgICAgICBib29sIGJOdW1iZXI7CisgICAgICAgIEZYX0JPT0wgYk51bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgaWYgKGJOdW1iZXIpIHsKICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CkBAIC04NSwxMCArODUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ0ZERl9Eb2N1bWVudDo6V3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0CitGWF9CT09MIENGREZfRG9jdW1lbnQ6OldyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdAogewogICAgIGlmIChtX3BSb290RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBidWYgPDwgRlhfQlNUUkMoIiVGREYtMS4yXHJcbiIpOwogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgYnVmIDw8IChGWF9EV09SRClvYmpudW0gPDwgRlhfQlNUUkMoIiAwIG9ialxyXG4iKSA8PCBwT2JqIDw8IEZYX0JTVFJDKCJcclxuZW5kb2JqXHJcblxyXG4iKTsKICAgICB9CiAgICAgYnVmIDw8IEZYX0JTVFJDKCJ0cmFpbGVyXHJcbjw8L1Jvb3QgIikgPDwgbV9wUm9vdERpY3QtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSPj5cclxuJSVFT0ZcclxuIik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDRlhfV2lkZVN0cmluZyBDRkRGX0RvY3VtZW50OjpHZXRXaW4zMlBhdGgoKSBjb25zdAogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAKaW5kZXggZjgxYWE3My4uZmVkNDU0NiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAKIENGWF9EYXRhRmlsdGVyOjpDRlhfRGF0YUZpbHRlcigpCiB7Ci0gICAgbV9iRU9GID0gZmFsc2U7CisgICAgbV9iRU9GID0gRkFMU0U7CiAgICAgbV9wRGVzdEZpbHRlciA9IE5VTEw7CiAgICAgbV9TcmNQb3MgPSAwOwogfQpAQCAtNjgsMTQgKzY4LDE0IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgdl9GaWx0ZXJGaW5pc2goZGVzdF9idWYpOwogICAgIH0KLSAgICBtX2JFT0YgPSB0cnVlOworICAgIG1fYkVPRiA9IFRSVUU7CiB9CiB2b2lkIENGWF9EYXRhRmlsdGVyOjpSZXBvcnRFT0YoRlhfRFdPUkQgbGVmdF9pbnB1dCkKIHsKICAgICBpZiAobV9iRU9GKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbV9iRU9GID0gdHJ1ZTsKKyAgICBtX2JFT0YgPSBUUlVFOwogICAgIG1fU3JjUG9zIC09IGxlZnRfaW5wdXQ7CiB9CiBDRlhfRGF0YUZpbHRlciogRlBERl9DcmVhdGVGaWx0ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQpAQCAtMTEzLDkgKzExMyw5IEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUnVuTGVuRmlsdGVyOwogICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdDJywgJ0knLCAnVCcpOiB7CiAgICAgICAgICAgICAgICAgaW50IEVuY29kaW5nID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgYkVuZE9mTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGludCBiQnl0ZUFsaWduID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaW50IGJCbGFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCBiRW5kT2ZMaW5lID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaW50IGJCeXRlQWxpZ24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpbnQgYkJsYWNrID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgaW50IG5Sb3dzID0gMDsKICAgICAgICAgICAgICAgICBpbnQgbkNvbHVtbnMgPSAxNzI4OwogICAgICAgICAgICAgICAgIGlmIChwUGFyYW0pIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEZpcnN0RmlsdGVyOwogfQotQ1BERl9TdHJlYW1GaWx0ZXIqIENQREZfU3RyZWFtOjpHZXRTdHJlYW1GaWx0ZXIoYm9vbCBiUmF3KSBjb25zdAorQ1BERl9TdHJlYW1GaWx0ZXIqIENQREZfU3RyZWFtOjpHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3KSBjb25zdAogewogICAgIENGWF9EYXRhRmlsdGVyKiBwRmlyc3RGaWx0ZXIgPSBOVUxMOwogICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CkBAIC0yOTQsNyArMjk0LDcgQEAKIH0KIHZvaWQgQ1BERl9EZWNyeXB0RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICBtX2JFT0YgPSB0cnVlOworICAgIG1fYkVPRiA9IFRSVUU7CiAgICAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUERGX0x6d0ZpbHRlcjo6Q1BERl9MendGaWx0ZXIoYm9vbCBiRWFybHlDaGFuZ2UpCitDUERGX0x6d0ZpbHRlcjo6Q1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpCiB7CiAgICAgbV9iRWFybHlDaGFuZ2UgPSBiRWFybHlDaGFuZ2UgPyAxIDogMDsKICAgICBtX0NvZGVMZW4gPSA5OwpAQCAtNjk3LDcgKzY5Nyw3IEBACiBDUERGX0pwZWdGaWx0ZXI6OkNQREZfSnBlZ0ZpbHRlcigpCiB7CiAgICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9iR290SGVhZGVyID0gZmFsc2U7CisgICAgbV9iR290SGVhZGVyID0gRkFMU0U7CiAgICAgbV9wU2NhbmxpbmUgPSBOVUxMOwogICAgIG1faUxpbmUgPSAwOwogfQpAQCAtNzQyLDcgKzc0Miw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPlN0YXJ0U2NhbmxpbmUobV9wQ29udGV4dCwgMSk7Ci0gICAgICAgIG1fYkdvdEhlYWRlciA9IHRydWU7CisgICAgICAgIG1fYkdvdEhlYWRlciA9IFRSVUU7CiAgICAgICAgIG1fUGl0Y2ggPSBtX1dpZHRoICogbV9uQ29tcHM7CiAgICAgfQogICAgIGlmIChtX3BTY2FubGluZSA9PSBOVUxMKSB7CkBAIC03NjUsOSArNzY1LDkgQEAKIENQREZfRmF4RmlsdGVyOjpDUERGX0ZheEZpbHRlcigpCiB7CiAgICAgbV9FbmNvZGluZyA9IDA7Ci0gICAgbV9iRW5kT2ZMaW5lID0gZmFsc2U7Ci0gICAgbV9iQnl0ZUFsaWduID0gZmFsc2U7Ci0gICAgbV9iQmxhY2sgPSBmYWxzZTsKKyAgICBtX2JFbmRPZkxpbmUgPSBGQUxTRTsKKyAgICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKKyAgICBtX2JCbGFjayA9IEZBTFNFOwogICAgIG1fblJvd3MgPSAwOwogICAgIG1fbkNvbHVtbnMgPSAwOwogICAgIG1fUGl0Y2ggPSAwOwpAQCAtNzg1LDcgKzc4NSw3IEBACiAgICAgICAgIEZYX0ZyZWUobV9wUmVmQnVmKTsKICAgICB9CiB9Ci1ib29sIENQREZfRmF4RmlsdGVyOjpJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucykKK0ZYX0JPT0wgQ1BERl9GYXhGaWx0ZXI6OkluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKQogewogICAgIG1fRW5jb2RpbmcgPSBFbmNvZGluZzsKICAgICBtX2JFbmRPZkxpbmUgPSBiRW5kT2ZMaW5lOwpAQCAtODAwLDcgKzgwMCw3IEBACiAgICAgRlhTWVNfbWVtc2V0KG1fcFJlZkJ1ZiwgMHhmZiwgbV9QaXRjaCk7CiAgICAgbV9pUm93ID0gMDsKICAgICBtX0lucHV0Qml0UG9zID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9GYXhGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQogewpAQCAtODIxLDE5ICs4MjEsMTkgQEAKICAgICAgICAgZmF4X3NyY19zaXplID0gc3JjX3NpemU7CiAgICAgICAgIGJpdHBvcyA9IDA7CiAgICAgfQotICAgIFByb2Nlc3NEYXRhKGZheF9zcmNfYnVmLCBmYXhfc3JjX3NpemUsIGJpdHBvcywgZmFsc2UsIGRlc3RfYnVmKTsKKyAgICBQcm9jZXNzRGF0YShmYXhfc3JjX2J1ZiwgZmF4X3NyY19zaXplLCBiaXRwb3MsIEZBTFNFLCBkZXN0X2J1Zik7CiAgICAgaW50IGxlZnRfYml0cyA9IGZheF9zcmNfc2l6ZSAqIDggLSBiaXRwb3M7CiAgICAgbV9JbnB1dEJ1Zi5BcHBlbmRCbG9jayhmYXhfc3JjX2J1ZiArIGJpdHBvcyAvIDgsIChsZWZ0X2JpdHMgKyA3KSAvIDgpOwogICAgIG1fSW5wdXRCaXRQb3MgPSBiaXRwb3MgJSA4OwogfQogdm9pZCBDUERGX0ZheEZpbHRlcjo6dl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7Ci0gICAgUHJvY2Vzc0RhdGEobV9JbnB1dEJ1Zi5HZXRCdWZmZXIoKSwgbV9JbnB1dEJ1Zi5HZXRTaXplKCksIG1fSW5wdXRCaXRQb3MsIHRydWUsIGRlc3RfYnVmKTsKKyAgICBQcm9jZXNzRGF0YShtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSwgbV9JbnB1dEJpdFBvcywgVFJVRSwgZGVzdF9idWYpOwogfQotYm9vbCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpOwotYm9vbCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpOwotYm9vbCBfRmF4R2V0MURMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGludCBjb2x1bW5zKTsKLXZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgYm9vbCBiRmluaXNoLAorRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpOworRlhfQk9PTCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpOworRlhfQk9PTCBfRmF4R2V0MURMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGludCBjb2x1bW5zKTsKK3ZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIGJpdHBvcywgRlhfQk9PTCBiRmluaXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7CiAgICAgaW50IGJpdHNpemUgPSBzcmNfc2l6ZSAqIDg7CkBAIC04NjMsMjEgKzg2MywyMSBAQAogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQorRlhfQk9PTCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQogewogICAgIGlmICghX0ZheFNraXBFT0woc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgYm9vbCByZXQ7CisgICAgRlhfQk9PTCByZXQ7CiAgICAgaWYgKG1fRW5jb2RpbmcgPCAwKSB7CiAgICAgICAgIHJldCA9IF9GYXhHNEdldFJvdyhzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fbkNvbHVtbnMpOwogICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7CiAgICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGJpdHBvcyA9PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCBiTmV4dDFEID0gc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOworICAgICAgICBGWF9CT09MIGJOZXh0MUQgPSBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7CiAgICAgICAgIGJpdHBvcyArKzsKICAgICAgICAgaWYgKGJOZXh0MUQpIHsKICAgICAgICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7CkBAIC04ODYsMTQgKzg4NiwxNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICghcmV0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9iRW5kT2ZMaW5lKQogICAgICAgICBpZiAoIV9GYXhTa2lwRU9MKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIGlmIChtX2JCeXRlQWxpZ24pIHsKICAgICAgICAgYml0cG9zID0gKGJpdHBvcyArIDcpIC8gOCAqIDg7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAKaW5kZXggOTZlNjgwNy4uYzdkMWRlYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgICgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lID0gc3RyOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBU1NFUlQoZmFsc2UpOworICAgIEFTU0VSVChGQUxTRSk7CiB9CiBpbnQgQ1BERl9PYmplY3Q6OkdldERpcmVjdFR5cGUoKSBjb25zdAogewpAQCAtMTkwLDEzICsxOTAsMTMgQEAKICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopdGhpczsKICAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RUeXBlKHBSZWYtPm1fUmVmT2JqTnVtKTsKIH0KLWJvb2wgQ1BERl9PYmplY3Q6OklzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT3RoZXIpIGNvbnN0CitGWF9CT09MIENQREZfT2JqZWN0OjpJc0lkZW50aWNhbChDUERGX09iamVjdCogcE90aGVyKSBjb25zdAogewogICAgIGlmICh0aGlzID09IHBPdGhlcikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChwT3RoZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBPdGhlci0+bV9UeXBlICE9IG1fVHlwZSkgewogICAgICAgICBpZiAobV9UeXBlID09IFBERk9CSl9SRUZFUkVOQ0UgJiYgR2V0RGlyZWN0KCkpIHsKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICBpZiAocE90aGVyLT5tX1R5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSkgewogICAgICAgICAgICAgcmV0dXJuIElzSWRlbnRpY2FsKHBPdGhlci0+R2V0RGlyZWN0KCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgpAQCAtMjIxLDEzICsyMjEsMTMgQEAKICAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKICAgICAgICAgICAgIHJldHVybiAoKChDUERGX0RpY3Rpb25hcnkqKXRoaXMpLT5JZGVudGljYWwoKENQREZfRGljdGlvbmFyeSopcE90aGVyKSk7CiAgICAgICAgIGNhc2UgUERGT0JKX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06CiAgICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9TdHJlYW0qKXRoaXMpLT5JZGVudGljYWwoKENQREZfU3RyZWFtKilwT3RoZXIpKTsKICAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOgogICAgICAgICAgICAgcmV0dXJuICgoKENQREZfUmVmZXJlbmNlKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1JlZmVyZW5jZSopcE90aGVyKSk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkdldERpcmVjdCgpIGNvbnN0CiB7CkBAIC0yNDAsMTIgKzI0MCwxMiBAQAogICAgIH0KICAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwogfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZShib29sIGJEaXJlY3QpIGNvbnN0CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lKEZYX0JPT0wgYkRpcmVjdCkgY29uc3QKIHsKICAgICBDRlhfTWFwUHRyVG9QdHIgdmlzaXRlZDsKICAgICByZXR1cm4gQ2xvbmVJbnRlcm5hbChiRGlyZWN0LCAmdmlzaXRlZCk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lSW50ZXJuYWwoYm9vbCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lSW50ZXJuYWwoRlhfQk9PTCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0CiB7CiAgICAgc3dpdGNoIChtX1R5cGUpIHsKICAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKQEAgLTI4NCw3ICsyODQsNyBAQAogICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFRoaXMgPSAoQ1BERl9TdHJlYW0qKXRoaXM7CiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwVGhpcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCBUUlVFKTsKICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFRoaXMtPkdldERpY3QoKTsKICAgICAgICAgICAgICAgICBpZiAocERpY3QpCkBAIC0yOTksNyArMjk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwUmVmLT5HZXREaXJlY3QoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwUmVmLT5HZXREaXJlY3QoKS0+Q2xvbmVJbnRlcm5hbCh0cnVlLCB2aXNpdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBSZWYtPkdldERpcmVjdCgpLT5DbG9uZUludGVybmFsKFRSVUUsIHZpc2l0ZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBSZWYtPm1fcE9iakxpc3QsIG9ial9udW0pOwogICAgICAgICAgICAgfQpAQCAtMzIwLDcgKzMyMCw3IEBACiAgICAgfQogICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXRoaXMsIGZhbHNlKTsKKyAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopdGhpcywgRkFMU0UpOwogICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMzM1LDE5ICszMzUsMTkgQEAKICAgICAgICAgKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwogICAgIH0gZWxzZSBpZiAobV9UeXBlID09IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0ID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwotICAgICAgICAoKENQREZfU3RyZWFtKil0aGlzKS0+U2V0RGF0YSgodWludDhfdCopcmVzdWx0LmNfc3RyKCksIHJlc3VsdC5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgKChDUERGX1N0cmVhbSopdGhpcyktPlNldERhdGEoKHVpbnQ4X3QqKXJlc3VsdC5jX3N0cigpLCByZXN1bHQuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CiAgICAgfQogfQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoaW50IHZhbHVlKQotICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIodHJ1ZSksIG1fSW50ZWdlcih2YWx1ZSkgeworICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoVFJVRSksIG1fSW50ZWdlcih2YWx1ZSkgewogfQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfRkxPQVQgdmFsdWUpCi0gICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihmYWxzZSksIG1fRmxvYXQodmFsdWUpIHsKKyAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKEZBTFNFKSwgbV9GbG9hdCh2YWx1ZSkgewogfQogCi1DUERGX051bWJlcjo6Q1BERl9OdW1iZXIoYm9vbCBiSW50ZWdlciwgdm9pZCogcERhdGEpCitDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpCiAgICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihiSW50ZWdlciksIG1fSW50ZWdlcigqKGludCopcERhdGEpIHsKIH0KIApAQCAtMzU5LDcgKzM1OSw3IEBACiB7CiAgICAgRlhfYXRvbnVtKHN0ciwgbV9iSW50ZWdlciwgJm1fSW50ZWdlcik7CiB9Ci1ib29sIENQREZfTnVtYmVyOjpJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3QKK0ZYX0JPT0wgQ1BERl9OdW1iZXI6OklkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdAogewogICAgIHJldHVybiBtX2JJbnRlZ2VyID09IHBPdGhlci0+bV9iSW50ZWdlciAmJiBtX0ludGVnZXIgPT0gcE90aGVyLT5tX0ludGVnZXI7CiB9CkBAIC0zNjksMTAgKzM2OSwxMCBAQAogfQogdm9pZCBDUERGX051bWJlcjo6U2V0TnVtYmVyKEZYX0ZMT0FUIHZhbHVlKQogewotICAgIG1fYkludGVnZXIgPSBmYWxzZTsKKyAgICBtX2JJbnRlZ2VyID0gRkFMU0U7CiAgICAgbV9GbG9hdCA9IHZhbHVlOwogfQotQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChmYWxzZSkgeworQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChGQUxTRSkgewogICAgIG1fU3RyaW5nID0gUERGX0VuY29kZVRleHQoc3RyKTsKIH0KIENQREZfQXJyYXk6On5DUERGX0FycmF5KCkKQEAgLTU1MywxNiArNTUzLDE2IEBACiAgICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwogICAgIEFkZChuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7CiB9Ci1ib29sIENQREZfQXJyYXk6OklkZW50aWNhbChDUERGX0FycmF5KiBwT3RoZXIpIGNvbnN0CitGWF9CT09MIENQREZfQXJyYXk6OklkZW50aWNhbChDUERGX0FycmF5KiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKG1fT2JqZWN0cy5HZXRTaXplKCkgIT0gcE90aGVyLT5tX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fT2JqZWN0cy5HZXRTaXplKCk7IGkgKyspCiAgICAgICAgIGlmICghKChDUERGX09iamVjdCopbV9PYmplY3RzW2ldKS0+SXNJZGVudGljYWwoKENQREZfT2JqZWN0KilwT3RoZXItPm1fT2JqZWN0c1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ1BERl9EaWN0aW9uYXJ5Ojp+Q1BERl9EaWN0aW9uYXJ5KCkKIHsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLWJvb2wgQ1BERl9EaWN0aW9uYXJ5OjpHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJEZWZhdWx0KSBjb25zdAorRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OkdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYkRlZmF1bHQpIGNvbnN0CiB7CiAgICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwogICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CkBAIC03MzQsNyArNzM0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1hdHJpeDsKIH0KLWJvb2wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKK0ZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKIHsKICAgICB2b2lkKiB2YWx1ZTsKICAgICByZXR1cm4gbV9NYXAuTG9va3VwKGtleSwgdmFsdWUpOwpAQCAtNzg2LDEzICs3ODYsMTMgQEAKICAgICBtX01hcC5SZW1vdmVLZXkob2xka2V5KTsKICAgICBtX01hcC5TZXRBdChuZXdrZXksIHApOwogfQotYm9vbCBDUERGX0RpY3Rpb25hcnk6OklkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBPdGhlcikgY29uc3QKK0ZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKHBPdGhlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9NYXAuR2V0Q291bnQoKSAhPSBwT3RoZXItPm1fTWFwLkdldENvdW50KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC04MDAsMTIgKzgwMCwxMiBAQAogICAgICAgICB2b2lkKiB2YWx1ZTsKICAgICAgICAgbV9NYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CiAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGlmICghKChDUERGX09iamVjdCopdmFsdWUpLT5Jc0lkZW50aWNhbChwT3RoZXItPkdldEVsZW1lbnQoa2V5KSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBpKQogewpAQCAtODMzLDcgKzgzMyw3IEBACiAgICAgcE51bWJlci0+U2V0TnVtYmVyKGYpOwogICAgIFNldEF0KGtleSwgcE51bWJlcik7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJWYWx1ZSkKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYlZhbHVlKQogewogICAgIFNldEF0KGtleSwgbmV3IENQREZfQm9vbGVhbihiVmFsdWUpKTsKIH0KQEAgLTkwNSw3ICs5MDUsNyBAQAogICAgICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBzaXplKTsKICAgICB9CiB9Ci12b2lkIENQREZfU3RyZWFtOjpTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBib29sIGJDb21wcmVzc2VkLCBib29sIGJLZWVwQnVmKQordm9pZCBDUERGX1N0cmVhbTo6U2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiQ29tcHJlc3NlZCwgRlhfQk9PTCBiS2VlcEJ1ZikKIHsKICAgICBpZiAobV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDEpIHsKICAgICAgICAgaWYgKG1fcERhdGFCdWYpIHsKQEAgLTkzMyw3ICs5MzMsNyBAQAogICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7CiAgICAgfQogfQotYm9vbCBDUERGX1N0cmVhbTo6UmVhZFJhd0RhdGEoRlhfRklMRVNJWkUgb2Zmc2V0LCB1aW50OF90KiBidWYsIEZYX0RXT1JEIHNpemUpIGNvbnN0CitGWF9CT09MIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsIHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQgc2l6ZSkgY29uc3QKIHsKICAgICBpZiAoKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSAmJiBtX3BGaWxlKSB7CiAgICAgICAgIHJldHVybiBtX3BGaWxlLT5SZWFkQmxvY2soYnVmLCBtX0ZpbGVPZmZzZXQgKyBvZmZzZXQsIHNpemUpOwpAQCAtOTQxLDcgKzk0MSw3IEBACiAgICAgaWYgKG1fcERhdGFCdWYpIHsKICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZiwgbV9wRGF0YUJ1ZiArIG9mZnNldCwgc2l6ZSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQogewpAQCAtOTUyLDIzICs5NTIsMjMgQEAKICAgICAgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgbV9kd1NpemUpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9TdHJlYW06OklkZW50aWNhbChDUERGX1N0cmVhbSogcE90aGVyKSBjb25zdAorRlhfQk9PTCBDUERGX1N0cmVhbTo6SWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKCFtX3BEaWN0KQotICAgICAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gZmFsc2UgOiB0cnVlOworICAgICAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gRkFMU0UgOiBUUlVFOwogCiAgICAgaWYgKCFtX3BEaWN0LT5JZGVudGljYWwocE90aGVyLT5tX3BEaWN0KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fZHdTaXplICE9IHBPdGhlci0+bV9kd1NpemUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSAmJiBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSB7CiAgICAgICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBtX3BGaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlIHx8ICFwT3RoZXItPm1fcEZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICB1aW50OF90IHNyY0J1ZlsxMDI0XTsKICAgICAgICAgdWludDhfdCBkZXN0QnVmWzEwMjRdOwpAQCAtOTc2LDIwICs5NzYsMjAgQEAKICAgICAgICAgRlhfRFdPUkQgc3JjT2Zmc2V0ID0gbV9GaWxlT2Zmc2V0OwogICAgICAgICBGWF9EV09SRCBkZXN0T2Zmc2V0ID0gcE90aGVyLT5tX0ZpbGVPZmZzZXQ7CiAgICAgICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBzcmNPZmZzZXQgPT0gZGVzdE9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKICAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzaXplID4gMTAyNCA/IDEwMjQgOiBzaXplOwogICAgICAgICAgICAgbV9wRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgc3JjT2Zmc2V0LCBhY3R1YWxTaXplKTsKICAgICAgICAgICAgIHBPdGhlci0+bV9wRmlsZS0+UmVhZEJsb2NrKGRlc3RCdWYsIGRlc3RPZmZzZXQsIGFjdHVhbFNpemUpOwogICAgICAgICAgICAgaWYgKEZYU1lTX21lbWNtcChzcmNCdWYsIGRlc3RCdWYsIGFjdHVhbFNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZSAtPSBhY3R1YWxTaXplOwogICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBkZXN0T2Zmc2V0ICs9IGFjdHVhbFNpemU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEgfHwgcE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewogICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gTlVMTDsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiAgICAgICAgICAgICBvZmZzZXQgPSBtX0ZpbGVPZmZzZXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE5VTEwgPT0gcEJ1ZikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHVpbnQ4X3Qgc3JjQnVmWzEwMjRdOwogICAgICAgICBGWF9EV09SRCBzaXplID0gbV9kd1NpemU7CkBAIC0xMDEzLDE3ICsxMDEzLDE3IEBACiAgICAgICAgICAgICBGWF9EV09SRCBhY3R1YWxTaXplID0gc3RkOjptaW4oc2l6ZSwgMTAyNFUpOwogICAgICAgICAgICAgcEZpbGUtPlJlYWRCbG9jayhzcmNCdWYsIG9mZnNldCwgYWN0dWFsU2l6ZSk7CiAgICAgICAgICAgICBpZiAoRlhTWVNfbWVtY21wKHNyY0J1ZiwgcEJ1ZiwgYWN0dWFsU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQnVmICs9IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBzaXplIC09IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBvZmZzZXQgKz0gYWN0dWFsU2l6ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9wRGF0YUJ1ZiwgcE90aGVyLT5tX3BEYXRhQnVmLCBtX2R3U2l6ZSkgPT0gMDsKIH0KLUNQREZfU3RyZWFtKiBDUERGX1N0cmVhbTo6Q2xvbmUoYm9vbCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3QKK0NQREZfU3RyZWFtKiBDUERGX1N0cmVhbTo6Q2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBDbG9uZURpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BEaWN0LT5DbG9uZShiRGlyZWN0KTsKICAgICBJRlhfRmlsZVN0cmVhbSAqcEZTID0gTlVMTDsKQEAgLTEwMzIsMTIgKzEwMzIsMTIgQEAKICAgICB9CiAgICAgaWYgKCFwRlMpIHsKICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICBhY2MuTG9hZEFsbERhdGEodGhpcywgdHJ1ZSk7CisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YSh0aGlzLCBUUlVFKTsKICAgICAgICAgRlhfRFdPUkQgc3RyZWFtU2l6ZSA9IGFjYy5HZXRTaXplKCk7CiAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJlYW0oYWNjLkRldGFjaERhdGEoKSwgc3RyZWFtU2l6ZSwgcENsb25lRGljdCk7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwT2JqID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIENQREZfU3RyZWFtRmlsdGVyICpwU0YgPSBHZXRTdHJlYW1GaWx0ZXIodHJ1ZSk7CisgICAgQ1BERl9TdHJlYW1GaWx0ZXIgKnBTRiA9IEdldFN0cmVhbUZpbHRlcihUUlVFKTsKICAgICBpZiAocFNGKSB7CiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCA0MDk2KTsKICAgICAgICAgRlhfRFdPUkQgZHdSZWFkOwpAQCAtMTA1NCwyMCArMTA1NCwyMCBAQAogICAgIHBPYmotPkluaXRTdHJlYW0oKElGWF9GaWxlUmVhZCopcEZTLCBwQ2xvbmVEaWN0KTsKICAgICByZXR1cm4gcE9iajsKIH0KLWV4dGVybiBib29sIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorZXh0ZXJuIEZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIENGWF9CeXRlU3RyaW5nJiBJbWFnZUVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcEltYWdlUGFybXMsIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCBib29sIGJJbWFnZUFjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIEZYX0JPT0wgYkltYWdlQWNjKTsKIENQREZfU3RyZWFtQWNjOjpDUERGX1N0cmVhbUFjYygpCiB7Ci0gICAgbV9iTmV3QnVmID0gZmFsc2U7CisgICAgbV9iTmV3QnVmID0gRkFMU0U7CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwogICAgIG1fcEltYWdlUGFyYW0gPSBOVUxMOwogICAgIG1fcFN0cmVhbSA9IE5VTEw7CiAgICAgbV9wU3JjRGF0YSA9IE5VTEw7CiB9Ci12b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiUmF3QWNjZXNzLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltYWdlQWNjKQordm9pZCBDUERGX1N0cmVhbUFjYzo6TG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlJhd0FjY2VzcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbWFnZUFjYykKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTExMTEsNyArMTExMSw3IEBACiAgICAgICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKICAgICAgICAgbV9kd1NpemUgPSBkd0RlY3J5cHRlZFNpemU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBiUmV0ID0gUERGX0RhdGFEZWNvZGUocERlY3J5cHRlZERhdGEsIGR3RGVjcnlwdGVkU2l6ZSwgbV9wU3RyZWFtLT5HZXREaWN0KCksCisgICAgICAgIEZYX0JPT0wgYlJldCA9IFBERl9EYXRhRGVjb2RlKHBEZWNyeXB0ZWREYXRhLCBkd0RlY3J5cHRlZFNpemUsIG1fcFN0cmVhbS0+R2V0RGljdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLCBtX2R3U2l6ZSwgbV9JbWFnZURlY29kZXIsIG1fcEltYWdlUGFyYW0sIGVzdGltYXRlZF9zaXplLCBiSW1hZ2VBY2MpOwogICAgICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcAppbmRleCAwN2Y2Y2E3Li44NTRiZTc1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwCkBAIC0xMywxOSArMTMsMTkgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogCi1ib29sIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQorRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKIHsKICAgICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJUeXBlIikpOwogICAgIGlmICghcFR5cGUpIHsKICAgICAgICAgcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGVCIpKTsKICAgICAgICAgaWYgKCFwVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwVHlwZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlNpZyIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHN0YXRpYyBpbnQgX0NvbXBhcmVGaWxlU2l6ZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpCiB7CkBAIC00OCwxMyArNDgsMTMgQEAKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKICAgICBtX2R3Rmlyc3RQYWdlTm8gPSAwOwogICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSAwOwotICAgIG1fYk93bkZpbGVSZWFkID0gdHJ1ZTsKKyAgICBtX2JPd25GaWxlUmVhZCA9IFRSVUU7CiAgICAgbV9GaWxlVmVyc2lvbiA9IDA7Ci0gICAgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIgPSBmYWxzZTsKKyAgICBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlciA9IEZBTFNFOwogfQogQ1BERl9QYXJzZXI6On5DUERGX1BhcnNlcigpCiB7Ci0gICAgQ2xvc2VQYXJzZXIoZmFsc2UpOworICAgIENsb3NlUGFyc2VyKEZBTFNFKTsKIH0KIEZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRMYXN0T2JqTnVtKCkKIHsKQEAgLTY1LDkgKzY1LDkgQEAKIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IHBEaWN0OwogfQotdm9pZCBDUERGX1BhcnNlcjo6Q2xvc2VQYXJzZXIoYm9vbCBiUmVQYXJzZSkKK3ZvaWQgQ1BERl9QYXJzZXI6OkNsb3NlUGFyc2VyKEZYX0JPT0wgYlJlUGFyc2UpCiB7Ci0gICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBmYWxzZTsKKyAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IEZBTFNFOwogICAgIGlmICghYlJlUGFyc2UpIHsKICAgICAgICAgZGVsZXRlIG1fcERvY3VtZW50OwogICAgICAgICBtX3BEb2N1bWVudCA9IE5VTEw7CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIGJvb2wgYlJlUGFyc2UpCitGWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSkKIHsKICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzID0gRlhfQ3JlYXRlRmlsZVJlYWQoZmlsZW5hbWUpOwogICAgIGlmICghcEZpbGVBY2Nlc3MpIHsKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIH0KICAgICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UpOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBib29sIGJSZVBhcnNlKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlKQogewogICAgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7CiAgICAgaWYgKCFwRmlsZUFjY2VzcykgewpAQCAtMTQyLDEwICsxNDIsMTAgQEAKIH0KIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CiBDUERGX1NlY3VyaXR5SGFuZGxlciogRlBERl9DcmVhdGVQdWJLZXlIYW5kbGVyKHZvaWQqKTsKLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIGJvb2wgYlJlUGFyc2UsIGJvb2wgYk93bkZpbGVSZWFkKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfQk9PTCBiUmVQYXJzZSwgRlhfQk9PTCBiT3duRmlsZVJlYWQpCiB7CiAgICAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBmYWxzZTsKKyAgICBtX2JYUmVmU3RyZWFtID0gRkFMU0U7CiAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgICAgbV9iT3duRmlsZVJlYWQgPSBiT3duRmlsZVJlYWQ7CiAgICAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwpAQCAtMTc2LDE1ICsxNzYsMTUgQEAKICAgICBpZiAoIWJSZVBhcnNlKSB7CiAgICAgICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CiAgICAgfQotICAgIGJvb2wgYlhSZWZSZWJ1aWx0ID0gZmFsc2U7Ci0gICAgaWYgKG1fU3ludGF4LlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCB0cnVlLCBmYWxzZSwgNDA5NikpIHsKKyAgICBGWF9CT09MIGJYUmVmUmVidWlsdCA9IEZBTFNFOworICAgIGlmIChtX1N5bnRheC5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgVFJVRSwgRkFMU0UsIDQwOTYpKSB7CiAgICAgICAgIEZYX0ZJTEVTSVpFIHN0YXJ0eHJlZl9vZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZzdGFydHhyZWZfb2Zmc2V0LCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CiAgICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChzdGFydHhyZWZfb2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBtX1N5bnRheC5HZXRLZXl3b3JkKCk7Ci0gICAgICAgIGJvb2wgYk51bWJlcjsKKyAgICAgICAgRlhfQk9PTCBiTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICBpZiAoIWJOdW1iZXIpIHsKICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogICAgICAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiWFJlZlJlYnVpbHQgPSB0cnVlOworICAgICAgICAgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKICAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewogICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKICAgICAgICAgfQotICAgICAgICBiWFJlZlJlYnVpbHQgPSB0cnVlOworICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOwogICAgIH0KICAgICBGWF9EV09SRCBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CiAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKQEAgLTM0MCwyNiArMzQwLDI2IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotc3RhdGljIGJvb2wgQ2hlY2tEaXJlY3RUeXBlKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQzMl90IGlUeXBlKQorc3RhdGljIEZYX0JPT0wgQ2hlY2tEaXJlY3RUeXBlKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQzMl90IGlUeXBlKQogewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKICAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gcE9iai0+R2V0VHlwZSgpID09IGlUeXBlOwogfQotYm9vbCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcykKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCiB7Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlLCBmYWxzZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKICAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiU2l6ZSIpKTsKICAgICBpZiAoeHJlZnNpemUgPD0gMCB8fCB4cmVmc2l6ZSA+ICgxIDw8IDIwKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9Dcm9zc1JlZi5TZXRTaXplKHhyZWZzaXplKTsKICAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKQEAgLTM2Nyw1MSArMzY3LDUxIEBACiAgICAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKICAgICBYUmVmU3RyZWFtTGlzdC5BZGQoR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiWFJlZlN0bSIpKSk7CiAgICAgaWYgKCFDaGVja0RpcmVjdFR5cGUobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSwgUERGT0JKX05VTUJFUikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIG5ld3hyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgIGlmIChuZXd4cmVmcG9zID09IHhyZWZwb3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHhyZWZwb3MgPSBuZXd4cmVmcG9zOwogICAgIHdoaWxlICh4cmVmcG9zKSB7CiAgICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFDaGVja0RpcmVjdFR5cGUocERpY3QsIEZYX0JTVFJDKCJQcmV2IiksIFBERk9CSl9OVU1CRVIpKSB7CiAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG5ld3hyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBEaWN0LCBGWF9CU1RSQygiUHJldiIpKTsKICAgICAgICAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgewogICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICB4cmVmcG9zID0gbmV3eHJlZnBvczsKICAgICAgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwogICAgICAgICBtX1RyYWlsZXJzLkFkZChwRGljdCk7CiAgICAgfQogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IENyb3NzUmVmTGlzdC5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UsIGkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSwgaSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zLCBGWF9EV09SRCBkd09iakNvdW50KQogewogICAgIGlmICghTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KHhyZWZwb3MsIGR3T2JqQ291bnQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwogICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwogICAgIGlmICh4cmVmc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRmlsZVNpemVBcnJheSBDcm9zc1JlZkxpc3QsIFhSZWZTdHJlYW1MaXN0OwogICAgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7CkBAIC00MTksMjIgKzQxOSwyMiBAQAogICAgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgIHdoaWxlICh4cmVmcG9zKSB7CiAgICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgICAgICBYUmVmU3RyZWFtTGlzdC5JbnNlcnRBdCgwLCBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiWFJlZlN0bSIpKSk7CiAgICAgICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0KTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSArKykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBmYWxzZSwgaSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KENyb3NzUmVmTGlzdFtpXSwgWFJlZlN0cmVhbUxpc3RbaV0sIEZBTFNFLCBpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpCitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KQogewogICAgIEZYX0ZJTEVTSVpFIGR3U3RhcnRQb3MgPSBwb3MgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKGR3U3RhcnRQb3MpOwpAQCAtNDU0LDExICs0NTQsMTEgQEAKICAgICAgICAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGJsb2NrX3NpemUgKiByZWNvcmRzaXplOwogICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGR3UmVhZFNpemUpKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkgKyspIHsKICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7CkBAIC00NzIsMTQgKzQ3MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYyArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZi5TZXRBdEdyb3cob2JqbnVtLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZltvYmpudW1dIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7CkBAIC00OTQsMTMgKzQ5NCwxMyBAQAogICAgIH0KICAgICBGWF9GcmVlKHBCdWYpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIGJvb2wgYlNraXAsIGJvb2wgYkZpcnN0KQorRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIEZYX0JPT0wgYlNraXAsIEZYX0JPT0wgYkZpcnN0KQogewogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKICAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJ4cmVmIikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CkBAIC01MTQsMTAgKzUxNCwxMCBAQAogICAgIH0KICAgICB3aGlsZSAoMSkgewogICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgYm9vbCBiSXNOdW1iZXI7CisgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtNTI1LDIyICs1MjUsMjIgQEAKICAgICAgICAgfQogICAgICAgICBGWF9EV09SRCBzdGFydF9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwogICAgICAgICBpZiAoc3RhcnRfb2JqbnVtID49ICgxIDw8IDIwKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIGNvdW50ID0gbV9TeW50YXguR2V0RGlyZWN0TnVtKCk7CiAgICAgICAgIG1fU3ludGF4LlRvTmV4dFdvcmQoKTsKICAgICAgICAgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIGJvb2wgYkZpcnN0SXRlbSA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJGaXJzdEl0ZW0gPSBGQUxTRTsKICAgICAgICAgaW50MzJfdCByZWNvcmRzaXplID0gMjA7CiAgICAgICAgIGlmIChiRmlyc3QpIHsKLSAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSB0cnVlOworICAgICAgICAgICAgYkZpcnN0SXRlbSA9IFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgbV9kd1hyZWZTdGFydE9iak51bSA9IHN0YXJ0X29iam51bTsKICAgICAgICAgaWYgKCFiU2tpcCkgewogICAgICAgICAgICAgY2hhciogcEJ1ZiA9IEZYX0FsbG9jKGNoYXIsIDEwMjQgKiByZWNvcmRzaXplICsgMSk7CiAgICAgICAgICAgICBwQnVmWzEwMjQgKiByZWNvcmRzaXplXSA9ICdcMCc7CiAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja3MgPSBjb3VudCAvIDEwMjQgKyAxOwotICAgICAgICAgICAgYm9vbCBiRmlyc3RCbG9jayA9IHRydWU7CisgICAgICAgICAgICBGWF9CT09MIGJGaXJzdEJsb2NrID0gVFJVRTsKICAgICAgICAgICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgbkJsb2NrczsgYmxvY2sgKyspIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGJsb2NrX3NpemUgPSBibG9jayA9PSBuQmxvY2tzIC0gMSA/IGNvdW50ICUgMTAyNCA6IDEwMjQ7CiAgICAgICAgICAgICAgICAgbV9TeW50YXguUmVhZEJsb2NrKCh1aW50OF90KilwQnVmLCBibG9ja19zaXplICogcmVjb3Jkc2l6ZSk7CkBAIC01NTAsNyArNTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVsxN10gPT0gJ2YnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RCbG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKQEAgLTU2OCwxNCArNTY4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMgKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0R3JvdyhvYmpudW0sIHZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3Jvc3NSZWZbb2JqbnVtXSA8IG1fU3ludGF4Lm1fRmlsZUxlbikgewpAQCAtNTg3LDcgKzU4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZS5TZXRBdEdyb3cob2JqbnVtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEJsb2NrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RCbG9jayA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTk2LDI1ICs1OTYsMjUgQEAKICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyArIGNvdW50ICogcmVjb3Jkc2l6ZSk7CiAgICAgfQogICAgIGlmIChzdHJlYW1wb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoc3RyZWFtcG9zLCBzdHJlYW1wb3MsIGZhbHNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHN0cmVhbXBvcywgc3RyZWFtcG9zLCBGQUxTRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCiB7Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCB0cnVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBUUlVFKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHdoaWxlICh4cmVmcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIGZhbHNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIGZhbHNlKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOworICAgIG1fYlhSZWZTdHJlYW0gPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OlJlYnVpbGRDcm9zc1JlZigpCiB7CiAgICAgbV9Dcm9zc1JlZi5SZW1vdmVBbGwoKTsKICAgICBtX1Y1VHlwZS5SZW1vdmVBbGwoKTsKQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgIEZYX0ZJTEVTSVpFIHN0YXJ0X3BvcyA9IDAsIHN0YXJ0X3BvczEgPSAwOwogICAgIEZYX0ZJTEVTSVpFIGxhc3Rfb2JqID0gLTEsIGxhc3RfeHJlZiA9IC0xLCBsYXN0X3RyYWlsZXIgPSAtMTsKICAgICB3aGlsZSAocG9zIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7Ci0gICAgICAgIGJvb2wgYk92ZXJGbG93ID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYk92ZXJGbG93ID0gRkFMU0U7CiAgICAgICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpKG1fU3ludGF4Lm1fRmlsZUxlbiAtIHBvcyk7CiAgICAgICAgIGlmIChzaXplID4gNDA5NikgewogICAgICAgICAgICAgc2l6ZSA9IDQwOTY7CkBAIC04MTIsNyArODEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbkxlbiA9IG9ial9lbmQgLSBvYmpfcG9zIC0gb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKEZYX0RXT1JEKW5MZW4gPiBzaXplIC0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gb2JqX2VuZCArIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk92ZXJGbG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPdmVyRmxvdyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC04MjIsNyArODIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmW29iam51bV0gPSBvYmpfcG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdChvYmpudW0sIChpbnQxNl90KWdlbm51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGdlbiAhPSBnZW5udW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtODgxLDcgKzg4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyV29yZCA9IG1fU3ludGF4LkdldEtleXdvcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJXb3JkLkNvbXBhcmUoRlhfQlNUUkMoInN0YXJ0eHJlZiIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTnVtYmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzT2Zmc2V0ID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSBGWFNZU19hdG9pKGJzT2Zmc2V0KTsKQEAgLTk4Miw3ICs5ODIsNyBAQAogICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2Zmc2V0KTsKICAgICB9CiAgICAgRlhfRnJlZShidWZmZXIpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogc3RhdGljIEZYX0RXT1JEIF9HZXRWYXJJbnQoY29uc3QgdWludDhfdCogcCwgaW50MzJfdCBuKQogewpAQCAtOTkyLDExICs5OTIsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLWJvb2wgQ1BERl9QYXJzZXI6OkxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIGJvb2wgYk1haW5YUmVmKQorRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgRlhfQk9PTCBiTWFpblhSZWYpCiB7CiAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKVBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3BEb2N1bWVudCwgcG9zLCAwLCBOVUxMKTsKICAgICBpZiAoIXBTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BEb2N1bWVudCkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CkBAIC0xMDA2LDE3ICsxMDA2LDE3IEBACiAgICAgICAgICAgICBpZiAocFN0cmVhbS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwcmV2ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmV2IikpOwogICAgIGludDMyX3Qgc2l6ZSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiU2l6ZSIpKTsKICAgICBpZiAoc2l6ZSA8IDApIHsKICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGJNYWluWFJlZikgewogICAgICAgICBtX3BUcmFpbGVyID0gKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpOwpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKICAgICBwQXJyYXkgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJXIikpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewogICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRFdvcmRBcnJheSBXaWR0aEFycmF5OwogICAgIEZYX1NBRkVfRFdPUkQgZHdBY2NXaWR0aCA9IDA7CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgIH0KICAgICBpZiAoIWR3QWNjV2lkdGguSXNWYWxpZCgpIHx8IFdpZHRoQXJyYXkuR2V0U2l6ZSgpIDwgMykgewogICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9EV09SRCB0b3RhbFdpZHRoID0gZHdBY2NXaWR0aC5WYWx1ZU9yRGllKCk7CiAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwpAQCAtMTEyMCw3ICsxMTIwLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9WNVR5cGUuR2V0U2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbV9WNVR5cGVbb2Zmc2V0XSA9IDI1NTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTI5LDcgKzExMjksNyBAQAogICAgICAgICBzZWdpbmRleCArPSBjb3VudDsKICAgICB9CiAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ1BERl9BcnJheSogQ1BERl9QYXJzZXI6OkdldElEQXJyYXkoKQogewpAQCAtMTE2MiwzMiArMTE2MiwzMiBAQAogICAgIH0KICAgICByZXR1cm4gKChDUERGX1JlZmVyZW5jZSopIHBSZWYpLT5HZXRSZWZPYmpOdW0oKTsKIH0KLWJvb2wgQ1BERl9QYXJzZXI6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIGJvb2wmIGJGb3JtKQorRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pCiB7Ci0gICAgYkZvcm0gPSBmYWxzZTsKKyAgICBiRm9ybSA9IEZBTFNFOwogICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX0Nyb3NzUmVmW29iam51bV07CiAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0IC0gKEZYX0ZJTEVTSVpFKiltX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0gbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgc2l6ZSA9ICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gcG9zOwogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBiRm9ybSA9IG1fU3ludGF4LlNlYXJjaE11bHRpV29yZChGWF9CU1RSQygiL0Zvcm1cMHN0cmVhbSIpLCB0cnVlLCBzaXplKSA9PSAwOworICAgIGJGb3JtID0gbV9TeW50YXguU2VhcmNoTXVsdGlXb3JkKEZYX0JTVFJDKCIvRm9ybVwwc3RyZWFtIiksIFRSVUUsIHNpemUpID09IDA7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQogewpAQCAtMTIwOSw3ICsxMjA5LDcgQEAKICAgICAgICAgaW50MzJfdCBuID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOIikpOwogICAgICAgICBpbnQzMl90IG9mZnNldCA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3QiKSk7CiAgICAgICAgIENQREZfU3ludGF4UGFyc2VyIHN5bnRheDsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKHVpbnQ4X3QqKXBPYmpTdHJlYW0tPkdldERhdGEoKSwgKHNpemVfdClwT2JqU3RyZWFtLT5HZXRTaXplKCksIGZhbHNlKSk7CisgICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwT2JqU3RyZWFtLT5HZXREYXRhKCksIChzaXplX3QpcE9ialN0cmVhbS0+R2V0U2l6ZSgpLCBGQUxTRSkpOwogICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgQ1BERl9PYmplY3QqIHBSZXQgPSBOVUxMOwogICAgICAgICB3aGlsZSAobikgewpAQCAtMTI4Miw3ICsxMjgyLDcgQEAKICAgICAgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OwogICAgICAgICBjb25zdCB1aW50OF90KiBwRGF0YSA9IHBPYmpTdHJlYW0tPkdldERhdGEoKTsKICAgICAgICAgRlhfRFdPUkQgdG90YWxzaXplID0gcE9ialN0cmVhbS0+R2V0U2l6ZSgpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIChzaXplX3QpdG90YWxzaXplLCBmYWxzZSkpOworICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIChzaXplX3QpdG90YWxzaXplLCBGQUxTRSkpOwogICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgd2hpbGUgKG4pIHsKICAgICAgICAgICAgIEZYX0RXT1JEIHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CkBAIC0xMzEwLDcgKzEzMTAsNyBAQAogICAgICAgICB9CiAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgICAgIGJvb2wgYklzTnVtYmVyOworICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgIGlmICghYklzTnVtYmVyKSB7CiAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKQEAgLTEzMzYsMTYgKzEzMzYsMTYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGWF9GSUxFU0laRSBuZXh0b2ZmID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV07Ci0gICAgICAgIGJvb2wgYk5leHRPZmZWYWxpZCA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJOZXh0T2ZmVmFsaWQgPSBGQUxTRTsKICAgICAgICAgaWYgKG5leHRvZmYgIT0gcG9zKSB7CiAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG5leHRvZmYpOwogICAgICAgICAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieHJlZiIpKSB7Ci0gICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc051bWJlcikgewogICAgICAgICAgICAgICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICAgICAgICAgIGlmIChiSXNOdW1iZXIgJiYgbV9TeW50YXguR2V0S2V5d29yZCgpID09IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzczLDcgKzEzNzMsNyBAQAogewogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBib29sIGJJc051bWJlcjsKKyAgICBGWF9CT09MIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAoIWJJc051bWJlcikgewogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKQEAgLTE0MTYsNyArMTQxNiw3IEBACiB7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgIGJvb2wgYklzTnVtYmVyOworICAgIEZYX0JPT0wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICghYklzTnVtYmVyKSB7CiAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoYm9vbCBiQ2hlY2tSZXZpc2lvbikKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKQogewogICAgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CkBAIC0xNDczLDExICsxNDczLDExIEBACiAgICAgfQogICAgIHJldHVybiBkd1Blcm1pc3Npb247CiB9Ci1ib29sIENQREZfUGFyc2VyOjpJc093bmVyKCkKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OklzT3duZXIoKQogewotICAgIHJldHVybiBtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCA/IHRydWUgOiBtX3BTZWN1cml0eUhhbmRsZXItPklzT3duZXIoKTsKKyAgICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwgPyBUUlVFIDogbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7CiB9Ci12b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIGJvb2wgYkZvcmNlZCkKK3ZvaWQgQ1BERl9QYXJzZXI6OlNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgRlhfQk9PTCBiRm9yY2VkKQogewogICAgIEFTU0VSVChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCk7CiAgICAgaWYgKCFtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgewpAQCAtMTQ5MiwyOSArMTQ5MiwyOSBAQAogICAgIG1fU3ludGF4Lm1fcENyeXB0b0hhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCk7CiAgICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci0+SW5pdChOVUxMLCBwU2VjdXJpdHlIYW5kbGVyKTsKIH0KLWJvb2wgQ1BERl9QYXJzZXI6OklzTGluZWFyaXplZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgb2Zmc2V0KQorRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpCiB7CiAgICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0ICsgOSk7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgYm9vbCBiSXNOdW1iZXI7CisgICAgRlhfQk9PTCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CiAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7CiAgICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BMaW5lYXJpemVkID0gbV9TeW50YXguR2V0T2JqZWN0KE5VTEwsIG9iam51bSwgZ2VubnVtLCAwKTsKICAgICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BMaW5lYXJpemVkLT5HZXREaWN0KCkgJiYgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7CiAgICAgICAgIG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CkBAIC0xNTIyLDEwICsxNTIyLDEwIEBACiAgICAgICAgIGlmICghcExlbikgewogICAgICAgICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwogICAgICAgICAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBMZW4tPkdldEludGVnZXIoKSAhPSAoaW50KXBGaWxlQWNjZXNzLT5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBDUERGX09iamVjdCAqcE5vID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQIikpOwogICAgICAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKQEAgLTE1MzUsMTYgKzE1MzUsMTYgQEAKICAgICAgICAgaWYgKHBUYWJsZSAmJiBwVGFibGUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gcFRhYmxlLT5HZXRJbnRlZ2VyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CiAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBib29sIGJSZVBhcnNlLCBib29sIGJPd25GaWxlUmVhZCkKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9CT09MIGJSZVBhcnNlLCBGWF9CT09MIGJPd25GaWxlUmVhZCkKIHsKICAgICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IGZhbHNlOworICAgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKICAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKICAgICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7CkBAIC0xNTU5LDE5ICsxNTU5LDE5IEBACiAgICAgICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIGR3Rmlyc3RYUmVmT2Zmc2V0ID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIGJvb2wgYlhSZWZSZWJ1aWx0ID0gZmFsc2U7Ci0gICAgYm9vbCBiTG9hZFY0ID0gZmFsc2U7Ci0gICAgaWYgKCEoYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCAwLCBmYWxzZSwgZmFsc2UpKSAmJiAhTG9hZENyb3NzUmVmVjUoZHdGaXJzdFhSZWZPZmZzZXQsIGR3Rmlyc3RYUmVmT2Zmc2V0LCB0cnVlKSkgeworICAgIEZYX0JPT0wgYlhSZWZSZWJ1aWx0ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiTG9hZFY0ID0gRkFMU0U7CisgICAgaWYgKCEoYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCAwLCBGQUxTRSwgRkFMU0UpKSAmJiAhTG9hZENyb3NzUmVmVjUoZHdGaXJzdFhSZWZPZmZzZXQsIGR3Rmlyc3RYUmVmT2Zmc2V0LCBUUlVFKSkgewogICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CiAgICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgICAgICB9Ci0gICAgICAgIGJYUmVmUmVidWlsdCA9IHRydWU7CisgICAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CiAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgIH0KICAgICBpZiAoYkxvYWRWNCkgewogICAgICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwogICAgICAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7CiAgICAgICAgIGlmICh4cmVmc2l6ZSA+IDApIHsKQEAgLTE2MjMsMTggKzE2MjMsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7CiB9Ci1ib29sIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKQogewotICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgZmFsc2UpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHdoaWxlICh4cmVmcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIGZhbHNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIGZhbHNlKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOworICAgIG1fYlhSZWZTdHJlYW0gPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQogRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpCiB7CkBAIC0xNjg4LDcgKzE2ODgsNyBAQAogICAgIG1fcEZpbGVCdWYgPSBOVUxMOwogICAgIG1fTWV0YWRhdGFPYmpudW0gPSAwOwogICAgIG1fZHdXb3JkUG9zID0gMDsKLSAgICBtX2JGaWxlU3RyZWFtID0gZmFsc2U7CisgICAgbV9iRmlsZVN0cmVhbSA9IEZBTFNFOwogfQogQ1BERl9TeW50YXhQYXJzZXI6On5DUERGX1N5bnRheFBhcnNlcigpCiB7CkBAIC0xNjk2LDE5ICsxNjk2LDE5IEBACiAgICAgICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7CiAgICAgfQogfQotYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpCitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKIHsKICAgICBGWF9GSUxFU0laRSBzYXZlX3BvcyA9IG1fUG9zOwogICAgIG1fUG9zID0gcG9zOwotICAgIGJvb2wgcmV0ID0gR2V0TmV4dENoYXIoY2gpOworICAgIEZYX0JPT0wgcmV0ID0gR2V0TmV4dENoYXIoY2gpOwogICAgIG1fUG9zID0gc2F2ZV9wb3M7CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKQorRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dENoYXIodWludDhfdCYgY2gpCiB7CiAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3MgKyBtX0hlYWRlck9mZnNldDsKICAgICBpZiAocG9zID49IG1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fQnVmT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fQnVmT2Zmc2V0ICsgbV9CdWZTaXplKSA8PSBwb3MpIHsKICAgICAgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CkBAIC0xNzI1LDE5ICsxNzI1LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBtX0J1Zk9mZnNldCA9IHJlYWRfcG9zOwogICAgIH0KICAgICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOwogICAgIG1fUG9zICsrOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpCiB7CiAgICAgcG9zICs9IG1fSGVhZGVyT2Zmc2V0OwogICAgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9CdWZPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9CdWZPZmZzZXQgKyBtX0J1ZlNpemUpIDw9IHBvcykgewogICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvczsKQEAgLTE3NTYsMjYgKzE3NTYsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhtX3BGaWxlQnVmLCByZWFkX3BvcywgcmVhZF9zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CiAgICAgfQogICAgIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU3ludGF4UGFyc2VyOjpSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSkKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayh1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKQogewogICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKHBCdWYsIG1fUG9zICsgbV9IZWFkZXJPZmZzZXQsIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX1BvcyArPSBzaXplOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogI2RlZmluZSBNQVhfV09SRF9CVUZGRVIgMjU2CiB2b2lkIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZCgpCiB7CiAgICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgbV9iSXNOdW1iZXIgPSB0cnVlOworICAgIG1fYklzTnVtYmVyID0gVFJVRTsKICAgICB1aW50OF90IGNoOwogICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE4MDIsNyArMTgwMiw3IEBACiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIH0KICAgICBpZiAodHlwZSA9PSAnRCcpIHsKLSAgICAgICAgbV9iSXNOdW1iZXIgPSBmYWxzZTsKKyAgICAgICAgbV9iSXNOdW1iZXIgPSBGQUxTRTsKICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKICAgICAgICAgaWYgKGNoID09ICcvJykgewogICAgICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTE4NDQsNyArMTg0NCw3IEBACiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgbV9iSXNOdW1iZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYklzTnVtYmVyID0gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE5NTAsNyArMTk1MCw3IEBACiAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogICAgIH0KICAgICBDRlhfQmluYXJ5QnVmIGJ1ZjsKLSAgICBib29sIGJGaXJzdCA9IHRydWU7CisgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwogICAgIHVpbnQ4X3QgY29kZSA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGNoID09ICc+JykgewpAQCAtMjAzNiw3ICsyMDM2LDcgQEAKICAgICB9CiAgICAgbV9Qb3MgLS07CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dFdvcmQoYm9vbCYgYklzTnVtYmVyKQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcikKIHsKICAgICBHZXROZXh0V29yZCgpOwogICAgIGJJc051bWJlciA9IG1fYklzTnVtYmVyOwpAQCAtMjA0NywxNSArMjA0NywxNSBAQAogICAgIEdldE5leHRXb3JkKCk7CiAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKiltX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwogfQotQ1BERl9PYmplY3QqIENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIGJvb2wgYkRlY3J5cHQpCitDUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgRlhfQk9PTCBiRGVjcnlwdCkKIHsKICAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKICAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBib29sIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKLSAgICBib29sIGJJc051bWJlcjsKKyAgICBGWF9CT09MIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKKyAgICBGWF9CT09MIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIxMDIsNyArMjEwMiw3IEBACiAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KSB7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgZmFsc2UpOworICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIEZBTFNFKTsKICAgICB9CiAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIjwiKSkgewogICAgICAgICBpZiAoYlR5cGVPbmx5KSB7CkBAIC0yMTEyLDcgKzIxMTIsNyBAQAogICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciAmJiBiRGVjcnlwdCkgewogICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIHRydWUpOworICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIFRSVUUpOwogICAgIH0KICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiWyIpKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIxNDUsNyArMjE0NSw3IEBACiAgICAgICAgIGludDMyX3QgbktleXMgPSAwOwogICAgICAgICBGWF9GSUxFU0laRSBkd1NpZ25WYWx1ZVBvcyA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBib29sIGJJc051bWJlcjsKKyAgICAgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBEaWN0KQpAQCAtMjE4Myw3ICsyMTgzLDcgQEAKICAgICAgICAgaWYgKElzU2lnbmF0dXJlRGljdChwRGljdCkpIHsKICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fUG9zOwogICAgICAgICAgICAgbV9Qb3MgPSBkd1NpZ25WYWx1ZVBvczsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgTlVMTCwgZmFsc2UpOworICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBOVUxMLCBGQUxTRSk7CiAgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbnRlbnRzIiksIHBPYmopOwogICAgICAgICAgICAgbV9Qb3MgPSBkd1NhdmVQb3M7CiAgICAgICAgIH0KQEAgLTIxOTQsNyArMjE5NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICAgICAgYm9vbCBiSXNOdW1iZXI7CisgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKQEAgLTIyMjUsOCArMjIyNSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgIGJvb2wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOwotICAgIGJvb2wgYklzTnVtYmVyOworICAgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICAgIEZYX0JPT0wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDApIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjI3Myw3ICsyMjczLDcgQEAKICAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgRkFMU0UpOwogICAgIH0KICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPCIpKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIyODMsNyArMjI4Myw3IEBACiAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7CiAgICAgfQogICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJbIikpIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjMxOSw3ICsyMzE5LDcgQEAKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGJvb2wgYklzTnVtYmVyOworICAgICAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CiAgICAgICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7CkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIGJvb2wgYklzTnVtYmVyOworICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICBpZiAobmV4dHdvcmQgPT0gRlhfQlNUUkMoInN0cmVhbSIpKSB7CiAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFJlYWRTdHJlYW0ocERpY3QsIHBDb250ZXh0LCBvYmpudW0sIGdlbm51bSk7CkBAIC0yNDk1LDMyICsyNDk1LDMyIEBACiAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKICAgICByZXR1cm4gRlhTWVNfYXRvaSgoY29uc3QgRlhfQ0hBUiopbV9Xb3JkQnVmZmVyKTsKIH0KLWJvb2wgQ1BERl9TeW50YXhQYXJzZXI6OklzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pCitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIGNvbnN0IHVpbnQ4X3QqIHRhZywgRlhfRFdPUkQgdGFnbGVuKQogewogICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVt0YWdbMF1dOwotICAgIGJvb2wgYkNoZWNrTGVmdCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOworICAgIEZYX0JPT0wgYkNoZWNrTGVmdCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwogICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnW3RhZ2xlbiAtIDFdXTsKLSAgICBib29sIGJDaGVja1JpZ2h0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CisgICAgRlhfQk9PTCBiQ2hlY2tSaWdodCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwogICAgIHVpbnQ4X3QgY2g7CiAgICAgaWYgKGJDaGVja1JpZ2h0ICYmIHN0YXJ0cG9zICsgKGludDMyX3QpdGFnbGVuIDw9IGxpbWl0ICYmIEdldENoYXJBdChzdGFydHBvcyArIChpbnQzMl90KXRhZ2xlbiwgY2gpKSB7CiAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgIGlmICh0eXBlID09ICdOJyB8fCB0eXBlID09ICdSJykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiQ2hlY2tMZWZ0ICYmIHN0YXJ0cG9zID4gMCAmJiBHZXRDaGFyQXQoc3RhcnRwb3MgLSAxLCBjaCkpIHsKICAgICAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICAgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLCBib29sIGJXaG9sZVdvcmQsIGJvb2wgYkZvcndhcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQorRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9CT09MIGJGb3J3YXJkLCBGWF9GSUxFU0laRSBsaW1pdCkKIHsKICAgICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKICAgICBpZiAodGFnbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOwogICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKQEAgLTI1MzMsMjAgKzI1MzMsMjAgQEAKICAgICAgICAgaWYgKGJGb3J3YXJkKSB7CiAgICAgICAgICAgICBpZiAobGltaXQpIHsKICAgICAgICAgICAgICAgICBpZiAocG9zID49IG1fUG9zICsgbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobGltaXQpIHsKICAgICAgICAgICAgICAgICBpZiAocG9zIDw9IG1fUG9zIC0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFHZXRDaGFyQXRCYWNrd2FyZChwb3MsIGJ5dGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZSA9PSB0YWdfZGF0YVtvZmZzZXRdKSB7CkBAIC0yNTY2LDcgKzI1NjYsNyBAQAogICAgICAgICAgICAgRlhfRklMRVNJWkUgc3RhcnRwb3MgPSBiRm9yd2FyZCA/IHBvcyAtIHRhZ2xlbiArIDEgOiBwb3M7CiAgICAgICAgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwgSXNXaG9sZVdvcmQoc3RhcnRwb3MsIGxpbWl0LCB0YWcuR2V0UHRyKCksIHRhZ2xlbikpIHsKICAgICAgICAgICAgICAgICBtX1BvcyA9IHN0YXJ0cG9zOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChiRm9yd2FyZCkgewpAQCAtMjU3NywxNyArMjU3NywxNyBAQAogICAgICAgICAgICAgcG9zIC0tOwogICAgICAgICB9CiAgICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHN0cnVjdCBfU2VhcmNoVGFnUmVjb3JkIHsKICAgICBjb25zdCB1aW50OF90KgltX3BUYWc7CiAgICAgRlhfRFdPUkQJbV9MZW47CiAgICAgRlhfRFdPUkQJbV9PZmZzZXQ7CiB9OwotaW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFncywgYm9vbCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCkKK2ludDMyX3QgQ1BERl9TeW50YXhQYXJzZXI6OlNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ3MsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfRklMRVNJWkUgbGltaXQpCiB7CiAgICAgaW50MzJfdCBudGFncyA9IDEsIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHRhZ3MuR2V0TGVuZ3RoKCk7IGkgKyspCkBAIC0yNjk1LDE3ICsyNjk1LDE3IEBACiAgICAgQ1BERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOwogICAgIH5DUERGX0RhdGFBdmFpbCgpOwogCi0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICAgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBTZXREb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jKSAgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgICAgICBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIElzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpICBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZFBERigpICBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZCgpICBvdmVycmlkZQorICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZCgpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkxpbmVhcml6ZWQ7CiAgICAgfQpAQCAtMjcxNyw1MiArMjcxNyw1MiBAQAogICAgIHN0YXRpYyBpbnQgc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGg7CiAKICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNPYmplY3RzQXZhaWwoQ0ZYX1B0ckFycmF5JiBvYmpfYXJyYXksIGJvb2wgYlBhcnNlUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgQ0ZYX1B0ckFycmF5ICZyZXRfYXJyYXkpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRG9jU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBbm5vdHMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgRlhfQk9PTCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fubm90cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm1TdWJPYmplY3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZVN0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMsIEZYX0ZJTEVTSVpFICZ4cmVmX29mZnNldCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChGWF9GSUxFU0laRSBkd09mZnNldCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbik7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dENoYXIodWludDhfdCAmY2gpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRDaGFyKHVpbnQ4X3QgJmNoKTsKICAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0pOwotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIGJvb2wgKnBFeGlzdEluRmlsZSk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXBhcmVQYWdlSXRlbSgpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlsZVJlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VBbm5vdHMoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9CT09MICpwRXhpc3RJbkZpbGUpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VLaWRzKENQREZfUGFyc2VyICpwUGFyc2VyLCBDUERGX09iamVjdCAqcFBhZ2VzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwYXJlUGFnZUl0ZW0oKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEFsbFhyZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEFsbEZpbGUoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tMaW5lYXJpemVkRGF0YShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZpbGVSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQW5ub3RzKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkgKnBEaWN0KTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSAmcGFnZU5vZGVzLCBpbnQzMl90IGlQYWdlLCBpbnQzMl90ICZpQ291bnQsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZUNvdW50KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRmlyc3RDaGVjayhpbnQgaVBhZ2UpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSk7CiAKICAgICBDUERGX1BhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcnNlcjsKQEAgLTI3NzksNyArMjc3OSw3IEBACiAKICAgICBDUERGX09iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqbV9wVHJhaWxlcjsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvY0F2YWlsOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvY0F2YWlsOwogCiAgICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0hlYWRlck9mZnNldDsKIApAQCAtMjgyMywzMSArMjgyMywzMSBAQAogCiAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9QYWdlc09iak51bTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcml6ZWQ7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZDsKIAogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdGaXJzdFBhZ2VObzsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkVHJpZWQ7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkVHJpZWQ7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JNYWluWFJlZkxvYWRlZE9LOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0s7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQ7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQ7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkOwogCiAgICAgQ1BERl9QYXJzZXIgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFBhcnNlcjsKIAogICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQW5ub3RzTG9hZDsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBbm5vdHNMb2FkOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkhhdmVBY3JvRm9ybTsKIAogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdBY3JvRm9ybU9iak51bTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkFjcm9Gb3JtTG9hZDsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBY3JvRm9ybUxvYWQ7CiAKICAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBtX3BBY3JvRm9ybTsKIApAQCAtMjg1NywxMSArMjg1NywxMSBAQAogCiAgICAgQ1BERl9PYmplY3QgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFnZVJlc291cmNlOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0s7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CiAKICAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzQXJyYXk7CiAKQEAgLTI4NjksOSArMjg2OSw5IEBACiAKICAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQ7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JUb3RhbExvYWRQYWdlVHJlZTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JUb3RhbExvYWRQYWdlVHJlZTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LOwogCiAgICAgQ1BERl9QYWdlTm9kZSAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlTm9kZXM7CiAKQEAgLTI5MTYsMTkgKzI5MTYsMTkgQEAKICAgICBtX2R3RW5jcnlwdE9iak51bSA9IDA7CiAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOwotICAgIG1fYkRvY0F2YWlsID0gZmFsc2U7Ci0gICAgbV9iTWFpblhSZWZMb2FkVHJpZWQgPSBmYWxzZTsKLSAgICBtX2JEb2NBdmFpbCA9IGZhbHNlOwotICAgIG1fYkxpbmVhcml6ZWQgPSBmYWxzZTsKLSAgICBtX2JQYWdlc0xvYWQgPSBmYWxzZTsKLSAgICBtX2JQYWdlc1RyZWVMb2FkID0gZmFsc2U7Ci0gICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IGZhbHNlOwotICAgIG1fYkFubm90c0xvYWQgPSBmYWxzZTsKLSAgICBtX2JIYXZlQWNyb0Zvcm0gPSBmYWxzZTsKLSAgICBtX2JBY3JvRm9ybUxvYWQgPSBmYWxzZTsKLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKLSAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IGZhbHNlOwotICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gZmFsc2U7CisgICAgbV9iRG9jQXZhaWwgPSBGQUxTRTsKKyAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IEZBTFNFOworICAgIG1fYkRvY0F2YWlsID0gRkFMU0U7CisgICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOworICAgIG1fYlBhZ2VzTG9hZCA9IEZBTFNFOworICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBGQUxTRTsKKyAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gRkFMU0U7CisgICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOworICAgIG1fYkhhdmVBY3JvRm9ybSA9IEZBTFNFOworICAgIG1fYkFjcm9Gb3JtTG9hZCA9IEZBTFNFOworICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7CisgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBGQUxTRTsKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKICAgICBtX3BSb290ID0gTlVMTDsKICAgICBtX3BUcmFpbGVyID0gTlVMTDsKQEAgLTI5MzgsMTAgKzI5MzgsMTAgQEAKICAgICBtX3BQYWdlUmVzb3VyY2UgPSBOVUxMOwogICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBOVUxMOwogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7Ci0gICAgbV9wYXJzZXIubV9iT3duRmlsZVJlYWQgPSBmYWxzZTsKLSAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IGZhbHNlOwotICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gZmFsc2U7Ci0gICAgbV9iTGluZWFyZWREYXRhT0sgPSBmYWxzZTsKKyAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOworICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7CisgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKKyAgICBtX2JMaW5lYXJlZERhdGFPSyA9IEZBTFNFOwogICAgIG1fcGFnZXNMb2FkU3RhdGUgPSBOVUxMOwogfQogQ1BERl9EYXRhQXZhaWw6On5DUERGX0RhdGFBdmFpbCgpCkBAIC0yOTk1LDEwICsyOTk1LDEwIEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNPYmplY3RzQXZhaWwoQ0ZYX1B0ckFycmF5JiBvYmpfYXJyYXksIGJvb2wgYlBhcnNlUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgQ0ZYX1B0ckFycmF5ICZyZXRfYXJyYXkpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgRlhfQk9PTCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSkKIHsKICAgICBpZiAoIW9ial9hcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9EV09SRCBjb3VudCA9IDA7CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpfYXJyYXk7CkBAIC0zMDg4LDQyICszMDg4LDQyIEBACiAgICAgICAgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgb2JqX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIG9ial9hcnJheS5BcHBlbmQobmV3X29ial9hcnJheSk7Ci0gICAgcmV0dXJuIElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgZmFsc2UsIHBIaW50cywgcmV0X2FycmF5KTsKKyAgICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9kd0ZpbGVMZW4gJiYgbV9wRmlsZVJlYWQpIHsKICAgICAgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKICAgICAgICAgaWYgKCFtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICB3aGlsZSAoIW1fYkRvY0F2YWlsKSB7CiAgICAgICAgIGlmICghQ2hlY2tEb2NTdGF0dXMocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQXBwZW5kKG1fYXJyYXlBY3JvZm9ybXMpOwotICAgICAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIGZhbHNlLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIGlmIChiUmV0KSB7CiAgICAgICAgIGludDMyX3QgaVNpemUgPSBtX2FycmF5QWNyb2Zvcm1zLkdldFNpemUoKTsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewpAQCAtMzEzNiwyNiArMzEzNiwyNiBAQAogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBib29sIGJFeGlzdCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CiAgICAgbV9wQWNyb0Zvcm0gPSBHZXRPYmplY3QobV9kd0Fjcm9Gb3JtT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoIW1fcEFjcm9Gb3JtKSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX2FycmF5QWNyb2Zvcm1zLkFkZChtX3BBY3JvRm9ybSk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRG9jU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCiB7CiAgICAgc3dpdGNoIChtX2RvY1N0YXR1cykgewogICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfSEVBREVSOgpAQCAtMzE5NSwxNyArMzE5NSwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKICAgICAgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOwogICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQ6CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fYkRvY0F2YWlsID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgbV9iRG9jQXZhaWwgPSBUUlVFOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogfQotYm9vbAlDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MCUNQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKQEAgLTMyMTUsMzYgKzMyMTUsMzYgQEAKICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgogICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fYlBhZ2VzTG9hZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOworICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKDAsIChGWF9EV09SRCltX2R3RmlsZUxlbikpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcEhpbnRzLT5BZGRTZWdtZW50KDAsIChGWF9EV09SRCltX2R3RmlsZUxlbik7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIG1fcGFyc2VyLm1fU3ludGF4LkluaXRQYXJzZXIobV9wRmlsZVJlYWQsIChGWF9EV09SRCltX2R3SGVhZGVyT2Zmc2V0KTsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IGZhbHNlOworICAgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7CiAgICAgaWYgKCFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNChtX2R3TGFzdFhSZWZPZmZzZXQpICYmICFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNShtX2R3TGFzdFhSZWZPZmZzZXQpKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYU1lTX3Fzb3J0KG1fcGFyc2VyLm1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9wYXJzZXIubV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKICAgICBtX2R3Um9vdE9iak51bSA9IG1fcGFyc2VyLkdldFJvb3RPYmpOdW0oKTsKICAgICBtX2R3SW5mb09iak51bSA9IG1fcGFyc2VyLkdldEluZm9PYmpOdW0oKTsKICAgICBtX3BDdXJyZW50UGFyc2VyID0gJm1fcGFyc2VyOwogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ST09UOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotQ1BERl9PYmplY3QqIENQREZfRGF0YUF2YWlsOjpHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBib29sICpwRXhpc3RJbkZpbGUpCitDUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OkdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0JPT0wgKnBFeGlzdEluRmlsZSkKIHsKICAgICBDUERGX09iamVjdCAqcFJldCAgICAgICAgID0gTlVMTDsKICAgICBGWF9EV09SRCAgICBvcmlnaW5hbF9zaXplID0gMDsKQEAgLTMyNTIsNyArMzI1Miw3IEBACiAgICAgQ1BERl9QYXJzZXIgKnBQYXJzZXIgICAgICA9IE5VTEw7CiAKICAgICBpZiAocEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSB0cnVlOworICAgICAgICAqcEV4aXN0SW5GaWxlID0gVFJVRTsKICAgICB9CiAKICAgICBpZiAobV9wRG9jdW1lbnQgPT0gTlVMTCkgewpAQCAtMzI2Nyw3ICszMjY3LDcgQEAKICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0RXT1JEPiBzaXplID0gb3JpZ2luYWxfc2l6ZTsKICAgICBpZiAoc2l6ZS5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7CiAgICAgICAgIGlmIChwRXhpc3RJbkZpbGUpCi0gICAgICAgICAgICpwRXhpc3RJbkZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgKnBFeGlzdEluRmlsZSA9IEZBTFNFOwogCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMyOTgsMTUgKzMyOTgsMTUgQEAKICAgICB9CiAKICAgICBpZiAoIXBSZXQgJiYgcEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBmYWxzZTsKKyAgICAgICAgKnBFeGlzdEluRmlsZSA9IEZBTFNFOwogICAgIH0KIAogICAgIHJldHVybiBwUmV0OwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKICAgICBDUERGX09iamVjdCAqcEluZm8gPSBHZXRPYmplY3QobV9kd0luZm9PYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgaWYgKG1fYkhhdmVBY3JvRm9ybSkgewpAQCAtMzMxNCwxNyArMzMxNCwxNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKCFwSW5mbykgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Qb3MgPT0gbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBJbmZvKSB7CiAgICAgICAgIHBJbmZvLT5SZWxlYXNlKCk7CkBAIC0zMzM0LDM3ICszMzM0LDM3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwogICAgIG1fcFJvb3QgPSBHZXRPYmplY3QobV9kd1Jvb3RPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghbV9wUm9vdCkgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFJvb3QtPkdldERpY3QoKTsKICAgICBpZiAoIXBEaWN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKilwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSk7CiAgICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CiAgICAgQ1BERl9SZWZlcmVuY2UqIHBBY3JvRm9ybVJlZiA9IChDUERGX1JlZmVyZW5jZSopbV9wUm9vdC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3JvRm9ybSIpKTsKICAgICBpZiAocEFjcm9Gb3JtUmVmICYmIHBBY3JvRm9ybVJlZi0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID0gdHJ1ZTsKKyAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID0gVFJVRTsKICAgICAgICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gcEFjcm9Gb3JtUmVmLT5HZXRSZWZPYmpOdW0oKTsKICAgICB9CiAgICAgaWYgKG1fZHdJbmZvT2JqTnVtKSB7CkBAIC0zMzc2LDIyICszMzc2LDIyIEBACiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpQcmVwYXJlUGFnZUl0ZW0oKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6UHJlcGFyZVBhZ2VJdGVtKCkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IHBSb290ID8gKENQREZfUmVmZXJlbmNlKilwUm9vdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSkgOiBOVUxMOwogICAgIGlmIChwUmVmID09IE5VTEwgfHwgcFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9QYWdlc09iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwogICAgIG1fcEN1cnJlbnRQYXJzZXIgPSAoQ1BERl9QYXJzZXIgKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNGaXJzdENoZWNrKGludCBpUGFnZSkKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzRmlyc3RDaGVjayhpbnQgaVBhZ2UpCiB7CiAgICAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgewogICAgICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7CkBAIC0zMzk5LDEzICszMzk5LDEzIEBACiAgICAgRlhfRFdPUkQgZHdWYWx1ZSA9IDA7CiAgICAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7CiAgICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAxKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoZHdWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENQREZfRGF0YUF2YWlsOjpSZXNldEZpcnN0Q2hlY2soaW50IGlQYWdlKQogewpAQCAtMzQxOCwxMyArMzQxOCwxMyBAQAogICAgIH0KICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMCk7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIEZYX0RXT1JEIGlQYWdlT2JqcyA9IG1fUGFnZU9iakxpc3QuR2V0U2l6ZSgpOwogICAgIENGWF9EV29yZEFycmF5IFVuYXZhaWxPYmpMaXN0OwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZU9ianM7ICsraSkgewogICAgICAgICBGWF9EV09SRCBkd1BhZ2VPYmpOdW0gPSBtX1BhZ2VPYmpMaXN0LkdldEF0KGkpOwotICAgICAgICBib29sIGJFeGlzdCA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwogICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgICAgIGlmICghcE9iaikgewogICAgICAgICAgICAgaWYgKGJFeGlzdCkgewpAQCAtMzQ1OSw3ICszNDU5LDcgQEAKICAgICBtX1BhZ2VPYmpMaXN0LlJlbW92ZUFsbCgpOwogICAgIGlmIChVbmF2YWlsT2JqTGlzdC5HZXRTaXplKCkpIHsKICAgICAgICAgbV9QYWdlT2JqTGlzdC5BcHBlbmQoVW5hdmFpbE9iakxpc3QpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfRFdPUkQgaVBhZ2VzID0gbV9QYWdlc0FycmF5LkdldFNpemUoKTsKICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgaVBhZ2VzOyBpKyspIHsKQEAgLTM0NzUsNyArMzQ3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX1BhZ2VzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgfQpAQCAtMzQ4MywxOCArMzQ4MywxOCBAQAogICAgIGlmICghbV9QYWdlT2JqTGlzdC5HZXRTaXplKCkpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6R2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcykKIHsKICAgICBpZiAoIXBQYXJzZXIpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOwogICAgIENQREZfT2JqZWN0ICpwS2lkcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIktpZHMiKSkgOiBOVUxMOwogICAgIGlmICghcEtpZHMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKICAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CkBAIC0zNTE0LDM1ICszNTE0LDM1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwogICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKCFwUGFnZXMpIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghR2V0UGFnZUtpZHMobV9wQ3VycmVudFBhcnNlciwgcFBhZ2VzKSkgewogICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBGWF9EV09SRCByZXFfc2l6ZSA9IDEwMjQ7CiAgICAgaWYgKChGWF9GSUxFU0laRSlyZXFfc2l6ZSA+IG1fZHdGaWxlTGVuKSB7CkBAIC0zNTU1LDM0ICszNTU1LDM0IEBACiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VORDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHBIaW50cy0+QWRkU2VnbWVudCgwLCByZXFfc2l6ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0ZpcnN0UGFnZShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCk7CiAgICAgQ1BERl9PYmplY3QgKnBFbmRPZmZTZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJFIikpIDogTlVMTDsKICAgICBpZiAoIXBFbmRPZmZTZXQpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QgKnBYUmVmT2Zmc2V0ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiVCIpKSA6IE5VTEw7CiAgICAgaWYgKCFwWFJlZk9mZnNldCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcEZpbGVMZW4gPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMIikpIDogTlVMTDsKICAgICBpZiAoIXBGaWxlTGVuKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGJvb2wgYk5lZWREb3duTG9hZCA9IGZhbHNlOworICAgIEZYX0JPT0wgYk5lZWREb3duTG9hZCA9IEZBTFNFOwogICAgIGlmIChwRW5kT2ZmU2V0LT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewogICAgICAgICBGWF9EV09SRCBkd0VuZCA9IHBFbmRPZmZTZXQtPkdldEludGVnZXIoKTsKICAgICAgICAgZHdFbmQgKz0gNTEyOwpAQCAtMzU5Myw3ICszNTkzLDcgQEAKICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IGR3RW5kID4gMTAyNCA/IGR3RW5kIC0gMTAyNCA6IDA7CiAgICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChpU3RhcnRQb3MsIGlTaXplKSkgewogICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGlTdGFydFBvcywgaVNpemUpOwotICAgICAgICAgICAgYk5lZWREb3duTG9hZCA9IHRydWU7CisgICAgICAgICAgICBiTmVlZERvd25Mb2FkID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOwpAQCAtMzYxOSwxNiArMzYxOSwxNiBAQAogICAgIH0KICAgICBpZiAoIWJOZWVkRG93bkxvYWQgJiYgbV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENQREZfT2JqZWN0CSogQ1BERl9EYXRhQXZhaWw6OlBhcnNlSW5kaXJlY3RPYmplY3RBdChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSkKIHsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKICAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgYm9vbCBiSXNOdW1iZXI7CisgICAgRlhfQk9PTCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNjcwLDIxICszNjcwLDIxIEBACiAgICAgfQogICAgIHJldHVybiBQREZfTk9UX0xJTkVBUklaRUQ7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpJc0xpbmVhcml6ZWRGaWxlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd0xlbikKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKQogewotICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBmYWxzZSkpOworICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBGQUxTRSkpOwogICAgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KGZpbGUuR2V0KCkpOwogICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9kd0hlYWRlck9mZnNldCA9IG9mZnNldDsKICAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIG9mZnNldCk7CiAgICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOwotICAgIGJvb2wgYk51bWJlciA9IGZhbHNlOworICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmRPYmpOdW0gPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZE9iak51bSk7CiAgICAgaWYgKG1fcExpbmVhcml6ZWQpIHsKQEAgLTM2OTMsNTggKzM2OTMsNTggQEAKICAgICB9CiAgICAgbV9wTGluZWFyaXplZCA9IFBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDksIG9iam51bSk7CiAgICAgaWYgKCFtX3BMaW5lYXJpemVkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wTGluZWFyaXplZC0+R2V0RGljdCgpICYmIG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTGluZWFyaXplZCIpKSkgewogICAgICAgICBDUERGX09iamVjdCAqcExlbiA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKTsKICAgICAgICAgaWYgKCFwTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChGWF9GSUxFU0laRSlwTGVuLT5HZXRJbnRlZ2VyKCkgIT0gbV9wRmlsZVJlYWQtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgICAgIG1fYkxpbmVhcml6ZWQgPSB0cnVlOworICAgICAgICBtX2JMaW5lYXJpemVkID0gVFJVRTsKICAgICAgICAgQ1BERl9PYmplY3QgKnBObyA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKICAgICAgICAgaWYgKHBObyAmJiBwTm8tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgICAgICBtX2R3Rmlyc3RQYWdlTm8gPSBwTm8tPkdldEludGVnZXIoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBGWF9EV09SRCByZXFfcG9zID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiA+IDEwMjQgPyBtX2R3RmlsZUxlbiAtIDEwMjQgOiAwKTsKICAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuIC0gcmVxX3Bvcyk7CiAgICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwocmVxX3BvcywgZHdTaXplKSkgewogICAgICAgICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKICAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIHJlcV9wb3MsIGR3U2l6ZSk7Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJ1ZmZlciwgKHNpemVfdClkd1NpemUsIGZhbHNlKSk7CisgICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJ1ZmZlciwgKHNpemVfdClkd1NpemUsIEZBTFNFKSk7CiAgICAgICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgMCk7CiAgICAgICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoZHdTaXplIC0gMSk7Ci0gICAgICAgIGlmIChtX3N5bnRheFBhcnNlci5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgdHJ1ZSwgZmFsc2UsIGR3U2l6ZSkpIHsKLSAgICAgICAgICAgIGJvb2wgYk51bWJlcjsKKyAgICAgICAgaWYgKG1fc3ludGF4UGFyc2VyLlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCBUUlVFLCBGQUxTRSwgZHdTaXplKSkgeworICAgICAgICAgICAgRlhfQk9PTCBiTnVtYmVyOwogICAgICAgICAgICAgbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICAgICAgaWYgKCFiTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2R3WFJlZk9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIpOwogICAgICAgICAgICAgaWYgKCFtX2R3WFJlZk9mZnNldCB8fCBtX2R3WFJlZk9mZnNldCA+IG1fZHdGaWxlTGVuKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7CiAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogaW50MzJfdCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpCiB7CkBAIC0zNzU1LDkgKzM3NTUsOSBAQAogICAgICAgICBDRlhfQmluYXJ5QnVmIGJ1ZihpU2l6ZSk7CiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CiAgICAgICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZiwgbV9kd0N1cnJlbnRYUmVmU3RlYW0sIGlTaXplKTsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgZmFsc2UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgRkFMU0UpKTsKICAgICAgICAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKLSAgICAgICAgYm9vbCBiTnVtYmVyID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBvYmpudW0gPSBtX3BhcnNlci5tX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgaWYgKCFiTnVtYmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0zNzg5LDE4ICszNzg5LDE4IEBACiAgICAgbV9Qb3MgPSBkd09mZnNldDsKIH0KICNkZWZpbmUgTUFYX1dPUkRfQlVGRkVSIDI1NgotYm9vbCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbikKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pCiB7CiAgICAgbV9Xb3JkU2l6ZSA9IDA7CiAgICAgdWludDhfdCBjaDsKICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICB3aGlsZSAoMSkgewogICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKICAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgICAgICB9CkBAIC0zODA5LDcgKzM4MDksNyBAQAogICAgICAgICB9CiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zODIyLDE0ICszODIyLDE0IEBACiAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9ICdSJyAmJiB0eXBlICE9ICdOJykgewogICAgICAgICAgICAgICAgICAgICBtX1BvcyAtLTsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gcmV0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODM3LDcgKzM4MzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgewogICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNoID09ICc8JykgewogICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODQ2LDcgKzM4NDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewogICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNoID09ICc+JykgewogICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CkBAIC0zODU2LDE0ICszODU2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CiAgICAgICAgIHRva2VuID0gcmV0OwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CiAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9CiAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgIGlmICh0eXBlID09ICdEJyB8fCB0eXBlID09ICdXJykgewpAQCAtMzg3MywxMyArMzg3MywxMyBAQAogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKICAgICB0b2tlbiA9IHJldDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRDaGFyKHVpbnQ4X3QgJmNoKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dENoYXIodWludDhfdCAmY2gpCiB7CiAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7CiAgICAgaWYgKHBvcyA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fYnVmZmVyT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fYnVmZmVyT2Zmc2V0ICsgbV9idWZmZXJTaXplKSA8PSBwb3MpIHsKICAgICAgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CkBAIC0zODkxLDE2ICszODkxLDE2IEBACiAgICAgICAgICAgICByZWFkX3BvcyA9IG1fZHdGaWxlTGVuIC0gcmVhZF9zaXplOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX2J1ZmZlckRhdGEsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9idWZmZXJPZmZzZXQgPSByZWFkX3BvczsKICAgICAgICAgbV9idWZmZXJTaXplID0gcmVhZF9zaXplOwogICAgIH0KICAgICBjaCA9IG1fYnVmZmVyRGF0YVtwb3MgLSBtX2J1ZmZlck9mZnNldF07CiAgICAgbV9Qb3MgKys7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKIHsKICAgICBpbnQzMl90IGlTaXplID0gMDsKICAgICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKQEAgLTM5MDgsMTYgKzM5MDgsMTYgQEAKICAgICAgICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CiAgICAgICAgICAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7CiAgICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOwogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQogewogICAgIEZYX0ZJTEVTSVpFIHhyZWZfb2Zmc2V0ID0gMDsKICAgICBpbnQzMl90IG5SZXQgPSBDaGVja0Nyb3NzUmVmU3RyZWFtKHBIaW50cywgeHJlZl9vZmZzZXQpOwpAQCAtMzkyOCwyMSArMzkyOCwyMSBAQAogICAgICAgICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW0gPSB4cmVmX29mZnNldDsKICAgICAgICAgICAgIG1fUG9zID0geHJlZl9vZmZzZXQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoblJldCA9PSAtMSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpU2l6ZSA9IDA7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9rZW47CiAgICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CiAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpU2l6ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAodG9rZW4gPT0gInhyZWYiKSB7CiAgICAgICAgIG1fQ3Jvc3NPZmZzZXQuSW5zZXJ0QXQoMCwgbV9kd1hSZWZPZmZzZXQpOwpAQCAtMzk1MSwyOCArMzk1MSwyOCBAQAogICAgICAgICAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKICAgICAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRva2VuID09ICJ0cmFpbGVyIikgewogICAgICAgICAgICAgICAgIG1fZHdUcmFpbGVyT2Zmc2V0ID0gbV9Qb3M7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgRlhfRklMRVNJWkUgZHdBcHBlbmRQb3MgPSBtX1BvcyArIG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShkd0FwcGVuZFBvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBkd0FwcGVuZFBvcyA6IDUxMik7CiAgICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChkd0FwcGVuZFBvcywgaVNpemUpKSB7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQoZHdBcHBlbmRQb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0KSB7CkBAIC0zOTgxLDkgKzM5ODEsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JTT1NTUkVGOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpVHJhaWxlclNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwogICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fUG9zLCBpVHJhaWxlclNpemUpKSB7CkBAIC0zOTkyLDIxICszOTkyLDIxIEBACiAgICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CiAgICAgICAgIGlmICghcEJ1ZikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3VHJhaWxlck9mZnNldCwgaVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgZmFsc2UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgRkFMU0UpKTsKICAgICAgICAgbV9zeW50YXhQYXJzZXIuSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgQ1BERl9PYmplY3QgKnBUcmFpbGVyID0gbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KE5VTEwsIDAsIDAsIDApOwogICAgICAgICBpZiAoIXBUcmFpbGVyKSB7CiAgICAgICAgICAgICBtX1BvcyArPSBtX3N5bnRheFBhcnNlci5TYXZlUG9zKCk7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBUcmFpbGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBUcmFpbGVyRGljdCA9IHBUcmFpbGVyLT5HZXREaWN0KCk7CiAgICAgICAgIGlmIChwVHJhaWxlckRpY3QpIHsKQEAgLTQwMTQsNyArNDAxNCw3IEBACiAgICAgICAgICAgICBpZiAocEVuY3J5cHQgJiYgcEVuY3J5cHQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwogICAgICAgICAgICAgICAgIHBUcmFpbGVyLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRFdPUkQgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocFRyYWlsZXItPkdldERpY3QoKSwgRlhfQlNUUkMoIlByZXYiKSk7CkBAIC00MDMyLDYwICs0MDMyLDYwIEBACiAgICAgICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IDA7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgd2hpbGUgKHRydWUpIHsKKyAgICB3aGlsZSAoVFJVRSkgewogICAgICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6CiAgICAgICAgICAgICAgICAgaWYgKCFMb2FkRG9jUGFnZXMocEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKICAgICAgICAgICAgICAgICBpZiAoIUxvYWREb2NQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKICAgICAgICAgICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sCUNQREZfRGF0YUF2YWlsOjpDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wJQ1BERl9EYXRhQXZhaWw6OkNoZWNrQXJyYXlQYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKICAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghcFBhZ2VzKSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwUGFnZXMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwUGFnZXM7CkBAIC00MDk5LDMzICs0MDk5LDMzIEBACiAgICAgICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gKChDUERGX1JlZmVyZW5jZSopcEtpZCktPkdldFJlZk9iak51bSgpOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBib29sIGJFeGlzdCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CiAgICAgQ1BERl9PYmplY3QgKnBQYWdlID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghcFBhZ2UpIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOwogICAgICAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9BUlJBWTsKICAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwUGFnZU5vZGUtPm1fZHdQYWdlTm8gPSBkd1BhZ2VObzsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPkdldERpY3QoKTsKQEAgLTQxMzUsNyArNDEzNSw3IEBACiAgICAgICAgIENQREZfT2JqZWN0ICpwS2lkcyA9IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJLaWRzIikpOwogICAgICAgICBpZiAoIXBLaWRzKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChwS2lkcy0+R2V0VHlwZSgpKSB7CiAgICAgICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKQEAgLTQxNjYsMTcgKzQxNjYsMTcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSAmcGFnZU5vZGVzLCBpbnQzMl90IGlQYWdlLCBpbnQzMl90ICZpQ291bnQsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaW50MzJfdCBpU2l6ZSA9IHBhZ2VOb2Rlcy5tX2NoaWxkTm9kZS5HZXRTaXplKCk7CiAgICAgaWYgKGlTaXplIDw9IDAgfHwgaVBhZ2UgPj0gaVNpemUpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewogICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IChDUERGX1BhZ2VOb2RlKilwYWdlTm9kZXMubV9jaGlsZE5vZGUuR2V0QXQoaSk7CkBAIC00MTg2LDcgKzQxODYsNyBAQAogICAgICAgICBzd2l0Y2ggKHBOb2RlLT5tX3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1VOS09XTjoKICAgICAgICAgICAgICAgICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAtLWk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MTk4LDE5OSArNDE5OCwxOTkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1BBR0VTOgogICAgICAgICAgICAgICAgIGlmICghQ2hlY2tQYWdlTm9kZSgqcE5vZGUsIGlQYWdlLCBpQ291bnQsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfQVJSQVk6CiAgICAgICAgICAgICAgICAgaWYgKCFDaGVja0FycmF5UGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAtLWk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlQYWdlID09IGlDb3VudCkgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA8PSBpUGFnZSB8fCBtX3BEb2N1bWVudC0+bV9QYWdlTGlzdC5HZXRBdChpUGFnZSkpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fcGFnZU5vZGVzLm1fdHlwZSA9PSBQREZfUEFHRU5PREVfUEFHRSkgewogICAgICAgICBpZiAoaVBhZ2UgPT0gMCkgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpbnQzMl90IGlDb3VudCA9IC0xOwogICAgIHJldHVybiBDaGVja1BhZ2VOb2RlKG1fcGFnZU5vZGVzLCBpUGFnZSwgaUNvdW50LCBwSGludHMpOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZUNvdW50KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwogICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIXBQYWdlcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXNEaWN0ID0gcFBhZ2VzLT5HZXREaWN0KCk7CiAgICAgaWYgKCFwUGFnZXNEaWN0KSB7CiAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIXBQYWdlc0RpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJLaWRzIikpKSB7CiAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGludCBjb3VudCA9IHBQYWdlc0RpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOwogICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFDaGVja1Vua293blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX3BhZ2VOb2RlcywgcEhpbnRzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKENoZWNrUGFnZUNvdW50KHBIaW50cykpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICB3aGlsZSAoIW1fYlBhZ2VzVHJlZUxvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja1BhZ2VTdGF0dXMocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JQYWdlc0xvYWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBtX3BEb2N1bWVudC0+TG9hZFBhZ2VzKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAobV9iTGluZWFyZWREYXRhT0spIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIGlmICghbV9iTWFpblhSZWZMb2FkVHJpZWQpIHsKICAgICAgICAgRlhfU0FGRV9EV09SRCBkYXRhX3NpemUgPSBtX2R3RmlsZUxlbjsKICAgICAgICAgZGF0YV9zaXplIC09IG1fZHdMYXN0WFJlZk9mZnNldDsKICAgICAgICAgaWYgKCFkYXRhX3NpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fZHdMYXN0WFJlZk9mZnNldCwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpIHsKICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX2R3TGFzdFhSZWZPZmZzZXQsIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIGR3UmV0ID0gKChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOwotICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IHRydWU7CisgICAgICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gVFJVRTsKICAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAoIVByZXBhcmVQYWdlSXRlbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IHRydWU7Ci0gICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LICAgPSB0cnVlOworICAgICAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gVFJVRTsKKyAgICAgICAgbV9iTGluZWFyZWREYXRhT0sgICA9IFRSVUU7CiAgICAgfQogCiAgICAgcmV0dXJuIG1fYkxpbmVhcmVkRGF0YU9LOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQW5ub3RzKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7CiAgICAgICAgIGlmICghcFBhZ2VEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIENQREZfT2JqZWN0ICpwQW5ub3RzID0gcFBhZ2VEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBbm5vdHMiKSk7CiAgICAgICAgIGlmICghcEFubm90cykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQWRkKHBBbm5vdHMpOwotICAgICAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIGZhbHNlLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CiAgICAgfQogICAgIHJldHVybiBiUmV0OwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fYkFubm90c0xvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja1BhZ2VBbm5vdHMoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBtX2JBbm5vdHNMb2FkID0gdHJ1ZTsKKyAgICAgICAgbV9iQW5ub3RzTG9hZCA9IFRSVUU7CiAgICAgfQogICAgIGlmIChtX2JBbm5vdHNMb2FkKSB7CiAgICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkgKnBEaWN0KQogewogICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpOwogICAgIGlmICgrK3NfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID4ga01heERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKTsKICAgICBpZiAoIXBQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSAqcFBhcmVudERpY3QgPSBwUGFyZW50LT5HZXREaWN0KCk7CiAgICAgaWYgKCFwUGFyZW50RGljdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QgKnBSZXQgPSBwUGFyZW50RGljdC0+R2V0RWxlbWVudCgiUmVzb3VyY2VzIik7CiAgICAgaWYgKHBSZXQpIHsKICAgICAgICAgbV9wUGFnZVJlc291cmNlID0gcFJldDsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOwogfQotYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzUGFnZUF2YWlsKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFtX3BEb2N1bWVudCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKElzRmlyc3RDaGVjayhpUGFnZSkpIHsKLSAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBmYWxzZTsKLSAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gZmFsc2U7Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBmYWxzZTsKLSAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBmYWxzZTsKKyAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKKyAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7CisgICAgICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKKyAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBGQUxTRTsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKICAgICB9CkBAIC00Mzk5LDQ2ICs0Mzk5LDQ2IEBACiAgICAgfQogICAgIEZYX0RXT1JEIGR3UGFnZUxvYWQgPSAwOwogICAgIGlmIChtX3BhZ2VzTG9hZFN0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3UGFnZUxvYWQpICYmIGR3UGFnZUxvYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChtX2JMaW5lYXJpemVkKSB7CiAgICAgICAgIGlmICgoRlhfRFdPUkQpaVBhZ2UgPT0gbV9kd0ZpcnN0UGFnZU5vKSB7Ci0gICAgICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgdHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYk1haW5YUmVmTG9hZGVkT0spIHsKICAgICAgICAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgewogICAgICAgICAgICAgICAgIGlmICghTG9hZFBhZ2VzKHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKCFMb2FkQWxsRmlsZShwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICgoQ1BERl9QYXJzZXIgKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpLT5SZWJ1aWxkQ3Jvc3NSZWYoKTsKICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFtX2JUb3RhbExvYWRQYWdlVHJlZSkgewogICAgICAgICAgICAgaWYgKCFtX2JDdXJQYWdlRGljdExvYWRPSyAmJiAhQ2hlY2tQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtICYmICFtX2JBY3JvRm9ybUxvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBtX2JBY3JvRm9ybUxvYWQgPSB0cnVlOworICAgICAgICBtX2JBY3JvRm9ybUxvYWQgPSBUUlVFOwogICAgIH0KICAgICBpZiAoIW1fYlBhZ2VMb2FkZWRPSykgewogICAgICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKQEAgLTQ0NDcsMjMgKzQ0NDcsMjMgQEAKICAgICAgICAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOwogICAgICAgICAgICAgaWYgKCFtX3BQYWdlRGljdCkgewogICAgICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlRGljdCk7Ci0gICAgICAgICAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIHRydWUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgVFJVRSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOwogICAgICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSBUUlVFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gYlJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKLSAgICAgICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CiAgICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gVFJVRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGJSZXQ7CkBAIC00NDczLDkgKzQ0NzMsOSBAQAogICAgIGlmIChtX2JQYWdlTG9hZGVkT0spIHsKICAgICAgICAgaWYgKCFtX2JBbm5vdHNMb2FkKSB7CiAgICAgICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2JBbm5vdHNMb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BQYWdlRGljdCAmJiAhbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UpIHsKQEAgLTQ0ODMsMzcgKzQ0ODMsMzcgQEAKICAgICAgICAgaWYgKCFtX3BQYWdlUmVzb3VyY2UpIHsKICAgICAgICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gSGF2ZVJlc291cmNlQW5jZXN0b3IobV9wUGFnZURpY3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSB0cnVlOworICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgICAgICBib29sIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOworICAgICAgICBGWF9CT09MIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOwogICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IGZhbHNlOworICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOwogICAgIH0KLSAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKLSAgICBtX2JBbm5vdHNMb2FkID0gZmFsc2U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBmYWxzZTsKKyAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKKyAgICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7CisgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKICAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOwotICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCB0cnVlKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgVFJVRSk7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwogICAgICAgICBvYmpfYXJyYXkuQWRkKG1fcFBhZ2VSZXNvdXJjZSk7Ci0gICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgdHJ1ZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOworICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKICAgICAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CkBAIC00NTQ5LDEwICs0NTQ5LDEwIEBACiAgICAgICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFkZChwQWNyb0Zvcm0tPkdldERpY3QoKSk7CiAgICAgICAgIH0KLSAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSB0cnVlOworICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IFRSVUU7CiAgICAgfQogICAgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKLSAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIGZhbHNlLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYgKCFiUmV0KSB7CiAgICAgICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOwpAQCAtNDU2OCwxMiArNDU2OCwxMiBAQAogICAgIH0KICAgICBtX251bWJlcl9hcnJheS5JbnNlcnRBdChpTmV4dCwgZHdPYmpOdW0pOwogfQotYm9vbCBDUERGX1NvcnRPYmpOdW1BcnJheTo6RmluZChGWF9EV09SRCBkd09iak51bSkKK0ZYX0JPT0wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pCiB7CiAgICAgaW50MzJfdCBpTmV4dCA9IDA7CiAgICAgcmV0dXJuIEJpbmFyeVNlYXJjaChkd09iak51bSwgaU5leHQpOwogfQotYm9vbCBDUERGX1NvcnRPYmpOdW1BcnJheTo6QmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQzMl90ICZpTmV4dCkKK0ZYX0JPT0wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkJpbmFyeVNlYXJjaChGWF9EV09SRCB2YWx1ZSwgaW50MzJfdCAmaU5leHQpCiB7CiAgICAgaW50MzJfdCBpTG93ID0gMDsKICAgICBpbnQzMl90IGlIaWdoID0gbV9udW1iZXJfYXJyYXkuR2V0U2l6ZSgpIC0gMTsKQEAgLTQ1ODEsNyArNDU4MSw3IEBACiAgICAgICAgIGludDMyX3QgaU1pZCA9IChpTG93ICsgaUhpZ2gpIC8gMjsKICAgICAgICAgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID09IHZhbHVlKSB7CiAgICAgICAgICAgICBpTmV4dCA9IGlNaWQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX251bWJlcl9hcnJheS5HZXRBdChpTWlkKSA+IHZhbHVlKSB7CiAgICAgICAgICAgICBpSGlnaCA9IGlNaWQgLSAxOwpAQCAtNDU5MCw3ICs0NTkwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpTmV4dCA9IGlMb3c7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENQREZfUGFnZU5vZGU6On5DUERGX1BhZ2VOb2RlKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCmluZGV4IDc2ZTI0NWEuLjQ5MDMzMTIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcApAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgfQogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCBkd1NpemUpOwogfQotYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6U2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikKK0ZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OlNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCiB7CiAgICAgaW50IHRva2VuX2xlbiA9IHRva2VuLkdldExlbmd0aCgpOwogICAgIHdoaWxlIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKQEAgLTIwNSwzMCArMjA1LDMwIEBACiAgICAgICAgIG1fZHdDdXJQb3MgKys7CiAgICAgfQogICAgIGlmIChtX2R3Q3VyUG9zID09IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX2R3Q3VyUG9zICs9IHRva2VuX2xlbjsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9TaW1wbGVQYXJzZXI6OlNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCitGWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpTa2lwV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKQogewogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOwogICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhaXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdGFydF90b2tlbiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCitGWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzdGFydF9wb3MsIEZYX0RXT1JEJiBlbmRfcG9zKQogewogICAgIGlmICghc3RhcnRfdG9rZW4uSXNFbXB0eSgpKSB7CiAgICAgICAgIGlmICghU2tpcFdvcmQoc3RhcnRfdG9rZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgc3RhcnRfcG9zID0gbV9kd0N1clBvczsKICAgICB9CkBAIC0yMzYsMTUgKzIzNiwxNSBAQAogICAgICAgICBlbmRfcG9zID0gbV9kd0N1clBvczsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmICh3b3JkID09IGVuZF90b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sIGludCBuUGFyYW1zKQorRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sIGludCBuUGFyYW1zKQogewogICAgIG5QYXJhbXMgKys7CiAgICAgRlhfRFdPUkQqIHBCdWYgPSBGWF9BbGxvYyhGWF9EV09SRCwgblBhcmFtcyk7CkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewogICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewogICAgICAgICAgICAgaWYgKGJ1Zl9jb3VudCA8IG5QYXJhbXMpIHsKQEAgLTI3MCwxMCArMjcwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2R3Q3VyUG9zID0gcEJ1ZltidWZfaW5kZXhdOwogICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHN0YXRpYyBpbnQgX2hleDJkZWMoY2hhciBjaCkKIHsKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJvb2wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwogICAgICAgICAgICAgICAgIGJ1ZiA8PCBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00MTcsMTMgKzQxNywxMyBAQAogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwID0gKENQREZfU3RyZWFtKilwT2JqOwogICAgICAgICAgICAgICAgIGJ1ZiA8PCBwLT5HZXREaWN0KCkgPDwgRlhfQlNUUkMoInN0cmVhbVxyXG4iKTsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIHRydWUpOworICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CiAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYnVmOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcAppbmRleCBhNzBmNWJmLi5mOGI1OTkxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcApAQCAtMTgsMTAgKzE4LDEwIEBACiAKIENQREZfRG9jUmVuZGVyRGF0YTo6fkNQREZfRG9jUmVuZGVyRGF0YSgpCiB7Ci0gICAgQ2xlYXIodHJ1ZSk7CisgICAgQ2xlYXIoVFJVRSk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpDbGVhcihib29sIGJSZWxlYXNlKQordm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OkNsZWFyKEZYX0JPT0wgYlJlbGVhc2UpCiB7CiAgICAgZm9yIChhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCk7KSB7CiAgICAgICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgICAgICBkZWxldGUgbV9wRm9udENhY2hlOwogICAgICAgICAgICAgbV9wRm9udENhY2hlID0gTlVMTDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEZvbnRDYWNoZS0+RnJlZUNhY2hlKGZhbHNlKTsKKyAgICAgICAgICAgIG1fcEZvbnRDYWNoZS0+RnJlZUNhY2hlKEZBTFNFKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTExOCw3ICsxMTgsNyBAQAogdm9pZCBDUERGX1JlbmRlck1vZHVsZTo6Q2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkKIHsKICAgICBpZiAocCkgewotICAgICAgICBwLT5DbGVhcihmYWxzZSk7CisgICAgICAgIHAtPkNsZWFyKEZBTFNFKTsKICAgICB9CiB9CiB2b2lkIENQREZfUmVuZGVyTW9kdWxlOjpEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUpCkBAIC0xODAsMTkgKzE4MCwxOSBAQAogQ1BERl9SZW5kZXJTdGF0dXM6OkNQREZfUmVuZGVyU3RhdHVzKCkKIHsKICAgICBtX3BDb250ZXh0ID0gTlVMTDsKLSAgICBtX2JTdG9wcGVkID0gZmFsc2U7CisgICAgbV9iU3RvcHBlZCA9IEZBTFNFOwogICAgIG1fcERldmljZSA9IE5VTEw7CiAgICAgbV9wQ3VyT2JqID0gTlVMTDsKICAgICBtX3BTdG9wT2JqID0gTlVMTDsKICAgICBtX0hhbGZ0b25lTGltaXQgPSAwOwogICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICBtX2JQcmludCA9IGZhbHNlOworICAgIG1fYlByaW50ID0gRkFMU0U7CiAgICAgbV9UcmFuc3BhcmVuY3kgPSAwOwogICAgIG1fRGl0aGVyQml0cyA9IDA7Ci0gICAgbV9iRHJvcE9iamVjdHMgPSBmYWxzZTsKLSAgICBtX2JTdGRDUyA9IGZhbHNlOworICAgIG1fYkRyb3BPYmplY3RzID0gRkFMU0U7CisgICAgbV9iU3RkQ1MgPSBGQUxTRTsKICAgICBtX0dyb3VwRmFtaWx5ID0gMDsKLSAgICBtX2JMb2FkTWFzayA9IGZhbHNlOworICAgIG1fYkxvYWRNYXNrID0gRkFMU0U7CiAgICAgbV9wVHlwZTNDaGFyID0gTlVMTDsKICAgICBtX1QzRmlsbENvbG9yID0gMDsKICAgICBtX3BGb3JtUmVzb3VyY2UgPSBOVUxMOwpAQCAtMjA1LDEzICsyMDUsMTMgQEAKICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7CiB9CiAKLWJvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0ZSwgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwSW5pdGlhbFN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgaW50IHRyYW5zcGFyZW5jeSwgYm9vbCBiRHJvcE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgYm9vbCBiU3RkQ1MsIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBpbnQgdHJhbnNwYXJlbmN5LCBGWF9CT09MIGJEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBGWF9CT09MIGJTdGRDUywgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfRFdPUkQgR3JvdXBGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykKIHsKICAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CiAgICAgbV9wRGV2aWNlID0gcERldmljZTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgIH0KICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7CiAgICAgbV9UcmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3k7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgICAgICBpbmRleCArKzsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcE9ianMtPkdldE5leHRPYmplY3QocG9zKTsKICAgICAgICAgaWYgKHBDdXJPYmogPT0gbV9wU3RvcE9iaikgewotICAgICAgICAgICAgbV9iU3RvcHBlZCA9IHRydWU7CisgICAgICAgICAgICBtX2JTdG9wcGVkID0gVFJVRTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAoIXBDdXJPYmopIHsKQEAgLTMwMSw0MiArMzAxLDQyIEBACiAgICAgfQogICAgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOwogfQotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6Q29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9wT2JqZWN0UmVuZGVyZXIpIHsKICAgICAgICAgaWYgKG1fcE9iamVjdFJlbmRlcmVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPm1fUmVzdWx0KSB7CiAgICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKICAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQ3VyT2JqID0gcE9iajsKICAgICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrLk5vdE51bGwoKSkKICAgICAgICAgaWYgKCFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7CiAgICAgaWYgKFByb2Nlc3NUcmFuc3BhcmVuY3kocE9iaiwgcE9iajJEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKICAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBJUERGX09iamVjdFJlbmRlcmVyOjpDcmVhdGUocE9iai0+bV9UeXBlKTsKLSAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+U3RhcnQodGhpcywgcE9iaiwgcE9iajJEZXZpY2UsIGZhbHNlKSkgeworICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5TdGFydCh0aGlzLCBwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UpKSB7CiAgICAgICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5tX1Jlc3VsdCkgewogICAgICAgICAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7CiAgICAgICAgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2luZ2xlT2JqZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBwUGF1c2UpOwogICAgIH0KICAgICBQcm9jZXNzT2JqZWN0Tm9DbGlwKHBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogSVBERl9PYmplY3RSZW5kZXJlciogSVBERl9PYmplY3RSZW5kZXJlcjo6Q3JlYXRlKGludCB0eXBlKQogewpAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgfQogICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZVJlbmRlcmVyOwogfQotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYkxvZ2ljYWwsIEZYX1JFQ1QgJnJlY3QpIGNvbnN0CiB7CiAgICAgcmVjdCA9IHBPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwogICAgIEZYX1JFQ1QgcnRDbGlwID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CkBAIC0zNzAsNyArMzcwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBmYWxzZSwgcmVjdCkpIHsKKyAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChtX0RpdGhlckJpdHMgPT0gMikgewpAQCAtMzg2LDcgKzM4Niw3IEBACiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzT2JqZWN0Tm9DbGlwKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CiAgICAgc3dpdGNoIChwT2JqLT5tX1R5cGUpIHsKICAgICAgICAgY2FzZSBQREZQQUdFX1RFWFQ6CiAgICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc1RleHQoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UsIE5VTEwpOwpAQCAtNDA4LDkgKzQwOCw5IEBACiAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CiAgICAgfQogfQotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewotICAgIGJvb2wgYlJldCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwogICAgIHN3aXRjaCAocE9iai0+bV9UeXBlKSB7CiAgICAgICAgIGNhc2UgUERGUEFHRV9QQVRIOgogICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NQYXRoKChDUERGX1BhdGhPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwT2JqLCBwT2JqMkRldmljZSwgZmFsc2UsIHJlY3QpKSB7CisgICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnQgcmVzID0gMzAwOwpAQCAtNDU5LDExICs0NTksMTEgQEAKICAgICBzdGF0dXMuUmVuZGVyU2luZ2xlT2JqZWN0KHBPYmosICZtYXRyaXgpOwogICAgIGJ1ZmZlci5PdXRwdXRUb0RldmljZSgpOwogfQotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiT0MiKSk7CiAgICAgaWYgKHBPQyAmJiBtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmICFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09DR1Zpc2libGUocE9DKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcEZvcm1PYmotPm1fRm9ybU1hdHJpeDsKICAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CkBAIC00NzMsMTUgKzQ3MywxNSBAQAogICAgIH0KICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBtX3BTdG9wT2JqLAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBGb3JtT2JqLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBSZXNvdXJjZXMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwRm9ybU9iaiwgJm1fT3B0aW9ucywgbV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwUmVzb3VyY2VzLCBGQUxTRSk7CiAgICAgc3RhdHVzLm1fY3VyQmxlbmQgPSBtX2N1ckJsZW5kOwogICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CiAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEZvcm1PYmotPm1fcEZvcm0sICZtYXRyaXgpOwogICAgIG1fYlN0b3BwZWQgPSBzdGF0dXMubV9iU3RvcHBlZDsKICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCitGWF9CT09MIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKIHsKICAgICBpZiAobWF0cml4LmEgPT0gMCB8fCBtYXRyaXguZCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBtYXRyaXguYiAhPSAwICYmIG1hdHJpeC5jICE9IDA7CkBAIC00ODksMTUgKzQ4OSwxNSBAQAogICAgIGlmIChtYXRyaXguYiA9PSAwIHx8IG1hdHJpeC5jID09IDApIHsKICAgICAgICAgcmV0dXJuIG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMDsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIGludCBGaWxsVHlwZSA9IHBQYXRoT2JqLT5tX0ZpbGxUeXBlOwotICAgIGJvb2wgYlN0cm9rZSA9IHBQYXRoT2JqLT5tX2JTdHJva2U7CisgICAgRlhfQk9PTCBiU3Ryb2tlID0gcFBhdGhPYmotPm1fYlN0cm9rZTsKICAgICBQcm9jZXNzUGF0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCBGaWxsVHlwZSwgYlN0cm9rZSk7CiAgICAgaWYgKEZpbGxUeXBlID09IDAgJiYgIWJTdHJva2UpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSAwOwogICAgIGlmIChGaWxsVHlwZSkgewpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBwYXRoX21hdHJpeCA9IHBQYXRoT2JqLT5tX01hdHJpeDsKICAgICBwYXRoX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKICAgICBpZiAoIUlzQXZhaWxhYmxlTWF0cml4KHBhdGhfbWF0cml4KSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfUkVDVF9BQSkpIHsKICAgICAgICAgRmlsbFR5cGUgfD0gRlhGSUxMX1JFQ1RfQUE7CkBAIC01NDYsNyArNTQ2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKHBPYmopOwogfQotRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBib29sIGJUeXBlMykgY29uc3QKK0ZYX0FSR0IgQ1BERl9SZW5kZXJTdGF0dXM6OkdldEZpbGxBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiVHlwZTMpIGNvbnN0CiB7CiAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcE9iai0+bV9Db2xvclN0YXRlOwogICAgIGlmIChtX3BUeXBlM0NoYXIgJiYgIWJUeXBlMyAmJiAoIW1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCB8fCAobV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkICYmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX0ZpbGxDb2xvci5Jc051bGwoKSkpKSkgewpAQCAtNjEyLDcgKzYxMiw3IEBACiAgICAgICAgIGlmIChtX0xhc3RDbGlwUGF0aC5Jc051bGwoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKHRydWUpOworICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShUUlVFKTsKICAgICAgICAgbV9MYXN0Q2xpcFBhdGguU2V0TnVsbCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjIwLDcgKzYyMCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9MYXN0Q2xpcFBhdGggPSBDbGlwUGF0aDsKLSAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSh0cnVlKTsKKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShUUlVFKTsKICAgICBpbnQgbkNsaXBQYXRoID0gQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG5DbGlwUGF0aDsgaSsrKSB7CkBAIC02OTAsNyArNjkwLDcgQEAKICAgICAgICAgbV9wRGV2aWNlLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCAmc3Ryb2tlX3N0YXRlLCAwLCAweGZmZmYwMDAwLCBmaWxsX21vZGUpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpCitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQogewogICAgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7CiAgICAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CkBAIC03MDcsMTIgKzcwNywxMiBAQAogICAgIH0KICAgICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoT2JqLT5tX1BhdGgsICZwYXRoX21hdHJpeCwgZmlsbF9tb2RlKTsKIH0KLWJvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUcmFuc3BhcmVuY3koY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHJhbnNwYXJlbmN5KGNvbnN0IENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZTsKICAgICBpbnQgYmxlbmRfdHlwZSA9IHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKICAgICBpZiAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9VTlNVUFBPUlRFRCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7CiAgICAgaWYgKHBTTWFza0RpY3QpIHsKQEAgLTcyNCw3ICs3MjQsNyBAQAogICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CiAgICAgRlhfRkxPQVQgZ3JvdXBfYWxwaGEgPSAxLjBmOwogICAgIGludCBUcmFuc3BhcmVuY3kgPSBtX1RyYW5zcGFyZW5jeTsKLSAgICBib29sIGJHcm91cFRyYW5zcGFyZW50ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiR3JvdXBUcmFuc3BhcmVudCA9IEZBTFNFOwogICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewogICAgICAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CiAgICAgICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSAqcFN0YXRlRGF0YSA9IHBGb3JtT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRPYmplY3QoKTsKQEAgLTczMiwxNSArNzMyLDE1IEBACiAgICAgICAgICAgICBncm91cF9hbHBoYSA9IHBTdGF0ZURhdGEtPm1fRmlsbEFscGhhOwogICAgICAgICB9CiAgICAgICAgIFRyYW5zcGFyZW5jeSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeTsKLSAgICAgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCA/IFRSVUUgOiBGQUxTRTsKICAgICAgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewogICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgYm9vbCBiVGV4dENsaXAgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJUZXh0Q2xpcCA9IEZBTFNFOwogICAgIGlmIChwUGFnZU9iai0+bV9DbGlwUGF0aC5Ob3ROdWxsKCkgJiYgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkgJiYKICAgICAgICAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX0RJU1BMQVkgJiYgIShtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX1NPRlRfQ0xJUCkpIHsKLSAgICAgICAgYlRleHRDbGlwID0gdHJ1ZTsKKyAgICAgICAgYlRleHRDbGlwID0gVFJVRTsKICAgICB9CiAgICAgaWYgKChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9PVkVSUFJJTlQpICYmIHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJiBwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QICYmIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlT1ApIHsKICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gTlVMTDsKQEAgLTc2MywxMSArNzYzLDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBTTWFza0RpY3QgPT0gTlVMTCAmJiBncm91cF9hbHBoYSA9PSAxLjBmICYmIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFiVGV4dENsaXAgJiYgIWJHcm91cFRyYW5zcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBib29sIGlzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CisgICAgRlhfQk9PTCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwogICAgIGlmIChtX2JQcmludCkgewotICAgICAgICBib29sIGJSZXQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CiAgICAgICAgIGludCByZW5kQ2FwcyA9IG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpOwogICAgICAgICBpZiAoISgoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJiAocmVuZENhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB7CiAgICAgICAgICAgICBpbnQgb2xkQmxlbmQgPSBtX2N1ckJsZW5kOwpAQCAtNzc4LDEyICs3NzgsMTIgQEAKICAgICAgICAgaWYgKCFiUmV0KSB7CiAgICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocFBhZ2VPYmosIHBPYmoyRGV2aWNlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKICAgICByZWN0LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CiAgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ0ZYX01hdHJpeCBkZXZpY2VDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwogICAgIEZYX0ZMT0FUIHNjYWxlWCA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmEpOwpAQCAtNzk1LDEyICs3OTUsMTIgQEAKICAgICBpZiAoIWlzb2xhdGVkICYmIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKSB7CiAgICAgICAgIG9yaURldmljZSA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgIGlmICghbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKG9yaURldmljZSwgd2lkdGgsIGhlaWdodCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGV2aWNlLT5HZXRESUJpdHMob3JpRGV2aWNlLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKICAgICB9CiAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiLCAwLCBvcmlEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBiaXRtYXBfZGV2aWNlLkdldEJpdG1hcCgpOwogICAgIGJpdG1hcC0+Q2xlYXIoMCk7CkBAIC04MTIsNyArODEyLDcgQEAKICAgICAgICAgcFRleHRNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIHBUZXh0TWFzay0+Q2xlYXIoMCk7CiAgICAgICAgIENGWF9GeGdlRGV2aWNlIHRleHRfZGV2aWNlOwpAQCAtODMxLDcgKzgzMSw3IEBACiAgICAgfQogICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdG9wT2JqLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0b3BPYmosIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBUUlVFKTsKICAgICBiaXRtYXBfcmVuZGVyLlByb2Nlc3NPYmplY3ROb0NsaXAocFBhZ2VPYmosICZuZXdfbWF0cml4KTsKICAgICBtX2JTdG9wcGVkID0gYml0bWFwX3JlbmRlci5tX2JTdG9wcGVkOwogICAgIGlmIChwU01hc2tEaWN0KSB7CkBAIC04NTgsMTAgKzg1OCwxMCBAQAogICAgIH0KICAgICBDb21wb3NpdGVESUJpdG1hcChiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIDI1NSwgYmxlbmRfdHlwZSwgVHJhbnNwYXJlbmN5KTsKICAgICBkZWxldGUgb3JpRGV2aWNlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ0ZYX0RJQml0bWFwKiBDUERGX1JlbmRlclN0YXR1czo6R2V0QmFja2Ryb3AoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBGWF9SRUNUJiByZWN0LCBpbnQmIGxlZnQsIGludCYgdG9wLAotICAgICAgICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCkKKyAgICAgICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQpCiB7CiAgICAgRlhfUkVDVCBiYm94ID0gcmVjdDsKICAgICBiYm94LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CkBAIC04ODIsNyArODgyLDcgQEAKICAgICAgICAgZGVsZXRlIHBCYWNrZHJvcDsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGJvb2wgYk5lZWREcmF3OworICAgIEZYX0JPT0wgYk5lZWREcmF3OwogICAgIGlmIChwQmFja2Ryb3AtPkhhc0FscGhhKCkpIHsKICAgICAgICAgYk5lZWREcmF3ID0gIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKTsKICAgICB9IGVsc2UgewpAQCAtOTExLDcgKzkxMSw3IEBACiAgICAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCAweGZmZmZmZmZmKTsKICAgICBSZW5kZXIoJmRldmljZSwgcE9iaiwgcE9wdGlvbnMsIHBGaW5hbE1hdHJpeCk7CiB9Ci1DUERGX0dyYXBoaWNTdGF0ZXMqIENQREZfUmVuZGVyU3RhdHVzOjpDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTcmNTdGF0ZXMsIGJvb2wgYlN0cm9rZSkKK0NQREZfR3JhcGhpY1N0YXRlcyogQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFNyY1N0YXRlcywgRlhfQk9PTCBiU3Ryb2tlKQogewogICAgIGlmICghcFNyY1N0YXRlcykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTkzMiwxNCArOTMyLDE0IEBACiB7CiB9CiB2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBib29sIGJGaXJzdExheWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJGaXJzdExheWVyKQogewogICAgIG1fcERvY3VtZW50ID0gcERvYzsKICAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CiAgICAgbV9wUGFnZUNhY2hlID0gcFBhZ2VDYWNoZTsKICAgICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIGJvb2wgYkZpcnN0TGF5ZXIpCit2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CiAgICAgbV9wUGFnZVJlc291cmNlcyA9IHBQYWdlLT5tX3BQYWdlUmVzb3VyY2VzOwpAQCAtOTU0LDcgKzk1NCw3IEBACiAgICAgbV9wRG9jdW1lbnQgPSBOVUxMOwogICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBOVUxMOwogICAgIG1fcFBhZ2VDYWNoZSA9IE5VTEw7Ci0gICAgbV9iRmlyc3RMYXllciA9IHRydWU7CisgICAgbV9iRmlyc3RMYXllciA9IFRSVUU7CiAgICAgbV9Db250ZW50TGlzdC5SZW1vdmVBbGwoKTsKIH0KIHZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpBcHBlbmRPYmplY3RMaXN0KENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSkKQEAgLTk4NCw3ICs5ODQsNyBAQAogICAgICAgICAgICAgRmluYWxNYXRyaXguQ29uY2F0KCpwTGFzdE1hdHJpeCk7CiAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBwTGFzdE1hdHJpeCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBmYWxzZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIEZBTFNFLCBOVUxMKTsKICAgICAgICAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBJdGVtLT5tX3BPYmplY3RMaXN0LCAmRmluYWxNYXRyaXgpOwogICAgICAgICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewogICAgICAgICAgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwpAQCAtOTk2LDcgKzk5Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBOVUxMLCBwU3RvcE9iaiwgTlVMTCwgTlVMTCwgcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIGZhbHNlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOwogICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZwSXRlbS0+bV9NYXRyaXgpOwogICAgICAgICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewogICAgICAgICAgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwpAQCAtMTA5MCw3ICsxMDkwLDcgQEAKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy5yZXNldChuZXcgQ1BERl9SZW5kZXJTdGF0dXMoKSk7CiAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkluaXRpYWxpemUoCiAgICAgICAgICAgICAgICAgbV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBtX3BPcHRpb25zLAotICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgZmFsc2UsIE5VTEwpOworICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOwogICAgICAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKICAgICAgICAgICAgIG1fQ2xpcFJlY3QgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggZGV2aWNlMm9iamVjdDsKQEAgLTExNzEsMTAgKzExNzEsMTAgQEAKICAgICB9CiAKICAgICBDUERGX0Z1bmN0aW9uKiBwRnVuY3NbM10gPSB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKLSAgICBib29sIGJVbmlUcmFuc2ZlciA9IHRydWU7Ci0gICAgYm9vbCBiSWRlbnRpdHkgPSB0cnVlOworICAgIEZYX0JPT0wgYlVuaVRyYW5zZmVyID0gVFJVRTsKKyAgICBGWF9CT09MIGJJZGVudGl0eSA9IFRSVUU7CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgYlVuaVRyYW5zZmVyID0gZmFsc2U7CisgICAgICAgIGJVbmlUcmFuc2ZlciA9IEZBTFNFOwogICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKICAgICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDMpCiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAgICAgICAgICAgICAgICAgcEZ1bmNzWzBdLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKICAgICAgICAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKICAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgYklkZW50aXR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYklkZW50aXR5ID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87CiAgICAgICAgICAgICB9CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBwRnVuY3NbaV0tPkNhbGwoJmlucHV0LCAxLCBvdXRwdXQsIG5vdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBwVHJhbnNmZXItPm1fU2FtcGxlc1tpICogMjU2ICsgdl0gPSBvOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IHY7CkBAIC0xMjU4LDcgKzEyNTgsNyBAQAogewogICAgIGRlbGV0ZSBtX3BCaXRtYXA7CiB9Ci1ib29sIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAorRlhfQk9PTCBDUERGX0RldmljZUJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSkKIHsKICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMTI4OSw3ICsxMjg5LDcgQEAKICAgICBGWF9SRUNUIGJpdG1hcF9yZWN0ID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENQREZfRGV2aWNlQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpCiB7CkBAIC0xMzE2LDEzICsxMzE2LDEzIEBACiAgICAgZGVsZXRlIG1fcEJpdG1hcERldmljZTsKIH0KICNkZWZpbmUgX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXwkoMzAgKiAxMDI0ICogMTAyNCkKLWJvb2wgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCitGWF9CT09MIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyAqcE9wdGlvbnMsIGludCBtYXhfZHBpKQogewogICAgIEZYU1lTX2Fzc2VydChwUmVjdCAhPSBOVUxMKTsKICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwogICAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0dFVF9CSVRTKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgbV9wQ29udGV4dCA9IHBDb250ZXh0OwogICAgIG1fUmVjdCA9ICpwUmVjdDsKQEAgLTEzNTcsNyArMTM1Nyw3IEBACiAgICAgICAgIGlIZWlnaHQgPSBiaXRtYXBfcmVjdC5IZWlnaHQoKTsKICAgICAgICAgaVBpdGNoID0gKGlXaWR0aCAqIGJwcCArIDMxKSAvIDMyICogNDsKICAgICAgICAgaWYgKGlXaWR0aCAqIGlIZWlnaHQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlQaXRjaCAqIGlIZWlnaHQgPD0gX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAmJgogICAgICAgICAgICAgICAgIG1fcEJpdG1hcERldmljZS0+Q3JlYXRlKGlXaWR0aCwgaUhlaWdodCwgZGliRm9ybWF0KSkgewpAQCAtMTM2Niw3ICsxMzY2LDcgQEAKICAgICAgICAgbV9NYXRyaXguU2NhbGUoMC41ZiwgMC41Zik7CiAgICAgfQogICAgIG1fcENvbnRleHQtPkdldEJhY2tncm91bmQobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9wT2JqZWN0LCBwT3B0aW9ucywgJm1fTWF0cml4KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6Ok91dHB1dFRvRGV2aWNlKCkKIHsKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAgICAgICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BCaXRtYXBEZXZpY2UtPkdldEJpdG1hcCgpLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7CiAgICAgfQogfQotYm9vbCBJUERGX09DQ29udGV4dDo6Q2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikKK0ZYX0JPT0wgSVBERl9PQ0NvbnRleHQ6OkNoZWNrT2JqZWN0VmlzaWJsZShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopCiB7CiAgICAgY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEqIHBEYXRhID0gcE9iai0+bV9Db250ZW50TWFyazsKICAgICBpbnQgbkl0ZW1zID0gcERhdGEtPkNvdW50SXRlbXMoKTsKQEAgLTEzODMsOSArMTM4Myw5IEBACiAgICAgICAgIGlmIChpdGVtLkdldE5hbWUoKSA9PSBGWF9CU1RSQygiT0MiKSAmJiBpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCkgewogICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwogICAgICAgICAgICAgaWYgKCFDaGVja09DR1Zpc2libGUocE9DRykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcAppbmRleCBkOTc2N2I0Li5jZGJlY2Q2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcApAQCAtMTA4LDE2ICsxMDgsMTYgQEAKICAgICByZXR1cm4gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwogfQogdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwKLSAgICAgICAgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCisgICAgICAgIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAogICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGU7Ci0gICAgYm9vbCBiRmluZCA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpOworICAgIEZYX0JPT0wgYkZpbmQgPSBtX0ltYWdlQ2FjaGVzLkxvb2t1cChwU3RyZWFtLCAodm9pZComKXBJbWFnZUNhY2hlKTsKICAgICBpZiAoIWJGaW5kKSB7CiAgICAgICAgIHBJbWFnZUNhY2hlID0gbmV3IENQREZfSW1hZ2VDYWNoZShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CiAgICAgfQogICAgIG1fblRpbWVDb3VudCArKzsKLSAgICBib29sIGJDYWNoZWQgPSBwSW1hZ2VDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBCaXRtYXAsIHBNYXNrLCBNYXR0ZUNvbG9yLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisgICAgRlhfQk9PTCBiQ2FjaGVkID0gcEltYWdlQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwQml0bWFwLCBwTWFzaywgTWF0dGVDb2xvciwgbV9wUGFnZS0+bV9wUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBkb3duc2FtcGxlV2lkdGgsIGRvd25zYW1wbGVIZWlnaHQpOwogICAgIGlmICghYkZpbmQpIHsKICAgICAgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChwU3RyZWFtLCBwSW1hZ2VDYWNoZSk7CiAgICAgfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICAgIG1fbkNhY2hlU2l6ZSArPSBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CiAgICAgfQogfQotYm9vbAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQorRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIG1fYkN1ckZpbmRDYWNoZSA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpbV9wQ3VySW1hZ2VDYWNoZSk7CiAgICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICBpbnQgcmV0ID0gbV9wQ3VySW1hZ2VDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAocFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgbV9uVGltZUNvdW50ICsrOwogICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7CkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogICAgIGlmICghcmV0KSB7CiAgICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wJQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgbV9uVGltZUNvdW50ICsrOwogICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBpZiAoIXJldCkgewogICAgICAgICBtX25DYWNoZVNpemUgKz0gbV9wQ3VySW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiB2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQogewpAQCAtMjIyLDE4ICsyMjIsMTggQEAKIHsKICAgICByZXR1cm4gcERJQiAmJiBwRElCLT5HZXRCdWZmZXIoKSA/IChGWF9EV09SRClwRElCLT5HZXRIZWlnaHQoKSAqIHBESUItPkdldFBpdGNoKCkgKyAoRlhfRFdPUkQpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQgOiAwOwogfQotYm9vbCBDUERGX0ltYWdlQ2FjaGU6OkdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCitGWF9CT09MIENQREZfSW1hZ2VDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkKIHsKICAgICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CiAgICAgICAgIHBCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7CiAgICAgICAgIHBNYXNrID0gbV9wQ2FjaGVkTWFzazsKICAgICAgICAgTWF0dGVDb2xvciA9IG1fTWF0dGVDb2xvcjsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoIXBSZW5kZXJTdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfUmVuZGVyQ29udGV4dCpwQ29udGV4dCA9IHBSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKTsKICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VSZW5kZXJDYWNoZSA9IHBDb250ZXh0LT5tX3BQYWdlQ2FjaGU7CkBAIC0yNDMsNyArMjQzLDcgQEAKICAgICBpZiAoIXBTcmMtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgJnBNYXNrU3JjLCAmTWF0dGVDb2xvciwgcFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKSkgewogICAgICAgICBkZWxldGUgcFNyYzsKICAgICAgICAgcEJpdG1hcCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX01hdHRlQ29sb3IgPSBNYXR0ZUNvbG9yOwogICAgIGlmIChwU3JjLT5HZXRQaXRjaCgpICogcFNyYy0+R2V0SGVpZ2h0KCkgPCBGUERGX0hVR0VfSU1BR0VfU0laRSkgewpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgcEJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKICAgICBwTWFzayA9IG1fcENhY2hlZE1hc2s7CiAgICAgQ2FsY1NpemUoKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlOjpEZXRhY2hCaXRtYXAoKQogewpAQCAtMjc0LDggKzI3NCw4IEBACiAgICAgbV9wQ3VyTWFzayA9IE5VTEw7CiAgICAgcmV0dXJuIHBESUJTb3VyY2U7CiB9Ci1pbnQJQ1BERl9JbWFnZUNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBib29sIGJTdGRDUywKLSAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKK2ludAlDUERGX0ltYWdlQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAogICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIH0KICAgICBtX3BSZW5kZXJTdGF0dXMgPSBwUmVuZGVyU3RhdHVzOwogICAgIG1fcEN1ckJpdG1hcCA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIHRydWUsIHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKICAgICBpZiAocmV0ID09IDIpIHsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICBpZiAobV9wRG9jUmVuZGVyKSB7CiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9IG1fcERvY1JlbmRlci0+R2V0Rm9udENhY2hlKCk7CiAgICAgICAgIGlmIChwQ2FjaGUpIHsKLSAgICAgICAgICAgIHBDYWNoZS0+RnJlZUNhY2hlKGZhbHNlKTsKKyAgICAgICAgICAgIHBDYWNoZS0+RnJlZUNhY2hlKEZBTFNFKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKaW5kZXggMjU4YWQxMS4uZmE5MzI1YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKIAotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyOwogICAgIGlmIChyZW5kZXIuU3RhcnQodGhpcywgcEltYWdlT2JqLCBwT2JqMkRldmljZSwgbV9iU3RkQ1MsIG1fY3VyQmxlbmQpKSB7CkBAIC0yNyw4ICsyNyw4IEBACiAgICAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBiSXNvbGF0ZWQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRDsKLSAgICBib29sIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOworICAgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CisgICAgRlhfQk9PTCBiR3JvdXAgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUDsKICAgICBpZiAoYmxlbmRfbW9kZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpIHsKICAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKQEAgLTQ3LDggKzQ3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKLSAgICBib29sIGJHZXRCYWNrR3JvdW5kID0gKChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSkgfHwKKyAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKKyAgICBGWF9CT09MIGJHZXRCYWNrR3JvdW5kID0gKChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGWFJDX0dFVF9CSVRTKSAmJiAhYkJhY2tBbHBoYVJlcXVpcmVkKTsKICAgICBpZiAoYkdldEJhY2tHcm91bmQpIHsKQEAgLTYxLDkgKzYxLDkgQEAKICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOwogICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBOVUxMOwotICAgICAgICAgICAgYm9vbCBiQ2xvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkNsb25lID0gRkFMU0U7CiAgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKLSAgICAgICAgICAgICAgICBiQ2xvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJDbG9uZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7CiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwRm9yZUJpdG1hcCA9IG1fcERldmljZS0+R2V0Qml0bWFwKCk7CiAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICByZXR1cm4gRlhTWVNfUkdCKG1fU2FtcGxlc1tGWFNZU19HZXRSVmFsdWUocmdiKV0sIG1fU2FtcGxlc1syNTYgKyBGWFNZU19HZXRHVmFsdWUocmdiKV0sCiAgICAgICAgICAgICAgICAgICAgICBtX1NhbXBsZXNbNTEyICsgRlhTWVNfR2V0QlZhbHVlKHJnYildKTsKIH0KLUNGWF9ESUJTb3VyY2UqIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYykKK0NGWF9ESUJTb3VyY2UqIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYykKIHsKICAgICBDUERGX0RJQlRyYW5zZmVyRnVuYyogcERlc3QgPSBuZXcgQ1BERl9ESUJUcmFuc2ZlckZ1bmModGhpcyk7CiAgICAgcERlc3QtPkxvYWRTcmMocFNyYywgYkF1dG9Ecm9wU3JjKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogdm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYpIGNvbnN0CiB7CiAgICAgaW50IGk7Ci0gICAgYm9vbCBiU2tpcCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlNraXAgPSBGQUxTRTsKICAgICBzd2l0Y2ggKG1fcFNyYy0+R2V0Rm9ybWF0KCkpIHsKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CiAgICAgICAgICAgICAgICAgaW50IHIwID0gbV9SYW1wUlswXSwgZzAgPSBtX1JhbXBHWzBdLCBiMCA9IG1fUmFtcEJbMF07CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgYlNraXAgPSB0cnVlOworICAgICAgICAgICAgYlNraXAgPSBUUlVFOwogICAgICAgICBjYXNlIEZYRElCX0FyZ2I6CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewogICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQlsqKHNyY19idWYrKyldOwpAQCAtMjY2LDMxICsyNjYsMzEgQEAKICAgICAgICAgICAgIH0KICAgICB9CiB9Ci1zdGF0aWMgYm9vbCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCitzdGF0aWMgRlhfQk9PTCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCiB7CiAgICAgaWYgKHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFUkdCIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fAogICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfQ0FMR1JBWSB8fAogICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19DQUxSR0IpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAocENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEICYmIF9Jc1N1cHBvcnRlZChwQ1MtPkdldEJhc2VDUygpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDUERGX0ltYWdlUmVuZGVyZXI6OkNQREZfSW1hZ2VSZW5kZXJlcigpCiB7CiAgICAgbV9wUmVuZGVyU3RhdHVzID0gTlVMTDsKICAgICBtX3BJbWFnZU9iamVjdCA9IE5VTEw7Ci0gICAgbV9SZXN1bHQgPSB0cnVlOworICAgIG1fUmVzdWx0ID0gVFJVRTsKICAgICBtX1N0YXR1cyA9IDA7CiAgICAgbV9wUXVpY2tTdHJldGNoZXIgPSBOVUxMOwogICAgIG1fcFRyYW5zZm9ybWVyID0gTlVMTDsKICAgICBtX0RldmljZUhhbmRsZSA9IE5VTEw7CiAgICAgbV9Mb2FkSGFuZGxlID0gTlVMTDsKICAgICBtX3BDbG9uZSA9IE5VTEw7Ci0gICAgbV9iU3RkQ1MgPSBmYWxzZTsKLSAgICBtX2JQYXR0ZXJuQ29sb3IgPSBmYWxzZTsKKyAgICBtX2JTdGRDUyA9IEZBTFNFOworICAgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogICAgIG1fcFBhdHRlcm4gPSBOVUxMOwogICAgIG1fcE9iajJEZXZpY2UgPSBOVUxMOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgZGVsZXRlIChDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqKW1fTG9hZEhhbmRsZTsKICAgICBkZWxldGUgbV9wQ2xvbmU7CiB9Ci1ib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRMb2FkRElCU291cmNlKCkKK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydExvYWRESUJTb3VyY2UoKQogewogICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC0zMjEsMTYgKzMyMSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fR3JvdXBGYW1pbHksIG1fcFJlbmRlclN0YXR1cy0+bV9iTG9hZE1hc2ssIG1fcFJlbmRlclN0YXR1cywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpKSB7CiAgICAgICAgIGlmIChtX0xvYWRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgbV9TdGF0dXMgPSA0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydFJlbmRlckRJQlNvdXJjZSgpCitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRSZW5kZXJESUJTb3VyY2UoKQogewogICAgIGlmIChtX0xvYWRlci5tX3BCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9CaXRtYXBBbHBoYSA9IDI1NTsKICAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGU7CkBAIC0zNTAsMTggKzM1MCwxOCBAQAogICAgICAgICAgICAgaWYgKG1fTG9hZGVyLm1fYkNhY2hlZCAmJiBtX0xvYWRlci5tX3BNYXNrKSB7CiAgICAgICAgICAgICAgICAgbV9Mb2FkZXIubV9wTWFzayA9IG1fTG9hZGVyLm1fcE1hc2stPkNsb25lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0xvYWRlci5tX2JDYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fTG9hZGVyLm1fYkNhY2hlZCA9IEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIG1fRmlsbEFyZ2IgPSAwOwotICAgIG1fYlBhdHRlcm5Db2xvciA9IGZhbHNlOworICAgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOwogICAgIG1fcFBhdHRlcm4gPSBOVUxMOwogICAgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgQ1BERl9Db2xvciogcENvbG9yID0gbV9wSW1hZ2VPYmplY3QtPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKICAgICAgICAgaWYgKHBDb2xvciAmJiBwQ29sb3ItPklzUGF0dGVybigpKSB7CiAgICAgICAgICAgICBtX3BQYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7CiAgICAgICAgICAgICBpZiAobV9wUGF0dGVybiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9iUGF0dGVybkNvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JQYXR0ZXJuQ29sb3IgPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1fRmlsbEFyZ2IgPSBtX3BSZW5kZXJTdGF0dXMtPkdldEZpbGxBcmdiKG1fcEltYWdlT2JqZWN0KTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogICAgIH0KICAgICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKIH0KLWJvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlKQogewogICAgIG1fcFJlbmRlclN0YXR1cyA9IHBTdGF0dXM7CiAgICAgbV9iU3RkQ1MgPSBiU3RkQ1M7CkBAIC00MzksMTcgKzQzOSwxNyBAQAogICAgIG1fcE9iajJEZXZpY2UgPSBwT2JqMkRldmljZTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0T0MoKTsKICAgICBpZiAocE9DICYmIG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiAhbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09DR1Zpc2libGUocE9DKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9JbWFnZU1hdHJpeCA9IG1fcEltYWdlT2JqZWN0LT5tX01hdHJpeDsKICAgICBtX0ltYWdlTWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwogICAgIGlmIChTdGFydExvYWRESUJTb3VyY2UoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBTdGFydFJlbmRlckRJQlNvdXJjZSgpOwogfQotYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIEZYX0RXT1JEIGZsYWdzLCBib29sIGJTdGRDUywgaW50IGJsZW5kVHlwZSkKK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCiB7CiAgICAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKICAgICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOwpAQCAtNDYxLDE2ICs0NjEsMTYgQEAKICAgICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsKICAgICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKIH0KLWJvb2wJQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3UGF0dGVybkltYWdlKGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKQorRlhfQk9PTAlDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0ID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpLkdldE91dHRlclJlY3QoKTsKICAgICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7CiAgICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CkBAIC00NzgsMzIgKzQ3OCwzMiBAQAogICAgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOwogICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UxOwogICAgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKICAgICB7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucywgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwogICAgICAgICBDRlhfTWF0cml4IHBhdHRlcm5EZXZpY2UgPSAqcE9iajJEZXZpY2U7CiAgICAgICAgIHBhdHRlcm5EZXZpY2UuVHJhbnNsYXRlKChGWF9GTE9BVCkgLSByZWN0LmxlZnQsIChGWF9GTE9BVCkgLSByZWN0LnRvcCk7CiAgICAgICAgIGlmKG1fcFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gUEFUVEVSTl9USUxJTkcpIHsKLSAgICAgICAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4oKENQREZfVGlsaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBmYWxzZSk7CisgICAgICAgICAgICBiaXRtYXBfcmVuZGVyLkRyYXdUaWxpbmdQYXR0ZXJuKChDUERGX1RpbGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgRkFMU0UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3U2hhZGluZ1BhdHRlcm4oKENQREZfU2hhZGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgZmFsc2UpOworICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3U2hhZGluZ1BhdHRlcm4oKENQREZfU2hhZGluZ1BhdHRlcm4qKW1fcFBhdHRlcm4sIG1fcEltYWdlT2JqZWN0LCAmcGF0dGVybkRldmljZSwgRkFMU0UpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNsZWFyKDApOwogICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwogICAgICAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwogICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDB4ZmZmZmZmZmYsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIHRydWUpKSB7CisgICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKICAgICAgICAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKQEAgLTU0OSwxOCArNTQ5LDE4IEBACiAgICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKDI1NSk7CiAgICAgfQogICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdNYXNrZWRJbWFnZSgpCitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd01hc2tlZEltYWdlKCkKIHsKICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOwogICAgIHJlY3QuSW50ZXJzZWN0KG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gbV9JbWFnZU1hdHJpeDsKICAgICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKQEAgLTU2OCwyOSArNTY4LDI5IEBACiAgICAgaW50IGhlaWdodCA9IHJlY3QuSGVpZ2h0KCk7CiAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7CiAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKICAgICB7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CiAgICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMCwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgdHJ1ZSkpIHsKKyAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAwLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCBUUlVFKSkgewogICAgICAgICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKICAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKICAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKLSAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9Mb2FkZXIubV9wTWFzaywgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgdHJ1ZSkpIHsKKyAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9Mb2FkZXIubV9wTWFzaywgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKICAgICAgICAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKQEAgLTYzOCw5ICs2MzgsOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkKK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydERJQlNvdXJjZSgpCiB7CiAgICAgaWYgKCEobV9GbGFncyAmIFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFKSAmJiBtX3BESUJTb3VyY2UtPkdldEJQUCgpID4gMSkgewogICAgICAgICBpbnQgaW1hZ2Vfc2l6ZSA9IG1fcERJQlNvdXJjZS0+R2V0QlBQKCkgLyA4ICogbV9wRElCU291cmNlLT5HZXRXaWR0aCgpICogbV9wRElCU291cmNlLT5HZXRIZWlnaHQoKTsKQEAgLTY1Miw5ICs2NTIsOSBAQAogICAgICAgICAgICAgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsIG1fRGV2aWNlSGFuZGxlLCAwLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsKICAgICAgICAgaWYgKG1fRGV2aWNlSGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1fU3RhdHVzID0gMzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC02NjMsMTUgKzY2MywxNSBAQAogICAgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8CiAgICAgICAgICAgICAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApICkgewogICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICAgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICAgICAgICBtX1N0YXR1cyA9IDI7CiAgICAgICAgIG1fcFRyYW5zZm9ybWVyID0gbmV3IENGWF9JbWFnZVRyYW5zZm9ybWVyOwogICAgICAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQobV9wRElCU291cmNlLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgewogICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CkBAIC02ODUsNyArNjg1LDcgQEAKICAgICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkgJiYgbV9CaXRtYXBBbHBoYSA9PSAyNTUpIHsKICAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgTlVMTCwgbV9CbGVuZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewpAQCAtNjkzLDEyICs2OTMsMTIgQEAKICAgICAgICAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RyZXRjaEJpdE1hc2sobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GaWxsQXJnYiwgbV9GbGFncykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgRlhfUkVDVCBkZXN0X3JlY3QgPSBjbGlwX2JveDsKQEAgLTcwOCwxMyArNzA4LDEzIEBACiAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gbV9wRElCU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsICZkZXN0X2NsaXApOwogICAgIGlmIChwU3RyZXRjaGVkKSB7CiAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+Q29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIG1fRmlsbEFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CaXRtYXBBbHBoYSwgbV9CbGVuZFR5cGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdG1hcEFscGhhLCBtX0JsZW5kVHlwZSwgRkFMU0UpOwogICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKICAgICAgICAgcFN0cmV0Y2hlZCA9IE5VTEw7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRCaXRtYXBBbHBoYSgpCitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRCaXRtYXBBbHBoYSgpCiB7CiAgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpKSB7CiAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICAgICAgICBpbnQgbGVmdCwgdG9wOwogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwQWxwaGFNYXNrLT5UcmFuc2Zvcm1UbygmbV9JbWFnZU1hdHJpeCwgbGVmdCwgdG9wKTsKICAgICAgICAgICAgIGlmIChwVHJhbnNmb3JtZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2socFRyYW5zZm9ybWVkLCBsZWZ0LCB0b3AsIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOwogICAgICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKQEAgLTc0NiwxMyArNzQ2LDEzIEBACiAgICAgICAgICAgICBkZWxldGUgcEFscGhhTWFzazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7CiAgICAgICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcC0+SXNBbHBoYU1hc2soKSkKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKG1fcFF1aWNrU3RyZXRjaGVyLT5tX3BCaXRtYXAsIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdExlZnQsCkBAIC03NjAsMTUgKzc2MCwxNSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKG1fcFF1aWNrU3RyZXRjaGVyLT5tX3BCaXRtYXAsIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDIpIHsKICAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5tX1N0b3Jlci5EZXRhY2goKTsKICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKQEAgLTc4NCwyMCArNzg0LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDMpIHsKICAgICAgICAgcmV0dXJuIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhtX0RldmljZUhhbmRsZSwgcFBhdXNlKTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDQpIHsKICAgICAgICAgaWYgKG1fTG9hZGVyLkNvbnRpbnVlKG1fTG9hZEhhbmRsZSwgcFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoU3RhcnRSZW5kZXJESUJTb3VyY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENQREZfUXVpY2tTdHJldGNoZXI6OkNQREZfUXVpY2tTdHJldGNoZXIoKQogewpAQCAtODE1LDEwICs4MTUsMTAgQEAKIH0KIElDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7Ci1ib29sIENQREZfUXVpY2tTdHJldGNoZXI6OlN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpCitGWF9CT09MIENQREZfUXVpY2tTdHJldGNoZXI6OlN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpCiB7CiAgICAgaWYgKEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YSkgPCBGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmIpICogMTAgJiYgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5kKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YykgKiAxMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBwSW1hZ2UyRGV2aWNlLT5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CkBAIC04MjksNyArODI5LDcgQEAKICAgICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gKnBDbGlwQm94OwogICAgIHJlc3VsdF9yZWN0LkludGVyc2VjdChpbWFnZV9yZWN0KTsKICAgICBpZiAocmVzdWx0X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX1Jlc3VsdFdpZHRoID0gcmVzdWx0X3JlY3QuV2lkdGgoKTsKICAgICBtX1Jlc3VsdEhlaWdodCA9IHJlc3VsdF9yZWN0LkhlaWdodCgpOwpAQCAtODM5LDEwICs4MzksMTAgQEAKICAgICBtX0NsaXBUb3AgPSByZXN1bHRfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcDsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0RGljdCgpOwogICAgIGlmIChwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKSAhPSA4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTTWFzayIpKSB8fCBwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1hc2siKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fU3JjV2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7CiAgICAgbV9TcmNIZWlnaHQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOwpAQCAtODUwLDE0ICs4NTAsMTQgQEAKICAgICBtX0JwcCA9IDM7CiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CiAgICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREb2N1bWVudCgpLCBwQ1NPYmopOwogICAgIGlmIChtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIV9Jc1N1cHBvcnRlZChtX3BDUykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fQnBwID0gbV9wQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgIGlmIChtX3BDUy0+c1JHQigpKSB7CkBAIC04NjUsNyArODY1LDcgQEAKICAgICAgICAgbV9wQ1MgPSBOVUxMOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpOwotICAgIG1fU3RyZWFtQWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlLCBtX1NyY1dpZHRoICogbV9TcmNIZWlnaHQgKiBtX0JwcCwgdHJ1ZSk7CisgICAgbV9TdHJlYW1BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIG1fQnBwLCBUUlVFKTsKICAgICBtX3BEZWNvZGVyID0gTlVMTDsKICAgICBpZiAoIW1fU3RyZWFtQWNjLkdldEltYWdlRGVjb2RlcigpLklzRW1wdHkoKSkgewogICAgICAgICBpZiAobV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7CkBAIC04NzgsNyArODc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0RGF0YSgpLCBtX1N0cmVhbUFjYy5HZXRTaXplKCksIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBtX0JwcCwgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBtX3BEZWNvZGVyLT5Eb3duU2NhbGUobV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCk7CiAgICAgfQpAQCAtODg5LDkgKzg4OSw5IEBACiAgICAgbV9wQml0bWFwLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIEZYRElCX1JnYik7CiAjZW5kaWYKICAgICBtX0xpbmVJbmRleCA9IDA7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfUXVpY2tTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTCBDUERGX1F1aWNrU3RyZXRjaGVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICB1aW50OF90KiByZXN1bHRfYnVmID0gbV9wQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgICBpbnQgc3JjX3dpZHRoID0gbV9wRGVjb2RlciA/IG1fcERlY29kZXItPkdldFdpZHRoKCkgOiBtX1NyY1dpZHRoOwpAQCAtOTQ1LDEwICs5NDUsMTAgQEAKICAgICAgICAgfQogICAgICAgICBtX0xpbmVJbmRleCArKzsKICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENGWF9ESUJpdG1hcCogQ1BERl9SZW5kZXJTdGF0dXM6OkxvYWRTTWFzayhDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QsCiAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKQEAgLTk1OSw3ICs5NTksNyBAQAogICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBOVUxMOwogICAgIGludCB3aWR0aCA9IHBDbGlwUmVjdC0+cmlnaHQgLSBwQ2xpcFJlY3QtPmxlZnQ7CiAgICAgaW50IGhlaWdodCA9IHBDbGlwUmVjdC0+Ym90dG9tIC0gcENsaXBSZWN0LT50b3A7Ci0gICAgYm9vbCBiTHVtaW5vc2l0eSA9IGZhbHNlOworICAgIEZYX0JPT0wgYkx1bWlub3NpdHkgPSBGQUxTRTsKICAgICBiTHVtaW5vc2l0eSA9IHBTTWFza0RpY3QtPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTIikpICE9IEZYX0JTVFJDKCJBbHBoYSIpOwogICAgIENQREZfU3RyZWFtKiBwR3JvdXAgPSBwU01hc2tEaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIkciKSk7CiAgICAgaWYgKHBHcm91cCA9PSBOVUxMKSB7CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogICAgIG9wdGlvbnMubV9Db2xvck1vZGUgPSBiTHVtaW5vc2l0eSA/IFJFTkRFUl9DT0xPUl9OT1JNQUwgOiBSRU5ERVJfQ09MT1JfQUxQSEE7CiAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwogICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgdHJ1ZSwgTlVMTCwgMCwgcENTID8gcENTLT5HZXRGYW1pbHkoKSA6IDAsIGJMdW1pbm9zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIFRSVUUsIE5VTEwsIDAsIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7CiAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QoJmZvcm0sICZtYXRyaXgpOwogICAgIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAKaW5kZXggMDg2MTA0OC4uN2QxN2U3OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2ssIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaykgY29uc3QKK0NGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzaywgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKSBjb25zdAogewogICAgIENQREZfRElCU291cmNlKiBwU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwogICAgIGlmIChwU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIChDUERGX0RJQlNvdXJjZSoqKXBwTWFzaywgcE1hdHRlQ29sb3IsIE5VTEwsIE5VTEwsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaykpIHsKQEAgLTEyNiwzNiArMTI2LDM2IEBACiAgICAgbV9wTWFzayA9IE5VTEw7CiAgICAgcmV0dXJuIHBCaXRtYXA7CiB9Ci1ib29sIENQREZfSW1hZ2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaykKK0ZYX0JPT0wgQ1BERl9JbWFnZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQogewogICAgIG1fcERJQlNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIHRydWUsIHBGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7CisgICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCBUUlVFLCBwRm9ybVJlc291cmNlLCBwUGFnZVJlc291cmNlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwogICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghcmV0KSB7CiAgICAgICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7CiAgICAgICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOwogICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0ltYWdlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wgQ1BERl9JbWFnZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwogICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghcmV0KSB7CiAgICAgICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7CiAgICAgICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOwogICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogQ1BERl9ESUJTb3VyY2U6OkNQREZfRElCU291cmNlKCkKIHsKQEAgLTE2NSwyNiArMTY1LDI2IEBACiAgICAgbV9icHAgPSAwOwogICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7CiAgICAgbV9wQ29sb3JTcGFjZSA9IE5VTEw7Ci0gICAgbV9iRGVmYXVsdERlY29kZSA9IHRydWU7Ci0gICAgbV9iSW1hZ2VNYXNrID0gZmFsc2U7Ci0gICAgbV9iRG9CcGNDaGVjayA9IHRydWU7CisgICAgbV9iRGVmYXVsdERlY29kZSA9IFRSVUU7CisgICAgbV9iSW1hZ2VNYXNrID0gRkFMU0U7CisgICAgbV9iRG9CcGNDaGVjayA9IFRSVUU7CiAgICAgbV9wUGFsZXR0ZSA9IE5VTEw7CiAgICAgbV9wQ29tcERhdGEgPSBOVUxMOwotICAgIG1fYkNvbG9yS2V5ID0gZmFsc2U7CisgICAgbV9iQ29sb3JLZXkgPSBGQUxTRTsKICAgICBtX3BNYXNrZWRMaW5lID0gbV9wTGluZUJ1ZiA9IE5VTEw7CiAgICAgbV9wRGVjb2RlciA9IE5VTEw7CiAgICAgbV9uQ29tcG9uZW50cyA9IDA7CiAgICAgbV9icGMgPSAwOwotICAgIG1fYkxvYWRNYXNrID0gZmFsc2U7CisgICAgbV9iTG9hZE1hc2sgPSBGQUxTRTsKICAgICBtX0ZhbWlseSA9IDA7CiAgICAgbV9wTWFzayA9IE5VTEw7CiAgICAgbV9NYXR0ZUNvbG9yID0gMDsKICAgICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOwogICAgIG1fcEdsb2JhbFN0cmVhbSA9IE5VTEw7Ci0gICAgbV9iU3RkQ1MgPSBmYWxzZTsKKyAgICBtX2JTdGRDUyA9IEZBTFNFOwogICAgIG1fcE1hc2tTdHJlYW0gPSBOVUxMOwogICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX2JIYXNNYXNrID0gZmFsc2U7CisgICAgbV9iSGFzTWFzayA9IEZBTFNFOwogfQogQ1BERl9ESUJTb3VyY2U6On5DUERGX0RJQlNvdXJjZSgpCiB7CkBAIC0yMjAsNDMgKzIyMCw0MyBAQAogICAgICAgICBkZWxldGUgcEJpdG1hcDsKICAgICB9CiB9Ci1ib29sIENQREZfRElCU291cmNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0RJQlNvdXJjZSoqIHBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrKQorRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9ESUJTb3VyY2UqKiBwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BEb2N1bWVudCA9IHBEb2M7CiAgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwogICAgIG1fV2lkdGggPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKICAgICBtX0hlaWdodCA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKICAgICBpZiAobV9XaWR0aCA8PSAwIHx8IG1fSGVpZ2h0IDw9IDAgfHwgbV9XaWR0aCA+IDB4MDFmZmZmIHx8IG1fSGVpZ2h0ID4gMHgwMWZmZmYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fR3JvdXBGYW1pbHkgPSBHcm91cEZhbWlseTsKICAgICBtX2JMb2FkTWFzayA9IGJMb2FkTWFzazsKICAgICBpZiAoIUxvYWRDb2xvckluZm8obV9wU3RyZWFtLT5HZXRPYmpOdW0oKSAhPSAwID8gTlVMTCA6IHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1NBRkVfRFdPUkQgc3JjX3BpdGNoID0KICAgICAgICAgQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCBtX0hlaWdodCk7CiAgICAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BTdHJlYW1BY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgdHJ1ZSk7CisgICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgVFJVRSk7CiAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFDcmVhdGVEZWNvZGVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX2JJbWFnZU1hc2spIHsKICAgICAgICAgbV9icHAgPSAxOwpAQCAtMjcyLDExICsyNzIsMTEgQEAKICAgICB9CiAgICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOwogICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBiU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbih0cnVlKTsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihUUlVFKTsKICAgICB9CiAgICAgTG9hZFBhbGV0dGUoKTsKICAgICBpZiAobV9iQ29sb3JLZXkpIHsKQEAgLTI4NCw3ICsyODQsNyBAQAogICAgICAgICBtX0FscGhhRmxhZyA9IDI7CiAgICAgICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CiAgICAgICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CiAgICAgfQpAQCAtMjkzLDkgKzI5Myw5IEBACiAgICAgICAgICpwcE1hc2sgPSBMb2FkTWFzaygqcE1hdHRlQ29sb3IpOwogICAgIH0KICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBiU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihmYWxzZSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludAlDUERGX0RJQlNvdXJjZTo6Q29udGludWVUb0xvYWRNYXNrKCkKIHsKQEAgLTMyMCw3ICszMjAsNyBAQAogICAgIH0KICAgICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKHRydWUpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOwogICAgIH0KICAgICBMb2FkUGFsZXR0ZSgpOwogICAgIGlmIChtX2JDb2xvcktleSkgewpAQCAtMzM1LDkgKzMzNSw5IEBACiAgICAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKICAgICByZXR1cm4gMTsKIH0KLWludAlDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJIYXNNYXNrLAoraW50CUNQREZfRElCU291cmNlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2spCiB7CiAgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbV9wU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIHRydWUpOworICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIFRSVUUpOwogICAgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzkzLDcgKzM5Myw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwR2xvYmFscyA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkpCSUcyR2xvYmFscyIpKTsKICAgICAgICAgICAgICAgICBpZiAocEdsb2JhbHMpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0tPkxvYWRBbGxEYXRhKHBHbG9iYWxzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIEZBTFNFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBwSmJpZzJNb2R1bGUtPlN0YXJ0RGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICB9CkBAIC00NjMsNyArNDYzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXQxOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQxOwogICAgIH0KQEAgLTQ3MiwxMSArNDcyLDExIEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotYm9vbCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKQorRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKQogewogICAgIG1fYnBjX29yaWcgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwogICAgIGlmIChtX3BEaWN0LT5HZXRJbnRlZ2VyKCJJbWFnZU1hc2siKSkgewotICAgICAgICBtX2JJbWFnZU1hc2sgPSB0cnVlOworICAgICAgICBtX2JJbWFnZU1hc2sgPSBUUlVFOwogICAgIH0KICAgICBpZiAobV9iSW1hZ2VNYXNrIHx8ICFtX3BEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKSkgewogICAgICAgICBpZiAoIW1fYkltYWdlTWFzaykgewpAQCAtNDg2LDI3ICs0ODYsMjcgQEAKICAgICAgICAgICAgICAgICBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewogICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBBcnJheS0+R2V0U3RyaW5nKHBBcnJheS0+R2V0Q291bnQoKSAtIDEpID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtX2JJbWFnZU1hc2sgPSB0cnVlOworICAgICAgICBtX2JJbWFnZU1hc2sgPSBUUlVFOwogICAgICAgICBtX2JwYyA9IG1fbkNvbXBvbmVudHMgPSAxOwogICAgICAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gbV9wRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKICAgICAgICAgbV9iRGVmYXVsdERlY29kZSA9IHBEZWNvZGUgPT0gTlVMTCB8fCBwRGVjb2RlLT5HZXRJbnRlZ2VyKDApID09IDA7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKICAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwogICAgIGlmIChwRm9ybVJlc291cmNlcykgewpAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgICAgIG1fcENvbG9yU3BhY2UgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fRmFtaWx5ID0gbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCk7CiAgICAgbV9uQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOwpAQCAtNTMzLDExICs1MzMsMTEgQEAKICAgICBWYWxpZGF0ZURpY3RQYXJhbSgpOwogICAgIG1fcENvbXBEYXRhID0gR2V0RGVjb2RlQW5kTWFza0FycmF5KG1fYkRlZmF1bHREZWNvZGUsIG1fYkNvbG9yS2V5KTsKICAgICBpZiAobV9wQ29tcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KGJvb2wmIGJEZWZhdWx0RGVjb2RlLCBib29sJiBiQ29sb3JLZXkpCitESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLCBGWF9CT09MJiBiQ29sb3JLZXkpCiB7CiAgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgICAgICAgICAgICAgIGRlZl9tYXggPSAoRlhfRkxPQVQpbWF4X2RhdGE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVmX21pbiAhPSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gfHwgZGVmX21heCAhPSBtYXgpIHsKLSAgICAgICAgICAgICAgICBiRGVmYXVsdERlY29kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJEZWZhdWx0RGVjb2RlID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNTg0LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWF4ID0gRlhfTUlOKG1heF9udW0sIG1heF9kYXRhKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiQ29sb3JLZXkgPSB0cnVlOworICAgICAgICAgICAgYkNvbG9yS2V5ID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcENvbXBEYXRhOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAgICAgICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLAogICAgICAgICAgICAgcFBhcmFtcyA/IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMSkgOiAxKTsKICAgICAgICAgaWYgKCFtX3BEZWNvZGVyKSB7Ci0gICAgICAgICAgICBib29sIGJUcmFuc2Zvcm0gPSBmYWxzZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zZm9ybSA9IEZBTFNFOwogICAgICAgICAgICAgaW50IGNvbXBzLCBicGM7CiAgICAgICAgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKTsKICAgICAgICAgICAgIGlmIChwSnBlZ01vZHVsZS0+TG9hZEluZm8oc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgY29tcHMsIGJwYywgYlRyYW5zZm9ybSkpIHsKQEAgLTY5MywyOSArNjkzLDI5IEBACiAgICAgICAgIHJldHVybjsKIAogICAgIGludCBvdXRwdXRfbkNvbXBzOwotICAgIGJvb2wgYlRyYW5zbGF0ZUNvbG9yOwotICAgIGJvb2wgYlN3YXBSR0IgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJUcmFuc2xhdGVDb2xvcjsKKyAgICBGWF9CT09MIGJTd2FwUkdCID0gRkFMU0U7CiAgICAgaWYgKG1fcENvbG9yU3BhY2UpIHsKICAgICAgICAgaWYgKGNvZGVzdHJlYW1fbkNvbXBzICE9IChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgb3V0cHV0X25Db21wcyA9IGNvZGVzdHJlYW1fbkNvbXBzOwotICAgICAgICBiVHJhbnNsYXRlQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7CiAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlID09IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpKSB7Ci0gICAgICAgICAgICBiU3dhcFJHQiA9IHRydWU7CisgICAgICAgICAgICBiU3dhcFJHQiA9IFRSVUU7CiAgICAgICAgICAgICBtX3BDb2xvclNwYWNlID0gbnVsbHB0cjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IHRydWU7CisgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IFRSVUU7CiAgICAgICAgIGlmIChpbWFnZV9uQ29tcHMpIHsKICAgICAgICAgICAgIG91dHB1dF9uQ29tcHMgPSBpbWFnZV9uQ29tcHM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG91dHB1dF9uQ29tcHMgPT0gMykgewotICAgICAgICAgICAgYlN3YXBSR0IgPSB0cnVlOworICAgICAgICAgICAgYlN3YXBSR0IgPSBUUlVFOwogICAgICAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPT0gNCkgewogICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IGZhbHNlOworICAgICAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG91dHB1dF9uQ29tcHM7CiAgICAgfQpAQCAtODI5LDcgKzgyOSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKICAgICB9CiAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgZGVsZXRlIG1fcE1hc2s7CkBAIC04NDcsNyArODQ3LDcgQEAKIENQREZfRElCU291cmNlKiBDUERGX0RJQlNvdXJjZTo6TG9hZE1hc2tESUIoQ1BERl9TdHJlYW0qIHBNYXNrKQogewogICAgIENQREZfRElCU291cmNlKiBwTWFza1NvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpZiAoIXBNYXNrU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBwTWFzaywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgdHJ1ZSkpIHsKKyAgICBpZiAoIXBNYXNrU291cmNlLT5Mb2FkKG1fcERvY3VtZW50LCBwTWFzaywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSkpIHsKICAgICAgICAgZGVsZXRlIHBNYXNrU291cmNlOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC04NTYsNyArODU2LDcgQEAKIGludCBDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkTWFza0RJQigpCiB7CiAgICAgbV9wTWFzayA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCAoQ1BERl9TdHJlYW0qKW1fcE1hc2tTdHJlYW0sIGZhbHNlLCBOVUxMLCBOVUxMLCB0cnVlKTsKKyAgICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCAoQ1BERl9TdHJlYW0qKW1fcE1hc2tTdHJlYW0sIEZBTFNFLCBOVUxMLCBOVUxMLCBUUlVFKTsKICAgICBpZiAocmV0ID09IDIpIHsKICAgICAgICAgaWYgKG1fU3RhdHVzID09IDApIHsKICAgICAgICAgICAgIG1fU3RhdHVzID0gMjsKQEAgLTEyMDksMTUgKzEyMDksMTUgQEAKICAgICB9CiAgICAgcmV0dXJuIHBTcmNMaW5lOwogfQotYm9vbCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAorRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAogewogICAgIGlmIChtX3BEZWNvZGVyKSB7CiAgICAgICAgIHJldHVybiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogdm9pZCBDUERGX0RJQlNvdXJjZTo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0CiB7CiAgICAgaWYgKGxpbmUgPCAwIHx8IGRlc3Rfc2NhbiA9PSBOVUxMIHx8IGRlc3RfYnBwIDw9IDAgfHwKICAgICAgICAgZGVzdF93aWR0aCA8PSAwIHx8IGNsaXBfbGVmdCA8IDAgfHwgY2xpcF93aWR0aCA8PSAwKSB7CkBAIC0xNDgwLDI2ICsxNDgwLDI2IEBACiBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6On5DUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKQogewogfQotYm9vbCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OlN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KQorRlhfQk9PTCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OlN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KQogewogICAgIG1fcEltYWdlTG9hZGVyID0gcEltYWdlTG9hZGVyOwogICAgIG1fcENhY2hlID0gcENhY2hlOwogICAgIG1fcEltYWdlID0gKENQREZfSW1hZ2VPYmplY3QqKXBJbWFnZTsKICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSBuRG93bnNhbXBsZVdpZHRoOwogICAgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKLSAgICBib29sIHJldDsKKyAgICBGWF9CT09MIHJldDsKICAgICBpZiAocENhY2hlKSB7CiAgICAgICAgIHJldCA9IHBDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAocEltYWdlLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCksIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IHRydWU7CisgICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBUUlVFOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoQml0bWFwKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoTWFzaygpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IHBDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+bV9NYXR0ZUNvbG9yOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gcEltYWdlLT5tX3BJbWFnZS0+U3RhcnRMb2FkRElCU291cmNlKHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgcFJlbmRlclN0YXR1cy0+bV9wUGFnZVJlc291cmNlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwotICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gZmFsc2U7CisgICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBGQUxTRTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKQEAgLTE1MDcsMjEgKzE1MDcsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBib29sIHJldDsKKyAgICBGWF9CT09MIHJldDsKICAgICBpZiAobV9wQ2FjaGUpIHsKICAgICAgICAgcmV0ID0gbV9wQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSB0cnVlOworICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7CisgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gVFJVRTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoQml0bWFwKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPm1fTWF0dGVDb2xvcjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+Q29udGludWUocFBhdXNlKTsKLSAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IGZhbHNlOworICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7CisgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gRkFMU0U7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hCaXRtYXAoKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hNYXNrKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5tX01hdHRlQ29sb3I7CkBAIC0xNTI5LDMwICsxNTI5LDMwIEBACiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci1ib29sIENQREZfSW1hZ2VMb2FkZXI6OkxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cykKK0ZYX0JPT0wgQ1BERl9JbWFnZUxvYWRlcjo6TG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKQogewogICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBDYWNoZSkgewogICAgICAgICBwQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgbV9wQml0bWFwLCBtX3BNYXNrLCBtX01hdHRlQ29sb3IsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgbV9iQ2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgbV9iQ2FjaGVkID0gVFJVRTsKICAgICB9IGVsc2UgewogICAgICAgICBtX3BCaXRtYXAgPSBwSW1hZ2UtPm1fcEltYWdlLT5Mb2FkRElCU291cmNlKCZtX3BNYXNrLCAmbV9NYXR0ZUNvbG9yLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwotICAgICAgICBtX2JDYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgbV9iQ2FjaGVkID0gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfSW1hZ2VMb2FkZXI6OlN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCitGWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OlN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgbV9uRG93bnNhbXBsZVdpZHRoID0gbkRvd25zYW1wbGVXaWR0aDsKICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gbkRvd25zYW1wbGVIZWlnaHQ7CiAgICAgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKiBwTG9hZGVySGFuZGxlID0gbmV3IENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTsKLSAgICBib29sIHJldCA9IHBMb2FkZXJIYW5kbGUtPlN0YXJ0KHRoaXMsIHBJbWFnZSwgcENhY2hlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIG1fbkRvd25zYW1wbGVXaWR0aCwgbV9uRG93bnNhbXBsZUhlaWdodCk7CisgICAgRlhfQk9PTCByZXQgPSBwTG9hZGVySGFuZGxlLT5TdGFydCh0aGlzLCBwSW1hZ2UsIHBDYWNoZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwogICAgIExvYWRIYW5kbGUgPSBwTG9hZGVySGFuZGxlOwogICAgIHJldHVybiByZXQ7CiB9Ci1ib29sCUNQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTAlDUERGX0ltYWdlTG9hZGVyOjpDb250aW51ZSh2b2lkKiBMb2FkSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICByZXR1cm4gKChDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqKUxvYWRIYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAKaW5kZXggZTA4NjQ5MC4uM2VlMjIyMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgICAgIHRfbWluID0gcEFycmF5LT5HZXROdW1iZXIoMCk7CiAgICAgICAgIHRfbWF4ID0gcEFycmF5LT5HZXROdW1iZXIoMSk7CiAgICAgfQotICAgIGJvb2wgYlN0YXJ0RXh0ZW5kID0gZmFsc2UsIGJFbmRFeHRlbmQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJTdGFydEV4dGVuZCA9IEZBTFNFLCBiRW5kRXh0ZW5kID0gRkFMU0U7CiAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFeHRlbmQiKSk7CiAgICAgaWYgKHBBcnJheSkgewogICAgICAgICBiU3RhcnRFeHRlbmQgPSBwQXJyYXktPkdldEludGVnZXIoMCk7CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKICAgICAgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKICAgICB9Ci0gICAgYm9vbCBiU3RhcnRFeHRlbmQgPSBmYWxzZSwgYkVuZEV4dGVuZCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlN0YXJ0RXh0ZW5kID0gRkFMU0UsIGJFbmRFeHRlbmQgPSBGQUxTRTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKQEAgLTE1NSwxMSArMTU1LDExIEBACiAgICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CiAgICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICBib29sIGJEZWNyZWFzaW5nID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRGVjcmVhc2luZyA9IEZBTFNFOwogICAgIGlmIChzdGFydF9yID4gZW5kX3IpIHsKICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpRlhTWVNfc3FydCgoRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArIEZYU1lTX011bChzdGFydF95IC0gZW5kX3ksIHN0YXJ0X3kgLSBlbmRfeSkpKTsKICAgICAgICAgaWYgKGxlbmd0aCA8IHN0YXJ0X3IgLSBlbmRfcikgewotICAgICAgICAgICAgYkRlY3JlYXNpbmcgPSB0cnVlOworICAgICAgICAgICAgYkRlY3JlYXNpbmcgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7CkBAIC0yODEsMjIgKzI4MSwyMiBAQAogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoaW50IHksIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9GTE9BVCYgeCkKK0ZYX0JPT0wgX0dldFNjYW5saW5lSW50ZXJzZWN0KGludCB5LCBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRkxPQVQmIHgpCiB7CiAgICAgaWYgKHkxID09IHkyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoeTEgPCB5MikgewogICAgICAgICBpZiAoeSA8IHkxIHx8IHkgPiB5MikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHkgPCB5MiB8fCB5ID4geTEpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICB4ID0geDEgKyBGWFNZU19NdWxEaXYoeDIgLSB4MSwgeSAtIHkxLCB5MiAtIHkxKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHN0YXRpYyB2b2lkIF9EcmF3R291cmF1ZChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBhbHBoYSwgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdKQogewpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSArKykgewogICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgxID0gdHJpYW5nbGVbaV07CiAgICAgICAgICAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleDIgPSB0cmlhbmdsZVsoaSArIDEpICUgM107Ci0gICAgICAgICAgICBib29sIGJJbnRlcnNlY3QgPSBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoeSwgdmVydGV4MS54LCB2ZXJ0ZXgxLnksCisgICAgICAgICAgICBGWF9CT09MIGJJbnRlcnNlY3QgPSBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoeSwgdmVydGV4MS54LCB2ZXJ0ZXgxLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgyLngsIHZlcnRleDIueSwgaW50ZXJfeFtuSW50ZXJzZWN0c10pOwogICAgICAgICAgICAgaWYgKCFiSW50ZXJzZWN0KSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02MDEsNyArNjAxLDcgQEAKICAgICBpbnQJCQkJCWFscGhhOwogICAgIHZvaWQgRHJhdyhpbnQgeF9zY2FsZSwgaW50IHlfc2NhbGUsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBDb29uX0JlemllciBDMSwgQ29vbl9CZXppZXIgQzIsIENvb25fQmV6aWVyIEQxLCBDb29uX0JlemllciBEMikKICAgICB7Ci0gICAgICAgIGJvb2wgYlNtYWxsID0gQzEuRGlzdGFuY2UoKSA8IDIgJiYgQzIuRGlzdGFuY2UoKSA8IDIgJiYgRDEuRGlzdGFuY2UoKSA8IDIgJiYgRDIuRGlzdGFuY2UoKSA8IDI7CisgICAgICAgIEZYX0JPT0wgYlNtYWxsID0gQzEuRGlzdGFuY2UoKSA8IDIgJiYgQzIuRGlzdGFuY2UoKSA8IDIgJiYgRDEuRGlzdGFuY2UoKSA8IDIgJiYgRDIuRGlzdGFuY2UoKSA8IDI7CiAgICAgICAgIENvb25fQ29sb3IgZGl2X2NvbG9yc1s0XTsKICAgICAgICAgaW50IGRfYm90dG9tLCBkX2xlZnQsIGRfdG9wLCBkX3JpZ2h0OwogICAgICAgICBkaXZfY29sb3JzWzBdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0LCBib3R0b20sIHhfc2NhbGUsIHlfc2NhbGUpOwpAQCAtNjYzLDkgKzY2Myw5IEBACiAgICAgfQogfTsKIAotYm9vbCBfQ2hlY2tDb29uVGVuc29yUGFyYShjb25zdCBDUERGX01lc2hTdHJlYW0gJnN0cmVhbSkKK0ZYX0JPT0wgX0NoZWNrQ29vblRlbnNvclBhcmEoY29uc3QgQ1BERl9NZXNoU3RyZWFtICZzdHJlYW0pCiB7Ci0gICAgYm9vbCBiQ29vckJpdHMgPSAoIHN0cmVhbS5tX25Db29yZEJpdHM9PSAxICAgfHwKKyAgICBGWF9CT09MIGJDb29yQml0cyA9ICggc3RyZWFtLm1fbkNvb3JkQml0cz09IDEgICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDIgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gNCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSA4ICB8fApAQCAtNjc0LDIxICs2NzQsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyNCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDMyICAgKTsKIAotICAgIGJvb2wgYkNvbXBCaXRzID0gKCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSAgfHwKKyAgICBGWF9CT09MIGJDb21wQml0cyA9ICggc3RyZWFtLm1fbkNvbXBCaXRzID09IDEgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAyICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gNCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDggIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxMiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMTYgICApOwogCi0gICAgYm9vbCBiRmxhZ0JpdHMgPSAoIHN0cmVhbS5tX25GbGFnQml0cyA9PSAyICB8fAorICAgIEZYX0JPT0wgYkZsYWdCaXRzID0gKCBzdHJlYW0ubV9uRmxhZ0JpdHMgPT0gMiAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDQgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25GbGFnQml0cyA9PSA4ICAgICk7CiAKICAgICByZXR1cm4gYkNvb3JCaXRzICYmIGJDb21wQml0cyAmJiBiRmxhZ0JpdHM7CiB9CiAKLXN0YXRpYyB2b2lkIF9EcmF3Q29vblBhdGNoTWVzaGVzKGJvb2wgYlRlbnNvciwgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKK3N0YXRpYyB2b2lkIF9EcmF3Q29vblBhdGNoTWVzaGVzKEZYX0JPT0wgYlRlbnNvciwgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgZmlsbF9tb2RlLCBpbnQgYWxwaGEpCiB7CkBAIC03NjgsNyArNzY4LDcgQEAKICAgICB9CiB9CiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwgaW50IGFscGhhLCBib29sIGJBbHBoYU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBjbGlwX3JlY3QsIGludCBhbHBoYSwgRlhfQk9PTCBiQWxwaGFNb2RlKQogewogICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MgPSBwUGF0dGVybi0+bV9wRnVuY3Rpb25zOwogICAgIGludCBuRnVuY3MgPSBwUGF0dGVybi0+bV9uRnVuY3M7CkBAIC04NDAsNyArODQwLDcgQEAKICAgICB9CiAgICAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQogewogICAgIGlmICghcGF0dGVybi0+TG9hZCgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTg1OCw3ICs4NTgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBmYWxzZSwgcmVjdCkpIHsKKyAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg2OSwxOSArODY5LDE5IEBACiAgICAgRHJhd1NoYWRpbmcocGF0dGVybiwgJm1hdHJpeCwgcmVjdCwgYWxwaGEsIG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEpOwogICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9Ci1ib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgcmVjdC5JbnRlcnNlY3QoY2xpcF9ib3gpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcFNoYWRpbmdPYmotPm1fTWF0cml4OwogICAgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICBEcmF3U2hhZGluZyhwU2hhZGluZ09iai0+bV9wU2hhZGluZywgJm1hdHJpeCwgcmVjdCwgcFNoYWRpbmdPYmotPm1fR2VuZXJhbFN0YXRlLkdldEFscGhhKGZhbHNlKSwKKyAgICBEcmF3U2hhZGluZyhwU2hhZGluZ09iai0+bV9wU2hhZGluZywgJm1hdHJpeCwgcmVjdCwgcFNoYWRpbmdPYmotPm1fR2VuZXJhbFN0YXRlLkdldEFscGhhKEZBTFNFKSwKICAgICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHN0YXRpYyBDRlhfRElCaXRtYXAqIERyYXdQYXR0ZXJuQml0bWFwKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKQEAgLTkxNCw3ICs5MTQsNyBAQAogICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QoJmJpdG1hcF9kZXZpY2UsIHBQYXR0ZXJuLT5tX3BGb3JtLCAmbXRQYXR0ZXJuMkJpdG1hcCwgJm9wdGlvbnMpOwogICAgIHJldHVybiBwQml0bWFwOwogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpCiB7CiAgICAgaWYgKCFwUGF0dGVybi0+TG9hZCgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTk0NCwxMSArOTQ0LDExIEBACiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtdFBhdHRlcm4yRGV2aWNlID0gcFBhdHRlcm4tPm1fUGF0dGVybjJGb3JtOwogICAgIG10UGF0dGVybjJEZXZpY2UuQ29uY2F0KCpwT2JqMkRldmljZSk7CiAgICAgR2V0U2NhbGVkTWF0cml4KG10UGF0dGVybjJEZXZpY2UpOwotICAgIGJvb2wgYkFsaWduZWQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJBbGlnbmVkID0gRkFMU0U7CiAgICAgaWYgKHBQYXR0ZXJuLT5tX0JCb3gubGVmdCA9PSAwICYmIHBQYXR0ZXJuLT5tX0JCb3guYm90dG9tID09IDAgJiYKICAgICAgICAgICAgIHBQYXR0ZXJuLT5tX0JCb3gucmlnaHQgPT0gcFBhdHRlcm4tPm1fWFN0ZXAgJiYgcFBhdHRlcm4tPm1fQkJveC50b3AgPT0gcFBhdHRlcm4tPm1fWVN0ZXAgJiYKICAgICAgICAgICAgIChtdFBhdHRlcm4yRGV2aWNlLklzU2NhbGVkKCkgfHwgbXRQYXR0ZXJuMkRldmljZS5JczkwUm90YXRlZCgpKSkgewotICAgICAgICBiQWxpZ25lZCA9IHRydWU7CisgICAgICAgIGJBbGlnbmVkID0gVFJVRTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OwogICAgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOwpAQCAtMTA3NSwxMSArMTA3NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIENvbXBvc2l0ZURJQml0bWFwKCZzY3JlZW4sIGNsaXBfYm94LmxlZnQsIGNsaXBfYm94LnRvcCwgMCwgMjU1LCBGWERJQl9CTEVORF9OT1JNQUwsIGZhbHNlKTsKKyAgICBDb21wb3NpdGVESUJpdG1hcCgmc2NyZWVuLCBjbGlwX2JveC5sZWZ0LCBjbGlwX2JveC50b3AsIDAsIDI1NSwgRlhESUJfQkxFTkRfTk9STUFMLCBGQUxTRSk7CiAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKICAgICBkZWxldGUgcFBhdHRlcm5CaXRtYXA7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3UGF0aFdpdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDUERGX0NvbG9yKiBwQ29sb3IsIGJvb2wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgRlhfQk9PTCBiU3Ryb2tlKQogewogICAgIENQREZfUGF0dGVybiogcGF0dGVybiA9IHBDb2xvci0+R2V0UGF0dGVybigpOwogICAgIGlmIChwYXR0ZXJuID09IE5VTEwpIHsKQEAgLTEwOTEsMjAgKzEwOTEsMjAgQEAKICAgICAgICAgRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsIGJTdHJva2UpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgYm9vbCYgYlN0cm9rZSkKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgRlhfQk9PTCYgYlN0cm9rZSkKIHsKICAgICBpZihmaWxsdHlwZSkgewogICAgICAgICBDUERGX0NvbG9yJiBGaWxsQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKICAgICAgICAgaWYoRmlsbENvbG9yLm1fcENTICYmIEZpbGxDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZGaWxsQ29sb3IsIGZhbHNlKTsKKyAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmRmlsbENvbG9yLCBGQUxTRSk7CiAgICAgICAgICAgICBmaWxsdHlwZSA9IDA7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoYlN0cm9rZSkgewogICAgICAgICBDUERGX0NvbG9yJiBTdHJva2VDb2xvciA9ICpwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldFN0cm9rZUNvbG9yKCk7CiAgICAgICAgIGlmKFN0cm9rZUNvbG9yLm1fcENTICYmIFN0cm9rZUNvbG9yLm1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICBEcmF3UGF0aFdpdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgJlN0cm9rZUNvbG9yLCB0cnVlKTsKLSAgICAgICAgICAgIGJTdHJva2UgPSBmYWxzZTsKKyAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmU3Ryb2tlQ29sb3IsIFRSVUUpOworICAgICAgICAgICAgYlN0cm9rZSA9IEZBTFNFOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKaW5kZXggMjYxMzhhOS4uYWQ1ZGM1OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKLWV4dGVybiBib29sIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CitleHRlcm4gRlhfQk9PTCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogQ1BERl9UeXBlM0NhY2hlOjp+Q1BERl9UeXBlM0NhY2hlKCkKIHsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1NpemVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwpAQCAtNzYsMjggKzc2LDI4IEBACiAgICAgdG9wX2xpbmUgPSBfQWRqdXN0Qmx1ZSh0b3AsIG1fVG9wQmx1ZUNvdW50LCBtX1RvcEJsdWUpOwogICAgIGJvdHRvbV9saW5lID0gX0FkanVzdEJsdWUoYm90dG9tLCBtX0JvdHRvbUJsdWVDb3VudCwgbV9Cb3R0b21CbHVlKTsKIH0KLXN0YXRpYyBib29sIF9Jc1NjYW5MaW5lMWJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpCitzdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZTFicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQogewogICAgIGludCBzaXplID0gd2lkdGggLyA4OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykKICAgICAgICAgaWYgKHBCdWZbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICBpZiAod2lkdGggJSA4KQogICAgICAgICBpZiAocEJ1Zlt3aWR0aCAvIDhdICYgKDB4ZmYgPDwgKDggLSB3aWR0aCAlIDgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgYm9vbCBfSXNTY2FuTGluZThicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQorc3RhdGljIEZYX0JPT0wgX0lzU2NhbkxpbmU4YnBwKHVpbnQ4X3QqIHBCdWYsIGludCB3aWR0aCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpICsrKQogICAgICAgICBpZiAocEJ1ZltpXSA+IDB4NDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYkZpcnN0KQorc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYkZpcnN0KQogewogICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpLCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CiAgICAgaW50IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwpAQCAtMTM3LDEyICsxMzcsMTIgQEAKICAgICBpbnQgbGVmdCwgdG9wOwogICAgIGlmIChGWFNZU19mYWJzKGltYWdlX21hdHJpeC5iKSA8IEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmEpIC8gMTAwICYmIEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmMpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguZCkgLyAxMDApIHsKICAgICAgICAgaW50IHRvcF9saW5lLCBib3R0b21fbGluZTsKLSAgICAgICAgdG9wX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCB0cnVlKTsKLSAgICAgICAgYm90dG9tX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBmYWxzZSk7CisgICAgICAgIHRvcF9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgVFJVRSk7CisgICAgICAgIGJvdHRvbV9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgRkFMU0UpOwogICAgICAgICBpZiAodG9wX2xpbmUgPT0gMCAmJiBib3R0b21fbGluZSA9PSBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIDEpIHsKICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcF95ID0gaW1hZ2VfbWF0cml4LmQgKyBpbWFnZV9tYXRyaXguZjsKICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbV95ID0gaW1hZ2VfbWF0cml4LmY7Ci0gICAgICAgICAgICBib29sIGJGbGlwcGVkID0gdG9wX3kgPiBib3R0b21feTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBwZWQgPSB0b3BfeSA+IGJvdHRvbV95OwogICAgICAgICAgICAgaWYgKGJGbGlwcGVkKSB7CiAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdGVtcCA9IHRvcF95OwogICAgICAgICAgICAgICAgIHRvcF95ID0gYm90dG9tX3k7CkBAIC0xODUsNzYgKzE4NSw3NiBAQAogICAgIHZhX2VuZChhcmdMaXN0KTsKICAgICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKTsKIH0KLWJvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkKIHsKICAgICBpZih0ZXh0b2JqLT5tX25DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaW50IHRleHRfcmVuZGVyX21vZGUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKICAgICBpZiAodGV4dF9yZW5kZXJfbW9kZSA9PSAzKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKICAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgPT0gUERGRk9OVF9UWVBFMykgewogICAgICAgICByZXR1cm4gUHJvY2Vzc1R5cGUzVGV4dCh0ZXh0b2JqLCBwT2JqMkRldmljZSk7CiAgICAgfQotICAgIGJvb2wgYkZpbGwgPSBmYWxzZSwgYlN0cm9rZSA9IGZhbHNlLCBiQ2xpcCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkZpbGwgPSBGQUxTRSwgYlN0cm9rZSA9IEZBTFNFLCBiQ2xpcCA9IEZBTFNFOwogICAgIGlmIChwQ2xpcHBpbmdQYXRoKSB7Ci0gICAgICAgIGJDbGlwID0gdHJ1ZTsKKyAgICAgICAgYkNsaXAgPSBUUlVFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCAodGV4dF9yZW5kZXJfbW9kZSkgewogICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGJGaWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTCAmJiAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0dMWVBIUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZpbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYlN0cm9rZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJTdHJva2UgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldEZhY2UoKSA9PSBOVUxMICYmICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IGJTdHJva2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IGJTdHJva2UgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkZpbGwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiID0gMCwgZmlsbF9hcmdiID0gMDsKLSAgICBib29sIGJQYXR0ZXJuID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUGF0dGVybiA9IEZBTFNFOwogICAgIGlmIChiU3Ryb2tlKSB7CiAgICAgICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cm9rZV9hcmdiID0gR2V0U3Ryb2tlQXJnYih0ZXh0b2JqKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoYkZpbGwpIHsKICAgICAgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmopOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7CiAgICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIGlmKElzQXZhaWxhYmxlTWF0cml4KHRleHRfbWF0cml4KSA9PSBmYWxzZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZihJc0F2YWlsYWJsZU1hdHJpeCh0ZXh0X21hdHJpeCkgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7CiAgICAgaWYgKGJQYXR0ZXJuKSB7CiAgICAgICAgIERyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKHRleHRvYmosIHBPYmoyRGV2aWNlLCBwRm9udCwgZm9udF9zaXplLCAmdGV4dF9tYXRyaXgsIGJGaWxsLCBiU3Ryb2tlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoYkNsaXAgfHwgYlN0cm9rZSkgewogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4ID0gcE9iajJEZXZpY2U7CkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgZmFsc2UpOworICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOwogICAgIHJldHVybiBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Q2FjaGVkVHlwZTMocEZvbnQpOwogfQogc3RhdGljIHZvaWQgUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKQEAgLTMwNCwxMCArMzA0LDEwIEBACiAgICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPlJlbGVhc2VDYWNoZWRUeXBlMyhwRm9udCk7CiAgICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7CiB9Ci1ib29sIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCitGWF9CT09MIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCiB7CiAgICAgaWYgKG1fcEJpdG1hcCAhPSBOVUxMIHx8IG1fcEZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChtX3BGb3JtLT5Db3VudE9iamVjdHMoKSA9PSAxICYmICFtX2JDb2xvcmVkKSB7CiAgICAgICAgIENQREZfUGFnZU9iamVjdCAqcFBhZ2VPYmogPSBtX3BGb3JtLT5HZXRPYmplY3RBdChtX3BGb3JtLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCkpOwpAQCAtMzIxLDEwICszMjEsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGV0ZSBtX3BGb3JtOwogICAgICAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBjbGFzcyBDUERGX1JlZlR5cGUzQ2FjaGUKIHsKQEAgLTM0MywxMiArMzQzLDEyIEBACiAgICAgRlhfRFdPUkQgbV9kd0NvdW50OwogICAgIENQREZfVHlwZTNGb250KiBtX3BUeXBlM0ZvbnQ7CiB9OwotYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIENQREZfVHlwZTNGb250KiBwVHlwZTNGb250ID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLT5HZXRUeXBlM0ZvbnQoKTsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fVHlwZTNGb250Q2FjaGUuR2V0U2l6ZSgpOyBqKyspCiAgICAgICAgIGlmICgoQ1BERl9UeXBlM0ZvbnQqKW1fVHlwZTNGb250Q2FjaGUuR2V0QXQoaikgPT0gcFR5cGUzRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CiAgICAgRlhfRkxPQVQgc2EgPSBGWFNZU19mYWJzKGRDVE0uYSk7CkBAIC0zNTgsMTQgKzM1OCwxNCBAQAogICAgIENGWF9BZmZpbmVNYXRyaXggY2hhcl9tYXRyaXggPSBwVHlwZTNGb250LT5HZXRGb250TWF0cml4KCk7CiAgICAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgICBjaGFyX21hdHJpeC5TY2FsZShmb250X3NpemUsIGZvbnRfc2l6ZSk7Ci0gICAgRlhfQVJHQiBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYih0ZXh0b2JqLCB0cnVlKTsKKyAgICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIFRSVUUpOwogICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9hcmdiKTsKICAgICBpbnQgZGV2aWNlX2NsYXNzID0gbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpOwogICAgIEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zID0gTlVMTDsKICAgICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkgewogICAgICAgICBwR2x5cGhBbmRQb3MgPSBGWF9BbGxvYyhGWFRFWFRfR0xZUEhQT1MsIHRleHRvYmotPm1fbkNoYXJzKTsKICAgICB9IGVsc2UgaWYgKGZpbGxfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfUmVmVHlwZTNDYWNoZSByZWZUeXBlQ2FjaGUocFR5cGUzRm9udCk7CiAgICAgRlhfRFdPUkQgKnBDaGFycyA9IHRleHRvYmotPm1fcENoYXJDb2RlczsKQEAgLTM5OSw3ICszOTksNyBAQAogICAgICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKICAgICAgICAgICAgICAgICBwR2x5cGhBbmRQb3MgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgZmFsc2UpOworICAgICAgICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgRkFMU0UpOwogICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zIE9wdGlvbnMgPSBtX09wdGlvbnM7CiAgICAgICAgICAgICBPcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FIHwgUkVOREVSX1JFQ1RfQUE7CiAgICAgICAgICAgICBPcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOwpAQCAtNDEwLDcgKzQxMCw3IEBACiAgICAgICAgICAgICBpZiAoZmlsbF9hbHBoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLCAmT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIGZhbHNlLCBwVHlwZTNDaGFyLCBmaWxsX2FyZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwpAQCAtNDIyLDEyICs0MjIsMTIgQEAKICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwogICAgICAgICAgICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CiAgICAgICAgICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKS0+Q2xlYXIoMCk7CiAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwogICAgICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLCAmT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIGZhbHNlLCBwVHlwZTNDaGFyLCBmaWxsX2FyZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKICAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwpAQCAtNDU3LDExICs0NTcsMTEgQEAKICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGltYWdlX21hdHJpeCA9IHBUeXBlM0NoYXItPm1fSW1hZ2VNYXRyaXg7CiAgICAgICAgICAgICAgICAgaW1hZ2VfbWF0cml4LkNvbmNhdChtYXRyaXgpOwogICAgICAgICAgICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciByZW5kZXJlcjsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuU3RhcnQodGhpcywgcFR5cGUzQ2hhci0+bV9wQml0bWFwLCBmaWxsX2FyZ2IsIDI1NSwgJmltYWdlX21hdHJpeCwgMCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLlN0YXJ0KHRoaXMsIHBUeXBlM0NoYXItPm1fcEJpdG1hcCwgZmlsbF9hcmdiLCAyNTUsICZpbWFnZV9tYXRyaXgsIDAsIEZBTFNFKSkgewogICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5Db250aW51ZShOVUxMKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlci5tX1Jlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3MSw3ICs0NzEsNyBAQAogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUoKGludCkocmVjdC5XaWR0aCgpICogc2EpLCAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgdGV4dG9iai0+bV9uQ2hhcnM7IGlDaGFyICsrKSB7CkBAIC00ODcsNyArNDg3LDcgQEAKICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGZpbGxfYXJnYik7CiAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBjbGFzcyBDUERGX0NoYXJQb3NMaXN0CiB7CkBAIC01MTUsMTMgKzUxNSwxMyBAQAogICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJzKTsKICAgICBtX25DaGFycyA9IDA7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgYm9vbCBiVmVydFdyaXRpbmcgPSBwQ0lERm9udCAmJiBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gcENJREZvbnQgJiYgcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKICAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewogICAgICAgICBGWF9EV09SRCBDaGFyQ29kZSA9IG5DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcENoYXJDb2RlcyA6IHBDaGFyQ29kZXNbaUNoYXJdOwogICAgICAgICBpZiAoQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGJvb2wgYlZlcnQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiVmVydCA9IEZBTFNFOwogICAgICAgICBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcyA9IG1fcENoYXJQb3NbbV9uQ2hhcnMrK107CiAgICAgICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICAgICAgY2hhcnBvcy5tX2JGb250U3R5bGUgPSBwQ0lERm9udC0+SXNGb250U3R5bGVGcm9tQ2hhckNvZGUoQ2hhckNvZGUpOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2hhcnBvcy5tX09yaWdpblggPSBpQ2hhciA/IHBDaGFyUG9zW2lDaGFyIC0gMV0gOiAwOwogICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSA9IDA7Ci0gICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSBmYWxzZTsKKyAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IEZBTFNFOwogICAgICAgICBpZiAocENJREZvbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTU1OCwxMSArNTU4LDExIEBACiAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSk7CiAgICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWCArPSBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzRdKSAqIEZvbnRTaXplOwogICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkgKz0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiBGb250U2l6ZTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSB0cnVlOworICAgICAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IFRSVUU7CiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKK0ZYX0JPT0wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTYzMiw3ICs2MzIsNyBAQAogICAgICAgICBGWF9GcmVlKHBDaGFyUG9zKTsKICAgICB9CiB9Ci1ib29sIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAorRlhfQk9PTCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQpAQCAtNjcxLDEzICs2NzEsMTMgQEAKIH0KIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCiAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIGJvb2wgYkZpbGwsIGJvb2wgYlN0cm9rZSkKKyAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIEZYX0JPT0wgYkZpbGwsIEZYX0JPT0wgYlN0cm9rZSkKIHsKICAgICBpZiAoIWJTdHJva2UpIHsKICAgICAgICAgQ1BERl9QYXRoT2JqZWN0IHBhdGg7CiAgICAgICAgIENQREZfVGV4dE9iamVjdCogcENvcHkgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwogICAgICAgICBwQ29weS0+Q29weSh0ZXh0b2JqKTsKLSAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBmYWxzZTsKKyAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBGQUxTRTsKICAgICAgICAgcGF0aC5tX0ZpbGxUeXBlID0gRlhGSUxMX1dJTkRJTkc7CiAgICAgICAgIHBhdGgubV9DbGlwUGF0aC5BcHBlbmRUZXh0cygmcENvcHksIDEpOwogICAgICAgICBwYXRoLm1fQ29sb3JTdGF0ZSA9IHRleHRvYmotPm1fQ29sb3JTdGF0ZTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKaW5kZXggYzljODk0NC4uZTVmYjgzMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgKQEAgLTQ5LDkgKzQ5LDkgQEAKIHB1YmxpYzoKICAgICBDUERGX0RvY3VtZW50KgltX3BQREZEb2M7CiAgICAgdWludDhfdAkJCW1fU2FtcGxlc1syNTYgKiAzXTsKLSAgICBib29sCQkJbV9iSWRlbnRpdHk7CisgICAgRlhfQk9PTAkJCW1fYklkZW50aXR5OwogCi0gICAgQ0ZYX0RJQlNvdXJjZSoJVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgYm9vbCBiQXV0b0Ryb3BTcmMpOworICAgIENGWF9ESUJTb3VyY2UqCVRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKTsKICAgICBGWF9DT0xPUlJFRgkJVHJhbnNsYXRlQ29sb3IoRlhfQ09MT1JSRUYgc3JjKTsKIH07CiAKQEAgLTY2LDcgKzY2LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BGb250Q2FjaGU7CiAgICAgfQotICAgIHZvaWQJCQkJQ2xlYXIoYm9vbCBiUmVsZWFzZSA9IGZhbHNlKTsKKyAgICB2b2lkCQkJCUNsZWFyKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7CiAgICAgdm9pZAkJCQlSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKICAgICB2b2lkCQkJCVJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopOwogcHJpdmF0ZToKQEAgLTkxLDI0ICs5MSwyNCBAQAogcHVibGljOgogICAgIHN0YXRpYyBJUERGX09iamVjdFJlbmRlcmVyKiBDcmVhdGUoaW50IHR5cGUpOwogICAgIHZpcnR1YWwgfklQREZfT2JqZWN0UmVuZGVyZXIoKSB7fQotICAgIHZpcnR1YWwgYm9vbCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLSAgICBib29sCQltX1Jlc3VsdDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CisgICAgRlhfQk9PTAkJbV9SZXN1bHQ7CiB9OwogY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXMKIHsKIHB1YmxpYzoKICAgICBDUERGX1JlbmRlclN0YXR1cygpOwogICAgIH5DUERGX1JlbmRlclN0YXR1cygpOwotICAgIGJvb2wJCQlJbml0aWFsaXplKGNsYXNzIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXZpY2VNYXRyaXgsCisgICAgRlhfQk9PTAkJCUluaXRpYWxpemUoY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLCBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksIGJvb2wgYkRyb3BPYmplY3RzLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsCUNQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gTlVMTCwgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksIEZYX0JPT0wgYkRyb3BPYmplY3RzLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCUNQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gTlVMTCwgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOwogICAgIHZvaWQJCQlSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgdm9pZAkJCVJlbmRlclNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBib29sCQkJQ29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wJCQlDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ1BERl9SZW5kZXJPcHRpb25zCW1fT3B0aW9uczsKICAgICBDUERGX0RpY3Rpb25hcnkqICAgIG1fcEZvcm1SZXNvdXJjZTsKICAgICBDUERGX0RpY3Rpb25hcnkqICAgIG1fcFBhZ2VSZXNvdXJjZTsKQEAgLTEyMiw0NSArMTIyLDQ1IEBACiAgICAgZnJpZW5kIGNsYXNzCUNQREZfUmVuZGVyQ29udGV4dDsKICAgICB2b2lkCQkJUHJvY2Vzc0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJRHJhd0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBib29sCQkJUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgICBGWF9CT09MCQkJUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJUHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJRHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIGJvb2wgICAgICAgICBEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIGJvb2wJCQlQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCVByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgYm9vbCYgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgYm9vbCBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSk7Ci0gICAgYm9vbAkJCVNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpOwotICAgIGJvb2wJCQlQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgYm9vbAkJCU91dHB1dEJpdG1hcEFscGhhKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgYm9vbAkJCU91dHB1dEltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgYm9vbAkJCU91dHB1dERJQlNvdXJjZShjb25zdCBDRlhfRElCU291cmNlKiBwT3V0cHV0Qml0bWFwLCBGWF9BUkdCIGZpbGxfYXJnYiwgaW50IGJpdG1hcF9hbHBoYSwKKyAgICBGWF9CT09MICAgICAgICAgRHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgICBGWF9CT09MCQkJUHJvY2Vzc1BhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIHZvaWQJCQlQcm9jZXNzUGF0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGludCYgZmlsbHR5cGUsIEZYX0JPT0wmIGJTdHJva2UpOworICAgIHZvaWQJCQlEcmF3UGF0aFdpdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDUERGX0NvbG9yKiBwQ29sb3IsIEZYX0JPT0wgYlN0cm9rZSk7CisgICAgdm9pZAkJCURyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpOworICAgIHZvaWQJCQlEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpOworICAgIEZYX0JPT0wJCQlTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgICBGWF9CT09MCQkJUHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIEZYX0JPT0wJCQlPdXRwdXRCaXRtYXBBbHBoYShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICAgIEZYX0JPT0wJCQlPdXRwdXRJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICAgIEZYX0JPT0wJCQlPdXRwdXRESUJTb3VyY2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE91dHB1dEJpdG1hcCwgRlhfQVJHQiBmaWxsX2FyZ2IsIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlLCBGWF9EV09SRCBmbGFncyk7CiAgICAgdm9pZAkJCUNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGludCBibGVuZF9tb2RlLCBpbnQgYklzb2xhdGVkKTsKLSAgICBib29sCQkJUHJvY2Vzc1NoYWRpbmcoQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIEZYX0JPT0wJCQlQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgdm9pZAkJCURyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9SRUNUJiBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgYm9vbCBiQWxwaGFNb2RlKTsKLSAgICBib29sCQkJUHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBib29sCQkJUHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBGWF9CT09MIGJBbHBoYU1vZGUpOworICAgIEZYX0JPT0wJCQlQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIEZYX0JPT0wJCQlQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgpOwogICAgIHZvaWQJCQlEcmF3VGV4dFBhdGhXaXRoUGF0dGVybihjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0TWF0cml4LCBib29sIGJGaWxsLCBib29sIGJTdHJva2UpOwotICAgIGJvb2wJCQlQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0TWF0cml4LCBGWF9CT09MIGJGaWxsLCBGWF9CT09MIGJTdHJva2UpOworICAgIEZYX0JPT0wJCQlQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CiAgICAgQ0ZYX0RJQml0bWFwKglHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IEZYX1JFQ1QmIHJlY3QsIGludCYgbGVmdCwgaW50JiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJhY2tBbHBoYVJlcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQpOwogICAgIENGWF9ESUJpdG1hcCoJTG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwgRlhfUkVDVCogcENsaXBSZWN0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKICAgICB2b2lkCQkJSW5pdChDUERGX1JlbmRlckNvbnRleHQqIHBQYXJlbnQpOwogICAgIHN0YXRpYyBjbGFzcyBDUERGX1R5cGUzQ2FjaGUqCUdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7Ci0gICAgc3RhdGljIENQREZfR3JhcGhpY1N0YXRlcyogQ2xvbmVPYmpTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwUGF0aE9iaiwgYm9vbCBiU3Ryb2tlKTsKKyAgICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLCBGWF9CT09MIGJTdHJva2UpOwogICAgIENQREZfVHJhbnNmZXJGdW5jKglHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmplY3QpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYlR5cGUzID0gZmFsc2UpIGNvbnN0OworICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYlR5cGUzID0gRkFMU0UpIGNvbnN0OwogICAgIEZYX0FSR0IJCQlHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7CiAgICAgQ1BERl9SZW5kZXJDb250ZXh0KgkJbV9wQ29udGV4dDsKLSAgICBib29sCQkJCQltX2JTdG9wcGVkOworICAgIEZYX0JPT0wJCQkJCW1fYlN0b3BwZWQ7CiAgICAgdm9pZAkJCURpdGhlck9iamVjdEFyZWEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgYm9vbAkJCUdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYkxvZ2ljYWwsIEZYX1JFQ1QgJnJlY3QpIGNvbnN0OworICAgIEZYX0JPT0wJCQlHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJMb2dpY2FsLCBGWF9SRUNUICZyZWN0KSBjb25zdDsKICAgICB2b2lkCQkJR2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKQEAgLTE3NSwxMyArMTc1LDEzIEBACiAgICAgQ1BERl9HcmFwaGljU3RhdGVzCQltX0luaXRpYWxTdGF0ZXM7CiAgICAgaW50CQkJCQkJbV9IYWxmdG9uZUxpbWl0OwogICAgIElQREZfT2JqZWN0UmVuZGVyZXIqCW1fcE9iamVjdFJlbmRlcmVyOwotICAgIGJvb2wJCQkJCW1fYlByaW50OworICAgIEZYX0JPT0wJCQkJCW1fYlByaW50OwogICAgIGludAkJCQkJCW1fVHJhbnNwYXJlbmN5OwogICAgIGludAkJCQkJCW1fRGl0aGVyQml0czsKLSAgICBib29sCQkJCQltX2JEcm9wT2JqZWN0czsKLSAgICBib29sCQkJCQltX2JTdGRDUzsKKyAgICBGWF9CT09MCQkJCQltX2JEcm9wT2JqZWN0czsKKyAgICBGWF9CT09MCQkJCQltX2JTdGRDUzsKICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICBtX0dyb3VwRmFtaWx5OwotICAgIGJvb2wgICAgICAgICAgICAgICAgIG1fYkxvYWRNYXNrOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIG1fYkxvYWRNYXNrOwogICAgIENQREZfVHlwZTNDaGFyICogICAgICAgIG1fcFR5cGUzQ2hhcjsKICAgICBGWF9BUkdCCQkJCQltX1QzRmlsbENvbG9yOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1fY3VyQmxlbmQ7CkBAIC0xOTQsMjAgKzE5NCwyMCBAQAogICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwogICAgICAgICBtX3BNYXNrID0gTlVMTDsKICAgICAgICAgbV9NYXR0ZUNvbG9yID0gMDsKLSAgICAgICAgbV9iQ2FjaGVkID0gZmFsc2U7CisgICAgICAgIG1fYkNhY2hlZCA9IEZBTFNFOwogICAgICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSAwOwogICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gMDsKICAgICB9CiAKLSAgICBib29sCQkJCQlMb2FkKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwpOworICAgIEZYX0JPT0wJCQkJCUxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCk7CiAKLSAgICBib29sCQkJCQlTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIHZvaWQqJiBMb2FkSGFuZGxlLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCA9IDApOwotICAgIGJvb2wJCQkJCUNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MCQkJCQlTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIHZvaWQqJiBMb2FkSGFuZGxlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCA9IDApOworICAgIEZYX0JPT0wJCQkJCUNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKICAgICB+Q1BERl9JbWFnZUxvYWRlcigpOwogICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wQml0bWFwOwogICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wTWFzazsKICAgICBGWF9EV09SRAkJCQltX01hdHRlQ29sb3I7Ci0gICAgYm9vbAkJCQkJbV9iQ2FjaGVkOworICAgIEZYX0JPT0wJCQkJCW1fYkNhY2hlZDsKIHByb3RlY3RlZDoKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQ7CkBAIC0yMTgsOCArMjE4LDggQEAKICAgICBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKTsKICAgICB+Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCk7CiAKLSAgICBib29sCQkJU3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgYm9vbAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MCQkJU3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgICAgRlhfQk9PTAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKIHByb3RlY3RlZDoKICAgICBDUERGX0ltYWdlTG9hZGVyKgltX3BJbWFnZUxvYWRlcjsKICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wQ2FjaGU7CkBAIC0yMzMsMTAgKzIzMywxMCBAQAogcHVibGljOgogICAgIENQREZfSW1hZ2VSZW5kZXJlcigpOwogICAgIH5DUERGX0ltYWdlUmVuZGVyZXIoKTsKLSAgICBib29sCQlTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIGJvb2wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIEZYX0RXT1JEIGZsYWdzLCBib29sIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgYm9vbAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgRlhfQk9PTAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICBGWF9CT09MCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiBwcm90ZWN0ZWQ6CiAgICAgQ1BERl9SZW5kZXJTdGF0dXMqCW1fcFJlbmRlclN0YXR1czsKICAgICBDUERGX0ltYWdlT2JqZWN0KgltX3BJbWFnZU9iamVjdDsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCQltX3BESUJTb3VyY2U7CiAgICAgQ0ZYX0RJQml0bWFwKgkJbV9wQ2xvbmU7CiAgICAgaW50CQkJCQltX0JpdG1hcEFscGhhOwotICAgIGJvb2wJCQkJbV9iUGF0dGVybkNvbG9yOworICAgIEZYX0JPT0wJCQkJbV9iUGF0dGVybkNvbG9yOwogICAgIENQREZfUGF0dGVybioJCW1fcFBhdHRlcm47CiAgICAgRlhfQVJHQgkJCQltX0ZpbGxBcmdiOwogICAgIEZYX0RXT1JECQkJbV9GbGFnczsKQEAgLTI1NSwyMSArMjU1LDIxIEBACiAgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOwogICAgIHZvaWQqCQkJbV9EZXZpY2VIYW5kbGU7CiAgICAgdm9pZCogICAgICAgICAgIG1fTG9hZEhhbmRsZTsKLSAgICBib29sCQkJCW1fYlN0ZENTOworICAgIEZYX0JPT0wJCQkJbV9iU3RkQ1M7CiAgICAgaW50CQkJCQltX0JsZW5kVHlwZTsKLSAgICBib29sCQkJCVN0YXJ0Qml0bWFwQWxwaGEoKTsKLSAgICBib29sCQkJCVN0YXJ0RElCU291cmNlKCk7Ci0gICAgYm9vbAkJCQlTdGFydFJlbmRlckRJQlNvdXJjZSgpOwotICAgIGJvb2wJCQkJU3RhcnRMb2FkRElCU291cmNlKCk7Ci0gICAgYm9vbAkJCQlEcmF3TWFza2VkSW1hZ2UoKTsKLSAgICBib29sCQkJCURyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICAgIEZYX0JPT0wJCQkJU3RhcnRCaXRtYXBBbHBoYSgpOworICAgIEZYX0JPT0wJCQkJU3RhcnRESUJTb3VyY2UoKTsKKyAgICBGWF9CT09MCQkJCVN0YXJ0UmVuZGVyRElCU291cmNlKCk7CisgICAgRlhfQk9PTAkJCQlTdGFydExvYWRESUJTb3VyY2UoKTsKKyAgICBGWF9CT09MCQkJCURyYXdNYXNrZWRJbWFnZSgpOworICAgIEZYX0JPT0wJCQkJRHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CiB9OwogY2xhc3MgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXIKIHsKIHB1YmxpYzoKICAgICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwogICAgIH5DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwotICAgIGJvb2wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKKyAgICBGWF9CT09MCQkJCUluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zICpwT3B0aW9ucyA9IE5VTEwsIGludCBtYXhfZHBpID0gMCk7CiAgICAgQ0ZYX1JlbmRlckRldmljZSoJR2V0RGV2aWNlKCkKICAgICB7CkBAIC0yOTQsMTMgKzI5NCwxMyBAQAogcHVibGljOgogICAgIENQREZfUXVpY2tTdHJldGNoZXIoKTsKICAgICB+Q1BERl9RdWlja1N0cmV0Y2hlcigpOwotICAgIGJvb2wJCVN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpOwotICAgIGJvb2wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MCQlTdGFydChDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwQm94KTsKKyAgICBGWF9CT09MCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ0ZYX0RJQml0bWFwKgltX3BCaXRtYXA7CiAgICAgaW50CQkJbV9SZXN1bHRMZWZ0LCBtX1Jlc3VsdFRvcCwgbV9DbGlwTGVmdCwgbV9DbGlwVG9wOwogICAgIGludAkJCW1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0OwogICAgIGludAkJCW1fQnBwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodDsKLSAgICBib29sCQltX2JGbGlwWCwgbV9iRmxpcFk7CisgICAgRlhfQk9PTAkJbV9iRmxpcFgsIG1fYkZsaXBZOwogICAgIENQREZfQ29sb3JTcGFjZSoJbV9wQ1M7CiAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJbV9wRGVjb2RlcjsKICAgICBDUERGX1N0cmVhbUFjYyBtX1N0cmVhbUFjYzsKQEAgLTMxMSw3ICszMTEsNyBAQAogcHVibGljOgogICAgIENQREZfRGV2aWNlQnVmZmVyKCk7CiAgICAgfkNQREZfRGV2aWNlQnVmZmVyKCk7Ci0gICAgYm9vbAkJCQlJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAorICAgIEZYX0JPT0wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSA9IDApOwogICAgIHZvaWQJCQkJT3V0cHV0VG9EZXZpY2UoKTsKICAgICBDRlhfRElCaXRtYXAqCQlHZXRCaXRtYXAoKSBjb25zdApAQCAtMzM3LDggKzMzNyw4IEBACiAgICAgfkNQREZfSW1hZ2VDYWNoZSgpOwogICAgIHZvaWQJCQkJQ2xlYXJJbWFnZURhdGEoKTsKICAgICB2b2lkCQkJCVJlc2V0KGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgYm9vbAkJCQlHZXRDYWNoZWRCaXRtYXAoQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlLAorICAgIEZYX0JPT0wJCQkJR2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CiAgICAgRlhfRFdPUkQJCQlFc3RpbWF0ZVNpemUoKSBjb25zdAogICAgIHsKQEAgLTM1OSw4ICszNTksOCBAQAogICAgIGludAkJCQkJbV9kd1RpbWVDb3VudDsKIHB1YmxpYzoKICAgICBpbnQJCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCi0gICAgICAgICAgICBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CiAgICAgaW50CQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgaW50IAkJCQlDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOwogICAgIENGWF9ESUJTb3VyY2UqCQlEZXRhY2hCaXRtYXAoKTsKQEAgLTM4OCwyMyArMzg4LDIzIEBACiBwdWJsaWM6CiAgICAgQ1BERl9ESUJTb3VyY2UoKTsKICAgICB2aXJ0dWFsIH5DUERGX0RJQlNvdXJjZSgpOwotICAgIGJvb2wJCQkJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICBGWF9CT09MCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBib29sCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdDsKICAgICB2aXJ0dWFsCXVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZAkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQJCVNldERvd25TYW1wbGVTaXplKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIGNvbnN0OwogICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpIGNvbnN0OwogICAgIHZvaWQJCQkJUmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqKSBjb25zdDsKICAgICB2b2lkCQkJCUNsZWFySW1hZ2VEYXRhKCk7CiBwdWJsaWM6Ci0gICAgaW50CQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYkhhc01hc2ssCisgICAgaW50CQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CiAgICAgaW50CQkJCQlDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIGludAkJCQkJU3RyYXRMb2FkTWFzaygpOwogICAgIGludAkJCQkJU3RhcnRMb2FkTWFza0RJQigpOwpAQCAtNDE1LDEzICs0MTUsMTMgQEAKICAgICBGWF9EV09SRAkJCW1fTWF0dGVDb2xvcjsKICAgICB2b2lkKgkJCW1fcEpiaWcyQ29udGV4dDsKICAgICBDUERGX1N0cmVhbUFjYyoJCW1fcEdsb2JhbFN0cmVhbTsKLSAgICBib29sCQkJCW1fYlN0ZENTOworICAgIEZYX0JPT0wJCQkJbV9iU3RkQ1M7CiAgICAgaW50CQkJCQltX1N0YXR1czsKICAgICBDUERGX09iamVjdCoJCW1fcE1hc2tTdHJlYW07Ci0gICAgYm9vbAkJCQltX2JIYXNNYXNrOworICAgIEZYX0JPT0wJCQkJbV9iSGFzTWFzazsKIHByb3RlY3RlZDoKLSAgICBib29sCQkJCUxvYWRDb2xvckluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyk7Ci0gICAgRElCX0NPTVBfREFUQSogICAgICBHZXREZWNvZGVBbmRNYXNrQXJyYXkoYm9vbCYgYkRlZmF1bHREZWNvZGUsIGJvb2wmIGJDb2xvcktleSk7CisgICAgRlhfQk9PTAkJCQlMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpOworICAgIERJQl9DT01QX0RBVEEqICAgICAgR2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLCBGWF9CT09MJiBiQ29sb3JLZXkpOwogICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2soRlhfRFdPUkQmIE1hdHRlQ29sb3IpOwogICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2tESUIoQ1BERl9TdHJlYW0qIHBNYXNrKTsKICAgICB2b2lkCQkJCUxvYWRKcHhCaXRtYXAoKTsKQEAgLTQzOSwxMSArNDM5LDExIEBACiAgICAgRlhfRFdPUkQJCQltX2JwY19vcmlnOwogICAgIEZYX0RXT1JECQkJbV9uQ29tcG9uZW50czsKICAgICBGWF9EV09SRAkJCW1fR3JvdXBGYW1pbHk7Ci0gICAgYm9vbAkJCQltX2JMb2FkTWFzazsKLSAgICBib29sCQkJCW1fYkRlZmF1bHREZWNvZGU7Ci0gICAgYm9vbAkJCQltX2JJbWFnZU1hc2s7Ci0gICAgYm9vbAkJCQltX2JEb0JwY0NoZWNrOwotICAgIGJvb2wJCQkJbV9iQ29sb3JLZXk7CisgICAgRlhfQk9PTAkJCQltX2JMb2FkTWFzazsKKyAgICBGWF9CT09MCQkJCW1fYkRlZmF1bHREZWNvZGU7CisgICAgRlhfQk9PTAkJCQltX2JJbWFnZU1hc2s7CisgICAgRlhfQk9PTAkJCQltX2JEb0JwY0NoZWNrOworICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JLZXk7CiAgICAgRElCX0NPTVBfREFUQSoJCW1fcENvbXBEYXRhOwogICAgIHVpbnQ4X3QqCQkJbV9wTGluZUJ1ZjsKICAgICB1aW50OF90KgkJCW1fcE1hc2tlZExpbmU7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcAppbmRleCBlN2EzMzljLi44NTFiMmQ2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAKQEAgLTI4OSwxMCArMjg5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldDIiwgIldTIiwgIkRTIiwgIldQIiwgIkRQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLWJvb2wgQ1BERl9BQWN0aW9uOjpBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKK0ZYX0JPT0wgQ1BERl9BQWN0aW9uOjpBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+S2V5RXhpc3QoZ19zQUFUeXBlc1soaW50KWVUeXBlXSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAKaW5kZXggNTQzMDA3OS4uMGE3NDYxOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcApAQCAtMjIsNyArMjIsNyBAQAogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotICAgIGJvb2wgYlJlZ2VuZXJhdGVBUCA9IHBBY3JvRm9ybSAmJiBwQWNyb0Zvcm0tPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOworICAgIEZYX0JPT0wgYlJlZ2VuZXJhdGVBUCA9IHBBY3JvRm9ybSAmJiBwQWNyb0Zvcm0tPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RzLT5HZXRDb3VudCgpOyArK2kpIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKICAgICAgICAgaWYgKHBEaWN0ID09IE5VTEwgfHwgcERpY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewpAQCAtNTUsMTIgKzU1LDEyIEBACiAgICAgfQogfQogdm9pZCBDUERGX0Fubm90TGlzdDo6RGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lkZ2V0UGFzcywgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogY2xpcF9yZWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXRQYXNzLCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBjbGlwX3JlY3QpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkgewogICAgICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSAoQ1BERl9Bbm5vdCopbV9Bbm5vdExpc3RbaV07Ci0gICAgICAgIGJvb2wgYldpZGdldCA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiOworICAgICAgICBGWF9CT09MIGJXaWRnZXQgPSBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IjsKICAgICAgICAgaWYgKChiV2lkZ2V0UGFzcyAmJiAhYldpZGdldCkgfHwgKCFiV2lkZ2V0UGFzcyAmJiBiV2lkZ2V0KSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTEwMywyNCArMTAzLDI0IEBACiB9CiB2b2lkIENQREZfQW5ub3RMaXN0OjpEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hvd1dpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hvd1dpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKICAgICBGWF9SRUNUIGNsaXBfcmVjdDsKICAgICBpZiAocERldmljZSkgewogICAgICAgICBjbGlwX3JlY3QgPSBwRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgICAgfQotICAgIGJvb2wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKKyAgICBGWF9CT09MIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CiAgICAgRGlzcGxheUFubm90cyhwUGFnZSwgcERldmljZSwgTlVMTCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCAmY2xpcF9yZWN0KTsKIH0KIHZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBGWF9EV09SRCBkd0Fubm90RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIHBDbGlwUmVjdCkKIHsKICAgICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMSkgewotICAgICAgICBEaXNwbGF5UGFzcyhwUGFnZSwgcERldmljZSwgcENvbnRleHQsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBmYWxzZSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CisgICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIEZBTFNFLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKICAgICB9CiAgICAgaWYgKGR3QW5ub3RGbGFncyAmIDB4MDIpIHsKLSAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgdHJ1ZSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CisgICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIFRSVUUsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwogICAgIH0KIH0KIGludCBDUERGX0Fubm90TGlzdDo6R2V0SW5kZXgoQ1BERl9Bbm5vdCogcEFubm90KQpAQCAtMjQ2LDI4ICsyNDYsMjggQEAKICAgICBtYXRyaXguQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwogICAgIHJldHVybiBwRm9ybTsKIH0KLWJvb2wgQ1BERl9Bbm5vdDo6RHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAorRlhfQk9PTCBDUERGX0Fubm90OjpEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCiB7CiAgICAgQ0ZYX01hdHJpeCBtYXRyaXg7CiAgICAgQ1BERl9Gb3JtKiBwRm9ybSA9IEZQREZET0NfQW5ub3RfR2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsIG1hdHJpeCk7CiAgICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9SZW5kZXJDb250ZXh0IGNvbnRleHQ7CiAgICAgY29udGV4dC5DcmVhdGUoKENQREZfUGFnZSopcFBhZ2UpOwogICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QocERldmljZSwgcEZvcm0sICZtYXRyaXgsIHBPcHRpb25zKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9Bbm5vdDo6RHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIEFwcGVhcmFuY2VNb2RlIG1vZGUpCitGWF9CT09MIENQREZfQW5ub3Q6OkRyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENGWF9NYXRyaXggbWF0cml4OwogICAgIENQREZfRm9ybSogcEZvcm0gPSBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOwogICAgIGlmICghcEZvcm0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgICgoQ1BERl9SZW5kZXJDb250ZXh0KilwQ29udGV4dCktPkFwcGVuZE9iamVjdExpc3QocEZvcm0sICZtYXRyaXgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX0Fubm90OjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIGlmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19ISURERU4pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBib29sIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CisgICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOwogICAgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAKaW5kZXggNGYzZjE3OC4uZjk0YTRkNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcApAQCAtOCwxMCArOCwxMCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCiAjaW5jbHVkZSAicGRmX3Z0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCIKLWJvb2wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKK0ZYX0JPT0wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0Q29uc3RTdHJpbmcoIlN1YnR5cGUiKSAhPSBGWF9CU1RSQygiV2lkZ2V0IikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpZWxkX3R5cGUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRlQiKS0+R2V0U3RyaW5nKCk7CiAgICAgRlhfRFdPUkQgZmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7CkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIGNsYXNzIENQVlRfRm9udE1hcCA6IHB1YmxpYyBJUFZUX0ZvbnRNYXAKIHsKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1ib29sIENQVlRfUHJvdmlkZXI6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKK0ZYX0JPT0wgQ1BWVF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQogewogICAgIGlmICgod29yZCA+PSAweDYxICYmIHdvcmQgPD0gMHg3QSkgfHwgKHdvcmQgPj0gMHg0MSAmJiB3b3JkIDw9IDB4NUEpIHx8IHdvcmQgPT0gMHgyRCB8fCB3b3JkID09IDB4MjcpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkKIHsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAgICAgfQogICAgIHJldHVybiBydDsKIH0KLXN0YXRpYyBib29sIEdlbmVyYXRlV2lkZ2V0QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBjb25zdCBpbnQzMl90ICYgbldpZGdldFR5cGUpCitzdGF0aWMgRlhfQk9PTCBHZW5lcmF0ZVdpZGdldEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgaW50MzJfdCAmIG5XaWRnZXRUeXBlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gTlVMTDsKICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpKSB7CiAgICAgICAgIHBGb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKICAgICB9CiAgICAgaWYgKCFwRm9ybURpY3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIERBOwogICAgIGlmIChDUERGX09iamVjdCogcERBT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkRBIikpIHsKQEAgLTI2MSwyMyArMjYxLDIzIEBACiAgICAgICAgIERBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CiAgICAgfQogICAgIGlmIChEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChEQSk7CiAgICAgc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBzeW50YXguR2V0V29yZCgpOwogICAgIHNGb250TmFtZSA9IFBERl9OYW1lRGVjb2RlKHNGb250TmFtZSk7CiAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CiAgICAgQ1BWVF9Db2xvciBjclRleHQgPSBQYXJzZUNvbG9yKERBKTsKLSAgICBib29sIGJVc2VGb3JtUmVzID0gZmFsc2U7CisgICAgRlhfQk9PTCBiVXNlRm9ybVJlcyA9IEZBTFNFOwogICAgIENQREZfRGljdGlvbmFyeSAqIHBGb250RGljdCA9IE5VTEw7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7CiAgICAgaWYgKHBEUkRpY3QgPT0gTlVMTCkgewogICAgICAgICBwRFJEaWN0ID0gcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsKLSAgICAgICAgYlVzZUZvcm1SZXMgPSB0cnVlOworICAgICAgICBiVXNlRm9ybVJlcyA9IFRSVUU7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSAqIHBEUkZvbnREaWN0ID0gTlVMTDsKICAgICBpZiAocERSRGljdCAmJiAocERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250IikpKSB7CkBAIC0yOTEsMTIgKzI5MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICghcERSRm9udERpY3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghcEZvbnREaWN0KSB7CiAgICAgICAgIHBGb250RGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChwRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksICJGb250Iik7CiAgICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksICJUeXBlMSIpOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgfQogICAgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOwogICAgIGlmICghcERlZkZvbnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOwogICAgIGludDMyX3QgblJvdGF0ZSA9IDA7CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCB0cnVlKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCBUUlVFKTsKICAgICBpZiAoc0JHLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCRyA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKICAgICAgICAgICAgICAgICAgICA8PCByY0JCb3guV2lkdGgoKSA8PCAiICIgPDwgcmNCQm94LkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKQEAgLTM5NSw3ICszOTUsNyBAQAogICAgIGlmIChwQVBEaWN0ID09IE5VTEwpIHsKICAgICAgICAgcEFQRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChwQVBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBwQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKICAgICB9CkBAIC00MDMsNyArNDAzLDcgQEAKICAgICBpZiAocE5vcm1hbFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgIHBOb3JtYWxTdHJlYW0gPSBDUERGX1N0cmVhbTo6Q3JlYXRlKE5VTEwsIDAsIE5VTEwpOwogICAgICAgICBpZiAocE5vcm1hbFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBvYmpudW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwTm9ybWFsU3RyZWFtKTsKICAgICAgICAgcEFubm90RGljdC0+R2V0RGljdCgiQVAiKS0+U2V0QXRSZWZlcmVuY2UoIk4iLCBwRG9jLCBvYmpudW0pOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewogICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW1SZXNGb250TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXQoIkZvbnQiLCBwU3RyZWFtUmVzRm9udExpc3QpOwogICAgICAgICAgICAgfQpAQCAtNDQzLDIxICs0NDMsMjEgQEAKICAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNCb2R5KTsKICAgICAgICAgICAgICAgICB2dC5TZXRBbGlnbm1lbnQobkFsaWduKTsKICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZShUUlVFKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sIGJNdWx0aUxpbmUgPSAoZHdGbGFncyA+PiAxMikgJiAxOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSA9IChkd0ZsYWdzID4+IDEyKSAmIDE7CiAgICAgICAgICAgICAgICAgaWYgKGJNdWx0aUxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0TXVsdGlMaW5lKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvUmV0dXJuKHRydWUpOworICAgICAgICAgICAgICAgICAgICB2dC5TZXRNdWx0aUxpbmUoVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9SZXR1cm4oVFJVRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKChkd0ZsYWdzID4+IDEzKSAmIDEpIHsKICAgICAgICAgICAgICAgICAgICAgc3ViV29yZCA9ICcqJzsKICAgICAgICAgICAgICAgICAgICAgdnQuU2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJBcnJheSA9IChkd0ZsYWdzID4+IDI0KSAmIDE7CiAgICAgICAgICAgICAgICAgaWYgKGJDaGFyQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgdnQuU2V0Q2hhckFycmF5KGR3TWF4TGVuKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDc5LDcgKzQ3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQm9keS5sZWZ0IDw8ICIgIiA8PCByY0JvZHkuYm90dG9tIDw8ICIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCB0cnVlKSA8PCBzQm9keSA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKKyAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzQm9keSA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogICAgICAgICAgICAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKICAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZShUUlVFKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUwNiwxNCArNTA2LDE0IEBACiAgICAgICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CiAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IHZ0LkdldENvbnRlbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwgKHJjQ29udGVudC5IZWlnaHQoKSAtIHJjRWRpdC5IZWlnaHQoKSkgLyAyLjBmKTsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsIHRydWUsIDApOworICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgVFJVRSwgMCk7CiAgICAgICAgICAgICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCB0cnVlKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKKyAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgVFJVRSk7CiAgICAgICAgICAgICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKQEAgLTU1NSwxMSArNTU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT3B0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3SXRlbSA9ICgoQ1BERl9BcnJheSopcE9wdCktPkdldEVsZW1lbnRWYWx1ZSgxKS0+R2V0VW5pY29kZVRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU2VscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwU2Vscy0+R2V0SW50ZWdlcihzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTc4LDExICs1NzgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNJdGVtID0gQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9SR0IsIDAsIDUxLjBmIC8gMjU1LjBmLCAxMTMuMGYgLyAyNTUuMGYpLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAicVxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsIDExMy4wZiAvIDI1NS4wZiksIFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIiA8PCByY0l0ZW0uV2lkdGgoKSA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIHRydWUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIHRydWUsIDApIDw8ICJFVFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIFRSVUUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIFRSVUUsIDApIDw8ICJFVFxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCB0cnVlKSA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIENQREZfUG9pbnQoMC4wZiwgZnkpLCB0cnVlLCAwKSA8PCAiRVRcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIFRSVUUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIFRSVUUsIDApIDw8ICJFVFxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnkgLT0gZkl0ZW1IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC01OTgsNyArNTk4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAocE5vcm1hbFN0cmVhbSkgewotICAgICAgICBwTm9ybWFsU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilzQXBwU3RyZWFtLkdldEJ1ZmZlcigpLCBzQXBwU3RyZWFtLkdldFNpemUoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcE5vcm1hbFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0FwcFN0cmVhbS5HZXRCdWZmZXIoKSwgc0FwcFN0cmVhbS5HZXRTaXplKCksIEZBTFNFLCBGQUxTRSk7CiAgICAgICAgIHBTdHJlYW1EaWN0ID0gcE5vcm1hbFN0cmVhbS0+R2V0RGljdCgpOwogICAgICAgICBpZiAocFN0cmVhbURpY3QpIHsKICAgICAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKQEAgLTYwOSw3ICs2MDksNyBAQAogICAgICAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtUmVzRm9udExpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjIyLDIxICs2MjIsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKK0ZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAwKTsKIH0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCiB7CiAgICAgcmV0dXJuIEdlbmVyYXRlV2lkZ2V0QVAocERvYywgcEFubm90RGljdCwgMSk7CiB9Ci1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAyKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgYm9vbCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlKQorQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzTGluZVN0cmVhbSwgc1dvcmRzOwogICAgIENQREZfUG9pbnQgcHRPbGQoMC4wZiwgMC4wZiksIHB0TmV3KDAuMGYsIDAuMGYpOwpAQCAtNzI2LDcgKzcyNiw3IEBACiAgICAgICAgIHN3aXRjaCAoblN0eWxlKSB7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgY2FzZSBQQlNfU09MSUQ6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKQEAgLTczNiw3ICs3MzYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEJTX0RBU0g6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBGQUxTRSk7CiAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIgPDwgIiBbIiA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIiA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiI7CkBAIC03NDksNyArNzQ5LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6CiAgICAgICAgICAgICBjYXNlIFBCU19JTlNFVDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JMZWZ0VG9wLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JMZWZ0VG9wLCBUUlVFKTsKICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgbVxuIjsKQEAgLTc1OSw3ICs3NTksNyBAQAogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNyUmlnaHRCb3R0b20sIFRSVUUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8CWZUb3AgLSBmSGFsZldpZHRoIDw8ICIgbVxuIjsKQEAgLTc2OSw3ICs3NjksNyBAQAogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBUUlVFKTsKICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwJZlJpZ2h0IC0gZkxlZnQgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CkBAIC03NzgsNyArNzc4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgZmFsc2UpOworICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHdcbiI7CkBAIC03OTAsNyArNzkwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSkKK0NGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNvbnN0IENQVlRfQ29sb3IgJiBjb2xvciwgY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKICAgICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcAppbmRleCA2NDdiN2NiLi4zYmExMDliIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19iYXNpYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwCkBAIC0zMTMsMTAgKzMxMywxMCBAQAogICAgIHJldHVybiBmaWxlcGF0aDsKICNlbmRpZgogfQotYm9vbCBDUERGX0ZpbGVTcGVjOjpHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmY3NGaWxlTmFtZSkgY29uc3QKK0ZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJmNzRmlsZU5hbWUpIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcE9iajsKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRiIpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZTIikpID09IEZYX0JTVFJDKCJVUkwiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkRPUyIpKSkgewpAQCAtMzM1LDE0ICszMzUsMTQgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJVbml4IikpKSB7CiAgICAgICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVW5peCIpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BPYmotPkdldFN0cmluZygpKTsKICAgICB9CiAgICAgY3NGaWxlTmFtZSA9IEZJTEVTUEVDX0RlY29kZUZpbGVOYW1lKGNzRmlsZU5hbWUpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ1BERl9GaWxlU3BlYzo6Q1BERl9GaWxlU3BlYygpCiB7CkBAIC0zNTEsMTMgKzM1MSwxMyBAQAogICAgICAgICAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGaWxlc3BlYyIpKTsKICAgICB9CiB9Ci1ib29sIENQREZfRmlsZVNwZWM6OklzVVJMKCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6SXNVUkwoKSBjb25zdAogewogICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkqKW1fcE9iaiktPkdldFN0cmluZyhGWF9CU1RSQygiRlMiKSkgPT0gRlhfQlNUUkMoIlVSTCIpOwogfQpAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotc3RhdGljIHZvaWQgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShDUERGX09iamVjdCAqcE9iaiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBib29sIGJVUkwpCitzdGF0aWMgdm9pZCBGUERGRE9DX0ZJTEVTUEVDX1NldEZpbGVOYW1lKENQREZfT2JqZWN0ICpwT2JqLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIEZYX0JPT0wgYlVSTCkKIHsKICAgICBBU1NFUlQocE9iaiAhPSBOVUxMKTsKICAgICBDRlhfV2lkZVN0cmluZyB3c1N0cjsKQEAgLTQzNCw3ICs0MzQsNyBAQAogICAgICAgICBwRGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlVGIiksIFBERl9FbmNvZGVUZXh0KHdzU3RyKSk7CiAgICAgfQogfQotdm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIGJvb2wgYlVSTCkKK3ZvaWQgQ1BERl9GaWxlU3BlYzo6U2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwpCiB7CiAgICAgQVNTRVJUKG1fcE9iaiAhPSBOVUxMKTsKICAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgJiYgYlVSTCkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAppbmRleCA2MDU3ZjU2Li43MzUyMzFjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcApAQCAtMjQxLDEyICsyNDEsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIHBOb2RlOwogfQotQ1BERl9JbnRlckZvcm06OkNQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgYm9vbCBiR2VuZXJhdGVBUCkgOiBDRlhfUHJpdmF0ZURhdGEoKQorQ1BERl9JbnRlckZvcm06OkNQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfQk9PTCBiR2VuZXJhdGVBUCkgOiBDRlhfUHJpdmF0ZURhdGEoKQogewogICAgIG1fcERvY3VtZW50ID0gcERvY3VtZW50OwogICAgIG1fYkdlbmVyYXRlQVAgPSBiR2VuZXJhdGVBUDsKICAgICBtX3BGb3JtTm90aWZ5ID0gTlVMTDsKLSAgICBtX2JVcGRhdGVkID0gZmFsc2U7CisgICAgbV9iVXBkYXRlZCA9IEZBTFNFOwogICAgIG1fcEZpZWxkVHJlZSA9IG5ldyBDRmllbGRUcmVlOwogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICAgIG1fcEZvcm1EaWN0ID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7CkBAIC0yODAsMTIgKzI4MCwxMiBAQAogICAgICAgICBkZWxldGUgbV9wRmllbGRUcmVlOwogICAgIH0KIH0KLWJvb2wJQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQID0gdHJ1ZTsKLWJvb2wgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkKK0ZYX0JPT0wJQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQID0gVFJVRTsKK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkKIHsKICAgICByZXR1cm4gbV9iVXBkYXRlQVA7CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChib29sIGJVcGRhdGVBUCkKK3ZvaWQgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKQogewogICAgIG1fYlVwZGF0ZUFQID0gYlVwZGF0ZUFQOwogfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgfQogICAgIGludCBudW0gPSAwOwogICAgIENGWF9CeXRlU3RyaW5nIGJzTnVtOwotICAgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKFRSVUUpIHsKICAgICAgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoY3NUbXAgKyBic051bSkpIHsKICAgICAgICAgICAgIHJldHVybiBjc1RtcCArIGJzTnVtOwogICAgICAgICB9CkBAIC0zNDMsNyArMzQzLDcgQEAKIH0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiB0eXBlZGVmIHN0cnVjdCBfUERGX0ZPTlREQVRBIHsKLSAgICBib29sCQliRmluZDsKKyAgICBGWF9CT09MCQliRmluZDsKICAgICBMT0dGT05UQQlsZjsKIH0gUERGX0ZPTlREQVRBLCBGQVIqIExQREZfRk9OVERBVEE7CiBzdGF0aWMgaW50IENBTExCQUNLIEVudW1Gb250RmFtRXhQcm9jKAlFTlVNTE9HRk9OVEVYQSAqbHBlbGZlLApAQCAtMzU3LDEwICszNTcsMTAgQEAKICAgICB9CiAgICAgTFBERl9GT05UREFUQSBwRGF0YSA9IChMUERGX0ZPTlREQVRBKWxQYXJhbTsKICAgICBtZW1jcHkoJnBEYXRhLT5sZiwgJmxwZWxmZS0+ZWxmTG9nRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgcERhdGEtPmJGaW5kID0gdHJ1ZTsKKyAgICBwRGF0YS0+YkZpbmQgPSBUUlVFOwogICAgIHJldHVybiAwOwogfQotc3RhdGljIGJvb2wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQorc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQogewogICAgIFBERl9GT05UREFUQSBmZDsKICAgICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGZkLmJGaW5kOwogfQotc3RhdGljIGJvb2wgUmV0cmlldmVTcGVjaWZpY0ZvbnQodWludDhfdCBjaGFyU2V0LCB1aW50OF90IHBpdGNoQW5kRmFtaWx5LCBMUENTVFIgcGNzRm9udE5hbWUsIExPR0ZPTlRBJiBsZikKK3N0YXRpYyBGWF9CT09MIFJldHJpZXZlU3BlY2lmaWNGb250KHVpbnQ4X3QgY2hhclNldCwgdWludDhfdCBwaXRjaEFuZEZhbWlseSwgTFBDU1RSIHBjc0ZvbnROYW1lLCBMT0dGT05UQSYgbGYpCiB7CiAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7CiAgICAgbGYubGZDaGFyU2V0ID0gY2hhclNldDsKQEAgLTM4Miw3ICszODIsNyBAQAogICAgIH0KICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwogfQotc3RhdGljIGJvb2wgUmV0cmlldmVTdG9ja0ZvbnQoaW50IGlGb250T2JqZWN0LCB1aW50OF90IGNoYXJTZXQsIExPR0ZPTlRBJiBsZikKK3N0YXRpYyBGWF9CT09MIFJldHJpZXZlU3RvY2tGb250KGludCBpRm9udE9iamVjdCwgdWludDhfdCBjaGFyU2V0LCBMT0dGT05UQSYgbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSAoSEZPTlQpOjpHZXRTdG9ja09iamVjdChpRm9udE9iamVjdCk7CiAgICAgaWYgKGhGb250ICE9IE5VTEwpIHsKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFJldHJpZXZlU3BlY2lmaWNGb250KGxmKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogI2VuZGlmCiBDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTeXN0ZW1EZWZhdWx0Rm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCkBAIC00MDMsMTMgKzQwMywxMyBAQAogICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICAgICBMT0dGT05UQSBsZjsKLSAgICBib29sIGJSZXQ7CisgICAgRlhfQk9PTCBiUmV0OwogICAgIGJSZXQgPSBSZXRyaWV2ZVN0b2NrRm9udChERUZBVUxUX0dVSV9GT05ULCAyNTUsIGxmKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgYlJldCA9IFJldHJpZXZlU3RvY2tGb250KFNZU1RFTV9GT05ULCAyNTUsIGxmKTsKICAgICB9CiAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgZmFsc2UsIHRydWUpOworICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CiAgICAgfQogI2VuZGlmCiAgICAgcmV0dXJuIHBGb250OwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgIDo6R2V0T2JqZWN0QShoRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSwgJmxmKTsKICAgICAgICAgOjpEZWxldGVPYmplY3QoaEZvbnQpOwogICAgICAgICBpZiAoc3RybGVuKGxmLmxmRmFjZU5hbWUpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgpAQCAtNDUyLDcgKzQ1Miw3IEBACiAgICAgICAgIDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOwogICAgICAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7CiAgICAgICAgIGlmIChzdHJsZW4obGYubGZGYWNlTmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC00NzcsMTIgKzQ3NywxMiBAQAogICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogICAgIExPR0ZPTlRBIGxmOwotICAgIGJvb2wgYlJldDsKKyAgICBGWF9CT09MIGJSZXQ7CiAgICAgaWYgKGNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUKSB7CiAgICAgICAgIGNzRm9udE5hbWUgPSAiSGVsdmV0aWNhIjsKICAgICAgICAgcmV0dXJuIGNzRm9udE5hbWU7CiAgICAgfQotICAgIGJSZXQgPSBmYWxzZTsKKyAgICBiUmV0ID0gRkFMU0U7CiAgICAgaWYgKGNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVCkgewogICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTVMgTWluY2hvIiwgbGYpOwogICAgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCkgewpAQCAtNTkxLDcgKzU5MSw3IEBACiAgICAgICAgIGlmIChjc0ZvbnROYW1lID09ICJIZWx2ZXRpY2EiKSB7CiAgICAgICAgICAgICBwRm9udCA9IEFkZFN0YW5kYXJkRm9udChwRG9jdW1lbnQsIGNzRm9udE5hbWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC02MDcsMTUgKzYwNywxNSBAQAogICAgIHBGb250ID0gQWRkTmF0aXZlRm9udChjaGFyU2V0LCBwRG9jdW1lbnQpOwogICAgIHJldHVybiBwRm9udDsKIH0KLWJvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSwgY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBFeGNsdWRlZEZpZWxkLCBjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwRXhjbHVkZWRDb250cm9sKQogewogICAgIGlmIChjc05ld0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBpUG9zID0gMDsKICAgICBpbnQgaUxlbmd0aCA9IGNzTmV3RmllbGROYW1lLkdldExlbmd0aCgpOwogICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKFRSVUUpIHsKICAgICAgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmIChjc05ld0ZpZWxkTmFtZVtpUG9zXSA9PSBMJy4nIHx8IGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnICcpKSB7CiAgICAgICAgICAgICBpUG9zICsrOwogICAgICAgICB9CkBAIC02NTEsMTUgKzY1MSwxNSBAQAogICAgICAgICAgICAgaW50IGlSZXQgPSBDb21wYXJlRmllbGROYW1lKGNzU3ViLCBjc0Z1bGxOYW1lKTsKICAgICAgICAgICAgIGlmIChpUmV0ID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAocEZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBpVHlwZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMiAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgewogICAgICAgICAgICAgICAgIGlmIChjc0Z1bGxOYW1lW2lQb3NdID09IEwnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChpUmV0ID09IDMgJiYgY3NTdWIgPT0gY3NOZXdGaWVsZE5hbWUpIHsKICAgICAgICAgICAgICAgICBpZiAoY3NOZXdGaWVsZE5hbWVbY3NGdWxsTmFtZS5HZXRMZW5ndGgoKV0gPT0gTCcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY2OCwyNiArNjY4LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGNzU3ViLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgY3NOZXdGaWVsZE5hbWUgPSBjc1N1YjsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlKQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpCiB7CiAgICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBpVHlwZSwgTlVMTCwgTlVMTCk7CiB9Ci1ib29sIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCiB7CiAgICAgaWYgKHBGaWVsZCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBOVUxMKTsKIH0KLWJvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKQogewogICAgIGlmIChwQ29udHJvbCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9ICgoQ1BERl9Gb3JtQ29udHJvbCopcENvbnRyb2wpLT5HZXRGaWVsZCgpOwogICAgIHJldHVybiBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwgcEZpZWxkLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBwQ29udHJvbCk7CkBAIC03NjQsMTkgKzc2NCwxOSBAQAogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCkKIHsKICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKICAgICAgICAgQ1BERl9Gb3JtRmllbGQgKnBGb3JtRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKICAgICAgICAgaWYgKHBGaWVsZCA9PSBwRm9ybUZpZWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3QKIHsKQEAgLTgwOCwxMCArODA4LDEwIEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotYm9vbCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKQogewogICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKQEAgLTgxOSwxMCArODE5LDEwIEBACiAgICAgICAgIHZvaWQqIHBGb3JtQ29udHJvbCA9IE5VTEw7CiAgICAgICAgIG1fQ29udHJvbE1hcC5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBXaWRnZXREaWN0LCBwRm9ybUNvbnRyb2wpOwogICAgICAgICBpZiAocENvbnRyb2wgPT0gcEZvcm1Db250cm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBpbnQgQ1BERl9JbnRlckZvcm06OkNvdW50UGFnZUNvbnRyb2xzKENQREZfUGFnZSogcFBhZ2UpIGNvbnN0CiB7CkBAIC05MTksNyArOTE5LDcgQEAKICAgICAgICAgICAgIGNzU3ViICs9IGNzRmllbGROYW1lW2lQb3MgKytdOwogICAgICAgICB9CiAgICAgICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7CiAgICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewpAQCAtOTI3LDcgKzkyNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKICAgICAgICAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKLSAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NzAsNyArOTcwLDcgQEAKICAgICAgICAgICAgIGNzU3ViICs9IGNzRmllbGROYW1lW2lQb3MgKytdOwogICAgICAgICB9CiAgICAgICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7CiAgICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewpAQCAtOTc4LDcgKzk3OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKICAgICAgICAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKLSAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05OTYsMTQgKzk5NiwxNCBAQAogICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOwogICAgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldERpY3QoaW5kZXgpIDogcERpY3Q7CiB9Ci1ib29sIENQREZfSW50ZXJGb3JtOjpOZWVkQ29uc3RydWN0QVAoKQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKCkKIHsKICAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcEZvcm1EaWN0LT5HZXRCb29sZWFuKCJOZWVkQXBwZWFyYW5jZXMiKTsKIH0KLXZvaWQgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUChib29sIGJOZWVkQVApCit2b2lkIENQREZfSW50ZXJGb3JtOjpOZWVkQ29uc3RydWN0QVAoRlhfQk9PTCBiTmVlZEFQKQogewogICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7CiAgICAgICAgIEluaXRJbnRlckZvcm1EaWN0KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCk7CkBAIC0xMDc4LDM3ICsxMDc4LDM3IEBACiB7CiAgICAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjc05hbWVUYWcpOwogfQotYm9vbCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKICAgICByZXR1cm4gRmluZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250LCBjc05hbWVUYWcpOwogfQotYm9vbCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LCBjc05hbWVUYWcpOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6QWRkRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKICAgICBBZGRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgbV9iVXBkYXRlZCA9IHRydWU7CisgICAgbV9iVXBkYXRlZCA9IFRSVUU7CiB9CiBDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7Ci0gICAgbV9iVXBkYXRlZCA9IHRydWU7CisgICAgbV9iVXBkYXRlZCA9IFRSVUU7CiAgICAgcmV0dXJuIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwogfQogQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKLSAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICBtX2JVcGRhdGVkID0gVFJVRTsKICAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7CiB9CiB2b2lkIENQREZfSW50ZXJGb3JtOjpSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KQogewotICAgIG1fYlVwZGF0ZWQgPSB0cnVlOworICAgIG1fYlVwZGF0ZWQgPSBUUlVFOwogICAgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250KTsKIH0KIHZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykKIHsKLSAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICBtX2JVcGRhdGVkID0gVFJVRTsKICAgICBSZW1vdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBjc05hbWVUYWcpOwogfQogQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBDUERGX0ludGVyRm9ybTo6R2V0RGVmYXVsdEFwcGVhcmFuY2UoKQpAQCAtMTEzMSwxMiArMTEzMSwxMiBAQAogICAgIH0KICAgICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEludGVnZXIoIlEiLCAwKTsKIH0KLWJvb2wgQ1BERl9JbnRlckZvcm06OlJlc2V0Rm9ybShjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwgYm9vbCBiTm90aWZ5KQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJOb3RpZnkpCiB7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybVJlc2V0KHRoaXMpOwogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKQEAgLTExNDUsMTEgKzExNDUsMTEgQEAKICAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBib29sIGJGaW5kID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKICAgICAgICAgaW50IGlDb3VudCA9IGZpZWxkcy5HZXRTaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICBpZiAocEZpZWxkID09IChDUERGX0Zvcm1GaWVsZCopZmllbGRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE2MCwxNCArMTE2MCwxNCBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1SZXNldCh0aGlzKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oYm9vbCBiTm90aWZ5KQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6UmVsb2FkRm9ybSgpCiB7CkBAIC0xMjQyLDcgKzEyNDIsNyBAQAogICAgICAgICBBZGRUZXJtaW5hbEZpZWxkKHBGaWVsZERpY3QpOwogICAgIH0KIH0KLWJvb2wgQ1BERl9JbnRlckZvcm06Okhhc1hGQUZvcm0oKSBjb25zdAorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SGFzWEZBRm9ybSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcEZvcm1EaWN0ICYmIG1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiWEZBIikpICE9IE5VTEw7CiB9CkBAIC0xMzAzLDcgKzEzMDMsNyBAQAogICAgICAgICBwRmllbGQgPSBuZXcgQ1BERl9Gb3JtRmllbGQodGhpcywgcFBhcmVudCk7CiAgICAgICAgIENQREZfT2JqZWN0KiBwVE9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KCJUIik7CiAgICAgICAgIGlmIChwVE9iaiAmJiBwVE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwVE9iai0+Q2xvbmUodHJ1ZSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcENsb25lID0gcFRPYmotPkNsb25lKFRSVUUpOwogICAgICAgICAgICAgaWYgKHBDbG9uZSkgewogICAgICAgICAgICAgICAgIHBEaWN0LT5TZXRBdCgiVCIsIHBDbG9uZSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTM0Miw3ICsxMzQyLDcgQEAKICAgICAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5tX0NvbnRyb2xMaXN0LkFkZChwQ29udHJvbCk7CiAgICAgcmV0dXJuIHBDb250cm9sOwogfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdAorQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdAogewogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKQEAgLTEzNTgsNyArMTM1OCw3IEBACiAgICAgICAgIGlmIChkd0ZsYWdzICYgMHgwNCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCBiRmluZCA9IHRydWU7CisgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBUUlVFOwogICAgICAgICBpZiAoZmllbGRzICE9IE5VTEwpIHsKICAgICAgICAgICAgIGJGaW5kID0gZmllbGRzLT5GaW5kKHBGaWVsZCwgMCkgPj0gMDsKICAgICAgICAgfQpAQCAtMTM3MSw3ICsxMzcxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1DRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgYm9vbCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0CitDRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0CiB7CiAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKICAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKQEAgLTEzNzksMTAgKzEzNzksMTAgQEAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwogICAgICAgICBmaWVsZHMuQWRkKHBGaWVsZCk7CiAgICAgfQotICAgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCB0cnVlLCBiU2ltcGxlRmlsZVNwZWMpOworICAgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCBUUlVFLCBiU2ltcGxlRmlsZVNwZWMpOwogfQogQ0ZYX1dpZGVTdHJpbmcgRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCk7Ci1DRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdAorQ0ZERl9Eb2N1bWVudCogQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKIHsKICAgICBDRkRGX0RvY3VtZW50KiBwRG9jID0gQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCk7CiAgICAgaWYgKHBEb2MgPT0gTlVMTCkgewpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKICAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBib29sIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOworICAgICAgICBGWF9CT09MIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOwogICAgICAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKICAgICAgICAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkLT5tX3BEaWN0LT5HZXRTdHJpbmcoIlYiKS5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiVCIsIHBTdHJpbmcpOwogICAgICAgICAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pIHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBGaWVsZC0+R2V0Q2hlY2tWYWx1ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFeHBvcnQgPSBwRmllbGQtPkdldENoZWNrVmFsdWUoRkFMU0UpOwogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzQkV4cG9ydCA9IFBERl9FbmNvZGVUZXh0KGNzRXhwb3J0KTsKICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwogICAgICAgICAgICAgICAgIGlmIChwT3B0ID09IE5VTEwpIHsKQEAgLTE0NDMsNyArMTQ0Myw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIlYiKTsKICAgICAgICAgICAgICAgICBpZiAocFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiViIsIHBWLT5DbG9uZSh0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJWIiwgcFYtPkNsb25lKFRSVUUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwRmllbGRzLT5BZGQocEZpZWxkRGljdCk7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogICAgICAgICBjc1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjc0JWYWx1ZSk7CiAgICAgfQogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6RkRGX0ltcG9ydEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBib29sIGJOb3RpZnksIGludCBuTGV2ZWwpCit2b2lkIENQREZfSW50ZXJGb3JtOjpGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsIEZYX0JPT0wgYk5vdGlmeSwgaW50IG5MZXZlbCkKIHsKICAgICBDRlhfV2lkZVN0cmluZyBuYW1lOwogICAgIGlmICghcGFyZW50X25hbWUuSXNFbXB0eSgpKSB7CkBAIC0xNTMxLDcgKzE1MzEsNyBAQAogICAgIHBGaWVsZC0+U2V0VmFsdWUoY3NXVmFsdWUpOwogICAgIENQREZfRm9ybUZpZWxkOjpUeXBlIGVUeXBlID0gcEZpZWxkLT5HZXRUeXBlKCk7CiAgICAgaWYgKChlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveCB8fCBlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6Q29tYm9Cb3gpICYmIHBGaWVsZERpY3QtPktleUV4aXN0KCJPcHQiKSkgewotICAgICAgICBwRmllbGQtPm1fcERpY3QtPlNldEF0KCJPcHQiLCBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoIk9wdCIpLT5DbG9uZSh0cnVlKSk7CisgICAgICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0QXQoIk9wdCIsIHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiT3B0IiktPkNsb25lKFRSVUUpKTsKICAgICB9CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CkBAIC0xNTQ2LDI0ICsxNTQ2LDI0IEBACiAgICAgICAgIHBGaWVsZC0+VXBkYXRlQVAoTlVMTCk7CiAgICAgfQogfQotYm9vbCBDUERGX0ludGVyRm9ybTo6SW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGLCBib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpJbXBvcnRGcm9tRkRGKGNvbnN0IENGREZfRG9jdW1lbnQqIHBGREYsIEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBpZiAocEZERiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBGREYtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7CiAgICAgaWYgKHBNYWluRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwRmllbGRzID0gcE1haW5EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CiAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9ic0VuY29kaW5nID0gcE1haW5EaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkVuY29kaW5nIikpOwogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1JbXBvcnREYXRhKHRoaXMpOwogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSArKykgewpAQCAtMTU3NiwxMyArMTU3NiwxMyBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1JbXBvcnREYXRhKHRoaXMpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9JbnRlckZvcm06OlNldEZvcm1Ob3RpZnkoY29uc3QgQ1BERl9Gb3JtTm90aWZ5KiBwTm90aWZ5KQogewogICAgIG1fcEZvcm1Ob3RpZnkgPSAoQ1BERl9Gb3JtTm90aWZ5KilwTm90aWZ5OwogfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIGJvb2wgYk5leHQpCitpbnQgQ1BERl9JbnRlckZvcm06OkdldFBhZ2VXaXRoV2lkZ2V0KGludCBpQ3VyUGFnZSwgRlhfQk9PTCBiTmV4dCkKIHsKICAgICBpZiAoaUN1clBhZ2UgPCAwKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE2MjIsNiArMTYyMiw2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGlOZXdQYWdlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgfSB3aGlsZSAoVFJVRSk7CiAgICAgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwCmluZGV4IDYyZWI1OTEuLjg3ZWVlOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAKQEAgLTExMywyNSArMTEzLDI1IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXT24gPSBQREZfRGVjb2RlVGV4dChjc09uKTsKICAgICByZXR1cm4gY3NXT247CiB9Ci1ib29sIENQREZfRm9ybUNvbnRyb2w6OklzQ2hlY2tlZCgpCitGWF9CT09MIENQREZfRm9ybUNvbnRyb2w6OklzQ2hlY2tlZCgpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiQVMiKTsKICAgICByZXR1cm4gY3NBUyA9PSBjc09uOwogfQotYm9vbCBDUERGX0Zvcm1Db250cm9sOjpJc0RlZmF1bHRDaGVja2VkKCkKK0ZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SXNEZWZhdWx0Q2hlY2tlZCgpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CiAgICAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiRFYiKTsKICAgICBpZiAocERWID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOwogICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwogICAgIHJldHVybiAoY3NEViA9PSBjc09uKTsKIH0KLXZvaWQgQ1BERl9Gb3JtQ29udHJvbDo6Q2hlY2tDb250cm9sKGJvb2wgYkNoZWNrZWQpCit2b2lkIENQREZfRm9ybUNvbnRyb2w6OkNoZWNrQ29udHJvbChGWF9CT09MIGJDaGVja2VkKQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwogICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbV9wV2lkZ2V0RGljdC0+U2V0QXROYW1lKCJBUyIsIGNzQVMpOwotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwogfQogQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOwogdm9pZCBDUERGX0Zvcm1Db250cm9sOjpEcmF3Q29udHJvbChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDUERGX1BhZ2UqIHBQYWdlLApAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgfQogICAgIHJldHVybiBJbnZlcnQ7CiB9Ci1DUERGX0FwU2V0dGluZ3MgQ1BERl9Gb3JtQ29udHJvbDo6R2V0TUsoYm9vbCBiQ3JlYXRlKQorQ1BERl9BcFNldHRpbmdzIENQREZfRm9ybUNvbnRyb2w6OkdldE1LKEZYX0JPT0wgYkNyZWF0ZSkKIHsKICAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDEsNDkgKzIwMSw0OSBAQAogICAgIH0KICAgICByZXR1cm4gbWs7CiB9Ci1ib29sIENQREZfRm9ybUNvbnRyb2w6Okhhc01LRW50cnkoQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKK0ZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CiAgICAgcmV0dXJuIG1rLkhhc01LRW50cnkoY3NFbnRyeSk7CiB9CiBpbnQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Um90YXRpb24oKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CiAgICAgcmV0dXJuIG1rLkdldFJvdGF0aW9uKCk7CiB9CiBGWF9BUkdCIENQREZfRm9ybUNvbnRyb2w6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwogICAgIHJldHVybiBtay5HZXRDb2xvcihpQ29sb3JUeXBlLCBjc0VudHJ5KTsKIH0KIEZYX0ZMT0FUIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CiAgICAgcmV0dXJuIG1rLkdldE9yaWdpbmFsQ29sb3IoaW5kZXgsIGNzRW50cnkpOwogfQogdm9pZCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoZmFsc2UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKICAgICBtay5HZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCBjc0VudHJ5KTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldENhcHRpb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwogICAgIHJldHVybiBtay5HZXRDYXB0aW9uKGNzRW50cnkpOwogfQogQ1BERl9TdHJlYW0qIENQREZfRm9ybUNvbnRyb2w6OkdldEljb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwogICAgIHJldHVybiBtay5HZXRJY29uKGNzRW50cnkpOwogfQogQ1BERl9JY29uRml0IENQREZfRm9ybUNvbnRyb2w6OkdldEljb25GaXQoKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CiAgICAgcmV0dXJuIG1rLkdldEljb25GaXQoKTsKIH0KIGludCBDUERGX0Zvcm1Db250cm9sOjpHZXRUZXh0UG9zaXRpb24oKQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CiAgICAgcmV0dXJuIG1rLkdldFRleHRQb3NpdGlvbigpOwogfQogQ1BERl9BY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWN0aW9uKCkKQEAgLTM0MywxMCArMzQzLDEwIEBACiAgICAgfQogICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7CiB9Ci1ib29sIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpCitGWF9CT09MIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpCiB7CiAgICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERpY3QtPktleUV4aXN0KGNzRW50cnkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKaW5kZXggOGQ5ODg3ZS4uMDg3ZWJhOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCkBAIC03LDExICs3LDExIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAjaW5jbHVkZSAiZG9jX3V0aWxzLmgiCiAKLWJvb2wgUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbihDUERGX0Zvcm1GaWVsZCAqcEZpZWxkKQorRlhfQk9PTCBQREZfRm9ybUZpZWxkX0lzVW5pc29uKENQREZfRm9ybUZpZWxkICpwRmllbGQpCiB7Ci0gICAgYm9vbCBiVW5pc29uID0gZmFsc2U7CisgICAgRlhfQk9PTCBiVW5pc29uID0gRkFMU0U7CiAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgewotICAgICAgICBiVW5pc29uID0gdHJ1ZTsKKyAgICAgICAgYlVuaXNvbiA9IFRSVUU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOwogICAgICAgICBiVW5pc29uID0gKChkd0ZsYWdzICYgMHgyMDAwMDAwKSAhPSAwKTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogewogICAgIHJldHVybiA6OkdldEZ1bGxOYW1lKG1fcERpY3QpOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6UmVzZXRGaWVsZChib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpDaGVja0JveDoKQEAgLTExMywxMyArMTEzLDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIEdldENvbnRyb2woaSktPklzRGVmYXVsdENoZWNrZWQoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBHZXRDb250cm9sKGkpLT5Jc0RlZmF1bHRDaGVja2VkKCksIEZBTFNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgRkFMU0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM4LDEwICsxMzgsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOworICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTcsMTAgKzE1NywxMCBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOworICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTgyLDEyICsxODIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOwogICAgICAgICAgICAgICAgIGlmICghcFJWICYmIChjc0RWYWx1ZSA9PSBjc1ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NEVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocERWID09IE5VTEwpIHsKQEAgLTE5Niw3ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRFYtPkNsb25lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJWIiwgcENsb25lKTsKICAgICAgICAgICAgICAgICAgICAgaWYocFJWKSB7CkBAIC0yMDcsMTEgKzIwNywxMSBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0Q29udHJvbEluZGV4KGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQogewpAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgfQogICAgIHJldHVybiBwT2JqLT5HZXRVbmljb2RlVGV4dCgpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKGJvb2wgYkRlZmF1bHQpCitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkKIHsKICAgICBpZiAoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbikgewogICAgICAgICByZXR1cm4gR2V0Q2hlY2tWYWx1ZShiRGVmYXVsdCk7CkBAIC0zMzMsMTkgKzMzMywxOSBAQAogfQogQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkKIHsKLSAgICByZXR1cm4gR2V0VmFsdWUoZmFsc2UpOworICAgIHJldHVybiBHZXRWYWx1ZShGQUxTRSk7CiB9CiBDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFZhbHVlKCkKIHsKLSAgICByZXR1cm4gR2V0VmFsdWUodHJ1ZSk7CisgICAgcmV0dXJuIEdldFZhbHVlKFRSVUUpOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIENoZWNrQm94OgogICAgICAgICBjYXNlIFJhZGlvQnV0dG9uOiB7CiAgICAgICAgICAgICAgICAgU2V0Q2hlY2tWYWx1ZSh2YWx1ZSwgYkRlZmF1bHQsIGJOb3RpZnkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEZpbGU6CiAgICAgICAgIGNhc2UgUmljaFRleHQ6CkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZShjc1ZhbHVlKTsKQEAgLTM3MSwzOSArMzcxLDM5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBMaXN0Qm94OiB7CiAgICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCAmJiBpSW5kZXggPT0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MTIsMTEgKzQxMiwxMSBAQAogICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKICAgICAgICAgVXBkYXRlQVAoTlVMTCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkKIHsKLSAgICByZXR1cm4gU2V0VmFsdWUodmFsdWUsIGZhbHNlLCBiTm90aWZ5KTsKKyAgICByZXR1cm4gU2V0VmFsdWUodmFsdWUsIEZBTFNFLCBiTm90aWZ5KTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0TWF4TGVuKCkKIHsKQEAgLTUwNiw3ICs1MDYsNyBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1ib29sIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpCiB7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gMDsKQEAgLTUyMiw3ICs1MjIsNyBAQAogICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7CkBAIC01MzgsNDMgKzUzOCw0MyBAQAogICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKICAgICAgICAgVXBkYXRlQVAoTlVMTCk7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChJc09wdGlvblNlbGVjdGVkKGluZGV4KSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKICAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKICAgICAgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKICAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChwVmFsdWUtPkdldEludGVnZXIoKSA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBWYWx1ZTsKICAgICBpbnQgaVBvcyA9IC0xOwpAQCAtNTg2LDE1ICs1ODYsMTUgQEAKICAgICB9CiAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykKICAgICAgICAgaWYgKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSAmJiAoaW50KWkgPT0gaVBvcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfRm9ybUZpZWxkOjpTZXRJdGVtU2VsZWN0aW9uKGludCBpbmRleCwgYm9vbCBiU2VsZWN0ZWQsIGJvb2wgYk5vdGlmeSkKK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKQEAgLTYwNiwxNCArNjA2LDE0IEBACiAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgb3B0X3ZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIWJTZWxlY3RlZCkgewogICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAobV9UeXBlID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIEZBTFNFKTsKICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewogICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CkBAIC02NDUsMjEgKzY0NSwyMSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIHRydWUpOworICAgICAgICAgICAgU2VsZWN0T3B0aW9uKGluZGV4LCBUUlVFKTsKICAgICAgICAgICAgIGlmICghKG1fRmxhZ3MgJiBGT1JNTElTVF9NVUxUSVNFTEVDVCkpIHsKICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2wgYlNlbGVjdGVkOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkOwogICAgICAgICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gSXNJdGVtU2VsZWN0ZWQoaSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKQEAgLTY3Miw3ICs2NzIsNyBAQAogICAgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlYiLCBQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICBpZiAocEkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwSS0+QWRkSW50ZWdlcihpbmRleCk7CiAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiSSIsIHBJKTsKQEAgLTY4OSwxOCArNjg5LDE4IEBACiAgICAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgewogICAgICAgICBVcGRhdGVBUChOVUxMKTsKICAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtRGVmYXVsdFNlbGVjdGVkKGludCBpbmRleCkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50T3B0aW9ucygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpbnQgaURWSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7CiAgICAgaWYgKGlEVkluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIChpRFZJbmRleCA9PSBpbmRleCk7CiB9CkBAIC03OTgsMTUgKzc5OCwxNSBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1ib29sIENQREZfRm9ybUZpZWxkOjpDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIGJvb2wgYkNoZWNrZWQsIGJvb2wgYk5vdGlmeSkKK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaUNvbnRyb2xJbmRleCk7CiAgICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghYkNoZWNrZWQgJiYgcENvbnRyb2wtPklzQ2hlY2tlZCgpID09IGJDaGVja2VkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OwogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewpAQCAtODE1LDcgKzgxNSw3IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NXRXhwb3J0KTsKICAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwotICAgIGJvb2wgYlVuaXNvbiA9IFBERl9Gb3JtRmllbGRfSXNVbmlzb24odGhpcyk7CisgICAgRlhfQk9PTCBiVW5pc29uID0gUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IEdldENvbnRyb2woaSk7CiAgICAgICAgIGlmIChiVW5pc29uKSB7CkBAIC04MjQsMTYgKzgyNCwxNiBAQAogICAgICAgICAgICAgICAgIGlmIChwQ3RybC0+R2V0T25TdGF0ZU5hbWUoKSA9PSBwQ29udHJvbC0+R2V0T25TdGF0ZU5hbWUoKSkgewogICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChmYWxzZSk7CisgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBpQ29udHJvbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChiQ2hlY2tlZCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChmYWxzZSk7CisgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC04NTksMTQgKzg1OSwxNCBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRDaGVja1ZhbHVlKGJvb2wgYkRlZmF1bHQpCitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0Q2hlY2tWYWx1ZShGWF9CT09MIGJEZWZhdWx0KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IEwiT2ZmIjsKLSAgICBib29sIGJDaGVja2VkOworICAgIEZYX0JPT0wgYkNoZWNrZWQ7CiAgICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CkBAIC04ODIsNyArODgyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGNzRXhwb3J0OwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSkKK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwogICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CkBAIC04OTYsMjEgKzg5NiwyMSBAQAogICAgICAgICBpZiAoY3NFeHBvcnQgPT0gdmFsdWUpIHsKICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKEdldENvbnRyb2xJbmRleChwQ29udHJvbCksIFRSVUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoYkRlZmF1bHQpIHsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKEdldENvbnRyb2xJbmRleChwQ29udHJvbCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0VG9wVmlzaWJsZUluZGV4KCkKIHsKQEAgLTk0OCw0MyArOTQ4LDQzIEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLWJvb2wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkKK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CiAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICBpZiAocEFycmF5LT5HZXRJbnRlZ2VyKGkpID09IGlPcHRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkpCitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BEaWN0LT5HZXRBcnJheSgiSSIpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewogICAgICAgICBpZiAoIWJTZWxlY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGljdC0+U2V0QXQoIkkiLCBwQXJyYXkpOwogICAgIH0KLSAgICBib29sIGJSZXR1cm4gPSBmYWxzZTsKKyAgICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7CiAgICAgICAgIGludCBpRmluZCA9IHBBcnJheS0+R2V0SW50ZWdlcihpKTsKICAgICAgICAgaWYgKGlGaW5kID09IGlPcHRJbmRleCkgewogICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSAwOwpAQCAtOTk2LDExICs5OTYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcEFycmF5LT5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJSZXR1cm4gPSB0cnVlOworICAgICAgICAgICAgYlJldHVybiA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChpRmluZCA+IGlPcHRJbmRleCkgewogICAgICAgICAgICAgaWYgKCFiU2VsZWN0ZWQpIHsKQEAgLTEwMTYsMTUgKzEwMTYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ1BERl9OdW1iZXIqIHBOdW0gPSBDUERGX051bWJlcjo6Q3JlYXRlKGlPcHRJbmRleCk7CiAgICAgICAgICAgICBpZiAocE51bSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaSwgcE51bSk7Ci0gICAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJSZXR1cm4gPSBUUlVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDQ0LDEwICsxMDQ0LDEwIEBACiAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICB9CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJTZWxlY3RlZE9wdGlvbnMoYm9vbCBiTm90aWZ5KQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJTZWxlY3RlZE9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5KQogewogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBpbnQgaVJldCA9IDA7CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7CkBAIC0xMDc1LDggKzEwNzUsOCBAQAogICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ1BERl9Gb3JtRmllbGQ6OkxvYWREQSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAKaW5kZXggMzNlMWUyMy4uYWVlYjFkMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UpOworICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CiAgICAgaW50IHNpemUgPSBhY2MuR2V0U2l6ZSgpOwogICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWYgPSBhY2MuR2V0RGF0YSgpOwogICAgIENYTUxfRWxlbWVudCAqJnBYbWxFbG1udCA9ICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFhtbEVsbW50OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAKaW5kZXggNmU4ODMwOS4uZDUyNTIyNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLXN0YXRpYyBib29sIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKK3N0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKIHsKICAgICBGWFNZU19hc3NlcnQocERpY3QgIT0gTlVMTCk7CiAgICAgQ1BERl9PYmplY3QgKnBJbnRlbnQgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJJbnRlbnQiKSk7CkBAIC0zOCwxMCArMzgsMTAgQEAKICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewogICAgICAgICAgICAgYnNJbnRlbnQgPSAoKENQREZfQXJyYXkqKXBJbnRlbnQpLT5HZXRTdHJpbmcoaSk7CiAgICAgICAgICAgICBpZiAoYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBic0ludGVudCA9IHBJbnRlbnQtPkdldFN0cmluZygpOwogICAgIHJldHVybiBic0ludGVudCA9PSBGWF9CU1RSQygiQWxsIikgfHwgYnNJbnRlbnQgPT0gY3NFbGVtZW50OwpAQCAtMTAxLDI0ICsxMDEsMjQgQEAKIHsKICAgICBtX09DR1N0YXRlcy5jbGVhcigpOwogfQotYm9vbCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlRnJvbUNvbmZpZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzQ29uZmlnLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBib29sICZiVmFsaWRDb25maWcpIGNvbnN0CitGWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIEZYX0JPT0wgJmJWYWxpZENvbmZpZykgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBDb25maWcgPSBGUERGRE9DX09DR19HZXRDb25maWcobV9wRG9jdW1lbnQsIHBPQ0dEaWN0LCBjc0NvbmZpZyk7CiAgICAgaWYgKCFwQ29uZmlnKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgYlZhbGlkQ29uZmlnID0gdHJ1ZTsKLSAgICBib29sIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPSBGWF9CU1RSQygiT0ZGIik7CisgICAgYlZhbGlkQ29uZmlnID0gVFJVRTsKKyAgICBGWF9CT09MIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPSBGWF9CU1RSQygiT0ZGIik7CiAgICAgQ1BERl9BcnJheSAqcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIk9OIikpOwogICAgIGlmIChwQXJyYXkpIHsKICAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSB0cnVlOworICAgICAgICAgICAgYlN0YXRlID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiT0ZGIikpOwogICAgIGlmIChwQXJyYXkpIHsKICAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJTdGF0ZSA9IEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJBUyIpKTsKQEAgLTE0OSwxMCArMTQ5LDEwIEBACiAgICAgfQogICAgIHJldHVybiBiU3RhdGU7CiB9Ci1ib29sIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCkgY29uc3QKK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdAogewogICAgIGlmICghRlBERkRPQ19PQ0dfSGFzSW50ZW50KHBPQ0dEaWN0LCBGWF9CU1RSQygiVmlldyIpLCBGWF9CU1RSQygiVmlldyIpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzU3RhdGUgPSBGUERGRE9DX09DR19HZXRVc2FnZVR5cGVTdHJpbmcobV9lVXNhZ2VUeXBlKTsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBVc2FnZSA9IHBPQ0dEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJVc2FnZSIpKTsKQEAgLTE3MSwzMSArMTcxLDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgYm9vbCBiRGVmVmFsaWQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJEZWZWYWxpZCA9IEZBTFNFOwogICAgIHJldHVybiBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNzU3RhdGUsIHBPQ0dEaWN0LCBiRGVmVmFsaWQpOwogfQogCi1ib29sIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpCitGWF9CT09MIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpCiB7CiAgICAgaWYgKCFwT0NHRGljdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBjb25zdCBhdXRvIGl0ID0gbV9PQ0dTdGF0ZXMuZmluZChwT0NHRGljdCk7CiAgICAgaWYgKGl0ICE9IG1fT0NHU3RhdGVzLmVuZCgpKQogICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKIAotICAgIGJvb2wgYlN0YXRlID0gTG9hZE9DR1N0YXRlKHBPQ0dEaWN0KTsKKyAgICBGWF9CT09MIGJTdGF0ZSA9IExvYWRPQ0dTdGF0ZShwT0NHRGljdCk7CiAgICAgbV9PQ0dTdGF0ZXNbcE9DR0RpY3RdID0gYlN0YXRlOwogICAgIHJldHVybiBiU3RhdGU7CiB9CiAKLWJvb2wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBib29sIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsKQorRlhfQk9PTCBDUERGX09DQ29udGV4dDo6R2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIEZYX0JPT0wgYkZyb21Db25maWcsIGludCBuTGV2ZWwpCiB7CiAgICAgaWYgKG5MZXZlbCA+IDMyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocEV4cHJlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50MzJfdCBpQ291bnQgPSBwRXhwcmVzc2lvbi0+R2V0Q291bnQoKTsKICAgICBDUERGX09iamVjdCAqcE9DR09iajsKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgIGlmIChjc09wZXJhdG9yID09IEZYX0JTVFJDKCJOb3QiKSkgewogICAgICAgICBwT0NHT2JqID0gcEV4cHJlc3Npb24tPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgICAgIHJldHVybiAhKGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopIDogR2V0T0NHVmlzaWJsZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSk7CkBAIC0yMTEsMTYgKzIxMSwxNiBAQAogICAgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewogICAgICAgICAgICAgcmV0dXJuICFHZXRPQ0dWRSgoQ1BERl9BcnJheSopcE9DR09iaiwgYkZyb21Db25maWcsIG5MZXZlbCArIDEpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiT3IiKSB8fCBjc09wZXJhdG9yID09IEZYX0JTVFJDKCJBbmQiKSkgewotICAgICAgICBib29sIGJWYWx1ZSA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpQ291bnQ7IGkgKyspIHsKICAgICAgICAgICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgICAgICAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCBiSXRlbSA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiSXRlbSA9IEZBTFNFOwogICAgICAgICAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopOwogICAgICAgICAgICAgfSBlbHNlIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CkBAIC0yMzgsOSArMjM4LDkgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlZhbHVlOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX09DQ29udGV4dDo6TG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgYm9vbCBiRnJvbUNvbmZpZykKK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NNRERpY3QsIEZYX0JPT0wgYkZyb21Db25maWcpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KHBPQ01ERGljdCAhPSBOVUxMKTsKICAgICBDUERGX0FycmF5ICpwVkUgPSBwT0NNRERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJWRSIpKTsKQEAgLTI1MCw1MCArMjUwLDUwIEBACiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NQID0gcE9DTUREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlAiKSwgRlhfQlNUUkMoIkFueU9uIikpOwogICAgIENQREZfT2JqZWN0ICpwT0NHT2JqID0gcE9DTUREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk9DR3MiKSk7CiAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgcmV0dXJuIGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopIDogR2V0T0NHVmlzaWJsZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKTsKICAgICB9CiAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBib29sIGJTdGF0ZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYlN0YXRlID0gRkFMU0U7CiAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT24iKSB8fCBjc1AgPT0gRlhfQlNUUkMoIkFsbE9mZiIpKSB7Ci0gICAgICAgIGJTdGF0ZSA9IHRydWU7CisgICAgICAgIGJTdGF0ZSA9IFRSVUU7CiAgICAgfQogICAgIGludDMyX3QgaUNvdW50ID0gKChDUERGX0FycmF5KilwT0NHT2JqKS0+R2V0Q291bnQoKTsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgYm9vbCBiSXRlbSA9IHRydWU7CisgICAgICAgIEZYX0JPT0wgYkl0ZW0gPSBUUlVFOwogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBJdGVtRGljdCA9ICgoQ1BERl9BcnJheSopcE9DR09iaiktPkdldERpY3QoaSk7CiAgICAgICAgIGlmIChwSXRlbURpY3QpIHsKICAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocEl0ZW1EaWN0KSA6IEdldE9DR1Zpc2libGUocEl0ZW1EaWN0KTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPbiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFueU9mZiIpICYmICFiSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbGxPbiIpICYmICFiSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9mZiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGJTdGF0ZTsKIH0KLWJvb2wgQ1BERl9PQ0NvbnRleHQ6OkNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KQorRlhfQk9PTCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpCiB7CiAgICAgaWYgKCFwT0NHRGljdCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBPQ0dEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIk9DRyIpKTsKICAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJPQ0ciKSkgewogICAgICAgICByZXR1cm4gR2V0T0NHVmlzaWJsZShwT0NHRGljdCk7CiAgICAgfQotICAgIHJldHVybiBMb2FkT0NNRFN0YXRlKHBPQ0dEaWN0LCBmYWxzZSk7CisgICAgcmV0dXJuIExvYWRPQ01EU3RhdGUocE9DR0RpY3QsIEZBTFNFKTsKIH0KIHZvaWQgQ1BERl9PQ0NvbnRleHQ6OlJlc2V0T0NDb250ZXh0KCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwCmluZGV4IDNlNDRiMWEuLmU5ZjBjNTUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKICNpbmNsdWRlICJ0YWdnZWRfaW50LmgiCiBjb25zdCBpbnQgbk1heFJlY3Vyc2lvbiA9IDMyOwotc3RhdGljIGJvb2wgSXNUYWdnZWQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykKK3N0YXRpYyBGWF9CT09MIElzVGFnZ2VkKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYXJrSW5mbyA9IHBDYXRhbG9nLT5HZXREaWN0KEZYX0JTVFJDKCJNYXJrSW5mbyIpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudEVsZW1lbnQgPSBBZGRQYWdlTm9kZShwUGFyZW50LCBtYXAsIG5MZXZlbCArIDEpOwotICAgICAgICBib29sIGJTYXZlID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYlNhdmUgPSBGQUxTRTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwUGFyZW50RWxlbWVudC0+bV9LaWRzLkdldFNpemUoKTsgaSArKykgewogICAgICAgICAgICAgaWYgKHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9UeXBlICE9IENQREZfU3RydWN0S2lkOjpFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgICAgICBiU2F2ZSA9IHRydWU7CisgICAgICAgICAgICBiU2F2ZSA9IFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiU2F2ZSkgewogICAgICAgICAgICAgcEVsZW1lbnQtPlJlbGVhc2UoKTsKQEAgLTE1NiwxMSArMTU2LDExIEBACiAgICAgfQogICAgIHJldHVybiBwRWxlbWVudDsKIH0KLWJvb2wgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6QWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KQorRlhfQk9PTCBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpCiB7CiAgICAgQ1BERl9PYmplY3QgKnBPYmogPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwogICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkgPT0gcERpY3QtPkdldE9iak51bSgpKSB7CkBAIC0xNjksMTMgKzE2OSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9LaWRzWzBdID0gcEVsZW1lbnQtPlJldGFpbigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgIENQREZfQXJyYXkqIHBUb3BLaWRzID0gKENQREZfQXJyYXkqKXBPYmo7CiAgICAgICAgIEZYX0RXT1JEIGk7Ci0gICAgICAgIGJvb2wgYlNhdmUgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiU2F2ZSA9IEZBTFNFOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFRvcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwS2lkUmVmID0gcFRvcEtpZHMtPkdldEVsZW1lbnQoaSk7CiAgICAgICAgICAgICBpZiAocEtpZFJlZiA9PSBOVUxMIHx8IHBLaWRSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CkBAIC0xODgsMTMgKzE4OCwxMyBAQAogICAgICAgICAgICAgICAgIG1fS2lkc1tpXS0+UmVsZWFzZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9LaWRzW2ldID0gcEVsZW1lbnQtPlJldGFpbigpOwotICAgICAgICAgICAgYlNhdmUgPSB0cnVlOworICAgICAgICAgICAgYlNhdmUgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmICghYlNhdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfU3RydWN0RWxlbWVudEltcGw6OkNQREZfU3RydWN0RWxlbWVudEltcGwoQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBQYXJlbnQsIENQREZfRGljdGlvbmFyeSogcERpY3QpCiAgICAgOiBtX1JlZkNvdW50KDApCkBAIC0zNDAsMjAgKzM0MCwyMCBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUsIEZYX0ZMT0FUIGZMZXZlbCkKK0NQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIEZYX0ZMT0FUIGZMZXZlbCkKIHsKICAgICBpZiAoZkxldmVsID4gbk1heFJlY3Vyc2lvbikgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGJJbmhlcml0YWJsZSkgewotICAgICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBmYWxzZSk7CisgICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIEZBTFNFKTsKICAgICAgICAgaWYgKHBBdHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gcEF0dHI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcFBhcmVudCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCB0cnVlLCBmTGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuIG1fcFBhcmVudC0+R2V0QXR0cihvd25lciwgbmFtZSwgVFJVRSwgZkxldmVsICsgMSk7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQSA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQSIpKTsKICAgICBpZiAocEEpIHsKQEAgLTM5MSw3ICszOTEsNyBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0NQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHN1YmluZGV4ID09IC0xIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CkBAIC00MDMsNyArNDAzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKHN1YmluZGV4KTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCitDRlhfQnl0ZVN0cmluZyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKQEAgLTQxMSw3ICs0MTEsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEF0dHItPkdldFN0cmluZygpOwogfQotRlhfQVJHQglDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0ZYX0FSR0IJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7CiAgICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKICAgICByZXR1cm4gMHhmZjAwMDAwMCB8ICgoaW50KShwQXJyYXktPkdldE51bWJlcigwKSAqIDI1NSkgPDwgMTYpIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDEpICogMjU1KSA8PCA4KSB8IChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDIpICogMjU1KTsKIH0KLUZYX0ZMT0FUIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCitGWF9GTE9BVCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewpAQCAtNDI4LDcgKzQyOCw3IEBACiAgICAgfQogICAgIHJldHVybiBwQXR0ci0+R2V0TnVtYmVyKCk7CiB9Ci1pbnQJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQoraW50CUNQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKICAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9OVU1CRVIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcAppbmRleCAyNmM5M2YxLi45NmQyY2NmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIGZ1bGxfbmFtZTsKIH0KLWJvb2wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzRm9udCgpCitGWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKQogewogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKICAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKQEAgLTY1LDIzICs2NSwyMyBAQAogICAgIH0KICAgICBjc0ZvbnROYW1lVGFnID0gUERGX05hbWVEZWNvZGUoY3NGb250TmFtZVRhZyk7CiB9Ci1ib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0NvbG9yKGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uKQorRlhfQk9PTCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNDb2xvcihGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CiAgICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHN5bnRheC5TZXRQb3MoMCk7CiAgICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgc3ludGF4LlNldFBvcygwKTsKICAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiSyIgOiAiayIsIDQpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3JTdHJpbmcoYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24pCitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOwogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7CkBAIC0xMTksNyArMTE5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGNzQ29sb3I7CiB9Ci12b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uKQordm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwogICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYyArKykgewpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgICAgIGZjWzNdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CiAgICAgfQogfQotdm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwgaW50JiBpQ29sb3JUeXBlLCBib29sIGJTdHJva2luZ09wZXJhdGlvbikKK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsIGludCYgaUNvbG9yVHlwZSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCiB7CiAgICAgY29sb3IgPSAwOwogICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CkBAIC0xODcsMTAgKzE4NywxMCBAQAogICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KShyICogMjU1ICsgMC41ZiksIChpbnQpKGcgKiAyNTUgKyAwLjVmKSwgKGludCkoYiAqIDI1NSArIDAuNWYpKTsKICAgICB9CiB9Ci1ib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc1RleHRNYXRyaXgoKQorRlhfQk9PTCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNUZXh0TWF0cml4KCkKIHsKICAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CiAgICAgcmV0dXJuIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNik7CkBAIC00NjgsMTggKzQ2OCwxOCBAQAogICAgIH0KICAgICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY2hhclNldCwgY3NOYW1lVGFnKTsKIH0KLWJvb2wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCitGWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCB8fCBwRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKICAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CiAgICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7CiAgICAgd2hpbGUgKHBvcykgewpAQCAtNDk5LDIzICs0OTksMjMgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocEZvbnQtPkdldEZvbnREaWN0KCkgPT0gcEVsZW1lbnQpIHsKICAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKK0ZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7CiAgICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKICAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CiAgICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgY3NGb250TmFtZS5SZW1vdmUoJyAnKTsKQEAgLTU0NSwxMCArNTQ1LDEwIEBACiAgICAgICAgIGNzQmFzZUZvbnQuUmVtb3ZlKCcgJyk7CiAgICAgICAgIGlmIChjc0Jhc2VGb250ID09IGNzRm9udE5hbWUpIHsKICAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogdm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewpAQCAtNjcwLDEwICs2NzAsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIEFsd2F5czsKIH0KLWJvb2wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkKK0ZYX0JPT0wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiUyIsICJQIikgIT0gIkEiOwogfQpAQCAtNjk0LDEwICs2OTQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkKK0ZYX0JPT0wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiRkIiKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmggYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5oCmluZGV4IDZkY2Y1YjAuLjZiYjFkMzAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmgKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaApAQCAtMTUsOCArMTUsOCBAQAogQ1BERl9Gb250KgkJR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgdWludDhfdCBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1ib29sCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotYm9vbAkJCUZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0ZYX0JPT0wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitGWF9CT09MCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogdm9pZAkJCUFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogQ1BERl9Gb250KgkJQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgdWludDhfdCBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIENQREZfRm9udCoJCUFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwpAQCAtMjUsOCArMjUsOCBAQAogQ1BERl9Gb250KgkJR2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB2b2lkCQkJU2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQpOwogdm9pZAkJCVNhdmVDaGVja2VkRmllbGRTdGF0dXMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpOwotYm9vbAkJCU5lZWRQREZFbmNvZGVGb3JGaWVsZEZ1bGxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Ci1ib29sCQkJTmVlZFBERkVuY29kZUZvckZpZWxkVHJlZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKK0ZYX0JPT0wJCQlOZWVkUERGRW5jb2RlRm9yRmllbGRGdWxsTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOworRlhfQk9PTAkJCU5lZWRQREZFbmNvZGVGb3JGaWVsZFRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CiB2b2lkCQkJRW5jb2RlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc05hbWUsIENGWF9CeXRlU3RyaW5nJiBjc1QpOwogdm9pZAkJCVVwZGF0ZUVuY29kZUZpZWxkTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwCmluZGV4IDFjMDE0ZGIuLmViODI0ZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAKQEAgLTExLDIxICsxMSwyMSBAQAogQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6fkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKQogewogfQotYm9vbCBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpJc0RpcmVjdGlvblIyTCgpIGNvbnN0CitGWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OklzRGlyZWN0aW9uUjJMKCkgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7CiAgICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7CiAgICAgaWYgKCFwRGljdCkJewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIEZYX0JTVFJDKCJSMkwiKSA9PSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEaXJlY3Rpb24iKSk7CiB9Ci1ib29sIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0CitGWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0CiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOwogICAgIHBEaWN0ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOwogICAgIGlmICghcERpY3QpCXsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRlhfQlNUUkMoIk5vbmUiKSAhPSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJQcmludFNjYWxpbmciKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAKaW5kZXggOGNjNmI3Yy4uMjMwYmE3NiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcApAQCAtMTgzLDggKzE4Myw4IEBACiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICBib29sIGJVcCA9IHRydWU7Ci0gICAgYm9vbCBiRG93biA9IHRydWU7CisgICAgRlhfQk9PTCBiVXAgPSBUUlVFOworICAgIEZYX0JPT0wgYkRvd24gPSBUUlVFOwogICAgIGludDMyX3QgbkxlZnQgPSAwOwogICAgIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKICAgICBpbnQzMl90IG5NaWQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLyAyOwpAQCAtMTk1LDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgIGZUb3AgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCAtIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX1NlY0luZm8pOwogICAgICAgICAgICAgZkJvdHRvbSA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKICAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBvaW50LnksIGZUb3ApKSB7Ci0gICAgICAgICAgICAgICAgYlVwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYlVwID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKLSAgICAgICAgICAgICAgICBiRG93biA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJEb3duID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZlRvcCkpIHsKICAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKQEAgLTM5NCw3ICszOTQsNyBAQAogewogICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBTcGxpdExpbmVzKGZhbHNlLCBmRm9udFNpemUpOworICAgIFNwbGl0TGluZXMoRkFMU0UsIGZGb250U2l6ZSk7CiAgICAgcmV0dXJuIENQVlRfU2l6ZShtX3JjUmV0LldpZHRoKCksIG1fcmNSZXQuSGVpZ2h0KCkpOwogfQogQ1BWVF9GbG9hdFJlY3QgQ1R5cGVzZXQ6OlR5cGVzZXQoKQpAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkVtcHR5KCk7Ci0gICAgU3BsaXRMaW5lcyh0cnVlLCAwLjBmKTsKKyAgICBTcGxpdExpbmVzKFRSVUUsIDAuMGYpOwogICAgIG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkNsZWFyKCk7CiAgICAgT3V0cHV0TGluZXMoKTsKICAgICByZXR1cm4gbV9yY1JldDsKQEAgLTQyNSwxMSArNDI1LDExIEBACiAgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCiAgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDBDLCAweDAwMDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsCiB9Owotc3RhdGljIGJvb2wgSXNMYXRpbihGWF9XT1JEIHdvcmQpCitzdGF0aWMgRlhfQk9PTCBJc0xhdGluKEZYX1dPUkQgd29yZCkKIHsKICAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKICAgICAgICAgaWYgKHNwZWNpYWxfY2hhcnNbd29yZF0gJiAweDAwMDEpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCh3b3JkID49IDB4MDBDMCAmJiB3b3JkIDw9IDB4MDBGRikgfHwKQEAgLTQzOSwxNSArNDM5LDE1IEBACiAgICAgICAgICAgICAod29yZCA+PSAweEE3MjAgJiYgd29yZCA8PSAweEE3RkYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweEZGMjEgJiYgd29yZCA8PSAweEZGM0EpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweEZGNDEgJiYgd29yZCA8PSAweEZGNUEpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIElzRGlnaXQoRlhfRFdPUkQgd29yZCkKK3N0YXRpYyBGWF9CT09MIElzRGlnaXQoRlhfRFdPUkQgd29yZCkKIHsKLSAgICByZXR1cm4gKHdvcmQgPj0gMHgwMDMwICYmIHdvcmQgPD0gMHgwMDM5KSA/IHRydWUgOiBmYWxzZTsKKyAgICByZXR1cm4gKHdvcmQgPj0gMHgwMDMwICYmIHdvcmQgPD0gMHgwMDM5KSA/IFRSVUUgOiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIElzQ0pLKEZYX0RXT1JEIHdvcmQpCitzdGF0aWMgRlhfQk9PTCBJc0NKSyhGWF9EV09SRCB3b3JkKQogewogICAgIGlmICgod29yZCA+PSAweDExMDAgJiYgd29yZCA8PSAweDExRkYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweDJFODAgJiYgd29yZCA8PSAweDJGRkYpIHx8CkBAIC00NTcsMzMgKzQ1NywzMyBAQAogICAgICAgICAgICAgKHdvcmQgPj0gMHhGRTMwICYmIHdvcmQgPD0gMHhGRTRGKSB8fAogICAgICAgICAgICAgKHdvcmQgPj0gMHgyMDAwMCAmJiB3b3JkIDw9IDB4MkE2REYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweDJGODAwICYmIHdvcmQgPD0gMHgyRkExRikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gMHgzMDA1IHx8IHdvcmQgPT0gMHgzMDA2IHx8IHdvcmQgPT0gMHgzMDIxIHx8IHdvcmQgPT0gMHgzMDIyIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMjMgfHwgd29yZCA9PSAweDMwMjQgfHwgd29yZCA9PSAweDMwMjUgfHwgd29yZCA9PSAweDMwMjYgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAyNyB8fCB3b3JkID09IDB4MzAyOCB8fCB3b3JkID09IDB4MzAyOSB8fCB3b3JkID09IDB4MzAzMSB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDMyIHx8IHdvcmQgPT0gMHgzMDMzIHx8IHdvcmQgPT0gMHgzMDM0IHx8IHdvcmQgPT0gMHgzMDM1KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAod29yZCA+PSAweEZGNjYgJiYgd29yZCA8PSAweEZGOUQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotc3RhdGljIGJvb2wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQorc3RhdGljIEZYX0JPT0wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewogICAgICAgICBpZiAoKHNwZWNpYWxfY2hhcnNbd29yZF0gPj4gMykgJiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4MDA4MCAmJiB3b3JkIDw9IDB4MDBGRikgewogICAgICAgICBpZiAod29yZCA9PSAweDAwODIgfHwgd29yZCA9PSAweDAwODQgfHwgd29yZCA9PSAweDAwODUgfHwgd29yZCA9PSAweDAwOTEgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MDA5MiB8fCB3b3JkID09IDB4MDA5MyB8fCB3b3JkIDw9IDB4MDA5NCB8fCB3b3JkID09IDB4MDA5NiB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgwMEI0IHx8IHdvcmQgPT0gMHgwMEI4KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4MjAwMCAmJiB3b3JkIDw9IDB4MjA2RikgewogICAgICAgICBpZiAod29yZCA9PSAweDIwMTAgfHwgd29yZCA9PSAweDIwMTEgfHwgd29yZCA9PSAweDIwMTIgfHwgd29yZCA9PSAweDIwMTMgfHwKQEAgLTQ5Miw3ICs0OTIsNyBAQAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDMyIHx8IHdvcmQgPT0gMHgyMDMzIHx8IHdvcmQgPT0gMHgyMDM0IHx8IHdvcmQgPT0gMHgyMDM1IHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDIwMzYgfHwgd29yZCA9PSAweDIwMzcgfHwgd29yZCA9PSAweDIwM0MgfHwgd29yZCA9PSAweDIwM0QgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MjAzRSB8fCB3b3JkID09IDB4MjA0NCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gMHgzMDAxIHx8IHdvcmQgPT0gMHgzMDAyIHx8IHdvcmQgPT0gMHgzMDAzIHx8IHdvcmQgPT0gMHgzMDA1IHx8CkBAIC01MDEsMTEgKzUwMSwxMSBAQAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDExIHx8IHdvcmQgPT0gMHgzMDE0IHx8IHdvcmQgPT0gMHgzMDE1IHx8IHdvcmQgPT0gMHgzMDE2IHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTcgfHwgd29yZCA9PSAweDMwMTggfHwgd29yZCA9PSAweDMwMTkgfHwgd29yZCA9PSAweDMwMUEgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAxQiB8fCB3b3JkID09IDB4MzAxRCB8fCB3b3JkID09IDB4MzAxRSB8fCB3b3JkID09IDB4MzAxRikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA+PSAweEZFNTAgJiYgd29yZCA8PSAweEZFNkYpIHsKICAgICAgICAgaWYgKCh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU1RSkgfHwgd29yZCA9PSAweEZFNjMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHhGRjAwICYmIHdvcmQgPD0gMHhGRkVGKSB7CiAgICAgICAgIGlmICh3b3JkID09IDB4RkYwMSB8fCB3b3JkID09IDB4RkYwMiB8fCB3b3JkID09IDB4RkYwNyB8fCB3b3JkID09IDB4RkYwOCB8fApAQCAtNTE0LDgzICs1MTQsODMgQEAKICAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYzRCB8fCB3b3JkID09IDB4RkY0MCB8fCB3b3JkID09IDB4RkY1QiB8fCB3b3JkID09IDB4RkY1QyB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjVEIHx8IHdvcmQgPT0gMHhGRjYxIHx8IHdvcmQgPT0gMHhGRjYyIHx8IHdvcmQgPT0gMHhGRjYzIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweEZGNjQgfHwgd29yZCA9PSAweEZGNjUgfHwgd29yZCA9PSAweEZGOUUgfHwgd29yZCA9PSAweEZGOUYpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIElzQ29ubmVjdGl2ZVN5bWJvbChGWF9EV09SRCB3b3JkKQorc3RhdGljIEZYX0JPT0wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpCiB7CiAgICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CiAgICAgICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiA1KSAmIDEpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKK3N0YXRpYyBGWF9CT09MIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKIHsKICAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKICAgICAgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDIpICYgMSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA9PSAweDMwMEEgfHwgd29yZCA9PSAweDMwMEMgfHwgd29yZCA9PSAweDMwMEUgfHwgd29yZCA9PSAweDMwMTAgfHwKICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDE0IHx8IHdvcmQgPT0gMHgzMDE2IHx8IHdvcmQgPT0gMHgzMDE4IHx8IHdvcmQgPT0gMHgzMDFBIHx8CiAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYwOCB8fCB3b3JkID09IDB4RkYzQiB8fCB3b3JkID09IDB4RkY1QiB8fCB3b3JkID09IDB4RkY2MikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgYm9vbCBJc0N1cnJlbmN5U3ltYm9sKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBGWF9CT09MIElzQ3VycmVuY3lTeW1ib2woRlhfV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkID09IDB4MDAyNCB8fCB3b3JkID09IDB4MDA4MCB8fCB3b3JkID09IDB4MDBBMiB8fCB3b3JkID09IDB4MDBBMyB8fAogICAgICAgICAgICAgd29yZCA9PSAweDAwQTQgfHwgd29yZCA9PSAweDAwQTUgfHwgKHdvcmQgPj0gMHgyMEEwICYmIHdvcmQgPD0gMHgyMENGKSB8fAogICAgICAgICAgICAgd29yZCA9PSAweEZFNjkgfHwgd29yZCA9PSAweEZGMDQgfHwgd29yZCA9PSAweEZGRTAgfHwgd29yZCA9PSAweEZGRTEgfHwKICAgICAgICAgICAgIHdvcmQgPT0gMHhGRkU1IHx8IHdvcmQgPT0gMHhGRkU2KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIElzUHJlZml4U3ltYm9sKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBGWF9CT09MIElzUHJlZml4U3ltYm9sKEZYX1dPUkQgd29yZCkKIHsKICAgICBpZiAoSXNDdXJyZW5jeVN5bWJvbCh3b3JkKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICh3b3JkID09IDB4MjExNikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgYm9vbCBJc1NwYWNlKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBGWF9CT09MIElzU3BhY2UoRlhfV09SRCB3b3JkKQogewotICAgIHJldHVybiAod29yZCA9PSAweDAwMjAgfHwgd29yZCA9PSAweDMwMDApID8gdHJ1ZSA6IGZhbHNlOworICAgIHJldHVybiAod29yZCA9PSAweDAwMjAgfHwgd29yZCA9PSAweDMwMDApID8gVFJVRSA6IEZBTFNFOwogfQotc3RhdGljIGJvb2wgTmVlZERpdmlzaW9uKEZYX1dPUkQgcHJldldvcmQsIEZYX1dPUkQgY3VyV29yZCkKK3N0YXRpYyBGWF9CT09MIE5lZWREaXZpc2lvbihGWF9XT1JEIHByZXZXb3JkLCBGWF9XT1JEIGN1cldvcmQpCiB7CiAgICAgaWYgKChJc0xhdGluKHByZXZXb3JkKSB8fCBJc0RpZ2l0KHByZXZXb3JkKSkgJiYgKElzTGF0aW4oY3VyV29yZCkgfHwgSXNEaWdpdChjdXJXb3JkKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChJc1NwYWNlKGN1cldvcmQpIHx8IElzUHVuY3R1YXRpb24oY3VyV29yZCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKElzU3BhY2UocHJldldvcmQpIHx8IElzUHVuY3R1YXRpb24ocHJldldvcmQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKElzUHJlZml4U3ltYm9sKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKElzUHJlZml4U3ltYm9sKGN1cldvcmQpIHx8IElzQ0pLKGN1cldvcmQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKElzQ0pLKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci12b2lkIENUeXBlc2V0OjpTcGxpdExpbmVzKGJvb2wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSkKK3ZvaWQgQ1R5cGVzZXQ6OlNwbGl0TGluZXMoRlhfQk9PTCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKQogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKQEAgLTYwMSwxNCArNjAxLDE0IEBACiAgICAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPSAwLjBmLCBmQmFja3VwTGluZUFzY2VudCA9IDAuMGY7CiAgICAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKICAgICBpbnQzMl90IG5Xb3JkU3RhcnRQb3MgPSAwOwotICAgIGJvb2wgYkZ1bGxXb3JkID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRnVsbFdvcmQgPSBGQUxTRTsKICAgICBpbnQzMl90IG5MaW5lRnVsbFdvcmRJbmRleCA9IDA7CiAgICAgaW50MzJfdCBuQ2hhckluZGV4ID0gMDsKICAgICBDUFZUX0xpbmVJbmZvIGxpbmU7CiAgICAgRlhfRkxPQVQgZldvcmRXaWR0aCA9IDA7CiAgICAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IEZQREZfTUFYKG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLSBtX3BWVC0+R2V0TGluZUluZGVudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pLCAwLjBmKTsKICAgICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOwotICAgIGJvb2wgYk9wZW5lZCA9IGZhbHNlOworICAgIEZYX0JPT0wgYk9wZW5lZCA9IEZBTFNFOwogICAgIGlmIChuVG90YWxXb3JkcyA+IDApIHsKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgewpAQCAtNjE5LDggKzYxOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocFdvcmQpIHsKICAgICAgICAgICAgICAgICBpZiAoYlR5cGVzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IEZQREZfTUlOKGZMaW5lRGVzY2VudCwgbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIFRSVUUpKTsKKyAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkLCBUUlVFKSk7CiAgICAgICAgICAgICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKQEAgLTYzNiwyMCArNjM2LDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghYk9wZW5lZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT2xkV29yZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmVlZERpdmlzaW9uKHBPbGRXb3JkLT5Xb3JkLCBwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIUlzU3BhY2UocFdvcmQtPldvcmQpICYmICFJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiRnVsbFdvcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBpZiAobkNoYXJJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCArKzsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjkxLDcgKzY5MSw3IEBACiAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gMC4wZjsKICAgICAgICAgICAgICAgICBuQ2hhckluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBuTGluZUZ1bGxXb3JkSW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmTGluZVdpZHRoICs9IGZXb3JkV2lkdGg7CiAgICAgICAgICAgICAgICAgaSsrOwpAQCAtODA5LDE3ICs4MDksMTcgQEAKIENQREZfVmFyaWFibGVUZXh0OjpDUERGX1ZhcmlhYmxlVGV4dCgpIDoKICAgICBtX25MaW1pdENoYXIoMCksCiAgICAgbV9uQ2hhckFycmF5KDApLAotICAgIG1fYk11bHRpTGluZShmYWxzZSksCi0gICAgbV9iTGltaXRXaWR0aChmYWxzZSksCi0gICAgbV9iQXV0b0ZvbnRTaXplKGZhbHNlKSwKKyAgICBtX2JNdWx0aUxpbmUoRkFMU0UpLAorICAgIG1fYkxpbWl0V2lkdGgoRkFMU0UpLAorICAgIG1fYkF1dG9Gb250U2l6ZShGQUxTRSksCiAgICAgbV9uQWxpZ25tZW50KDApLAogICAgIG1fZkxpbmVMZWFkaW5nKDAuMGYpLAogICAgIG1fZkNoYXJTcGFjZSgwLjBmKSwKICAgICBtX25Ib3J6U2NhbGUoMTAwKSwKICAgICBtX3dTdWJXb3JkKDApLAogICAgIG1fZkZvbnRTaXplKDAuMGYpLAotICAgIG1fYkluaXRpYWwoZmFsc2UpLAotICAgIG1fYlJpY2hUZXh0KGZhbHNlKSwKKyAgICBtX2JJbml0aWFsKEZBTFNFKSwKKyAgICBtX2JSaWNoVGV4dChGQUxTRSksCiAgICAgbV9wVlRQcm92aWRlcihOVUxMKSwKICAgICBtX3BWVEl0ZXJhdG9yKE5VTEwpCiB7CkBAIC04NDgsMTIgKzg0OCwxMiBAQAogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KDApKSB7CiAgICAgICAgICAgICBwU2VjdGlvbi0+UmVzZXRMaW5lUGxhY2UoKTsKICAgICAgICAgfQotICAgICAgICBtX2JJbml0aWFsID0gdHJ1ZTsKKyAgICAgICAgbV9iSW5pdGlhbCA9IFRSVUU7CiAgICAgfQogfQogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRBbGwoKQogewotICAgIG1fYkluaXRpYWwgPSBmYWxzZTsKKyAgICBtX2JJbml0aWFsID0gRkFMU0U7CiAgICAgUmVzZXRTZWN0aW9uQXJyYXkoKTsKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LApAQCAtOTU2LDcgKzk1Niw3IEBACiB9CiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6RGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQogewotICAgIGJvb2wgYkxhc3RTZWNQb3MgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJMYXN0U2VjUG9zID0gRkFMU0U7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGJMYXN0U2VjUG9zID0gKFBsYWNlUmFuZ2UuRW5kUG9zID09IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKSk7CiAgICAgfQpAQCAtOTcxLDExICs5NzEsMTEgQEAKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgcmV0dXJuIENsZWFyUmlnaHRXb3JkKEFqdXN0TGluZUhlYWRlcihwbGFjZSwgdHJ1ZSkpOworICAgIHJldHVybiBDbGVhclJpZ2h0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpKTsKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpCYWNrU3BhY2VXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKSk7CisgICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKSk7CiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAgICAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKICAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKICAgICB9Ci0gICAgcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOworICAgIHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7CiAgICAgfQpAQCAtMTA3MywxOSArMTA3MywxOSBAQAogewogICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKICAgICBpbnQzMl90IG5PbGRJbmRleCA9IDAgLCBuSW5kZXggPSAwOwotICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgewogICAgICAgICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CiAgICAgICAgICAgICBpZiAobkluZGV4ID09IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID4gaW5kZXgpIHsKICAgICAgICAgICAgICAgICBwbGFjZS5uU2VjSW5kZXggPSBpOwogICAgICAgICAgICAgICAgIHBsYWNlLm5Xb3JkSW5kZXggPSBpbmRleCAtIG5PbGRJbmRleCAtIDE7CiAgICAgICAgICAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpICE9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKQEAgLTExNTUsMTUgKzExNTUsMTUgQEAKICAgICBpbnQzMl90IG5MZWZ0ID0gMDsKICAgICBpbnQzMl90IG5SaWdodCA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDE7CiAgICAgaW50MzJfdCBuTWlkID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICBib29sIGJVcCA9IHRydWU7Ci0gICAgYm9vbCBiRG93biA9IHRydWU7CisgICAgRlhfQk9PTCBiVXAgPSBUUlVFOworICAgIEZYX0JPT0wgYkRvd24gPSBUUlVFOwogICAgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuTWlkKSkgewogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSkgewotICAgICAgICAgICAgICAgIGJVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJVcCA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tLCBwdC55KSkgewotICAgICAgICAgICAgICAgIGJEb3duID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYkRvd24gPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7CiAgICAgICAgICAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7CkBAIC0xMzAzLDQ5ICsxMzAzLDQ5IEBACiAgICAgfQogICAgIHJldHVybiBwbGFjZTsKIH0KLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewogICAgICAgICAgICAgd29yZGluZm8gPSAqcFdvcmQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfVmFyaWFibGVUZXh0OjpTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCkpIHsKICAgICAgICAgICAgICpwV29yZCA9IHdvcmRpbmZvOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewogICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4KSkgewogICAgICAgICAgICAgbGluZWluZm8gPSBwTGluZS0+bV9MaW5lSW5mbzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDUERGX1JlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldENvbnRlbnRSZWN0KCkgY29uc3QKIHsKICAgICByZXR1cm4gSW5Ub091dChDUERGX0VkaXRDb250YWluZXI6OkdldENvbnRlbnRSZWN0KCkpOwogfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSkKK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCiB7CiAgICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8IGJGYWN0Rm9udFNpemUgPyBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgOiBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgKiBQVlRfSEFMRikgOiBHZXRGb250U2l6ZSgpOwogfQpAQCAtMTM5MSwxMSArMTM5MSwxMSBAQAogewogICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgZkZvbnRTaXplKTsKIH0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgYm9vbCBiRmFjdEZvbnRTaXplKQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCiB7CiAgICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOwogfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgYm9vbCBiRmFjdEZvbnRTaXplKQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQogewogICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7CiB9CkBAIC0xNDIxLDcgKzE0MjEsNyBAQAogfQogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQogewotICAgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgdHJ1ZSk7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHcgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgdyA+IHdvcmRwbGFjZS5uV29yZEluZGV4OyB3LS0pIHsKICAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyk7CkBAIC0xNDI5LDI2ICsxNDI5LDI2IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGJvb2wgYlByZXZPck5leHQpIGNvbnN0CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0CiB7CiAgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCAwICYmIHBsYWNlLm5MaW5lSW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBiUHJldk9yTmV4dCA/IEdldFByZXZXb3JkUGxhY2UocGxhY2UpIDogR2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CiAgICAgfQogICAgIHJldHVybiBwbGFjZTsKIH0KLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQogewogICAgIGlmIChwbGFjZS5uU2VjSW5kZXggPT0gMCAmJiBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPT0gMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKICAgICAgICAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQogewpAQCAtMTQ2MCw3ICsxNDYwLDcgQEAKIH0KIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkxpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOworICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwTmV4dFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggKyAxKSkgewogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG9sZHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgICAgIGZvciAoaW50MzJfdCB3ID0gMCwgc3ogPSBwTmV4dFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsgdyA8IHN6OyB3KyspIHsKQEAgLTE0NzcsOCArMTQ3Nyw4IEBACiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSkKIHsKICAgICBDUFZUX1dvcmRSYW5nZSBOZXdSYW5nZTsKLSAgICBOZXdSYW5nZS5CZWdpblBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkJlZ2luUG9zLCB0cnVlKTsKLSAgICBOZXdSYW5nZS5FbmRQb3MgPSBBanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5FbmRQb3MsIHRydWUpOworICAgIE5ld1JhbmdlLkJlZ2luUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIFRSVUUpOworICAgIE5ld1JhbmdlLkVuZFBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkVuZFBvcywgVFJVRSk7CiAgICAgZm9yIChpbnQzMl90IHMgPSBOZXdSYW5nZS5FbmRQb3MublNlY0luZGV4OyBzID49IE5ld1JhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsgcy0tKSB7CiAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKICAgICAgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKQEAgLTE1MDcsNyArMTUwNyw3IEBACiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcmlnaHRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihHZXROZXh0V29yZFBsYWNlKHBsYWNlKSwgZmFsc2UpOworICAgICAgICBDUFZUX1dvcmRQbGFjZSByaWdodHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKEdldE5leHRXb3JkUGxhY2UocGxhY2UpLCBGQUxTRSk7CiAgICAgICAgIGlmIChyaWdodHBsYWNlICE9IHBsYWNlKSB7CiAgICAgICAgICAgICBpZihyaWdodHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpIHsKICAgICAgICAgICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihwbGFjZSk7CkBAIC0xNTY4LDkgKzE1NjgsOSBAQAogICAgIH0KICAgICByZXR1cm4gKEZYX0ZMT0FUKWdGb250U2l6ZVN0ZXBzW25NaWRdOwogfQotYm9vbAlDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKQorRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKQogewotICAgIGJvb2wgYkJpZ2dlciA9ICBmYWxzZTsKKyAgICBGWF9CT09MIGJCaWdnZXIgPSAgRkFMU0U7CiAgICAgQ1BWVF9TaXplIHN6VG90YWw7CiAgICAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewpAQCAtMTU4MCw3ICsxNTgwLDcgQEAKICAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueCwgR2V0UGxhdGVXaWR0aCgpKQogICAgICAgICAgICAgICAgICAgICB8fCBJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueSwgR2V0UGxhdGVIZWlnaHQoKSkKICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIGJCaWdnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGJCaWdnZXIgPSBUUlVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjUyLDkgKzE2NTIsOSBAQAogewogICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0RGVmYXVsdEZvbnRJbmRleCgpIDogLTE7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCiB7Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5Jc0xhdGluV29yZCh3b3JkKSA6IGZhbHNlOworICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+SXNMYXRpbldvcmQod29yZCkgOiBGQUxTRTsKIH0KIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogQ1BERl9WYXJpYWJsZVRleHQ6OkdldEl0ZXJhdG9yKCkKIHsKQEAgLTE2ODcsNzAgKzE2ODcsNzAgQEAKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgbV9DdXJQb3MgPSBwbGFjZTsKIH0KLWJvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKK0ZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKIHsKICAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX0N1clBvcyA9IG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fQ3VyUG9zKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkKK0ZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkKIHsKICAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fQ3VyUG9zID0gbV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV9DdXJQb3MpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dExpbmUoKQorRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dExpbmUoKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggKyAxLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPCBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpCitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpCiB7CiAgICAgaWYgKG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChtX0N1clBvcy5uTGluZUluZGV4ID4gMCkgewogICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggLSAxLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7CiAgICAgICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwTGFzdFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4IC0gMSkpIHsKICAgICAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEsIHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSwgLTEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCiB7CiAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA8IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CiAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4ICsgMSwgMCwgLTEpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7CiAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgMCwgLTEpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0CitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIHdvcmQuV29yZFBsYWNlID0gbV9DdXJQb3M7CkBAIC0xNzcwLDEzICsxNzcwLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdvcmQubkZvbnRJbmRleCA9IG1fcFZULT5HZXRXb3JkRm9udEluZGV4KCpwV29yZCk7CiAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUgPSBtX3BWVC0+R2V0V29yZEZvbnRTaXplKCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCkKK0ZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCkKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewpAQCAtMTc4NCwxMiArMTc4NCwxMiBAQAogICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0CitGWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIGxpbmUubGluZXBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4LCAtMSk7CkBAIC0xODAyLDEyICsxODAyLDEyIEBACiAgICAgICAgICAgICBsaW5lLmZMaW5lQXNjZW50ID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQ7CiAgICAgICAgICAgICBsaW5lLmZMaW5lRGVzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKICAgICAgICAgICAgIGxpbmUubGluZUVuZCA9IHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKK0ZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgc2VjdGlvbi5zZWNwbGFjZSA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgMCwgLTEpOwpAQCAtMTgxOSwxMSArMTgxOSwxMSBAQAogICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICBzZWN0aW9uLldvcmRQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHM7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKQorRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKQogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CkBAIC0xODMzLDcgKzE4MzMsNyBAQAogICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7CiAgICAgICAgICAgICAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvcGRmX3Z0LmgKaW5kZXggZmI3OTEwYi4uYTc1NDkwZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oCkBAIC0xOTEsNyArMTkxLDcgQEAKIHRlbXBsYXRlPGNsYXNzIFRZUEU+IGNsYXNzIENQVlRfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPgogewogcHVibGljOgotICAgIGJvb2wgSXNFbXB0eSgpCisgICAgRlhfQk9PTCBJc0VtcHR5KCkKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7CiAgICAgfQpAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJVHlwZXNldCgpOwogICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCUNoYXJBcnJheSgpOwogcHJpdmF0ZToKLSAgICB2b2lkCQkJCQkJCQkJU3BsaXRMaW5lcyhib29sIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpOworICAgIHZvaWQJCQkJCQkJCQlTcGxpdExpbmVzKEZYX0JPT0wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAgICAgdm9pZAkJCQkJCQkJCU91dHB1dExpbmVzKCk7CiAKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQltX3JjUmV0OwpAQCAtNDIzLDExICs0MjMsMTEgQEAKICAgICB7CiAgICAgICAgIG1fbkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lID0gdHJ1ZSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUpCiAgICAgewogICAgICAgICBtX2JNdWx0aUxpbmUgPSBiTXVsdGlMaW5lOwogICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSkKICAgICB7CiAgICAgICAgIG1fYkxpbWl0V2lkdGggPSBiQXV0bzsKICAgICB9CkBAIC00MzksMTEgKzQzOSwxMSBAQAogICAgIHsKICAgICAgICAgbV9uQ2hhckFycmF5ID0gbkNoYXJBcnJheTsKICAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvID0gdHJ1ZSkKKyAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFKQogICAgIHsKICAgICAgICAgbV9iQXV0b0ZvbnRTaXplID0gYkF1dG87CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dCkKKyAgICB2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpCiAgICAgewogICAgICAgICBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsKICAgICB9CkBAIC00NTIsMTEgKzQ1MiwxMSBAQAogICAgICAgICBtX2ZMaW5lTGVhZGluZyA9IGZMaW5lTGVhZGluZzsKICAgICB9CiAgICAgdm9pZAkJCQkJCQkJCUluaXRpYWxpemUoKTsKLSAgICBib29sCQkJCQkJCQkJSXNWYWxpZCgpIGNvbnN0CisgICAgRlhfQk9PTAkJCQkJCQkJCUlzVmFsaWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkluaXRpYWw7CiAgICAgfQotICAgIGJvb2wJCQkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QKKyAgICBGWF9CT09MCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iUmljaFRleHQ7CiAgICAgfQpAQCAtNDk2LDcgKzQ5Niw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbV9uTGltaXRDaGFyOwogICAgIH0KLSAgICBib29sCQkJCQkJCQkJSXNNdWx0aUxpbmUoKSBjb25zdAorICAgIEZYX0JPT0wJCQkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iTXVsdGlMaW5lOwogICAgIH0KQEAgLTUzNywyNSArNTM3LDI1IEBACiAgICAgaW50MzJfdAkJCQkJCQkJR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKICAgICBpbnQzMl90CQkJCQkJCQlHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpOwogICAgIGludDMyX3QJCQkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKLSAgICBib29sCQkJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKKyAgICBGWF9CT09MCQkJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKIHByaXZhdGU6CiAKICAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKTsKICAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7CiAgICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIGJvb2wJCQkJCQkJCQlHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIGJvb2wJCQkJCQkJCQlTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIGJvb2wJCQkJCQkJCQlHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pOwotICAgIGJvb2wJCQkJCQkJCQlHZXRTZWN0aW9uSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1NlY3Rpb25JbmZvICYgc2VjaW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSA9IGZhbHNlKTsKKyAgICBGWF9CT09MCQkJCQkJCQkJR2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKTsKKyAgICBGWF9CT09MCQkJCQkJCQkJU2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKTsKKyAgICBGWF9CT09MCQkJCQkJCQkJR2V0TGluZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKTsKKyAgICBGWF9CT09MCQkJCQkJCQkJR2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pOworICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUgPSBGQUxTRSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLAogICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwgaW50MzJfdCBuSG9yelNjYWxlLAogICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9GTE9BVCBmV29yZFRhaWwsIGludDMyX3QgbldvcmRTdHlsZSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfRkxPQVQgZkZvbnRTaXplKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgYm9vbCBiRmFjdEZvbnRTaXplID0gZmFsc2UpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSA9IGZhbHNlKTsKKyAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUgPSBGQUxTRSk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldExpbmVBc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lRGVzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbyk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOwpAQCAtNTY4LDggKzU2OCw4IEBACiAgICAgaW50MzJfdAkJCQkJCQkJR2V0QWxpZ25tZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOwogCiAgICAgdm9pZAkJCQkJCQkJCUNsZWFyU2VjdGlvblJpZ2h0V29yZHMoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGJvb2wgYlByZXZPck5leHQpIGNvbnN0OwotICAgIGJvb2wJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKKyAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Q7CisgICAgRlhfQk9PTAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwogICAgIHZvaWQJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKICAgICB2b2lkCQkJCQkJCQkJTGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7CiAgICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKQEAgLTU3OCw3ICs1NzgsNyBAQAogcHJpdmF0ZToKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0QXV0b0ZvbnRTaXplKCk7Ci0gICAgYm9vbAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgICAgRlhfQk9PTAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAgICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJUmVhcnJhbmdlU2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKIHByaXZhdGU6CiAgICAgdm9pZAkJCQkJCQkJCVJlc2V0U2VjdGlvbkFycmF5KCk7CkBAIC01ODYsOSArNTg2LDkgQEAKICAgICBDUFZUX0FycmF5VGVtcGxhdGU8Q1NlY3Rpb24qPgkJCW1fU2VjdGlvbkFycmF5OwogICAgIGludDMyX3QJCQkJCQkJCW1fbkxpbWl0Q2hhcjsKICAgICBpbnQzMl90CQkJCQkJCQltX25DaGFyQXJyYXk7Ci0gICAgYm9vbAkJCQkJCQkJCW1fYk11bHRpTGluZTsKLSAgICBib29sCQkJCQkJCQkJbV9iTGltaXRXaWR0aDsKLSAgICBib29sCQkJCQkJCQkJbV9iQXV0b0ZvbnRTaXplOworICAgIEZYX0JPT0wJCQkJCQkJCQltX2JNdWx0aUxpbmU7CisgICAgRlhfQk9PTAkJCQkJCQkJCW1fYkxpbWl0V2lkdGg7CisgICAgRlhfQk9PTAkJCQkJCQkJCW1fYkF1dG9Gb250U2l6ZTsKICAgICBpbnQzMl90CQkJCQkJCQltX25BbGlnbm1lbnQ7CiAgICAgRlhfRkxPQVQJCQkJCQkJCW1fZkxpbmVMZWFkaW5nOwogICAgIEZYX0ZMT0FUCQkJCQkJCQltX2ZDaGFyU3BhY2U7CkBAIC01OTcsOCArNTk3LDggQEAKICAgICBGWF9GTE9BVAkJCQkJCQkJbV9mRm9udFNpemU7CiAKIHByaXZhdGU6Ci0gICAgYm9vbAkJCQkJCQkJCW1fYkluaXRpYWw7Ci0gICAgYm9vbAkJCQkJCQkJCW1fYlJpY2hUZXh0OworICAgIEZYX0JPT0wJCQkJCQkJCQltX2JJbml0aWFsOworICAgIEZYX0JPT0wJCQkJCQkJCQltX2JSaWNoVGV4dDsKICAgICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciAqCQkJbV9wVlRQcm92aWRlcjsKICAgICBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqCQkJbV9wVlRJdGVyYXRvcjsKIH07CkBAIC02MDcsMTcgKzYwNywxNyBAQAogcHVibGljOgogICAgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKENQREZfVmFyaWFibGVUZXh0ICogcFZUKTsKICAgICB2aXJ0dWFsIH5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpOwotICAgIGJvb2wJCQkJCQkJCQlOZXh0V29yZCgpOwotICAgIGJvb2wJCQkJCQkJCQlQcmV2V29yZCgpOwotICAgIGJvb2wJCQkJCQkJCQlOZXh0TGluZSgpOwotICAgIGJvb2wJCQkJCQkJCQlQcmV2TGluZSgpOwotICAgIGJvb2wJCQkJCQkJCQlOZXh0U2VjdGlvbigpOwotICAgIGJvb2wJCQkJCQkJCQlQcmV2U2VjdGlvbigpOwotICAgIGJvb2wJCQkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpOwotICAgIGJvb2wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OwotICAgIGJvb2wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OwotICAgIGJvb2wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OwotICAgIGJvb2wJCQkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pOworICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0V29yZCgpOworICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2V29yZCgpOworICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0TGluZSgpOworICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2TGluZSgpOworICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0U2VjdGlvbigpOworICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2U2VjdGlvbigpOworICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpOworICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OworICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pOwogICAgIHZvaWQJCQkJCQkJCQlTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpOwogICAgIHZvaWQJCQkJCQkJCQlTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSAmCQkJCQlHZXRBdCgpIGNvbnN0CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCmluZGV4IDEyNzk2MTcuLjljNjQzYTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgdm9pZAkJTG9hZERvY1RyZWUoKTsKICAgICB2b2lkCQlMb2FkUGFnZVRyZWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwogICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIEFkZFBhZ2VOb2RlKENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQsIENGWF9NYXBQdHJUb1B0ciYgbWFwLCBpbnQgbkxldmVsID0gMCk7Ci0gICAgYm9vbAkJQWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KTsKKyAgICBGWF9CT09MCQlBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpOwogcHJvdGVjdGVkOgogICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wVHJlZVJvb3Q7CiAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KgltX3BSb2xlTWFwOwpAQCAtNjcsMTYgKzY3LDE2IEBACiAgICAgICAgIHJldHVybiAmbV9PYmplY3RBcnJheTsKICAgICB9CiAKLSAgICBDUERGX09iamVjdCoJCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRik7CisgICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKKyAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7CisgICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7CiAgICAgQ0ZYX1B0ckFycmF5CQkJbV9PYmplY3RBcnJheTsKICAgICB2b2lkCQkJCQlMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKICAgICB2b2lkCQkJCQlMb2FkS2lkKEZYX0RXT1JEIFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7Ci0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpOworICAgIENQREZfT2JqZWN0KgkJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KTsKICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKglSZXRhaW4oKTsKICAgICB2b2lkCQkJCQlSZWxlYXNlKCk7CiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcAppbmRleCA3ZDcyOGE4Li43MjAzYTY5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKQEAgLTI4OSw3ICsyODksNyBAQAogfQogdm9pZCBOb3JtYWxpemVDb21wb3NpdGVDaGFyKEZYX1dDSEFSIHdDaGFyLCBDRlhfV2lkZVN0cmluZyYgc0Rlc3QpCiB7Ci0gICAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyLCB0cnVlLCBmYWxzZSk7CisgICAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyLCBUUlVFLCBGQUxTRSk7CiAgICAgRlhfV0NIQVIqIHBEc3QgPSBOVUxMOwogICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKICAgICBpZiAobkNvdW50IDwgMSApIHsKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIENGWF9XaWRlU3RyaW5nIHNCdWZmZXI7CiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPElGWF9CaWRpQ2hhcj4gcEJpZGlDaGFyKElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkpOwogICAgIENGWF9Xb3JkQXJyYXkgb3JkZXI7Ci0gICAgYm9vbCBiUjJMID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CiAgICAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMCwgaSA9IDA7CiAgICAgaW50IG5SMkwgPSAwLCBuTDJSID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmKG5SMkwgPiAwICYmIG5SMkwgPj0gbkwyUikgewotICAgICAgICBiUjJMID0gdHJ1ZTsKKyAgICAgICAgYlIyTCA9IFRSVUU7CiAgICAgfQogICAgIGlmKGJSMkwpIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgICBib29sIGJTeW1ib2wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKICAgICAgICAgICAgICAgICB3aGlsZShpID4gMCAmJiBvcmRlci5HZXRBdChpKSAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGkgLT0gMzsKQEAgLTM4OSw3ICszODksNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwotICAgICAgICBib29sIGJMMlIgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiTDJSID0gRkFMU0U7CiAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBjb3VudDsgaiArPSAzKSB7CiAgICAgICAgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaiArIDIpOwogICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaik7CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYoaSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIGogPSAtMzsKLSAgICAgICAgICAgICAgICAgICAgYkwyUiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJMMlIgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0ci5HZXRMZW5ndGgoKSAtIDE7CkBAIC00MjcsMTUgKzQyNywxNSBAQAogICAgIHN0ci5FbXB0eSgpOwogICAgIHN0ciArPSBzQnVmZmVyOwogfQotc3RhdGljIGJvb2wgSXNOdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKK3N0YXRpYyBGWF9CT09MIElzTnVtYmVyKENGWF9XaWRlU3RyaW5nJiBzdHIpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkgKyspIHsKICAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJbaV07CiAgICAgICAgIGlmICgoY2ggPCAnMCcgfHwgY2ggPiAnOScpICYmIGNoICE9ICctJyAmJiBjaCAhPSAnKycgJiYgY2ggIT0gJy4nICYmIGNoICE9ICcgJykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDVGV4dFBhZ2U6OkZpbmRDb2x1bW5zKCkKIHsKQEAgLTUzNCwxOCArNTM0LDE4IEBACiAgICAgcFRleHQtPm1fcENvbHVtbiA9IE5VTEw7CiAgICAgbV9UZXh0TGlzdC5JbnNlcnRBdChpLCBwVGV4dCk7CiB9Ci1ib29sIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCitGWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpOwotYm9vbCBDVGV4dEJhc2VMaW5lOjpDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpCitGWF9CT09MIENUZXh0QmFzZUxpbmU6OkNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKIHsKICAgICBGWF9GTE9BVCBpbnRlcl90b3AsIGludGVyX2JvdHRvbTsKICAgICBpZiAoIUdldEludGVyc2VjdGlvbihtX0JvdHRvbSwgbV9Ub3AsIHBPdGhlci0+bV9Cb3R0b20sIHBPdGhlci0+bV9Ub3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfYm90dG9tLCBpbnRlcl90b3ApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9GTE9BVCBpbnRlcl9oID0gaW50ZXJfdG9wIC0gaW50ZXJfYm90dG9tOwogICAgIGlmIChpbnRlcl9oIDwgKG1fVG9wIC0gbV9Cb3R0b20pIC8gMiAmJiBpbnRlcl9oIDwgKHBPdGhlci0+bV9Ub3AgLSBwT3RoZXItPm1fQm90dG9tKSAvIDIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZMT0FUIGR5ID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMobV9CYXNlTGluZSAtIHBPdGhlci0+bV9CYXNlTGluZSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewpAQCAtNTYzLDExICs1NjMsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkeSA+PSAocFRleHQtPm1fQm90dG9tIC0gcFRleHQtPm1fVG9wKSAvIDIgfHwKICAgICAgICAgICAgICAgICAgICAgZHkgPj0gKHBPdGhlclRleHQtPm1fQm90dG9tIC0gcE90aGVyVGV4dC0+bV9Ub3ApIC8gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKIHsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHBUZXh0LT5tX1NwYWNlV2lkdGgsIHBUZXh0LT5tX0ZvbnRTaXplViwgcFRleHQtPm1fVGV4dCk7CiAgICAgfQogfQotYm9vbCBDVGV4dEJhc2VMaW5lOjpHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpCitGWF9CT09MIENUZXh0QmFzZUxpbmU6OkdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCkKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpID09IG1fVGV4dExpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7CiAgICAgbGVmdHggPSBwVGV4dC0+bV9MZWZ0OwpAQCAtNTk5LDcgKzU5OSw3IEBACiAgICAgfQogICAgIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwogICAgIHJpZ2h0eCA9IHBUZXh0LT5tX1JpZ2h0OwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDVGV4dEJhc2VMaW5lOjpNZXJnZUJveGVzKCkKIHsKQEAgLTcyNCw4ICs3MjQsOCBAQAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jLCBwUGFnZSk7CiAgICAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gdHJ1ZTsKLSAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IGZhbHNlOworICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOworICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CiAgICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwogICAgIENGWF9GbG9hdFJlY3QgcGFnZV9iYm94ID0gcGFnZS5HZXRQYWdlQkJveCgpOwogICAgIGlmIChmbGFncyAmIFBERjJUWFRfQVVUT19ST1RBVEUpIHsKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgIENUZXh0UGFnZSB0ZXh0czsKICAgICB0ZXh0cy5tX2JBdXRvV2lkdGggPSBmbGFncyAmIFBERjJUWFRfQVVUT19XSURUSDsKICAgICB0ZXh0cy5tX2JLZWVwQ29sdW1uID0gZmxhZ3MgJiBQREYyVFhUX0tFRVBfQ09MVU1OOwotICAgIHRleHRzLm1fYkJyZWFrU3BhY2UgPSB0cnVlOworICAgIHRleHRzLm1fYkJyZWFrU3BhY2UgPSBUUlVFOwogICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcyk7CkBAIC03NjMsNyArNzYzLDcgQEAKICAgICAgICAgbGluZXMuQWRkKHN0cik7CiAgICAgfQogfQotZXh0ZXJuIHZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBib29sIGJVc2VMRiwKK2V4dGVybiB2b2lkIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgRlhfQk9PTCBiVXNlTEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CiB2b2lkIFBERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIEZYX0RXT1JEIGZsYWdzKQogewpAQCAtNzcxLDggKzc3MSw4IEBACiAgICAgQ1BERl9QYWdlIHBhZ2U7CiAgICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKICAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSB0cnVlOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gZmFsc2U7CisgICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7CisgICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKICAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7Ci0gICAgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoYnVmZmVyLCAmcGFnZSwgdHJ1ZSwgTlVMTCk7CisgICAgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoYnVmZmVyLCAmcGFnZSwgVFJVRSwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCmluZGV4IGY3NzdhM2QuLmMxYWFhZDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwCkBAIC0xOSwxMCArMTksMTAgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQorRlhfQk9PTCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQogewogICAgIGlmKGN1ckNoYXIgPCAyNTUgKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIChjdXJDaGFyID49IDB4MDYwMCAmJiBjdXJDaGFyIDw9IDB4MDZGRikKICAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4RkU3MCAmJiBjdXJDaGFyIDw9IDB4RkVGRikKQEAgLTMzLDkgKzMzLDkgQEAKICAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4MkRFMCAmJiBjdXJDaGFyIDw9IDB4MkRGRikKICAgICAgICAgICAgIHx8IGN1ckNoYXIgPT0gODQ2NwogICAgICAgICAgICAgfHwgKGN1ckNoYXIgPj0gMHgyMDAwICYmIGN1ckNoYXIgPD0gMHgyMDZGKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIEZYX0ZMT0FUIF9Ob3JtYWxpemVUaHJlc2hvbGQoRlhfRkxPQVQgdGhyZXNob2xkKQpAQCAtNTgsNyArNTgsNyBAQAogICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IDAuMDsKICAgICBjb25zdCBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKICAgICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgewotICAgICAgICBib29sIGJBbGxDaGFyID0gdHJ1ZTsKKyAgICAgICAgRlhfQk9PTCBiQWxsQ2hhciA9IFRSVUU7CiAgICAgICAgIEZYX0ZMT0FUIHNwYWNpbmcgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoCiAgICAgICAgICAgICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ2hhclNwYWNlKTsKICAgICAgICAgYmFzZVNwYWNlID0gc3BhY2luZzsKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwogICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGtlcm5pbmcgPSAtZm9udHNpemVfaCAqIGl0ZW0ubV9PcmlnaW5YIC8gMTAwMDsKICAgICAgICAgICAgICAgICBiYXNlU3BhY2UgPSBzdGQ6Om1pbihiYXNlU3BhY2UsIGtlcm5pbmcgKyBzcGFjaW5nKTsKLSAgICAgICAgICAgICAgICBiQWxsQ2hhciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgewpAQCAtODIsNyArODIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIENQREZUZXh0X1BhcnNlT3B0aW9uczo6Q1BERlRleHRfUGFyc2VPcHRpb25zKCkKLSAgICA6IG1fYkdldENoYXJDb2RlT25seShmYWxzZSksIG1fYk5vcm1hbGl6ZU9ianModHJ1ZSksIG1fYk91dHB1dEh5cGhlbihmYWxzZSkKKyAgICA6IG1fYkdldENoYXJDb2RlT25seShGQUxTRSksIG1fYk5vcm1hbGl6ZU9ianMoVFJVRSksIG1fYk91dHB1dEh5cGhlbihGQUxTRSkKIHsKIH0KIElQREZfVGV4dFBhZ2UqIElQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKQpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgOiBtX2NoYXJMaXN0KDUxMiksCiAgICAgICBtX1RlbXBDaGFyTGlzdCg1MCksCiAgICAgICBtX3BQcmVUZXh0T2JqKE5VTEwpLAotICAgICAgbV9Jc1BhcnNlcmVkKGZhbHNlKSwKKyAgICAgIG1fSXNQYXJzZXJlZChGQUxTRSksCiAgICAgICBtX1RleHRsaW5lRGlyKC0xKSwKICAgICAgIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkKIHsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICwgbV9jaGFyTGlzdCg1MTIpCiAgICAgLCBtX1RlbXBDaGFyTGlzdCg1MCkKICAgICAsIG1fcFByZVRleHRPYmooTlVMTCkKLSAgICAsIG1fSXNQYXJzZXJlZChmYWxzZSkKKyAgICAsIG1fSXNQYXJzZXJlZChGQUxTRSkKICAgICAsIG1fVGV4dGxpbmVEaXIoLTEpCiAgICAgLCBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApCiB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICA6IG1fY2hhckxpc3QoNTEyKSwKICAgICAgIG1fVGVtcENoYXJMaXN0KDUwKSwKICAgICAgIG1fcFByZVRleHRPYmooTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZWQoZmFsc2UpLAorICAgICAgbV9Jc1BhcnNlcmVkKEZBTFNFKSwKICAgICAgIG1fVGV4dGxpbmVEaXIoLTEpLAogICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKQogewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgQ0ZYX0Zsb2F0UmVjdCBwYWdlUmVjdCA9IHBQYWdlLT5DYWxjQm91bmRpbmdCb3goKTsKICAgICBtX0Rpc3BsYXlNYXRyaXggPSBDRlhfQWZmaW5lTWF0cml4KDEsIDAsIDAsIC0xLCBwYWdlUmVjdC5yaWdodCwgcGFnZVJlY3QudG9wKTsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6Tm9ybWFsaXplT2JqZWN0cyhib29sIGJOb3JtYWxpemUpCit2b2lkIENQREZfVGV4dFBhZ2U6Ok5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKQogewogICAgIG1fUGFyc2VPcHRpb25zLm1fYk5vcm1hbGl6ZU9ianMgPSBiTm9ybWFsaXplOwogfQpAQCAtMTc3LDE4ICsxNzcsMTggQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9Ci1ib29sIENQREZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKQorRlhfQk9PTCBDUERGX1RleHRQYWdlOjpQYXJzZVRleHRQYWdlKCkKIHsKICAgICBpZiAoIW1fcFBhZ2UpIHsKLSAgICAgICAgbV9Jc1BhcnNlcmVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9Jc1BhcnNlcmVkID0gRkFMU0U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9Jc1BhcnNlcmVkID0gZmFsc2U7CisgICAgbV9Jc1BhcnNlcmVkID0gRkFMU0U7CiAgICAgbV9UZXh0QnVmLkNsZWFyKCk7CiAgICAgbV9jaGFyTGlzdC5SZW1vdmVBbGwoKTsKICAgICBtX3BQcmVUZXh0T2JqID0gTlVMTDsKICAgICBQcm9jZXNzT2JqZWN0KCk7Ci0gICAgbV9Jc1BhcnNlcmVkID0gdHJ1ZTsKKyAgICBtX0lzUGFyc2VyZWQgPSBUUlVFOwogICAgIGlmKCFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKICAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQWxsKCk7CiAgICAgICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE5NywxNSArMTk3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgICAgICAgICAgYm9vbCBiTm9ybWFsID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJOb3JtYWwgPSBGQUxTRTsKICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoaSk7CiAgICAgICAgICAgICBpZihjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYoY2hhcmluZm8ubV9Vbmljb2RlID09IDAgfHwgSXNDb250cm9sQ2hhcihjaGFyaW5mbykpCi0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBGQUxTRTsKICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJOb3JtYWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYoYk5vcm1hbCkgewogICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSAlIDIpIHsKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgICAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBpbnQJQ1BERl9UZXh0UGFnZTo6Q291bnRDaGFycygpIGNvbnN0CiB7CkBAIC0yODMsNyArMjgzLDcgQEAKICAgICBDUERGX1RleHRPYmplY3QqCXBDdXJPYmogPSBOVUxMOwogICAgIENGWF9GbG9hdFJlY3QJCXJlY3Q7CiAgICAgaW50CQkJCQljdXJQb3MgPSBzdGFydDsKLSAgICBib29sCQkJCWZsYWdOZXdSZWN0ID0gdHJ1ZTsKKyAgICBGWF9CT09MCQkJCWZsYWdOZXdSZWN0ID0gVFJVRTsKICAgICBpZiAobkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSB8fCBuQ291bnQgPT0gLTEpIHsKICAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKICAgICB9CkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICAgICAgaWYgKHBDdXJPYmogIT0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmopIHsKICAgICAgICAgICAgIHJlY3RBcnJheS5BZGQocmVjdCk7CiAgICAgICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7Ci0gICAgICAgICAgICBmbGFnTmV3UmVjdCA9IHRydWU7CisgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZsYWdOZXdSZWN0KSB7CiAgICAgICAgICAgICBGWF9GTE9BVCBvcmdYID0gaW5mb19jdXJjaGFyLm1fT3JpZ2luWCwgb3JnWSA9IGluZm9fY3VyY2hhci5tX09yaWdpblk7CkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gZmFsc2U7CisgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IEZBTFNFOwogICAgICAgICAgICAgcmVjdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3g7CiAgICAgICAgICAgICByZWN0Lk5vcm1hbGl6ZSgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzk5LDggKzM5OSw4IEBACiAgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIGludCBwb3MgPSAwOwogICAgIEZYX0ZMT0FUIHBvc3kgPSAwOwotICAgIGJvb2wgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOwotICAgIGJvb2wJSVNBZGRMaW5lRmVlZCA9IGZhbHNlOworICAgIEZYX0JPT0wgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICAgIEZYX0JPT0wJSVNBZGRMaW5lRmVlZCA9IEZBTFNFOwogICAgIHdoaWxlIChwb3MgPCBuQ291bnQpIHsKICAgICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7CiAgICAgICAgIGlmIChJc1JlY3RJbnRlcnNlY3QocmVjdCwgY2hhcmluZm8ubV9DaGFyQm94KSkgewpAQCAtNDEwLDIwICs0MTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyVGV4dCArPSBMIlxyXG4iOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSB0cnVlOwotICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IGZhbHNlOworICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IFRSVUU7CisgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gRkFMU0U7CiAgICAgICAgICAgICBpZiAoY2hhcmluZm8ubV9Vbmljb2RlKSB7CiAgICAgICAgICAgICAgICAgc3RyVGV4dCArPSBjaGFyaW5mby5tX1VuaWNvZGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmluZm8ubV9Vbmljb2RlID09IDMyKSB7CiAgICAgICAgICAgICBpZiAoSXNDb250YWluUHJlQ2hhciAmJiBjaGFyaW5mby5tX1VuaWNvZGUpIHsKICAgICAgICAgICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKLSAgICAgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7Ci0gICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdHJUZXh0OwpAQCAtNDM3LDcgKzQzNyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdAkJY3VyUmVjdDsKLSAgICBib29sCQkJCWZsYWdOZXdSZWN0ID0gdHJ1ZTsKKyAgICBGWF9CT09MCQkJCWZsYWdOZXdSZWN0ID0gVFJVRTsKICAgICBDUERGX1RleHRPYmplY3QqCXBDdXJPYmogPSBOVUxMOwogICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKICAgICBpbnQgcG9zID0gMDsKQEAgLTQ1MywxMSArNDUzLDExIEBACiAgICAgICAgICAgICBpZiAocEN1ck9iaiAhPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iaikgewogICAgICAgICAgICAgICAgIHJlc1JlY3RBcnJheS5BZGQoY3VyUmVjdCk7CiAgICAgICAgICAgICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOwotICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmxhZ05ld1JlY3QpIHsKICAgICAgICAgICAgICAgICBjdXJSZWN0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveDsKLSAgICAgICAgICAgICAgICBmbGFnTmV3UmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgY3VyUmVjdC5Ob3JtYWxpemUoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5Ob3JtYWxpemUoKTsKQEAgLTYyNiwxMyArNjI2LDEzIEBACiAgICAgcmlnaHQgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkucmlnaHQ7CiAgICAgYm90dG9tID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLmJvdHRvbTsKIH0KLWJvb2wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSkKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSkKIHsKICAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmKGVuZCA9PSBzdGFydCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfRkxPQVQgZHgsIGR5OwogICAgIEZQREZfQ0hBUl9JTkZPIGluZm8xLCBpbmZvMjsKQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgIHdoaWxlKGluZm8yLm1fQ2hhckJveC5XaWR0aCgpID09IDAgfHwgaW5mbzIubV9DaGFyQm94LkhlaWdodCgpID09IDApIHsKICAgICAgICAgZW5kLS07CiAgICAgICAgIGlmKGVuZCA8PSBzdGFydCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIEdldENoYXJJbmZvKGVuZCwgaW5mbzIpOwogICAgIH0KQEAgLTY2NCwxNiArNjY0LDE2IEBACiAgICAgfSBlbHNlIGlmKFJvdGF0ZSA+IDApIHsKICAgICAgICAgUm90YXRlID0gMzYwIC0gUm90YXRlOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wJQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCAsIGludCYgUm90YXRlKQorRlhfQk9PTAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0ICwgaW50JiBSb3RhdGUpCiB7CiAgICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpbnQgc3RhcnQsIGVuZCwgY291bnQsIG4gPSBDb3VudEJvdW5kZWRTZWdtZW50cyhyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgdHJ1ZSk7CisgICAgaW50IHN0YXJ0LCBlbmQsIGNvdW50LCBuID0gQ291bnRCb3VuZGVkU2VnbWVudHMocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIFRSVUUpOwogICAgIGlmKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZihuID4gMSkgewogICAgICAgICBHZXRCb3VuZGVkU2VnbWVudChuIC0gMSwgc3RhcnQsIGNvdW50KTsKQEAgLTY4NSwxOCArNjg1LDE4IEBACiAgICAgfQogICAgIHJldHVybiBHZXRCYXNlbGluZVJvdGF0ZShzdGFydCwgZW5kLCBSb3RhdGUpOwogfQotYm9vbAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkKK0ZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpCiB7CiAgICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIW1fSXNQYXJzZXJlZCB8fCByZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+IG1fU2VsUmVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCk7CiAgICAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHJlY3QgLCBSb3RhdGUpOwogfQotaW50CUNQREZfVGV4dFBhZ2U6OkNvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgYm9vbCBiQ29udGFpbnMgKQoraW50CUNQREZfVGV4dFBhZ2U6OkNvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfQk9PTCBiQ29udGFpbnMgKQogewogICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC03MTIsOCArNzEyLDggQEAKICAgICBGUERGX1NFR01FTlQJc2VnbWVudDsKICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwogICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwotICAgIGJvb2wJCXNlZ21lbnRTdGF0dXMgPSAwOwotICAgIGJvb2wJCUlzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKKyAgICBGWF9CT09MCQlzZWdtZW50U3RhdHVzID0gMDsKKyAgICBGWF9CT09MCQlJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CiAgICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewogICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcyk7CiAgICAgICAgIGlmKGJDb250YWlucyAmJiByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fQ2hhckJveCkpIHsKQEAgLTcyNCw3ICs3MjQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gdHJ1ZTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOwogICAgICAgICB9IGVsc2UgaWYgKCFiQ29udGFpbnMgJiYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpIHx8IHJlY3QuQ29udGFpbnMoY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpKSkgewogICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMCB8fCBzZWdtZW50U3RhdHVzID09IDIpIHsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CkBAIC03MzMsOSArNzMzLDkgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IHRydWU7CisgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKICAgICAgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IHRydWUpIHsKKyAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IFRSVUUpIHsKICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOwpAQCAtNzQzLDcgKzc0Myw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAyOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50ID0gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBwb3MrKzsKICAgICB9CkBAIC0xMDUzLDcgKzEwNTMsNyBAQAogICAgIFBBR0VDSEFSX0lORk8gSW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSk7CiAgICAgaWYoIUlzQ29udHJvbENoYXIoSW5mbykpIHsKICAgICAgICAgSW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIoc3RyLkdldEF0KGkpLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcihzdHIuR2V0QXQoaSksIFRSVUUsIEZBTFNFKTsKICAgICAgICAgRlhfV0NIQVIqIHBEc3QgPSBOVUxMOwogICAgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CiAgICAgICAgIGlmIChuQ291bnQgPj0gMSkgewpAQCAtMTA4OSwxMCArMTA4OSwxMCBAQAogICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJRlhfQmlkaUNoYXI+IHBCaWRpQ2hhcihJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpKTsKICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKICAgICBDRlhfV29yZEFycmF5IG9yZGVyOwotICAgIGJvb2wgYlIyTCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOwogICAgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDA7CiAgICAgaW50IG5SMkwgPSAwLCBuTDJSID0gMDsKLSAgICBib29sIGJQcmV2U3BhY2UgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJQcmV2U3BhY2UgPSBGQUxTRTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgIGlmKHN0ci5HZXRBdChpKSA9PSAzMikgewogICAgICAgICAgICAgaWYoYlByZXZTcGFjZSkgewpAQCAtMTEwMyw5ICsxMTAzLDkgQEAKICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiUHJldlNwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJQcmV2U3BhY2UgPSBUUlVFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYlByZXZTcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgYlByZXZTcGFjZSA9IEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmKHBCaWRpQ2hhci0+QXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHJldCA9IHBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKQEAgLTExMzUsNyArMTEzNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7Ci0gICAgICAgIGJSMkwgPSB0cnVlOworICAgICAgICBiUjJMID0gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fcGFyc2VyZmxhZyA9PSBGUERGVEVYVF9STFRCIHx8IGJSMkwpIHsKICAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludCBqID0gaTsKLSAgICAgICAgICAgICAgICBib29sIGJTeW1ib2wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKICAgICAgICAgICAgICAgICB3aGlsZShqID4gMCAmJiBvcmRlci5HZXRBdChqKSAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaik7CiAgICAgICAgICAgICAgICAgICAgIGogLT0gMzsKQEAgLTExODEsNyArMTE4MSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIGJvb2wgYkwyUiA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJMMlIgPSBGQUxTRTsKICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpICs9IDMpIHsKICAgICAgICAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChpICsgMik7CiAgICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChpKTsKQEAgLTExOTcsNyArMTE5Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmKGogPT0gMykgewogICAgICAgICAgICAgICAgICAgICBpID0gLTM7Ci0gICAgICAgICAgICAgICAgICAgIGJMMlIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiTDJSID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludCBlbmQgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxOwpAQCAtMTMwNyw3ICsxMzA3LDcgQEAKICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7Ci0gICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwogICAgIGludCBuID0gMDsKICAgICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKQEAgLTEzMTYsNyArMTMxNiw3IEBACiAgICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwogICAgICAgICBDUERGX1N0cmluZyogdGVtcCA9IChDUERGX1N0cmluZyopKHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkFjdHVhbFRleHQiKSkgOiBOVUxMKTsKICAgICAgICAgaWYgKHRlbXApIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IHRydWU7CisgICAgICAgICAgICBiRXhpc3QgPSBUUlVFOwogICAgICAgICAgICAgYWN0VGV4dCA9IHRlbXAtPkdldFVuaWNvZGVUZXh0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzM4LDI0ICsxMzM4LDI0IEBACiAgICAgaWYgKG5JdGVtcyA8IDEpIHsKICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CiAgICAgfQotICAgIGJFeGlzdCA9IGZhbHNlOworICAgIGJFeGlzdCA9IEZBTFNFOwogICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CiAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gYWN0VGV4dC5HZXRBdChpKTsKICAgICAgICAgaWYgKC0xID09IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiRXhpc3QgPSB0cnVlOworICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwogICAgIH0KLSAgICBiRXhpc3QgPSBmYWxzZTsKKyAgICBiRXhpc3QgPSBGQUxTRTsKICAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewogICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7CiAgICAgICAgIGlmICgod0NoYXIgPiAweDgwICYmIHdDaGFyIDwgMHhGRkZEKSB8fCAod0NoYXIgPD0gMHg4MCAmJiBpc3ByaW50KHdDaGFyKSkpIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IHRydWU7CisgICAgICAgICAgICBiRXhpc3QgPSBUUlVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTM5LDggKzE1MzksOCBAQAogICAgIGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwogICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IF9DYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7CiAKLSAgICBjb25zdCBib29sIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKLSAgICBjb25zdCBib29sIGJJc0JpZGlBbmRNaXJyb3JJbnZlcnNlID0KKyAgICBjb25zdCBGWF9CT09MIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKKyAgICBjb25zdCBGWF9CT09MIGJJc0JpZGlBbmRNaXJyb3JJbnZlcnNlID0KICAgICAgICAgYlIyTCAmJiAobWF0cml4LmEgKiBtYXRyaXguZCAtIG1hdHJpeC5iICogbWF0cml4LmMpIDwgMDsKICAgICBpbnQzMl90IGlCdWZTdGFydEFwcGVuZCA9IG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCk7CiAgICAgaW50MzJfdCBpQ2hhckxpc3RTdGFydEFwcGVuZCA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE2MDksNyArMTYwOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3BhY2luZyA9IDA7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgYm9vbCBiTm9Vbmljb2RlID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYk5vVW5pY29kZSA9IEZBTFNFOwogICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwogICAgICAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKICAgICAgICAgICAgIGlmKHdzdHJJdGVtLklzRW1wdHkoKSkgewpAQCAtMTYxNyw3ICsxNjE3LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgd3N0ckl0ZW0uU2V0QXQoMCwgKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiTm9Vbmljb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJOb1VuaWNvZGUgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGNoYXJpbmZvLm1fSW5kZXggPSAtMTsKICAgICAgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IGl0ZW0ubV9DaGFyQ29kZTsKQEAgLTE2NTEsNyArMTY1MSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCBuVG90YWwgPSB3c3RySXRlbS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGJvb2wgYkRlbCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiRGVsID0gRkFMU0U7CiAgICAgICAgICAgICBjb25zdCBpbnQgY291bnQgPSBzdGQ6Om1pbihtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCksIDcpOwogICAgICAgICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gY2hhcmluZm8ubV9NYXRyaXguVHJhbnNmb3JtWERpc3RhbmNlKChGWF9GTE9BVClURVhUX0NIQVJSQVRJT19HQVBERUxUQSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoaW50IG4gPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmluZm8xLT5tX3BUZXh0T2JqLT5HZXRGb250KCkgPT0gY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpICAmJgogICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhjaGFyaW5mbzEtPm1fT3JpZ2luWCAtIGNoYXJpbmZvLm1fT3JpZ2luWCkgPCB0aHJlc2hvbGQgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGNoYXJpbmZvMS0+bV9PcmlnaW5ZIC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA8IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBiRGVsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYkRlbCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3MDcsNyArMTcwNyw3IEBACiAgICAgICAgIHN0ZDo6c3dhcChwVGVtcEJ1ZmZlcltpXSwgcFRlbXBCdWZmZXJbal0pOwogICAgIH0KIH0KLWJvb2wgQ1BERl9UZXh0UGFnZTo6SXNSaWdodFRvTGVmdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAorRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1JpZ2h0VG9MZWZ0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkl0ZW1zKSBjb25zdAogewpAQCAtMTc3OSw3ICsxNzc5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fVGV4dGxpbmVEaXI7CiB9Ci1ib29sIENQREZfVGV4dFBhZ2U6OklzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpCitGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ3VyVGV4dCA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwogICAgIGlmKHN0ckN1clRleHQuR2V0TGVuZ3RoKCkgPT0gMCkgewpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKICAgICAgICAgICAgIEZYX1dDSEFSIHByZUNoYXIgPSBzdHJDdXJUZXh0LkdldEF0KChuSW5kZXgpKTsKICAgICAgICAgICAgIGlmICgoKHByZUNoYXIgPj0gTCdBJyAmJiBwcmVDaGFyIDw9IEwnWicpIHx8IChwcmVDaGFyID49IEwnYScgJiYgcHJlQ2hhciA8PSBMJ3onKSkKICAgICAgICAgICAgICAgICAgICAgJiYgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fCAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW50IHNpemUgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CkBAIC0xODA2LDIxICsxODA2LDIxIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CiAgICAgICAgICAgICBpZihzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3Rbc2l6ZSAtIDFdOwogICAgICAgICB9CiAgICAgICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFID09IHByZUNoYXIubV9GbGFnKQogICAgICAgICAgICAgaWYgKDB4QUQgPT0gcHJlQ2hhci5tX1VuaWNvZGUgfHwgMHgyRCA9PSBwcmVDaGFyLm1fVW5pY29kZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogaW50IENQREZfVGV4dFBhZ2U6OlByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KQogewogICAgIEZpbmRQcmV2aW91c1RleHRPYmplY3QoKTsKLSAgICBib29sIGJOZXdsaW5lID0gZmFsc2U7CisgICAgRlhfQk9PTCBiTmV3bGluZSA9IEZBTFNFOwogICAgIGludCBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShwT2JqKTsKICAgICBpZihXcml0aW5nTW9kZSA9PSAtMSkgewogICAgICAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqKTsKQEAgLTE4ODQsOCArMTg4NCw4IEBACiAgICAgcmVjdDEuSW50ZXJzZWN0KHJlY3QyKTsKICAgICBpZiAoV3JpdGluZ01vZGUgPT0gMCkgewogICAgICAgICBpZiAoKHJlY3QxLklzRW1wdHkoKSAmJiByZWN0Mi5IZWlnaHQoKSA+IDUgJiYgcmVjdDMuSGVpZ2h0KCkgPiA1KQotICAgICAgICAgICAgICAgIHx8ICgoeSA+IHRocmVzaG9sZCAqIDIgfHwgeSA8IHRocmVzaG9sZCAqIC0zKSAmJiAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IHRydWUpKSkgewotICAgICAgICAgICAgYk5ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHx8ICgoeSA+IHRocmVzaG9sZCAqIDIgfHwgeSA8IHRocmVzaG9sZCAqIC0zKSAmJiAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IFRSVUUpKSkgeworICAgICAgICAgICAgYk5ld2xpbmUgPSBUUlVFOwogICAgICAgICAgICAgaWYobkl0ZW0gPiAxICkgewogICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gdGVtcEl0ZW07CiAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJnRlbXBJdGVtKTsKQEAgLTE4OTcsMTEgKzE4OTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIG0uYiA8IDAuMSAmJiBtLmMgPCAwLjEgKSB7CiAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sIDEwMDAsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKICAgICAgICAgICAgICAgICAgICAgaWYocmUuQ29udGFpbnMocE9iai0+R2V0UG9zWCgpLCBwT2JqLT5HZXRQb3NZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTmV3bGluZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgcE9iai0+bV9Cb3R0b20sIDEwMDAsIHBPYmotPm1fVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlLkNvbnRhaW5zKG1fcFByZVRleHRPYmotPkdldFBvc1goKSwgbV9wUHJlVGV4dE9iai0+R2V0UG9zWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdsaW5lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE5NTIsMTAgKzE5NTIsMTAgQEAKICAgICAgICAgfQogICAgIHJldHVybiAwOwogfQotYm9vbCBDUERGX1RleHRQYWdlOjpJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCiB7CiAgICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwgcFRleHRPYmoyLT5tX1JpZ2h0LCBwVGV4dE9iajItPm1fVG9wKTsKICAgICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLCBwVGV4dE9iajEtPm1fUmlnaHQsIHBUZXh0T2JqMS0+bV9Ub3ApOwpAQCAtMTk2Niw0NiArMTk2Niw0NiBAQAogICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBwZXJDaGFyVGVtcCA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3RbbkNvdW50IC0gMl07CiAgICAgICAgICAgICBGWF9GTE9BVCBkYlNwYWNlID0gcGVyQ2hhclRlbXAubV9DaGFyQm94LldpZHRoKCk7CiAgICAgICAgICAgICBpZiAoZGJYZGlmID4gZGJTcGFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewogICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwogICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKICAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7CiAgICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CiAgICAgICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOwogICAgICAgICBwVGV4dE9iajEtPkdldEl0ZW1JbmZvKGksICZpdGVtQ3VyKTsKICAgICAgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWCgpIC0gcFRleHRPYmoyLT5HZXRQb3NYKCkpID4gR2V0Q2hhcldpZHRoKGl0ZW1QZXIubV9DaGFyQ29kZSwgcFRleHRPYmoyLT5HZXRGb250KCkpKnBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKiAwLjkgfHwKICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NZKCkgLSBwVGV4dE9iajItPkdldFBvc1koKSkgPgogICAgICAgICAgICAgRlhfTUFYKEZYX01BWChyY1ByZU9iai5IZWlnaHQoKSAsIHJjUHJlT2JqLldpZHRoKCkpLCBwVGV4dE9iajItPkdldEZvbnRTaXplKCkpIC8gOCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfVGV4dFBhZ2U6OklzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpCitGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpCiB7CiAgICAgaWYgKCFwVGV4dE9iaikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGkgPSAwOwogICAgIGlmICghT2JqUG9zKSB7CkBAIC0yMDIxLDEzICsyMDIxLDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZihJc1NhbWVUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmosIHBUZXh0T2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpKys7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZfVGV4dFBhZ2U6OkdlbmVyYXRlQ2hhckluZm8oRlhfV0NIQVIgdW5pY29kZSwgUEFHRUNIQVJfSU5GTyYgaW5mbykKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKQogewogICAgIGludCBzaXplID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc2l6ZSA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwogICAgICAgICBpZihzaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CiAgICAgfQpAQCAtMjA2MSwzNyArMjA2MSwzNyBAQAogICAgIGluZm8ubV9PcmlnaW5YID0gcHJlQ2hhci5tX09yaWdpblggKyBwcmVXaWR0aCAqIChmcykgLyAxMDAwOwogICAgIGluZm8ubV9PcmlnaW5ZID0gcHJlQ2hhci5tX09yaWdpblk7CiAgICAgaW5mby5tX0NoYXJCb3ggPSBDRlhfRmxvYXRSZWN0KGluZm8ubV9PcmlnaW5YLCBpbmZvLm1fT3JpZ2luWSwgaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9UZXh0UGFnZTo6SXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MikKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MikKIHsKICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSByZWN0MTsKICAgICByZWN0LkludGVyc2VjdChyZWN0Mik7CiAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKIH0KLWJvb2wJQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkKK0ZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkKIHsKICAgICBpZiAodW5pY29kZSA8IEwnQScpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICh1bmljb2RlID4gTCdaJyAmJiB1bmljb2RlIDwgTCdhJykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHVuaWNvZGUgPiBMJ3onKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENQREZfVGV4dFBhZ2VGaW5kOjpDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCiAgICAgOiBtX3BUZXh0UGFnZShwVGV4dFBhZ2UpLAogICAgICAgbV9mbGFncygwKSwKICAgICAgIG1fZmluZE5leHRTdGFydCgtMSksCiAgICAgICBtX2ZpbmRQcmVTdGFydCgtMSksCi0gICAgICBtX2JNYXRjaENhc2UoZmFsc2UpLAotICAgICAgbV9iTWF0Y2hXaG9sZVdvcmQoZmFsc2UpLAorICAgICAgbV9iTWF0Y2hDYXNlKEZBTFNFKSwKKyAgICAgIG1fYk1hdGNoV2hvbGVXb3JkKEZBTFNFKSwKICAgICAgIG1fcmVzU3RhcnQoMCksCiAgICAgICBtX3Jlc0VuZCgtMSksCi0gICAgICBtX0lzRmluZChmYWxzZSkKKyAgICAgIG1fSXNGaW5kKEZBTFNFKQogewogICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwogICAgIGludCBuQ291bnQgPSBwVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKQEAgLTIxNDAsMTAgKzIxNDAsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotYm9vbAlDUERGX1RleHRQYWdlRmluZDo6RmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MpCitGWF9CT09MCUNQREZfVGV4dFBhZ2VGaW5kOjpGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcykKIHsKICAgICBpZiAoIW1fcFRleHRQYWdlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2JNYXRjaENhc2UgIT0gKGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFKSkgewogICAgICAgICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKQEAgLTIxNTMsOCArMjE1Myw4IEBACiAgICAgbV9mbGFncyA9IGZsYWdzOwogICAgIG1fYk1hdGNoQ2FzZSA9IGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFOwogICAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBtX0lzRmluZCA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgRlhfU1RSU0laRSBsZW4gPSBmaW5kd2hhdFN0ci5HZXRMZW5ndGgoKTsKICAgICBpZiAoIW1fYk1hdGNoQ2FzZSkgewpAQCAtMjE4MiwzNiArMjE4MiwzNiBAQAogICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoZmluZHdoYXRTdHIpOwogICAgIH0KICAgICBpZihtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9Jc0ZpbmQgPSB0cnVlOworICAgIG1fSXNGaW5kID0gVFJVRTsKICAgICBtX3Jlc1N0YXJ0ID0gMDsKICAgICBtX3Jlc0VuZCA9IC0xOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDUERGX1RleHRQYWdlRmluZDo6RmluZE5leHQoKQorRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZE5leHQoKQogewogICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYobV9maW5kTmV4dFN0YXJ0ID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZihtX3N0clRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CisgICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgaW50IHN0ckxlbiA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKTsKICAgICBpZiAobV9maW5kTmV4dFN0YXJ0ID4gc3RyTGVuIC0gMSkgewotICAgICAgICBtX0lzRmluZCA9IGZhbHNlOworICAgICAgICBtX0lzRmluZCA9IEZBTFNFOwogICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCk7CiAgICAgaW50IG5SZXN1bHRQb3MgPSAwOwogICAgIGludAluU3RhcnRQb3MgPSAwOwogICAgIG5TdGFydFBvcyA9IG1fZmluZE5leHRTdGFydDsKLSAgICBib29sIGJTcGFjZVN0YXJ0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiU3BhY2VTdGFydCA9IEZBTFNFOwogICAgIGZvcihpbnQgaVdvcmQgPSAwOyBpV29yZCA8IG5Db3VudDsgaVdvcmQrKykgewogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1dvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZF07CiAgICAgICAgIGlmKGNzV29yZC5Jc0VtcHR5KCkpIHsKQEAgLTIyMjMsMzMgKzIyMjMsMzMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaVdvcmQgPSAtMTsKICAgICAgICAgICAgIH0gZWxzZSBpZihpV29yZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYlNwYWNlU3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJTcGFjZVN0YXJ0ID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGludCBlbmRJbmRleDsKICAgICAgICAgblJlc3VsdFBvcyA9IG1fc3RyVGV4dC5GaW5kKGNzV29yZC5jX3N0cigpLCBuU3RhcnRQb3MpOwogICAgICAgICBpZiAoblJlc3VsdFBvcyA9PSAtMSkgewotICAgICAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CiAgICAgICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgICAgIH0KICAgICAgICAgZW5kSW5kZXggPSBuUmVzdWx0UG9zICsgY3NXb3JkLkdldExlbmd0aCgpIC0gMTsKICAgICAgICAgaWYoaVdvcmQgPT0gMCkgewogICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCBiTWF0Y2ggPSB0cnVlOworICAgICAgICBGWF9CT09MIGJNYXRjaCA9IFRSVUU7CiAgICAgICAgIGlmKGlXb3JkICE9IDAgJiYgIWJTcGFjZVN0YXJ0KSB7CiAgICAgICAgICAgICBpbnQgUHJlUmVzRW5kUG9zID0gblN0YXJ0UG9zOwogICAgICAgICAgICAgaW50IGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQoMCk7CiAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBsYXN0V29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkIC0gMV07CiAgICAgICAgICAgICBpbnQgbGFzdENoYXIgPSBsYXN0V29yZC5HZXRBdChsYXN0V29yZC5HZXRMZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgaWYoblN0YXJ0UG9zID09IG5SZXN1bHRQb3MgJiYgIShfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihsYXN0Q2hhcikgfHwgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoY3VyQ2hhcikpKSB7Ci0gICAgICAgICAgICAgICAgYk1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IoaW50IGQgPSBQcmVSZXNFbmRQb3M7IGQgPCBuUmVzdWx0UG9zOyBkKyspIHsKICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoZCk7CiAgICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMjU3LDcgKzIyNTcsNyBAQAogICAgICAgICAgICAgaWYoblJlc3VsdFBvcyA+IDApIHsKICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblJlc3VsdFBvcyAtIDEpOwogICAgICAgICAgICAgICAgIGlmKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfQkxBTktfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBiTWF0Y2ggPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3MgLSAxOwpAQCAtMjI3OCw3ICsyMjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtX3Jlc0VuZCA9IG5SZXN1bHRQb3MgKyBtX2NzRmluZFdoYXRBcnJheVttX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgLSAxXS5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgbV9Jc0ZpbmQgPSB0cnVlOworICAgIG1fSXNGaW5kID0gVFJVRTsKICAgICBpbnQgcmVzU3RhcnQgPSBHZXRDaGFySW5kZXgobV9yZXNTdGFydCk7CiAgICAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CiAgICAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShyZXNTdGFydCwgcmVzRW5kIC0gcmVzU3RhcnQgKyAxLCBtX3Jlc0FycmF5KTsKQEAgLTIyOTEsMjAgKzIyOTEsMjAgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fSXNGaW5kOwogfQotYm9vbCBDUERGX1RleHRQYWdlRmluZDo6RmluZFByZXYoKQorRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZFByZXYoKQogewogICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgaWYobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKKyAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKICAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwogICAgIH0KICAgICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKLSAgICBib29sIHJldCA9IGZpbmRFbmdpbmUuRmluZEZpcnN0KG1fZmluZFdoYXQsIG1fZmxhZ3MpOworICAgIEZYX0JPT0wgcmV0ID0gZmluZEVuZ2luZS5GaW5kRmlyc3QobV9maW5kV2hhdCwgbV9mbGFncyk7CiAgICAgaWYoIXJldCkgewotICAgICAgICBtX0lzRmluZCA9IGZhbHNlOworICAgICAgICBtX0lzRmluZCA9IEZBTFNFOwogICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgfQogICAgIGludAlvcmRlciA9IC0xLCBNYXRjaGVkQ291bnQgPSAwOwpAQCAtMjMyMSwxMiArMjMyMSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmKG9yZGVyID09IC0xKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CisgICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgbV9yZXNTdGFydCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyKTsKICAgICBtX3Jlc0VuZCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyICsgTWF0Y2hlZENvdW50IC0gMSk7Ci0gICAgbV9Jc0ZpbmQgPSB0cnVlOworICAgIG1fSXNGaW5kID0gVFJVRTsKICAgICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KG9yZGVyLCBNYXRjaGVkQ291bnQsIG1fcmVzQXJyYXkpOwogICAgIGlmKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgewogICAgICAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKQEAgLTIzODUsMTYgKzIzODUsMTYgQEAKICAgICAgICAgaW5kZXgrKzsKICAgICB9CiB9Ci1ib29sIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpCitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpCiB7CiAgICAgaW50IGNoYXJfbGVmdCA9IDA7CiAgICAgaW50IGNoYXJfcmlnaHQgPSAwOwogICAgIGludCBjaGFyX2NvdW50ID0gZW5kUG9zIC0gc3RhcnRQb3MgKyAxOwogICAgIGlmKGNoYXJfY291bnQgPCAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoY2hhcl9jb3VudCA9PSAxICYmIGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID4gMjU1KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYoc3RhcnRQb3MgLSAxID49IDAgKSB7CiAgICAgICAgIGNoYXJfbGVmdCA9IGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MgLSAxKTsKQEAgLTI0MDQsMzMgKzI0MDQsMzMgQEAKICAgICB9CiAgICAgaWYgKChjaGFyX2xlZnQgPiAnQScgJiYgY2hhcl9sZWZ0IDwgJ2EnKSB8fCAoY2hhcl9sZWZ0ID4gJ2EnICYmIGNoYXJfbGVmdCA8ICd6JykgfHwgKGNoYXJfbGVmdCA+IDB4ZmIwMCAmJiBjaGFyX2xlZnQgPCAweGZiMDYpIHx8IChjaGFyX2xlZnQgPj0gJzAnICYmIGNoYXJfbGVmdCA8PSAnOScpIHx8CiAgICAgICAgICAgICAoY2hhcl9yaWdodCA+ICdBJyAmJiBjaGFyX3JpZ2h0IDwgJ2EnKSB8fCAoY2hhcl9yaWdodCA+ICdhJyAmJiBjaGFyX3JpZ2h0IDwgJ3onKSB8fCAoY2hhcl9yaWdodCA+IDB4ZmIwMCAmJiBjaGFyX3JpZ2h0IDwgMHhmYjA2KSB8fCAoY2hhcl9yaWdodCA+PSAnMCcgJiYgY2hhcl9yaWdodCA8PSAnOScpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZighKCgnQScgPiBjaGFyX2xlZnQgfHwgY2hhcl9sZWZ0ID4gJ1onKSAgJiYgKCdhJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAneicpCiAgICAgICAgICAgICAmJiAoJ0EnID4gY2hhcl9yaWdodCB8fCBjaGFyX3JpZ2h0ID4gJ1onKSAgJiYgKCdhJyA+IGNoYXJfcmlnaHQgfHwgY2hhcl9yaWdodCA+ICd6JykpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoY2hhcl9jb3VudCA+IDApIHsKICAgICAgICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID49IEwnMCcgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPD0gTCc5JyAmJiBjaGFyX2xlZnQgPj0gTCcwJyAmJiBjaGFyX2xlZnQgPD0gTCc5JykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJiBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCiAgICAgICAgIGludCBpU3ViU3RyaW5nLCBGWF9XQ0hBUiBjaFNlcCkKIHsKICAgICBpZiAobHBzekZ1bGxTdHJpbmcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgd2hpbGUgKGlTdWJTdHJpbmctLSkgewogICAgICAgICBscHN6RnVsbFN0cmluZyA9IEZYU1lTX3djc2NocihscHN6RnVsbFN0cmluZywgY2hTZXApOwogICAgICAgICBpZiAobHBzekZ1bGxTdHJpbmcgPT0gTlVMTCkgewogICAgICAgICAgICAgclN0cmluZy5FbXB0eSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGxwc3pGdWxsU3RyaW5nKys7CiAgICAgICAgIHdoaWxlKCpscHN6RnVsbFN0cmluZyA9PSBjaFNlcCkgewpAQCAtMjQ0Myw3ICsyNDQzLDcgQEAKICAgICBBU1NFUlQobkxlbiA+PSAwKTsKICAgICBGWFNZU19tZW1jcHkoclN0cmluZy5HZXRCdWZmZXIobkxlbiksIGxwc3pGdWxsU3RyaW5nLCBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CiAgICAgclN0cmluZy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlRmluZDo6TWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKIHsKQEAgLTI0NzEsMjcgKzI0NzEsMjcgQEAKIH0KIENQREZfTGlua0V4dHJhY3Q6OkNQREZfTGlua0V4dHJhY3QoKQogICAgIDogbV9wVGV4dFBhZ2UoTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZChmYWxzZSkKKyAgICAgIG1fSXNQYXJzZXJkKEZBTFNFKQogewogfQogQ1BERl9MaW5rRXh0cmFjdDo6fkNQREZfTGlua0V4dHJhY3QoKQogewogICAgIERlbGV0ZUxpbmtMaXN0KCk7CiB9Ci1ib29sIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCitGWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCiB7CiAgICAgaWYgKCFwVGV4dFBhZ2UgfHwgIXBUZXh0UGFnZS0+SXNQYXJzZXJlZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BUZXh0UGFnZSA9IChjb25zdCBDUERGX1RleHRQYWdlKilwVGV4dFBhZ2U7CiAgICAgbV9zdHJQYWdlVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgwLCAtMSk7CiAgICAgRGVsZXRlTGlua0xpc3QoKTsKICAgICBpZiAobV9zdHJQYWdlVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHBhcnNlckxpbmsoKTsKLSAgICBtX0lzUGFyc2VyZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9Jc1BhcnNlcmQgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUERGX0xpbmtFeHRyYWN0OjpEZWxldGVMaW5rTGlzdCgpCiB7CkBAIC0yNTQ2LDQyICsyNTQ2LDQyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjaykKK0ZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKQogewogICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHN0ckJlQ2hlY2s7CiAgICAgc3RyLk1ha2VMb3dlcigpOwogICAgIGlmIChzdHIuRmluZChMImh0dHA6Ly93d3cuIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vIikpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMImh0dHBzOi8vd3d3LiIpICE9IC0xKSB7CiAgICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMImh0dHBzOi8vIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovLyIpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoc3RyLkZpbmQoTCJ3d3cuIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJ3d3cuIikpOwogICAgICAgICBzdHJCZUNoZWNrID0gTCJodHRwOi8vIiArIHN0ckJlQ2hlY2s7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKQorRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpCiB7CiAgICAgc3RyLk1ha2VMb3dlcigpOwogICAgIGludCBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CiAgICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoc3RyLkdldEF0KGFQb3MgLSAxKSA9PSBMJy4nIHx8IHN0ci5HZXRBdChhUG9zIC0gMSkgPT0gTCdfJykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gYVBvcyAtIDE7IGkgPj0gMDsgaS0tKSB7CkBAIC0yNTkwLDcgKzI1OTAsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBhUG9zIC0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdHIgPSBzdHIuUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gaSAtIDEpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTk4LDcgKzI1OTgsNyBAQAogICAgIH0KICAgICBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CiAgICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfV2lkZVN0cmluZyBzdHJ0ZW1wID0gTCIiOwogICAgIGZvciAoaSA9IDA7IGkgPCBhUG9zOyBpKyspIHsKQEAgLTI2MTQsMTMgKzI2MTQsMTMgQEAKICAgICB9CiAgICAgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOwogICAgIGlmIChhUG9zIDwgMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgc3RyLlRyaW1SaWdodChMJy4nKTsKICAgICBzdHJ0ZW1wID0gc3RyOwogICAgIGludCBlUG9zID0gc3RyLkZpbmQoTCcuJyk7CiAgICAgaWYgKGVQb3MgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHdoaWxlIChlUG9zICE9IC0xKSB7CiAgICAgICAgIHN0cnRlbXAgPSBzdHJ0ZW1wLlJpZ2h0KHN0cnRlbXAuR2V0TGVuZ3RoKCkgLSBlUG9zIC0gMSk7CkBAIC0yNjQzLDIyICsyNjQzLDIyIEBACiAgICAgICAgIGlmICh3Y2ggPT0gTCctJyB8fCB3Y2ggPT0gTCcuJyB8fCAod2NoID49IEwnYScgJiYgd2NoIDw9IEwneicpIHx8ICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMIm1haWx0bzoiKSA9PSAtMSkgewogICAgICAgICBzdHIgPSBMIm1haWx0bzoiICsgc3RyOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERl9MaW5rRXh0cmFjdDo6QXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkKK0ZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6QXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkKIHsKICAgICBDUERGX0xpbmtFeHQqIGxpbmtJbmZvID0gbmV3IENQREZfTGlua0V4dDsKICAgICBsaW5rSW5mby0+bV9zdHJVcmwgPSBzdHJVcmw7CiAgICAgbGlua0luZm8tPm1fU3RhcnQgPSBzdGFydDsKICAgICBsaW5rSW5mby0+bV9Db3VudCA9IGNvdW50OwogICAgIG1fTGlua0xpc3QuQWRkKGxpbmtJbmZvKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChpbnQgaW5kZXgpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfc2VhcmNoLmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCmluZGV4IGQ4OGU5ZTEuLjIxYTI1NjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwCkBAIC05LDU2ICs5LDU2IEBACiBjbGFzcyBDUERGX1RleHRTdHJlYW0KIHsKIHB1YmxpYzoKLSAgICBDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIGJvb2wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CisgICAgQ1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBGWF9CT09MIGJVc2VMRiwgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpOwogICAgIH5DUERGX1RleHRTdHJlYW0oKSB7fQotICAgIGJvb2wgUHJvY2Vzc09iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGJvb2wgYkZpcnN0TGluZSk7CisgICAgRlhfQk9PTCBQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgRlhfQk9PTCBiRmlyc3RMaW5lKTsKICAgICBDRlhfV2lkZVRleHRCdWYmCW1fQnVmZmVyOwotICAgIGJvb2wJCQkJbV9iVXNlTEY7CisgICAgRlhfQk9PTAkJCQltX2JVc2VMRjsKICAgICBDRlhfUHRyQXJyYXkqCQltX3BPYmpBcnJheTsKICAgICBjb25zdCBDUERGX1RleHRPYmplY3QqCW1fcExhc3RPYmo7CiB9OwotQ1BERl9UZXh0U3RyZWFtOjpDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIGJvb2wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgOiBtX0J1ZmZlcihidWZmZXIpCitDUERGX1RleHRTdHJlYW06OkNQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgRlhfQk9PTCBiVXNlTEYsIENGWF9QdHJBcnJheSogcE9iakFycmF5KSA6IG1fQnVmZmVyKGJ1ZmZlcikKIHsKICAgICBtX3BMYXN0T2JqID0gTlVMTDsKICAgICBtX2JVc2VMRiA9IGJVc2VMRjsKICAgICBtX3BPYmpBcnJheSA9IHBPYmpBcnJheTsKIH0KLWJvb2wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCitGWF9CT09MIEZQREZUZXh0X0lzU2FtZVRleHRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajEsIGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKQogewogICAgIGlmICghcFRleHRPYmoxIHx8ICFwVGV4dE9iajIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghcmNQcmVPYmouSXNFbXB0eSgpIHx8ICFyY0N1ck9iai5Jc0VtcHR5KCkpIHsKICAgICAgICAgcmNQcmVPYmouSW50ZXJzZWN0KHJjQ3VyT2JqKTsKICAgICAgICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChGWFNZU19mYWJzKHJjUHJlT2JqLldpZHRoKCkgLSByY0N1ck9iai5XaWR0aCgpKSA+IHJjQ3VyT2JqLldpZHRoKCkgLyAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAhPSBwVGV4dE9iajEtPkdldEZvbnRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgblByZUNvdW50ID0gcFRleHRPYmoyLT5Db3VudEl0ZW1zKCk7CiAgICAgaW50IG5DdXJDb3VudCA9IHBUZXh0T2JqMS0+Q291bnRJdGVtcygpOwogICAgIGlmIChuUHJlQ291bnQgIT0gbkN1ckNvdW50KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CiAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKICAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7CiAgICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwogICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogaW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkKIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLWJvb2wgQ1BERl9UZXh0U3RyZWFtOjpQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgYm9vbCBiRmlyc3RMaW5lKQorRlhfQk9PTCBDUERGX1RleHRTdHJlYW06OlByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBGWF9CT09MIGJGaXJzdExpbmUpCiB7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IHBPYmotPkdldEZvbnQoKTsKICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdExpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobV9iVXNlTEYpIHsKICAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xyJyk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gLTEpIHsKICAgICAgICAgICAgIG1fcExhc3RPYmogPSBwT2JqOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAzKSB7CiAgICAgICAgICAgICBpdGVtX2luZGV4ID0gMTsKICAgICAgICAgfQpAQCAtMjc3LDkgKzI3Nyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBib29sIGJVc2VMRiwKK3ZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBGWF9CT09MIGJVc2VMRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpCiB7CiAgICAgQ1BERl9UZXh0U3RyZWFtIHRleHRzdHJlYW0oYnVmZmVyLCBiVXNlTEYsIHBPYmpBcnJheSk7CkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgaWYgKHBPYmplY3QtPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBmYWxzZSk7CisgICAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBGQUxTRSk7CiAgICAgfQogfQogQ0ZYX1dpZGVTdHJpbmcgUERGX0dldEZpcnN0VGV4dExpbmVfVW5pY29kZShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlKQpAQCAtMzAyLDE3ICszMDIsMTcgQEAKICAgICBDUERGX1BhZ2UgcGFnZTsKICAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwogICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IHRydWU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBmYWxzZTsKKyAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gVFJVRTsKKyAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IEZBTFNFOwogICAgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKLSAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGZhbHNlLCBOVUxMKTsKKyAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIEZBTFNFLCBOVUxMKTsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CiAgICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOwogICAgICAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCB0cnVlKSkgeworICAgICAgICBpZiAodGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIFRSVUUpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmggYi9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oCmluZGV4IGJjYWNjNTcuLmNlNTIzNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaApAQCAtNDgsOSArNDgsOSBAQAogICAgIENQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7CiAgICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7CiAgICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGVGV4dF9QYXJzZU9wdGlvbnMgUGFyc2VyT3B0aW9ucyk7Ci0gICAgdmlydHVhbCBib29sCQkJCQlQYXJzZVRleHRQYWdlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJCQlOb3JtYWxpemVPYmplY3RzKGJvb2wgYk5vcm1hbGl6ZSk7Ci0gICAgdmlydHVhbAlib29sCQkJCQlJc1BhcnNlcmVkKCkgY29uc3QKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVBhcnNlVGV4dFBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQJCQkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKTsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzUGFyc2VyZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fSXNQYXJzZXJlZDsKICAgICB9CkBAIC03MSwxMCArNzEsMTAgQEAKICAgICB2aXJ0dWFsIGludAkJCQkJCUNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KTsKICAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUICZib3R0b20pIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpOwotICAgIHZpcnR1YWwgYm9vbAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgaW50JiBSb3RhdGUpOwogICAgIHZpcnR1YWwJaW50CQkJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLAotICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSwgYm9vbCBiQ29udGFpbnMgPSBmYWxzZSk7CisgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKTsKICAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQJCQkJCQlHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKIHB1YmxpYzoKQEAgLTgyLDIwICs4MiwyMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuICZtX2NoYXJMaXN0OwogICAgIH0KLSAgICBzdGF0aWMJYm9vbAkJCQkJSXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0Mik7Ci0gICAgc3RhdGljCWJvb2wJCQkJCUlzTGV0dGVyKEZYX1dDSEFSIHVuaWNvZGUpOworICAgIHN0YXRpYwlGWF9CT09MCQkJCQlJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKKyAgICBzdGF0aWMJRlhfQk9PTAkJCQkJSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7CiBwcml2YXRlOgotICAgIGJvb2wJCQkJCQkJSXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcik7CisgICAgRlhfQk9PTAkJCQkJCQlJc0h5cGhlbihGWF9XQ0hBUiBjdXJDaGFyKTsKICAgICBib29sCQkJCQkJCUlzQ29udHJvbENoYXIoY29uc3QgUEFHRUNIQVJfSU5GTyYgY2hhckluZm8pOwotICAgIGJvb2wJCQkJCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSk7CisgICAgRlhfQk9PTAkJCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKTsKICAgICB2b2lkCQkJCQkJCVByb2Nlc3NPYmplY3QoKTsKICAgICB2b2lkCQkJCQkJCVByb2Nlc3NGb3JtT2JqZWN0KENQREZfRm9ybU9iamVjdCoJcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwogICAgIHZvaWQJCQkJCQkJUHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogcE9iaik7CiAgICAgdm9pZAkJCQkJCQlQcm9jZXNzVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqCXBUZXh0T2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4LCBGWF9QT1NJVElPTiBPYmpQb3MpOwogICAgIGludAkJCQkJCQkJUHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwotICAgIGJvb2wJCQkJCQkJR2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKTsKLSAgICBib29sCQkJCQkJCUlzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOwotICAgIGJvb2wJCQkJCQkJSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOworICAgIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKTsKKyAgICBGWF9CT09MCQkJCQkJCUlzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOworICAgIEZYX0JPT0wJCQkJCQkJSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOwogICAgIGludAkJCQkJCQkJR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KSBjb25zdDsKICAgICB2b2lkCQkJCQkJCUNsb3NlVGVtcExpbmUoKTsKICAgICB2b2lkCQkJCQkJCU9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBpbnQzMl90CUZpbmRUZXh0bGluZUZsb3dEaXJlY3Rpb24oKTsKICAgICB2b2lkIFN3YXBUZW1wVGV4dEJ1ZihpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZlN0YXJ0QXBwZW5kKTsKLSAgICBib29sIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICBGWF9CT09MIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JdGVtcykgY29uc3Q7CiBwcm90ZWN0ZWQ6CkBAIC0xMjMsMTMgKzEyMywxMyBAQAogICAgIGludAkJCQkJCQkJbV9wYXJzZXJmbGFnOwogICAgIENQREZfVGV4dE9iamVjdCoJCQkJbV9wUHJlVGV4dE9iajsKICAgICBDRlhfQWZmaW5lTWF0cml4CQkJCW1fcGVyTWF0cml4OwotICAgIGJvb2wJCQkJCQkJbV9Jc1BhcnNlcmVkOworICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmVkOwogICAgIENGWF9BZmZpbmVNYXRyaXgJCQkJbV9EaXNwbGF5TWF0cml4OwogCiAgICAgU0VHTUVOVF9BcnJheQkJCQkJbV9TZWdtZW50OwogICAgIENGWF9SZWN0QXJyYXkJCQkJCW1fU2VsUmVjdHM7CiAgICAgTElORU9CSgkJCQkJCQltX0xpbmVPYmo7Ci0gICAgYm9vbAkJCQkJCQltX1RleHRsaW5lRGlyOworICAgIEZYX0JPT0wJCQkJCQkJbV9UZXh0bGluZURpcjsKICAgICBDRlhfRmxvYXRSZWN0CQkJCQltX0N1cmxpbmVSZWN0OwogfTsKIGNsYXNzIENQREZfVGV4dFBhZ2VGaW5kOiBwdWJsaWMgSVBERl9UZXh0UGFnZUZpbmQKQEAgLTEzOCwxNyArMTM4LDE3IEBACiAgICAgQ1BERl9UZXh0UGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKICAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX1RleHRQYWdlRmluZCgpIHt9OwogcHVibGljOgotICAgIHZpcnR1YWwJYm9vbAkJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKTsKLSAgICB2aXJ0dWFsCWJvb2wJCQkJCUZpbmROZXh0KCk7Ci0gICAgdmlydHVhbAlib29sCQkJCQlGaW5kUHJldigpOworICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKTsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUZpbmROZXh0KCk7CisgICAgdmlydHVhbAlGWF9CT09MCQkJCQlGaW5kUHJldigpOwogCiAgICAgdmlydHVhbCB2b2lkCQkJCQlHZXRSZWN0QXJyYXkoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50CQkJCQkJR2V0Q3VyT3JkZXIoKSBjb25zdDsKICAgICB2aXJ0dWFsIGludAkJCQkJCUdldE1hdGNoZWRDb3VudCgpY29uc3Q7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZAkJCQkJCQlFeHRyYWN0RmluZFdoYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0KTsKLSAgICBib29sCQkJCQkJCUlzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcyk7Ci0gICAgYm9vbAkJCQkJCQlFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCisgICAgRlhfQk9PTAkJCQkJCQlJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpOworICAgIEZYX0JPT0wJCQkJCQkJRXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywgY29uc3QgRlhfV0NIQVIqIGxwc3pGdWxsU3RyaW5nLAogICAgICAgICAgICAgaW50IGlTdWJTdHJpbmcsIEZYX1dDSEFSIGNoU2VwKTsKICAgICBDRlhfV2lkZVN0cmluZwkJCQkJTWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CiAgICAgaW50CQkJCQkJCQlSZXZlcnNlRmluZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzV29yZCwgaW50IG5TdGFydFBvcywgaW50JiBXb3JkTGVuZ3RoKTsKQEAgLTE2MiwxMiArMTYyLDEyIEBACiAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQkJCQltX2NzRmluZFdoYXRBcnJheTsKICAgICBpbnQJCQkJCQkJCW1fZmluZE5leHRTdGFydDsKICAgICBpbnQJCQkJCQkJCW1fZmluZFByZVN0YXJ0OwotICAgIGJvb2wJCQkJCQkJbV9iTWF0Y2hDYXNlOwotICAgIGJvb2wJCQkJCQkJbV9iTWF0Y2hXaG9sZVdvcmQ7CisgICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaENhc2U7CisgICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaFdob2xlV29yZDsKICAgICBpbnQJCQkJCQkJCW1fcmVzU3RhcnQ7CiAgICAgaW50CQkJCQkJCQltX3Jlc0VuZDsKICAgICBDRlhfUmVjdEFycmF5CQkJCQltX3Jlc0FycmF5OwotICAgIGJvb2wJCQkJCQkJbV9Jc0ZpbmQ7CisgICAgRlhfQk9PTAkJCQkJCQltX0lzRmluZDsKIH07CiBjbGFzcyBDUERGX0xpbmtFeHQKIHsKQEAgLTE4NCw4ICsxODQsOCBAQAogcHVibGljOgogICAgIENQREZfTGlua0V4dHJhY3QoKTsKICAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX0xpbmtFeHRyYWN0KCk7Ci0gICAgdmlydHVhbCBib29sCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKLSAgICB2aXJ0dWFsCWJvb2wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0CisgICAgdmlydHVhbCBGWF9CT09MCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9Jc1BhcnNlcmQ7CiAgICAgfQpAQCAtMTk3LDE0ICsxOTcsMTQgQEAKIHByb3RlY3RlZDoKICAgICB2b2lkCQkJCQkJCXBhcnNlckxpbmsoKTsKICAgICB2b2lkCQkJCQkJCURlbGV0ZUxpbmtMaXN0KCk7Ci0gICAgYm9vbAkJCQkJCQlDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0ckJlQ2hlY2spOwotICAgIGJvb2wJCQkJCQkJQ2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBib29sCQkJCQkJCUFwcGVuZFRvTGlua0xpc3QoaW50IHN0YXJ0LCBpbnQgY291bnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJVcmwpOworICAgIEZYX0JPT0wJCQkJCQkJQ2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKTsKKyAgICBGWF9CT09MCQkJCQkJCUNoZWNrTWFpbExpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgICAgRlhfQk9PTAkJCQkJCQlBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKTsKIHByaXZhdGU6CiAgICAgTElOS19JbmZvQXJyYXkJCQkJCW1fTGlua0xpc3Q7CiAgICAgY29uc3QgQ1BERl9UZXh0UGFnZSoJCQltX3BUZXh0UGFnZTsKICAgICBDRlhfV2lkZVN0cmluZwkJCQkJbV9zdHJQYWdlVGV4dDsKLSAgICBib29sCQkJCQkJCW1fSXNQYXJzZXJkOworICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmQ7CiB9OwogRlhfU1RSU0laRSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24oRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiogcERzdCk7CiB2b2lkIE5vcm1hbGl6ZVN0cmluZyhDRlhfV2lkZVN0cmluZyYgc3RyKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaAppbmRleCBlZmU5ZmY5Li4yNzVhYWJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oCkBAIC0zMyw4ICszMyw4IEBACiAgICAgfkNUZXh0QmFzZUxpbmUoKTsKICAgICB2b2lkCUluc2VydFRleHRCb3goRlhfRkxPQVQgbGVmdHgsIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBib29sCUdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCk7Ci0gICAgYm9vbAlDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOworICAgIEZYX0JPT0wJR2V0V2lkdGgoRlhfRkxPQVQmIGxlZnR4LCBGWF9GTE9BVCYgcmlnaHR4KTsKKyAgICBGWF9CT09MCUNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7CiAgICAgdm9pZAlNZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOwogICAgIHZvaWQJTWVyZ2VCb3hlcygpOwogICAgIHZvaWQJQ291bnRDaGFycyhpbnQmIGNvdW50LCBGWF9GTE9BVCYgd2lkdGgsIGludCYgbWluY2hhcnMpOwpAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LCBGWF9GTE9BVCB0b3B5LCBGWF9GTE9BVCBib3R0b215LCBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyLCBDUERGX0ZvbnQqIHBGb250KTsKICAgICB2b2lkCVdyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBpbnQgaU1pbldpZHRoKTsKLSAgICBib29sCW1fYkF1dG9XaWR0aDsKLSAgICBib29sCW1fYktlZXBDb2x1bW47Ci0gICAgYm9vbAltX2JCcmVha1NwYWNlOworICAgIEZYX0JPT0wJbV9iQXV0b1dpZHRoOworICAgIEZYX0JPT0wJbV9iS2VlcENvbHVtbjsKKyAgICBGWF9CT09MCW1fYkJyZWFrU3BhY2U7CiAKIHByaXZhdGU6CiAgICAgQ0ZYX1B0ckFycmF5CW1fQmFzZUxpbmVzOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKaW5kZXggZGM2NDc0OC4uNzY2OGY4NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCkBAIC0xNyw5ICsxNyw5IEBACiBjbGFzcyBDQ29kZWNfQmFzaWNNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0Jhc2ljTW9kdWxlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBib29sCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorICAgIHZpcnR1YWwgRlhfQk9PTAlSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgYm9vbAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMpOwpAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgdWludDhfdCoJCQlHZXRTY2FubGluZShpbnQgbGluZSk7CiAKLSAgICBib29sCQkJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgRlhfQk9PTAkJCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCiAgICAgaW50CQkJCQlHZXRXaWR0aCgpCiAgICAgewpAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICByZXR1cm4gbV9icGM7CiAgICAgfQogCi0gICAgYm9vbAkJCQlJc0NvbG9yVHJhbnNmb3JtZWQoKQorICAgIEZYX0JPT0wJCQkJSXNDb2xvclRyYW5zZm9ybWVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JDb2xvclRyYW5zZm9ybWVkOwogICAgIH0KQEAgLTk4LDExICs5OCwxMSBAQAogCiAgICAgaW50CQkJCQltX1BpdGNoOwogCi0gICAgYm9vbAkJCQltX2JDb2xvclRyYW5zZm9ybWVkOworICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JUcmFuc2Zvcm1lZDsKIAogICAgIHVpbnQ4X3QqCQkJUmVhZE5leHRMaW5lKCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKSA9IDA7CiAKQEAgLTExOCwyMSArMTE4LDIxIEBACiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgSywgYm9vbCBFbmRPZkxpbmUsIGJvb2wgRW5jb2RlZEJ5dGVBbGlnbiwgYm9vbCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKLSAgICBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKKyAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiB9OwogY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlIDogcHVibGljIElDb2RlY19GbGF0ZU1vZHVsZQogewogcHVibGljOgogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JEIEZsYXRlT3JMWldEZWNvZGUoYm9vbCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgYm9vbCBiRWFybHlDaGFuZ2UsCisgICAgdmlydHVhbCBGWF9EV09SRCBGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgYm9vbCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBib29sCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiB9OwogY2xhc3MgQ0NvZGVjX0pwZWdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pwZWdNb2R1bGUKIHsKQEAgLTE0MywxNyArMTQzLDE3IEBACiAgICAgICAgIG1fcEV4dFByb3ZpZGVyID0gcEpQOwogICAgIH0KICAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBib29sIENvbG9yVHJhbnNmb3JtKTsKLSAgICBib29sCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pOworICAgIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKTsKLSAgICBib29sCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKKyAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKICAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7CiAgICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpOwogICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOwotICAgIHZpcnR1YWwgYm9vbAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1Zik7CisgICAgdmlydHVhbCBGWF9CT09MCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKIHByb3RlY3RlZDoKICAgICBJRlhfSnBlZ1Byb3ZpZGVyKiBtX3BFeHRQcm92aWRlcjsKQEAgLTE5OSwxMCArMTk5LDEwIEBACiB7CiBwdWJsaWM6CiAgICAgQ0NvZGVjX0pweE1vZHVsZSgpOwotICAgIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBib29sIHVzZUNvbG9yU3BhY2UgPSBmYWxzZSk7CisgICAgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSA9IEZBTFNFKTsKICAgICB2b2lkCQlHZXRJbWFnZUluZm8odm9pZCogY3R4LCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpOwotICAgIGJvb2wJCURlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBib29sIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cyk7CisgICAgRlhfQk9PTAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKTsKICAgICB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpOwogfTsKIGNsYXNzIENQREZfSmJpZzJJbnRlcmZhY2UgOiBwdWJsaWMgQ0pCaWcyX01vZHVsZQpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgRlhfRFdPUkQgbV9nbG9iYWxfc2l6ZTsKICAgICB1aW50OF90KiBtX2Rlc3RfYnVmOwogICAgIEZYX0RXT1JEIG1fZGVzdF9waXRjaDsKLSAgICBib29sCW1fYkZpbGVSZWFkZXI7CisgICAgRlhfQk9PTAltX2JGaWxlUmVhZGVyOwogICAgIElGWF9QYXVzZSogbV9wUGF1c2U7CiAgICAgQ0pCaWcyX0NvbnRleHQqIG1fcENvbnRleHQ7CiAgICAgQ0pCaWcyX0ltYWdlKiBtX2Rlc3RfaW1hZ2U7CkBAIC0yNjMsOSArMjYzLDkgQEAKIHB1YmxpYzoKICAgICBDQ29kZWNfSmJpZzJNb2R1bGUoKSB7fTsKICAgICB+Q0NvZGVjX0piaWcyTW9kdWxlKCk7Ci0gICAgYm9vbAkJRGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAorICAgIEZYX0JPT0wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCk7Ci0gICAgYm9vbAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCisgICAgRlhfQk9PTAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpOwogICAgIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpOwogICAgIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKaW5kZXggOGVkZmRlNS4uOWJiY2NlMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKQEAgLTQ5LDEzICs0OSwxMyBAQAogICAgIG1fTmV4dExpbmUgKys7CiAgICAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKIH0KLWJvb2wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTCBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcERhdGFDYWNoZSAmJiBsaW5lIDwgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fTmV4dExpbmUgPT0gbGluZSB8fCBtX05leHRMaW5lID09IGxpbmUgKyAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKICAgICAgICAgdl9SZXdpbmQoKTsKQEAgLTY2LDEwICs2NiwxMCBAQAogICAgICAgICBtX3BMYXN0U2NhbmxpbmUgPSBSZWFkTmV4dExpbmUoKTsKICAgICAgICAgbV9OZXh0TGluZSArKzsKICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHVpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OlJlYWROZXh0TGluZSgpCiB7CkBAIC0xMDcsMTAgKzEwNywxMCBAQAogICAgIG1fcERhdGFDYWNoZS0+bV9XaWR0aCA9IG1fT3V0cHV0V2lkdGg7CiAgICAgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcyA9IDA7CiB9Ci1ib29sIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCitGWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIGV4dGVybiAiQyIgZG91YmxlIEZYc3RydG9kKGNvbnN0IGNoYXIqIG5wdHIsIGNoYXIqKiBlbmRwdHIpCiB7CkBAIC0yMTYsMjYgKzIxNiwyNiBAQAogICAgIH0KICAgICByZXR1cm4gaXNfbmVnYXRpdmUgPyAtcmV0IDogcmV0OwogfQotYm9vbCBDQ29kZWNfQmFzaWNNb2R1bGU6OkE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorRlhfQk9PTCBDQ29kZWNfQmFzaWNNb2R1bGU6OkE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBjbGFzcyBDQ29kZWNfUkxTY2FubGluZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgogewogcHVibGljOgogICAgIENDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwogICAgIHZpcnR1YWwgfkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwotICAgIGJvb2wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpOworICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpOwogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkge30KLSAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCk7CisgICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX1NyY09mZnNldDsKICAgICB9CiBwcm90ZWN0ZWQ6Ci0gICAgYm9vbAkJCQlDaGVja0Rlc3RTaXplKCk7CisgICAgRlhfQk9PTAkJCQlDaGVja0Rlc3RTaXplKCk7CiAgICAgdm9pZAkJCQlHZXROZXh0T3BlcmF0b3IoKTsKICAgICB2b2lkCQkJCVVwZGF0ZU9wZXJhdG9yKHVpbnQ4X3QgdXNlZF9ieXRlcyk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogICAgIEZYX0RXT1JECQkJbV9TcmNTaXplOwogICAgIEZYX0RXT1JECQkJbV9kd0xpbmVCeXRlczsKICAgICBGWF9EV09SRAkJCW1fU3JjT2Zmc2V0OwotICAgIGJvb2wJCQkJbV9iRU9EOworICAgIEZYX0JPT0wJCQkJbV9iRU9EOwogICAgIHVpbnQ4X3QJCQkJbV9PcGVyYXRvcjsKIH07CiBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAsIG1fU3JjU2l6ZSgwKQogICAgICwgbV9kd0xpbmVCeXRlcygwKQogICAgICwgbV9TcmNPZmZzZXQoMCkKLSAgICAsIG1fYkVPRChmYWxzZSkKKyAgICAsIG1fYkVPRChGQUxTRSkKICAgICAsIG1fT3BlcmF0b3IoMCkKIHsKIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKICAgICB9CiB9Ci1ib29sIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpCitGWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpCiB7CiAgICAgRlhfRFdPUkQgaSA9IDA7CiAgICAgRlhfRFdPUkQgb2xkX3NpemUgPSAwOwpAQCAtMjczLDE0ICsyNzMsMTQgQEAKICAgICAgICAgICAgIG9sZF9zaXplID0gZGVzdF9zaXplOwogICAgICAgICAgICAgZGVzdF9zaXplICs9IG1fcFNyY0J1ZltpXSArIDE7CiAgICAgICAgICAgICBpZiAoZGVzdF9zaXplIDwgb2xkX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSBtX3BTcmNCdWZbaV0gKyAyOwogICAgICAgICB9IGVsc2UgaWYgKG1fcFNyY0J1ZltpXSA+IDEyOCkgewogICAgICAgICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7CiAgICAgICAgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gbV9wU3JjQnVmW2ldOwogICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI4OCwxMSArMjg4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCgoRlhfRFdPUkQpbV9PcmlnV2lkdGggKiBtX25Db21wcyAqIG1fYnBjICogbV9PcmlnSGVpZ2h0ICsgNykgLyA4ID4gZGVzdF9zaXplKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYykKK0ZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYykKIHsKICAgICBtX3BTcmNCdWYgPSBzcmNfYnVmOwogICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwpAQCAtMzAwLDIwICszMDAsMjAgQEAKICAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKICAgICBtX25Db21wcyA9IG5Db21wczsKICAgICBtX2JwYyA9IGJwYzsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOwogICAgIG1fRG93blNjYWxlID0gMTsKICAgICBtX1BpdGNoID0gKHdpZHRoICogbkNvbXBzICogYnBjICsgMzEpIC8gMzIgKiA0OwogICAgIG1fZHdMaW5lQnl0ZXMgPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICByZXR1cm4gQ2hlY2tEZXN0U2l6ZSgpOwogfQotYm9vbCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKK0ZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lLCAwLCBtX1BpdGNoKTsKICAgICBtX1NyY09mZnNldCA9IDA7Ci0gICAgbV9iRU9EID0gZmFsc2U7CisgICAgbV9iRU9EID0gRkFMU0U7CiAgICAgbV9PcGVyYXRvciA9IDA7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB1aW50OF90KiBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKQogewpAQCAtMzI2LDE3ICszMjYsMTcgQEAKICAgICB9CiAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lLCAwLCBtX1BpdGNoKTsKICAgICBGWF9EV09SRCBjb2xfcG9zID0gMDsKLSAgICBib29sCWVvbCA9IGZhbHNlOworICAgIEZYX0JPT0wJZW9sID0gRkFMU0U7CiAgICAgd2hpbGUgKG1fU3JjT2Zmc2V0IDwgbV9TcmNTaXplICYmICFlb2wpIHsKICAgICAgICAgaWYgKG1fT3BlcmF0b3IgPCAxMjgpIHsKICAgICAgICAgICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gbV9PcGVyYXRvciArIDE7CiAgICAgICAgICAgICBpZiAoY29sX3BvcyArIGNvcHlfbGVuID49IG1fZHdMaW5lQnl0ZXMpIHsKICAgICAgICAgICAgICAgICBjb3B5X2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IHRydWU7CisgICAgICAgICAgICAgICAgZW9sID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjb3B5X2xlbiA+PSBtX1NyY1NpemUgLSBtX1NyY09mZnNldCkgewogICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbV9TcmNTaXplIC0gbV9TcmNPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9iRU9EID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JFT0QgPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lICsgY29sX3BvcywgbV9wU3JjQnVmICsgbV9TcmNPZmZzZXQsIGNvcHlfbGVuKTsKICAgICAgICAgICAgIGNvbF9wb3MgKz0gY29weV9sZW47CkBAIC0zNDksMTMgKzM0OSwxMyBAQAogICAgICAgICAgICAgRlhfRFdPUkQgZHVwbGljYXRlX2xlbiA9IDI1NyAtIG1fT3BlcmF0b3I7CiAgICAgICAgICAgICBpZiAoY29sX3BvcyArIGR1cGxpY2F0ZV9sZW4gPj0gbV9kd0xpbmVCeXRlcykgewogICAgICAgICAgICAgICAgIGR1cGxpY2F0ZV9sZW4gPSBtX2R3TGluZUJ5dGVzIC0gY29sX3BvczsKLSAgICAgICAgICAgICAgICBlb2wgPSB0cnVlOworICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBmaWxsLCBkdXBsaWNhdGVfbGVuKTsKICAgICAgICAgICAgIGNvbF9wb3MgKz0gZHVwbGljYXRlX2xlbjsKICAgICAgICAgICAgIFVwZGF0ZU9wZXJhdG9yKCh1aW50OF90KWR1cGxpY2F0ZV9sZW4pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9iRU9EID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYkVPRCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcAppbmRleCAzNDQ2ZDBhLi5kNDU2MDAzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwCkBAIC03OSw3ICs3OSw3IEBACiAgICAgfQogICAgIHJldHVybiBwb3M7CiB9Ci12b2lkIF9GYXhHNEZpbmRCMUIyKGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsIGludCBjb2x1bW5zLCBpbnQgYTAsIGJvb2wgYTBjb2xvciwgaW50JiBiMSwgaW50JiBiMikKK3ZvaWQgX0ZheEc0RmluZEIxQjIoY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMsIGludCBhMCwgRlhfQk9PTCBhMGNvbG9yLCBpbnQmIGIxLCBpbnQmIGIyKQogewogICAgIGlmIChhMGNvbG9yKSB7CiAgICAgICAgIGEwY29sb3IgPSAxOwpAQCAtNDAwLDI3ICs0MDAsMjcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgX0ZheEc0R2V0Um93KGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgdWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsIGludCBjb2x1bW5zKQorRlhfQk9PTCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpCiB7CiAgICAgaW50IGEwID0gLTEsIGEwY29sb3IgPSAxOwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGludCBhMSwgYTIsIGIxLCBiMjsKICAgICAgICAgX0ZheEc0RmluZEIxQjIocmVmX2J1ZiwgY29sdW1ucywgYTAsIGEwY29sb3IsIGIxLCBiMik7Ci0gICAgICAgIGJvb2wgYml0ID0gTkVYVEJJVDsKKyAgICAgICAgRlhfQk9PTCBiaXQgPSBORVhUQklUOwogICAgICAgICBpbnQgdl9kZWx0YSA9IDA7CiAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIGJpdDEgPSBORVhUQklUOworICAgICAgICAgICAgRlhfQk9PTCBiaXQxID0gTkVYVEJJVDsKICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIGJpdDIgPSBORVhUQklUOworICAgICAgICAgICAgRlhfQk9PTCBiaXQyID0gTkVYVEJJVDsKICAgICAgICAgICAgIGlmIChiaXQxICYmIGJpdDIpIHsKICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MSkgewpAQCAtNDU3LDEwICs0NTcsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoYTAgPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKQEAgLTQ2OCwyNiArNDY4LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGEwLCBiMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGIyID49IGNvbHVtbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYTAgPSBiMjsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiaXQxID0gTkVYVEJJVDsKKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiaXQxID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiaXQyID0gTkVYVEJJVDsKKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiaXQyID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IDI7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0yOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRwb3MgKz0gNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTUxNiwxMyArNTE2LDEzIEBACiAgICAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGEwLCBhMSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGExID49IGNvbHVtbnMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgYTAgPSBhMTsKICAgICAgICAgYTBjb2xvciA9ICFhMGNvbG9yOwogICAgIH0KIH0KLWJvb2wgX0ZheFNraXBFT0woY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQorRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCiB7CiAgICAgaW50IHN0YXJ0Yml0ID0gYml0cG9zOwogICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7CkBAIC01MzEsMTggKzUzMSwxOCBAQAogICAgICAgICAgICAgaWYgKGJpdHBvcyAtIHN0YXJ0Yml0IDw9IDExKSB7CiAgICAgICAgICAgICAgICAgYml0cG9zID0gc3RhcnRiaXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpCitGWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpCiB7Ci0gICAgaW50IGNvbG9yID0gdHJ1ZTsKKyAgICBpbnQgY29sb3IgPSBUUlVFOwogICAgIGludCBzdGFydHBvcyA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaW50IHJ1bl9sZW4gPSAwOwogICAgICAgICB3aGlsZSAoMSkgewpAQCAtNTUxLDEwICs1NTEsMTAgQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cG9zIDwgYml0c2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gTkVYVEJJVDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcnVuX2xlbiArPSBydW47CiAgICAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKQEAgLTU3MCwxNyArNTcwLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgY29sb3IgPSAhY29sb3I7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY2xhc3MgQ0NvZGVjX0ZheERlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgogewogcHVibGljOgogICAgIENDb2RlY19GYXhEZWNvZGVyKCk7CiAgICAgdmlydHVhbCB+Q0NvZGVjX0ZheERlY29kZXIoKTsKLSAgICBib29sCQkJCUNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpOworICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cyk7CiAgICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgYm9vbAkJdl9SZXdpbmQoKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCk7CiAgICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKTsKICAgICBpbnQJCQltX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7CkBAIC02MDQsOCArNjA0LDggQEAKICAgICAgICAgRlhfRnJlZShtX3BSZWZCdWYpOwogICAgIH0KIH0KLWJvb2wgQ0NvZGVjX0ZheERlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCitGWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKQogewogICAgIG1fRW5jb2RpbmcgPSBLOwogICAgIG1fYkVuZE9mTGluZSA9IEVuZE9mTGluZTsKQEAgLTYyOCwxNCArNjI4LDE0IEBACiAgICAgbV9TcmNTaXplID0gc3JjX3NpemU7CiAgICAgbV9uQ29tcHMgPSAxOwogICAgIG1fYnBjID0gMTsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9SZXdpbmQoKQorRlhfQk9PTCBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9SZXdpbmQoKQogewogICAgIEZYU1lTX21lbXNldChtX3BSZWZCdWYsIDB4ZmYsIG1fUGl0Y2gpOwogICAgIGJpdHBvcyA9IDA7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB1aW50OF90KiBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCiB7CkBAIC02NTEsNyArNjUxLDcgQEAKICAgICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcgPT0gMCkgewogICAgICAgICBfRmF4R2V0MURMaW5lKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9PcmlnV2lkdGgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgYk5leHQxRCA9IG1fcFNyY0J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOworICAgICAgICBGWF9CT09MIGJOZXh0MUQgPSBtX3BTcmNCdWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKTsKICAgICAgICAgYml0cG9zICsrOwogICAgICAgICBpZiAoYk5leHQxRCkgewogICAgICAgICAgICAgX0ZheEdldDFETGluZShtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fT3JpZ1dpZHRoKTsKQEAgLTY2OSw3ICs2NjksNyBAQAogICAgICAgICB3aGlsZSAobV9iQnl0ZUFsaWduICYmIGJpdHBvczAgPCBiaXRwb3MxKSB7CiAgICAgICAgICAgICBpbnQgYml0ID0gbV9wU3JjQnVmW2JpdHBvczAgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zMCAlIDgpKTsKICAgICAgICAgICAgIGlmIChiaXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fYkJ5dGVBbGlnbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1fYkJ5dGVBbGlnbiA9IEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBiaXRwb3MwICsrOwogICAgICAgICAgICAgfQpAQCAtODQ2LDcgKzg0Niw3IEBACiAgICAgICAgIGRlc3RfYml0cG9zICsrOwogICAgIH0KIH0KLXN0YXRpYyB2b2lkIF9GYXhFbmNvZGVSdW4odWludDhfdCogZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBydW4sIGJvb2wgYldoaXRlKQorc3RhdGljIHZvaWQgX0ZheEVuY29kZVJ1bih1aW50OF90KiBkZXN0X2J1ZiwgaW50JiBkZXN0X2JpdHBvcywgaW50IHJ1biwgRlhfQk9PTCBiV2hpdGUpCiB7CiAgICAgd2hpbGUgKHJ1biA+PSAyNTYwKSB7CiAgICAgICAgIF9BZGRCaXRTdHJlYW0oZGVzdF9idWYsIGRlc3RfYml0cG9zLCAweDFmLCAxMik7CkBAIC05NzIsMTQgKzk3MiwxNCBAQAogICAgIGRlc3Rfc2l6ZSA9IG1fRGVzdEJ1Zi5HZXRTaXplKCk7CiAgICAgbV9EZXN0QnVmLkRldGFjaEJ1ZmZlcigpOwogfQotYm9vbAlDQ29kZWNfRmF4TW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKK0ZYX0JPT0wJQ0NvZGVjX0ZheE1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgQ0NvZGVjX0ZheEVuY29kZXIgZW5jb2RlcihzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCk7CiAgICAgZW5jb2Rlci5FbmNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDQ29kZWNfRmF4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCisgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCiB7CiAgICAgQ0NvZGVjX0ZheERlY29kZXIqIHBEZWNvZGVyID0gbmV3IENDb2RlY19GYXhEZWNvZGVyOwogICAgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIEssIEVuZE9mTGluZSwgRW5jb2RlZEJ5dGVBbGlnbiwgQmxhY2tJczEsIENvbHVtbnMsIFJvd3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mbGF0ZS5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAppbmRleCBhNjFiZTc1Li5kMTI5ZTM2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcApAQCAtODQsNyArODQsNyBAQAogY2xhc3MgQ0xaV0RlY29kZXIKIHsKIHB1YmxpYzoKLSAgICBpbnQgRGVjb2RlKHVpbnQ4X3QqIG91dHB1dCwgRlhfRFdPUkQmIG91dGxlbiwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEJiBzaXplLCBib29sIGJFYXJseUNoYW5nZSk7CisgICAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsIEZYX0RXT1JEJiBvdXRsZW4sIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCYgc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UpOwogCiBwcml2YXRlOgogICAgIHZvaWQgQWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcik7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgRlhfRFdPUkQJbV9PdXRQb3M7CiAgICAgdWludDhfdCoJbV9wT3V0cHV0OwogICAgIGNvbnN0IHVpbnQ4X3QqCW1fcElucHV0OwotICAgIGJvb2wJCW1fRWFybHk7CisgICAgRlhfQk9PTAkJbV9FYXJseTsKICAgICBGWF9EV09SRAltX0NvZGVBcnJheVs1MDIxXTsKICAgICBGWF9EV09SRAltX25Db2RlczsKICAgICB1aW50OF90CQltX0RlY29kZVN0YWNrWzQwMDBdOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgfQogICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWNvZGU7CiB9Ci1pbnQgQ0xaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQmIHNyY19zaXplLCBib29sIGJFYXJseUNoYW5nZSkKK2ludCBDTFpXRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlKQogewogICAgIG1fQ29kZUxlbiA9IDk7CiAgICAgbV9JblBvcyA9IDA7CkBAIC0yMzgsMTQgKzIzOCwxNCBAQAogICAgIH0KICAgICByZXR1cm4gKHVpbnQ4X3QpYzsKIH0KLXN0YXRpYyBib29sIFBOR19QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIEZYX0JPT0wgUE5HX1ByZWRpY3RvckVuY29kZSh1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKIHsKICAgICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OwogICAgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUgKyAxLCByb3dfY291bnQpOwpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgRlhfRnJlZShkYXRhX2J1Zik7CiAgICAgZGF0YV9idWYgPSBkZXN0X2J1ZjsKICAgICBkYXRhX3NpemUgPSAocm93X3NpemUgKyAxKSAqIHJvd19jb3VudCAtIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSAtIGxhc3Rfcm93X3NpemUpIDogMCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBzdGF0aWMgdm9pZCBQTkdfUHJlZGljdExpbmUodWludDhfdCogcERlc3REYXRhLCBjb25zdCB1aW50OF90KiBwU3JjRGF0YSwgY29uc3QgdWludDhfdCogcExhc3RMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsIGludCBuQ29sb3JzLCBpbnQgblBpeGVscykKQEAgLTM5MywxMyArMzkzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1zdGF0aWMgYm9vbCBQTkdfUHJlZGljdG9yKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKK3N0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCiB7CiAgICAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKICAgICBjb25zdCBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7CiAgICAgaWYgKHJvd19zaXplIDw9IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUpIC8gKHJvd19zaXplICsgMSk7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSAocm93X3NpemUgKyAxKTsKICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUsIHJvd19jb3VudCk7CkBAIC00NzksNyArNDc5LDcgQEAKICAgICBGWF9GcmVlKGRhdGFfYnVmKTsKICAgICBkYXRhX2J1ZiA9IGRlc3RfYnVmOwogICAgIGRhdGFfc2l6ZSA9IHJvd19zaXplICogcm93X2NvdW50IC0gKGxhc3Rfcm93X3NpemUgPiAwID8gKHJvd19zaXplICsgMSAtIGxhc3Rfcm93X3NpemUpIDogMCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBzdGF0aWMgdm9pZCBUSUZGX1ByZWRpY3RvckVuY29kZUxpbmUodWludDhfdCogZGVzdF9idWYsIGludCByb3dfc2l6ZSwgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2xvcnMsIGludCBDb2x1bW5zKQogewpAQCAtNTE4LDEyICs1MTgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIH0KLXN0YXRpYyBib29sIFRJRkZfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKK3N0YXRpYyBGWF9CT09MIFRJRkZfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKIHsKICAgICBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7CiAgICAgaWYgKHJvd19zaXplID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUgLSAxKSAvIHJvd19zaXplOwogICAgIGNvbnN0IGludCBsYXN0X3Jvd19zaXplID0gZGF0YV9zaXplICUgcm93X3NpemU7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgewpAQCAtNTMzLDcgKzUzMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywgQ29sdW1ucyk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogc3RhdGljIHZvaWQgVElGRl9QcmVkaWN0TGluZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHJvd19zaXplLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbG9ycywgaW50IENvbHVtbnMpCiB7CkBAIC01NjgsMTIgKzU2OCwxMiBAQAogICAgICAgICB9CiAgICAgfQogfQotc3RhdGljIGJvb2wgVElGRl9QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIEZYX0JPT0wgVElGRl9QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdyArKykgewpAQCAtNTgzLDcgKzU4Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgVElGRl9QcmVkaWN0TGluZShzY2FuX2xpbmUsIHJvd19zaXplLCBCaXRzUGVyQ29tcG9uZW50LCBDb2xvcnMsIENvbHVtbnMpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGNsYXNzIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCiB7CkBAIC01OTcsNyArNTk3LDcgQEAKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkge30KLSAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCk7CisgICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCk7CiAgICAgdm9pZCoJCQkJbV9wRmxhdGU7CkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKICAgICBtX25Db21wcyA9IG5Db21wczsKICAgICBtX2JwYyA9IGJwYzsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOwogICAgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICBtX1ByZWRpY3RvciA9IDA7CkBAIC02NzIsMTggKzY3MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKK0ZYX0JPT0wgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgaWYgKG1fcEZsYXRlKSB7CiAgICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwogICAgIH0KICAgICBtX3BGbGF0ZSA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7CiAgICAgaWYgKG1fcEZsYXRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZQREZBUElfRmxhdGVJbnB1dChtX3BGbGF0ZSwgbV9TcmNCdWYsIG1fU3JjU2l6ZSk7CiAgICAgbV9MZWZ0T3ZlciA9IDA7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB1aW50OF90KiBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKQogewpAQCAtNzMyLDcgKzczMiw3IEBACiBzdGF0aWMgdm9pZCBGbGF0ZVVuY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0RXT1JEIG9yaWdfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIEZYX0RXT1JEJiBvZmZzZXQpCiB7Ci0gICAgY29uc3QgYm9vbCB1c2VPbGRJbXBsID0gc3JjX3NpemUgPCAxMDI0MDsKKyAgICBjb25zdCBGWF9CT09MIHVzZU9sZEltcGwgPSBzcmNfc2l6ZSA8IDEwMjQwOwogICAgIEZYX0RXT1JEIGd1ZXNzX3NpemUgPSBvcmlnX3NpemUgPyBvcmlnX3NpemUgOiBzcmNfc2l6ZSAqIDI7CiAgICAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9IG9yaWdfc2l6ZSA/IDEwMjQwIDogKHNyY19zaXplIDwgMTAyNDAgPyAxMDI0MCA6IHNyY19zaXplKTsKICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKQEAgLTgzOSw3ICs4MzksNyBAQAogICAgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7CiAgICAgcmV0dXJuIHBEZWNvZGVyOwogfQotRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlLAorRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAogICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CkBAIC04NzYsNyArODc2LDcgQEAKICAgICBpZiAocHJlZGljdG9yX3R5cGUgPT0gMCkgewogICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgIH0KLSAgICBib29sIHJldCA9IHRydWU7CisgICAgRlhfQk9PTCByZXQgPSBUUlVFOwogICAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7CiAgICAgICAgIHJldCA9IFBOR19QcmVkaWN0b3IoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMpOwpAQCAtODg2LDcgKzg4Niw3IEBACiAgICAgfQogICAgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKIH0KLWJvb2wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitGWF9CT09MIENDb2RlY19GbGF0ZU1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKQEAgLTg5Niw3ICs4OTYsNyBAQAogICAgIHVpbnQ4X3QqIHBTcmNCdWYgPSBOVUxMOwogICAgIHBTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzcmNfc2l6ZSk7CiAgICAgRlhTWVNfbWVtY3B5KHBTcmNCdWYsIHNyY19idWYsIHNyY19zaXplKTsKLSAgICBib29sIHJldCA9IHRydWU7CisgICAgRlhfQk9PTCByZXQgPSBUUlVFOwogICAgIGlmIChwcmVkaWN0b3IgPT0gMikgewogICAgICAgICByZXQgPSBUSUZGX1ByZWRpY3RvckVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zKTsKQEAgLTkwOSwxMiArOTA5LDEyIEBACiAgICAgRlhfRnJlZShwU3JjQnVmKTsKICAgICByZXR1cm4gcmV0OwogfQotYm9vbCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQorRlhfQk9PTCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQogewogICAgIGRlc3Rfc2l6ZSA9IHNyY19zaXplICsgc3JjX3NpemUgLyAxMDAwICsgMTI7CiAgICAgZGVzdF9idWYgPSBGWF9BbGxvYyggdWludDhfdCwgZGVzdF9zaXplKTsKICAgICB1bnNpZ25lZCBsb25nIHRlbXBfc2l6ZSA9IGRlc3Rfc2l6ZTsKICAgICBGUERGQVBJX0ZsYXRlQ29tcHJlc3MoZGVzdF9idWYsICZ0ZW1wX3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKICAgICBkZXN0X3NpemUgPSAoRlhfRFdPUkQpdGVtcF9zaXplOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwCmluZGV4IDBjY2ZlMWYuLjc1MDdmZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKIGNvbnN0IEZYX0RXT1JEIE5fQ09NUE9ORU5UX0NNWUsgPSA0OwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfREVGQVVMVCA9IDM7CiAKLWJvb2wgTUQ1Q29tcHV0ZUlEKCBjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0gKQorRlhfQk9PTCBNRDVDb21wdXRlSUQoIGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSApCiB7CiAgICAgcmV0dXJuIGNtc01ENWNvbXB1dGVJREV4dChidWYsIGR3U2l6ZSwgSUQpOwogfQpAQCAtMjIsNTAgKzIyLDUwIEBACiAgICAgY21zSFRSQU5TRk9STSBtX2hUcmFuc2Zvcm07CiAgICAgaW50CQkJbV9uU3JjQ29tcG9uZW50czsKICAgICBpbnQJCQltX25Ec3RDb21wb25lbnRzOwotICAgIGJvb2wJCW1fYkxhYjsKKyAgICBGWF9CT09MCQltX2JMYWI7CiB9OwogZXh0ZXJuICJDIiB7CiAgICAgaW50IG91ckhhbmRsZXIoaW50IEVycm9yQ29kZSwgY29uc3QgY2hhciAqRXJyb3JUZXh0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIH07Ci1ib29sIENoZWNrQ29tcG9uZW50cyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzLCBpbnQgbkNvbXBvbmVudHMsIGJvb2wgYkRzdCkKK0ZYX0JPT0wgQ2hlY2tDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MsIGludCBuQ29tcG9uZW50cywgRlhfQk9PTCBiRHN0KQogewogICAgIGlmIChuQ29tcG9uZW50cyA8PSAwIHx8IG5Db21wb25lbnRzID4gMTUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHN3aXRjaChjcykgewogICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6CiAgICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgPCAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgogICAgICAgICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWJEc3QgJiYgbkNvbXBvbmVudHMgPiAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6CiAgICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgogICAgICAgICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGlmIChuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludDMyX3QgR2V0Q1NDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MpCiB7CkBAIC0xMTIsMTIgKzExMiwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaW50IHNyY0Zvcm1hdDsKLSAgICBib29sIGJMYWIgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJMYWIgPSBGQUxTRTsKICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIHNyY0NTID0gY21zR2V0Q29sb3JTcGFjZShzcmNQcm9maWxlKTsKICAgICBuU3JjQ29tcG9uZW50cyA9IEdldENTQ29tcG9uZW50cyhzcmNDUyk7CiAgICAgaWYgKHNyY0NTID09IGNtc1NpZ0xhYkRhdGEpIHsKICAgICAgICAgc3JjRm9ybWF0ID0gQ09MT1JTUEFDRV9TSChQVF9MYWIpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMCk7Ci0gICAgICAgIGJMYWIgPSB0cnVlOworICAgICAgICBiTGFiID0gVFJVRTsKICAgICB9IGVsc2UgewogICAgICAgICBzcmNGb3JtYXQgPSBDT0xPUlNQQUNFX1NIKFBUX0FOWSkgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgxKTsKICAgICAgICAgaWYgKHNyY0NTID09IGNtc1NpZ1JnYkRhdGEgJiYgVF9ET1NXQVAoZHdTcmNGb3JtYXQpKSB7CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGRzdENTID0gY21zR2V0Q29sb3JTcGFjZShkc3RQcm9maWxlKTsKLSAgICBpZiAoIUNoZWNrQ29tcG9uZW50cyhkc3RDUywgbkRzdENvbXBvbmVudHMsIHRydWUpKSB7CisgICAgaWYgKCFDaGVja0NvbXBvbmVudHMoZHN0Q1MsIG5Ec3RDb21wb25lbnRzLCBUUlVFKSkgewogICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcAppbmRleCBjMTNhMmY5Li41MTE4NDMwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKQEAgLTI2LDI4ICsyNiwyOCBAQAogICAgIH0KICAgICBwSmJpZzJDb250ZW50ID0gTlVMTDsKIH0KLWJvb2wgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCitGWF9CT09MIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKQogewogICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMCwgaGVpZ2h0ICogZGVzdF9waXRjaCk7CiAgICAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoJm1fTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilnbG9iYWxfZGF0YSwgZ2xvYmFsX3NpemUsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSwgSkJJRzJfRU1CRURfU1RSRUFNLCAmbV9TeW1ib2xEaWN0Q2FjaGUpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpbnQgcmV0ID0gcENvbnRleHQtPmdldEZpcnN0UGFnZShkZXN0X2J1Ziwgd2lkdGgsIGhlaWdodCwgZGVzdF9waXRjaCwgTlVMTCk7CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KHBDb250ZXh0KTsKICAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7CiAgICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpICsrKSB7CiAgICAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAorRlhfQk9PTCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmKQogewogICAgIENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCA9IE5VTEw7CkBAIC03MSwxNSArNzEsMTUgQEAKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uSGVpZ2h0OwogICAgIHBpdGNoID0gKEZYX0RXT1JEKWRlc3RfaW1hZ2UtPm1fblN0cmlkZTsKICAgICBkZXN0X2J1ZiA9IGRlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBmYWxzZTsKKyAgICBkZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOwogICAgIGRlbGV0ZSBkZXN0X2ltYWdlOwogICAgIEZYX0ZyZWUoc3JjX2J1Zik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiBmYWlsZWQ6CiAgICAgaWYoc3JjX2J1ZikgewogICAgICAgICBGWF9GcmVlKHNyY19idWYpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCwgSUZYX1BhdXNlKiBwUGF1c2UpCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmID0gZGVzdF9idWY7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfcGl0Y2ggPSBkZXN0X3BpdGNoOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gZmFsc2U7CisgICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gRkFMU0U7CiAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWdsb2JhbF9kYXRhLCBnbG9iYWxfc2l6ZSwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsKICAgICB9CiAgICAgQ0NvZGVjX0piaWcyQ29udGV4dCogbV9wSmJpZzJDb250ZXh0ID0gKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRleHQ7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gdHJ1ZTsKKyAgICBtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIgPSBUUlVFOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlID0gTlVMTDsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX3NpemUgPSAoRlhfRFdPUkQpZmlsZV9wdHItPkdldFNpemUoKTsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSk7CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgaGVpZ2h0ID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25IZWlnaHQ7CiAgICAgICAgIHBpdGNoID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25TdHJpZGU7CiAgICAgICAgIGRlc3RfYnVmID0gbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IGZhbHNlOworICAgICAgICBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBGQUxTRTsKICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CiAgICAgfQogICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgaGVpZ2h0ID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25IZWlnaHQ7CiAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fblN0cmlkZTsKICAgICBkZXN0X2J1ZiA9IG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX3BEYXRhOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IGZhbHNlOworICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOwogICAgIGRlbGV0ZSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZTsKICAgICBGWF9GcmVlKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKTsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IDFhYzJmMDMuLjY4MzlkMzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtNzgsMTUgKzc4LDE1IEBACiAjZGVmaW5lCUpQRUdfTUFSS0VSX0FVVEhPUlRJTUUJKEpQRUdfQVBQMCArIDMpCiAjZGVmaW5lCUpQRUdfTUFSS0VSX01BWFNJWkUJMHhGRkZGCiAjZGVmaW5lCUpQRUdfT1ZFUkhFQURfTEVOCTE0Ci1zdGF0aWMJYm9vbCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCitzdGF0aWMJRlhfQk9PTCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCiB7CiAgICAgaWYoaWNjX2J1Zl9wdHIgPT0gTlVMTCB8fCBpY2NfbGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0RXT1JEIGljY19zZWdtZW50X3NpemUgPSAoSlBFR19NQVJLRVJfTUFYU0laRSAtIDIgLSBKUEVHX09WRVJIRUFEX0xFTik7CiAgICAgRlhfRFdPUkQgaWNjX3NlZ21lbnRfbnVtID0gKGljY19sZW5ndGggLyBpY2Nfc2VnbWVudF9zaXplKSArIDE7CiAgICAgaWYgKGljY19zZWdtZW50X251bSA+IDI1NSkJewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuZ3RoID0gSlBFR19PVkVSSEVBRF9MRU4gKyAoaWNjX3NlZ21lbnRfbnVtID4gMSA/IGljY19zZWdtZW50X3NpemUgOiBpY2NfbGVuZ3RoKTsKICAgICB1aW50OF90KiBpY2NfZGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGljY19kYXRhX2xlbmd0aCk7CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICBGWFNZU19tZW1jcHkoaWNjX2RhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwgaWNjX2J1Zl9wdHIgKyBpY2Nfc2l6ZSwgaWNjX2xlbmd0aCAtIGljY19zaXplKTsKICAgICBqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBpY2NfZGF0YSwgSlBFR19PVkVSSEVBRF9MRU4gKyBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOwogICAgIEZYX0ZyZWUoaWNjX2RhdGEpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIHZvaWQgX2Rlc3RfZG9fbm90aGluZyhqX2NvbXByZXNzX3B0ciBjaW5mbykge30KQEAgLTExMCw3ICsxMTAsNyBAQAogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIGJvb2xlYW4gX2Rlc3RfZW1wdHkoal9jb21wcmVzc19wdHIgY2luZm8pCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiB9OwogI2RlZmluZQlKUEVHX0JMT0NLX1NJWkUJMTA0ODU3NgpAQCAtMTc4LDkgKzE3OCw5IEBACiAgICAgfQogICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CiAgICAgaWYocXVhbGl0eSAhPSA3NSkgewotICAgICAgICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywgcXVhbGl0eSwgdHJ1ZSk7CisgICAgICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKICAgICB9Ci0gICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIHRydWUpOworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKICAgICBfSnBlZ0VtYmVkSWNjUHJvZmlsZSgmY2luZm8sIGljY19idWYsIGljY19sZW5ndGgpOwogICAgIEpTQU1QUk9XIHJvd19wb2ludGVyWzFdOwogICAgIEpESU1FTlNJT04gcm93OwpAQCAtMjIxLDggKzIyMSw4IEBACiAgICAgfQogICAgIGRlc3Rfc2l6ZSA9IGRlc3RfYnVmX2xlbmd0aCAtIChGWF9TVFJTSVpFKWRlc3QuZnJlZV9pbl9idWZmZXI7CiB9Ci1zdGF0aWMgYm9vbCBfSnBlZ0xvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCitzdGF0aWMgRlhfQk9PTCBfSnBlZ0xvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciwgRlhfRFdPUkQqIGljY19sZW5ndGgpCiB7CiAgICAgX0pwZWdTY2FuU09JKHNyY19idWYsIHNyY19zaXplKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgIGptcF9idWYgbWFyazsKICAgICBjaW5mby5jbGllbnRfZGF0YSA9ICZtYXJrOwogICAgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKICAgICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKQEAgLTI1MiwxNSArMjUyLDE1IEBACiAgICAgY2luZm8uc3JjID0gJnNyYzsKICAgICBpZiAoc2V0am1wKG1hcmspID09IC0xKSB7CiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZihpY2NfYnVmX3B0ciAmJiBpY2NfbGVuZ3RoKSB7CiAgICAgICAgIGpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBKUEVHX01BUktFUl9NQVhTSVpFKTsKICAgICB9Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCB0cnVlKTsKKyAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwogICAgIGlmIChyZXQgIT0gSlBFR19IRUFERVJfT0spIHsKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHdpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7CiAgICAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OwpAQCAtMjc0LDIxICsyNzQsMjEgQEAKICAgICAgICAgKmljY19sZW5ndGggPSAwOwogICAgIH0KICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY2xhc3MgQ0NvZGVjX0pwZWdEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIKIHsKIHB1YmxpYzoKICAgICBDQ29kZWNfSnBlZ0RlY29kZXIoKTsKICAgICB+Q0NvZGVjX0pwZWdEZWNvZGVyKCk7Ci0gICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbG9yVHJhbnNmb3JtLCBJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApOworICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKTsKICAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3koKQogICAgIHsKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCk7Ci0gICAgdmlydHVhbCBib29sCQl2X1Jld2luZCgpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpOwogICAgIGptcF9idWYJCW1fSm1wQnVmOwpAQCAtMjk4LDggKzI5OCw4IEBACiAgICAgY29uc3QgdWludDhfdCoJbV9TcmNCdWY7CiAgICAgRlhfRFdPUkQJbV9TcmNTaXplOwogICAgIHVpbnQ4X3QqCW1fcFNjYW5saW5lQnVmOwotICAgIGJvb2wJCUluaXREZWNvZGUoKTsKLSAgICBib29sCQltX2JJbml0ZWQsIG1fYlN0YXJ0ZWQsIG1fYkpwZWdUcmFuc2Zvcm07CisgICAgRlhfQk9PTAkJSW5pdERlY29kZSgpOworICAgIEZYX0JPT0wJCW1fYkluaXRlZCwgbV9iU3RhcnRlZCwgbV9iSnBlZ1RyYW5zZm9ybTsKIHByb3RlY3RlZDoKICAgICBJRlhfSnBlZ1Byb3ZpZGVyKgltX3BFeHRQcm92aWRlcjsKICAgICB2b2lkKgkJCQltX3BFeHRDb250ZXh0OwpAQCAtMzA5LDggKzMwOSw4IEBACiB7CiAgICAgbV9wU2NhbmxpbmVCdWYgPSBOVUxMOwogICAgIG1fRG93blNjYWxlID0gMTsKLSAgICBtX2JTdGFydGVkID0gZmFsc2U7Ci0gICAgbV9iSW5pdGVkID0gZmFsc2U7CisgICAgbV9iU3RhcnRlZCA9IEZBTFNFOworICAgIG1fYkluaXRlZCA9IEZBTFNFOwogICAgIG1fcEV4dFByb3ZpZGVyID0gTlVMTDsKICAgICBtX3BFeHRDb250ZXh0ID0gTlVMTDsKICAgICBGWFNZU19tZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKQEAgLTMzMSwzMSArMzMxLDMxIEBACiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CiAgICAgfQogfQotYm9vbCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKQorRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKQogewogICAgIGNpbmZvLmVyciA9ICZqZXJyOwogICAgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1fSm1wQnVmOwogICAgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgbV9iSW5pdGVkID0gdHJ1ZTsKKyAgICBtX2JJbml0ZWQgPSBUUlVFOwogICAgIGNpbmZvLnNyYyA9ICZzcmM7CiAgICAgc3JjLmJ5dGVzX2luX2J1ZmZlciA9IG1fU3JjU2l6ZTsKICAgICBzcmMubmV4dF9pbnB1dF9ieXRlID0gbV9TcmNCdWY7CiAgICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgbV9iSW5pdGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9iSW5pdGVkID0gRkFMU0U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgY2luZm8uaW1hZ2Vfd2lkdGggPSBtX09yaWdXaWR0aDsKICAgICBjaW5mby5pbWFnZV9oZWlnaHQgPSBtX09yaWdIZWlnaHQ7Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCB0cnVlKTsKKyAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwogICAgIGlmIChyZXQgIT0gSlBFR19IRUFERVJfT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChjaW5mby5zYXdfQWRvYmVfbWFya2VyKSB7Ci0gICAgICAgIG1fYkpwZWdUcmFuc2Zvcm0gPSB0cnVlOworICAgICAgICBtX2JKcGVnVHJhbnNmb3JtID0gVFJVRTsKICAgICB9CiAgICAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzID09IDMgJiYgIW1fYkpwZWdUcmFuc2Zvcm0pIHsKICAgICAgICAgY2luZm8ub3V0X2NvbG9yX3NwYWNlID0gY2luZm8uanBlZ19jb2xvcl9zcGFjZTsKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAgICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOwogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OwogICAgIG1fbkRlZmF1bHRTY2FsZURlbm9tID0gY2luZm8uc2NhbGVfZGVub207Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENDb2RlY19KcGVnRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCkKK0ZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKQogewogICAgIGlmIChwSlApIHsKICAgICAgICAgbV9wRXh0UHJvdmlkZXIgPSBwSlA7CkBAIC0zOTYsMjEgKzM5NiwyMSBAQAogICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwogICAgIGlmICghSW5pdERlY29kZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoY2luZm8ubnVtX2NvbXBvbmVudHMgPCBuQ29tcHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgoaW50KWNpbmZvLmltYWdlX3dpZHRoIDwgd2lkdGgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fUGl0Y2ggPSAoY2luZm8uaW1hZ2Vfd2lkdGggKiBjaW5mby5udW1fY29tcG9uZW50cyArIDMpIC8gNCAqIDQ7CiAgICAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKICAgICBtX25Db21wcyA9IGNpbmZvLm51bV9jb21wb25lbnRzOwogICAgIG1fYnBjID0gODsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7Ci0gICAgbV9iU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiB0cnVlOworICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgICBtX2JTdGFydGVkID0gRkFMU0U7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBleHRlcm4gIkMiIHsKICAgICBpbnQzMl90IEZYX0dldERvd25zYW1wbGVSYXRpbyhpbnQzMl90IG9yaWdpbldpZHRoLCBpbnQzMl90IG9yaWdpbkhlaWdodCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkKQEAgLTQ0NSw3ICs0NDUsNyBAQAogICAgICAgICBtX05leHRMaW5lID0gLTE7CiAgICAgfQogfQotYm9vbCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfUmV3aW5kKCkKK0ZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmV3aW5kKG1fcEV4dENvbnRleHQpOwpAQCAtNDUzLDI1ICs0NTMsMjUgQEAKICAgICBpZiAobV9iU3RhcnRlZCkgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwogICAgICAgICBpZiAoIUluaXREZWNvZGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBjaW5mby5zY2FsZV9kZW5vbSA9IG1fbkRlZmF1bHRTY2FsZURlbm9tICogbV9Eb3duU2NhbGU7CiAgICAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKICAgICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7CiAgICAgaWYgKCFqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKSkgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChpbnQpY2luZm8ub3V0cHV0X3dpZHRoID4gbV9PcmlnV2lkdGgpIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fYlN0YXJ0ZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIG1fYlN0YXJ0ZWQgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQogdWludDhfdCogQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKIHsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogICAgIHJldHVybiAoRlhfRFdPUkQpKG1fU3JjU2l6ZSAtIHNyYy5ieXRlc19pbl9idWZmZXIpOwogfQogSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0pwZWdNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgYm9vbCBDb2xvclRyYW5zZm9ybSkKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBGWF9CT09MIENvbG9yVHJhbnNmb3JtKQogewogICAgIGlmIChzcmNfYnVmID09IE5VTEwgfHwgc3JjX3NpemUgPT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUwNCw4ICs1MDQsOCBAQAogICAgIH0KICAgICByZXR1cm4gcERlY29kZXI7CiB9Ci1ib29sIENDb2RlY19KcGVnTW9kdWxlOjpMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIGJvb2wmIGNvbG9yX3RyYW5zZm9ybSwKK0ZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKIHsKICAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKQEAgLTUxNSwxNyArNTE1LDE3IEBACiAgICAgfQogICAgIHJldHVybiBfSnBlZ0xvYWRJbmZvKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBudW1fY29tcG9uZW50cywgYml0c19wZXJfY29tcG9uZW50cywgY29sb3JfdHJhbnNmb3JtLCBpY2NfYnVmX3B0ciwgaWNjX2xlbmd0aCk7CiB9Ci1ib29sIENDb2RlY19KcGVnTW9kdWxlOjpFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKQorRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6RW5jb2RlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSwgY29uc3QgdWludDhfdCogaWNjX2J1ZiwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKIHsKICAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5FbmNvZGUocFNvdXJjZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcXVhbGl0eSwgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CiAgICAgfQogICAgIGlmKHBTb3VyY2UtPkdldEJQUCgpIDwgOCB8fCBwU291cmNlLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewogICAgICAgICBBU1NFUlQocFNvdXJjZS0+R2V0QlBQKCkgPj0gOCAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBfSnBlZ0VuY29kZShwU291cmNlLCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBxdWFsaXR5LCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHN0cnVjdCBGWEpQRUdfQ29udGV4dCB7CiAgICAgam1wX2J1ZgkJCW1fSnVtcE1hcms7CkBAIC02NTMsMTQgKzY1MywxNCBAQAogICAgIHAtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7CiAgICAgcmV0dXJuIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKIH0KLWJvb2wgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYpCitGWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmKQogewogICAgIGlmIChtX3BFeHRQcm92aWRlcikgewogICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlJlYWRTY2FubGluZShwQ29udGV4dCwgZGVzdF9idWYpOwogICAgIH0KICAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CiAgICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IG5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJnAtPm1fSW5mbywgJmRlc3RfYnVmLCAxKTsKICAgICByZXR1cm4gbmxpbmVzID09IDE7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcAppbmRleCA5MmFmNjI2Li4yZDM5NWIwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKQEAgLTU4NywxNyArNTg3LDE3IEBACiBwdWJsaWM6CiAgICAgQ0pQWF9EZWNvZGVyKCk7CiAgICAgfkNKUFhfRGVjb2RlcigpOwotICAgIGJvb2wJSW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKTsKKyAgICBGWF9CT09MCUluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSk7CiAgICAgdm9pZAlHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgYm9vbAlEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOworICAgIEZYX0JPT0wJRGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKTsKICAgICBjb25zdCB1aW50OF90KiBtX1NyY0RhdGE7CiAgICAgaW50IG1fU3JjU2l6ZTsKICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2U7CiAgICAgb3BqX2NvZGVjX3QqIGxfY29kZWM7CiAgICAgb3BqX3N0cmVhbV90ICpsX3N0cmVhbTsKLSAgICBib29sIG1fdXNlQ29sb3JTcGFjZTsKKyAgICBGWF9CT09MIG1fdXNlQ29sb3JTcGFjZTsKIH07Ci1DSlBYX0RlY29kZXI6OkNKUFhfRGVjb2RlcigpOiBpbWFnZShOVUxMKSwgbF9jb2RlYyhOVUxMKSwgbF9zdHJlYW0oTlVMTCksIG1fdXNlQ29sb3JTcGFjZShmYWxzZSkKK0NKUFhfRGVjb2Rlcjo6Q0pQWF9EZWNvZGVyKCk6IGltYWdlKE5VTEwpLCBsX2NvZGVjKE5VTEwpLCBsX3N0cmVhbShOVUxMKSwgbV91c2VDb2xvclNwYWNlKEZBTFNFKQogewogfQogQ0pQWF9EZWNvZGVyOjp+Q0pQWF9EZWNvZGVyKCkKQEAgLTYxMiwxMSArNjEyLDExIEBACiAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKICAgICB9CiB9Ci1ib29sIENKUFhfRGVjb2Rlcjo6SW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKQorRlhfQk9PTCBDSlBYX0RlY29kZXI6OkluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSkKIHsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzekpQMkhlYWRlcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDBjLCAweDZhLCAweDUwLCAweDIwLCAweDIwLCAweDBkLCAweDBhLCAweDg3LCAweDBhIH07CiAgICAgaWYgKCFzcmNfZGF0YSB8fCBzcmNfc2l6ZSA8IHNpemVvZihzekpQMkhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGltYWdlID0gTlVMTDsKICAgICBtX1NyY0RhdGEgPSBzcmNfZGF0YTsKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgIERlY29kZURhdGEgc3JjRGF0YShjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihzcmNfZGF0YSksIHNyY19zaXplKTsKICAgICBsX3N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oJnNyY0RhdGEsIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsIDEpOwogICAgIGlmIChsX3N0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBvcGpfZHBhcmFtZXRlcnNfdCBwYXJhbWV0ZXJzOwogICAgIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoJnBhcmFtZXRlcnMpOwpAQCAtNjM3LDMzICs2MzcsMzMgQEAKICAgICAgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKICAgICB9CiAgICAgaWYoIWxfY29kZWMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG9wal9zZXRfaW5mb19oYW5kbGVyKGxfY29kZWMsIGZ4X2luZm9fY2FsbGJhY2ssIDAwKTsKICAgICBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihsX2NvZGVjLCBmeF93YXJuaW5nX2NhbGxiYWNrLCAwMCk7CiAgICAgb3BqX3NldF9lcnJvcl9oYW5kbGVyKGxfY29kZWMsIGZ4X2Vycm9yX2NhbGxiYWNrLCAwMCk7CiAgICAgaWYgKCAhb3BqX3NldHVwX2RlY29kZXIobF9jb2RlYywgJnBhcmFtZXRlcnMpICkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYoISBvcGpfcmVhZF9oZWFkZXIobF9zdHJlYW0sIGxfY29kZWMsICZpbWFnZSkpIHsKICAgICAgICAgaW1hZ2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFwYXJhbWV0ZXJzLm5iX3RpbGVfdG9fZGVjb2RlKSB7CiAgICAgICAgIGlmICghb3BqX3NldF9kZWNvZGVfYXJlYShsX2NvZGVjLCBpbWFnZSwgcGFyYW1ldGVycy5EQV94MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuREFfeTAsIHBhcmFtZXRlcnMuREFfeDEsIHBhcmFtZXRlcnMuREFfeTEpKSB7CiAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CiAgICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCEob3BqX2RlY29kZShsX2NvZGVjLCBsX3N0cmVhbSwgaW1hZ2UpICYmIG9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLCBsX3N0cmVhbSkpKSB7CiAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CiAgICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIW9wal9nZXRfZGVjb2RlZF90aWxlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSwgcGFyYW1ldGVycy50aWxlX2luZGV4KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIG9wal9zdHJlYW1fZGVzdHJveShsX3N0cmVhbSk7CkBAIC02ODQsOSArNjg0LDkgQEAKICAgICAgICAgaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IDA7CiAgICAgfQogICAgIGlmKCFpbWFnZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENKUFhfRGVjb2Rlcjo6R2V0SW5mbyhGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpCiB7CkBAIC02OTQsNyArNjk0LDcgQEAKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpaW1hZ2UtPnkxOwogICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wcyA9IChGWF9EV09SRClpbWFnZS0+bnVtY29tcHM7CiB9Ci1ib29sIENKUFhfRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKQorRlhfQk9PTCBDSlBYX0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKIHsKICAgICBpbnQgaSwgd2lkLCBoZWksIHJvdywgY29sLCBjaGFubmVsLCBzcmM7CiAgICAgdWludDhfdCogcENoYW5uZWw7CkBAIC03MDIsMTQgKzcwMiwxNCBAQAogICAgIHVpbnQ4X3QqIHBQaXhlbDsKIAogICAgIGlmKGltYWdlLT5jb21wc1swXS53ICE9IGltYWdlLT54MSB8fCBpbWFnZS0+Y29tcHNbMF0uaCAhPSBpbWFnZS0+eTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmKHBpdGNoIDwgKGludCkoaW1hZ2UtPmNvbXBzWzBdLncgKiA4ICogaW1hZ2UtPm51bWNvbXBzICsgMzEpID4+IDUgPDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBpbWFnZS0+eTEgKiBwaXRjaCk7CiAgICAgdWludDhfdCoqIGNoYW5uZWxfYnVmcyA9IEZYX0FsbG9jKHVpbnQ4X3QqLCBpbWFnZS0+bnVtY29tcHMpOwotICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgRlhfQk9PTCByZXN1bHQgPSBGQUxTRTsKICAgICBpbnQqIGFkanVzdF9jb21wcyA9IEZYX0FsbG9jKGludCwgaW1hZ2UtPm51bWNvbXBzKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClpbWFnZS0+bnVtY29tcHM7IGkgKyspIHsKICAgICAgICAgY2hhbm5lbF9idWZzW2ldID0gZGVzdF9idWYgKyBvZmZzZXRzW2ldOwpAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICByZXN1bHQgPSBUUlVFOwogCiBkb25lOgogICAgIEZYX0ZyZWUoY2hhbm5lbF9idWZzKTsKQEAgLTc3OCw3ICs3NzgsNyBAQAogQ0NvZGVjX0pweE1vZHVsZTo6Q0NvZGVjX0pweE1vZHVsZSgpCiB7CiB9Ci12b2lkKiBDQ29kZWNfSnB4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplICwgYm9vbCB1c2VDb2xvclNwYWNlKQordm9pZCogQ0NvZGVjX0pweE1vZHVsZTo6Q3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSAsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSkKIHsKICAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gbmV3IENKUFhfRGVjb2RlcjsKICAgICBwRGVjb2Rlci0+bV91c2VDb2xvclNwYWNlID0gdXNlQ29sb3JTcGFjZTsKQEAgLTc5NCw3ICs3OTQsNyBAQAogICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7CiAgICAgcERlY29kZXItPkdldEluZm8od2lkdGgsIGhlaWdodCwgY29kZXN0cmVhbV9uQ29tcHMsIG91dHB1dF9uQ29tcHMpOwogfQotYm9vbCBDQ29kZWNfSnB4TW9kdWxlOjpEZWNvZGUodm9pZCogY3R4LCB1aW50OF90KiBkZXN0X2RhdGEsIGludCBwaXRjaCwgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpCitGWF9CT09MIENDb2RlY19KcHhNb2R1bGU6OkRlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKIHsKICAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OwogICAgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKGRlc3RfZGF0YSwgcGl0Y2gsIGJUcmFuc2xhdGVDb2xvciwgb2Zmc2V0cyk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaAppbmRleCBmY2QxMWY0Li5mZjBiOWZjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAogICAgIGludDMyX3QgcmVhZDFCaXQoRlhfRFdPUkQgKmR3UmVzdWx0KTsKIAotICAgIGludDMyX3QgcmVhZDFCaXQoYm9vbCAgKmJSZXN1bHQpOworICAgIGludDMyX3QgcmVhZDFCaXQoRlhfQk9PTCAgKmJSZXN1bHQpOwogCiAgICAgaW50MzJfdCByZWFkMUJ5dGUodWludDhfdCAqY1Jlc3VsdCk7CiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgIH0KIH0KIAotaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoYm9vbCAqYlJlc3VsdCkKK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQml0KEZYX0JPT0wgKmJSZXN1bHQpCiB7CiAgICAgaWYobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7CiAgICAgICAgICpiUmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKaW5kZXggMGI3MWM0Ny4uNjhjOTczNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgSkJJRzJfQUxMT0MobV9wU2VnbWVudExpc3QsIENKQmlnMl9MaXN0PENKQmlnMl9TZWdtZW50Pik7CiAgICAgSkJJRzJfQUxMT0MobV9wUGFnZUluZm9MaXN0LCBDSkJpZzJfTGlzdDxKQmlnMlBhZ2VJbmZvPigxKSk7CiAgICAgbV9wUGFnZSA9IE5VTEw7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gZmFsc2U7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7CiAgICAgbV9wUGF1c2UgPSBwUGF1c2U7CiAgICAgbV9uU2VnbWVudERlY29kZWQgPSAwOwogICAgIG1fUGF1c2VTdGVwID0gMTA7CkBAIC0yMzEsMTEgKzIzMSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbV9iRmlyc3RQYWdlID0gdHJ1ZTsKKyAgICBtX2JGaXJzdFBhZ2UgPSBUUlVFOwogICAgIG1fUGF1c2VTdGVwID0gMDsKICAgICBkZWxldGUgbV9wUGFnZTsKICAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2Uod2lkdGgsIGhlaWdodCwgc3RyaWRlLCBwQnVmKSk7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gdHJ1ZTsKKyAgICBtX2JCdWZTcGVjaWZpZWQgPSBUUlVFOwogICAgIGlmKG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewogICAgICAgICBtX1BhdXNlU3RlcCA9IDE7CiAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CkBAIC0yOTgsMTEgKzI5OCwxMSBAQAogaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0TmV4dFBhZ2UodWludDhfdCAqcEJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgc3RyaWRlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpbnQzMl90IG5SZXQgPSBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKLSAgICBtX2JGaXJzdFBhZ2UgPSBmYWxzZTsKKyAgICBtX2JGaXJzdFBhZ2UgPSBGQUxTRTsKICAgICBtX1BhdXNlU3RlcCA9IDA7CiAgICAgZGVsZXRlIG1fcFBhZ2U7CiAgICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IHRydWU7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKICAgICBpZihtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKICAgICAgICAgbV9QYXVzZVN0ZXAgPSAxOwogICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwpAQCAtMzMwLDcgKzMzMCw3IEBACiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXRGaXJzdFBhZ2UoQ0pCaWcyX0ltYWdlICoqaW1hZ2UsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGludDMyX3QgblJldDsKLSAgICBtX2JGaXJzdFBhZ2UgPSB0cnVlOworICAgIG1fYkZpcnN0UGFnZSA9IFRSVUU7CiAgICAgbV9QYXVzZVN0ZXAgPSAwOwogICAgIGlmKG1fcEdsb2JhbENvbnRleHQpIHsKICAgICAgICAgblJldCA9IG1fcEdsb2JhbENvbnRleHQtPmRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CkBAIC0zMzgsMTQgKzMzOCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gZmFsc2U7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7CiAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CiB9CiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZShDSkJpZzJfSW1hZ2UgKippbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50MzJfdCBuUmV0OwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IGZhbHNlOwotICAgIG1fYkZpcnN0UGFnZSA9IGZhbHNlOworICAgIG1fYkJ1ZlNwZWNpZmllZCA9IEZBTFNFOworICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOwogICAgIG1fUGF1c2VTdGVwID0gMDsKICAgICBzd2l0Y2gobV9uU3RyZWFtVHlwZSkgewogICAgICAgICBjYXNlIEpCSUcyX0ZJTEVfU1RSRUFNOgpAQCAtNjAxLDE0ICs2MDEsMTQgQEAKICAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpUYWJsZV9CMSA9IE5VTEwsICpUYWJsZV9CMiA9IE5VTEwsICpUYWJsZV9CMyA9IE5VTEwsICpUYWJsZV9CNCA9IE5VTEwsICpUYWJsZV9CNSA9IE5VTEw7CiAgICAgaW50MzJfdCBpLCBuSW5kZXgsIG5SZXQ7CiAgICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWcgPSBOVUxMLCAqcExSU2VnID0gTlVMTDsKLSAgICBib29sIGJVc2VkOworICAgIEZYX0JPT0wgYlVzZWQ7CiAgICAgQ0pCaWcyX0ltYWdlICoqIFNESU5TWU1TID0gTlVMTDsKICAgICBDSkJpZzJfU0REUHJvYyAqcFN5bWJvbERpY3REZWNvZGVyOwogICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCA9IE5VTEwsICpnckNvbnRleHQgPSBOVUxMOwogICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7CiAgICAgSkJJRzJfQUxMT0MocFN5bWJvbERpY3REZWNvZGVyLCBDSkJpZzJfU0REUHJvYygpKTsKICAgICB1aW50OF90ICprZXkgPSBwU2VnbWVudC0+bV9wRGF0YTsKLSAgICBib29sIGNhY2hlX2hpdCA9IGZhbHNlOworICAgIEZYX0JPT0wgY2FjaGVfaGl0ID0gZmFsc2U7CiAgICAgaWYobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApIHsKICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKQEAgLTgyNSwxNiArODI1LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYod0ZsYWdzICYgMHgwMjAwKSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9iQ29udGV4dFJldGFpbmVkID0gdHJ1ZTsKKyAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2JDb250ZXh0UmV0YWluZWQgPSBUUlVFOwogICAgICAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAwKSB7CiAgICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OwogICAgICAgICB9CiAgICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewogICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2dyQ29udGV4dCA9IGdyQ29udGV4dDsKICAgICAgICAgfQotICAgICAgICBiVXNlZCA9IHRydWU7CisgICAgICAgIGJVc2VkID0gVFJVRTsKICAgICB9IGVsc2UgewotICAgICAgICBiVXNlZCA9IGZhbHNlOworICAgICAgICBiVXNlZCA9IEZBTFNFOwogICAgIH0KICAgICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOwogICAgIGlmKFNESU5TWU1TKSB7CkBAIC04NDUsNyArODQ1LDcgQEAKICAgICBkZWxldGUgVGFibGVfQjM7CiAgICAgZGVsZXRlIFRhYmxlX0I0OwogICAgIGRlbGV0ZSBUYWJsZV9CNTsKLSAgICBpZihiVXNlZCA9PSBmYWxzZSkgeworICAgIGlmKGJVc2VkID09IEZBTFNFKSB7CiAgICAgICAgIGlmKGdiQ29udGV4dCkgewogICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKaW5kZXggMDJkNDE5Mi4uZTZhMGQ3YiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKQEAgLTEyMywxMyArMTIzLDEzIEBACiAKICAgICBDSkJpZzJfSW1hZ2UgKm1fcFBhZ2U7CiAKLSAgICBib29sIG1fYkJ1ZlNwZWNpZmllZDsKKyAgICBGWF9CT09MIG1fYkJ1ZlNwZWNpZmllZDsKIAogICAgIGludDMyX3QgbV9uU2VnbWVudERlY29kZWQ7CiAgICAgSUZYX1BhdXNlKgltX3BQYXVzZTsKICAgICBpbnQzMl90CW1fUGF1c2VTdGVwOwogICAgIEZYQ09ERUNfU1RBVFVTIG1fUHJvY2Vzc2l2ZVN0YXR1czsKLSAgICBib29sCW1fYkZpcnN0UGFnZTsKKyAgICBGWF9CT09MCW1fYkZpcnN0UGFnZTsKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICptX3BBcml0aERlY29kZXI7CiAgICAgQ0pCaWcyX0dSRFByb2MgKm1fcEdSRDsKICAgICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKaW5kZXggMWUzMzhhNS4uY2FiY2Q0YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKQEAgLTEwMSw3ICsxMDEsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC0yMTMsNyArMjEzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTMwNSw3ICszMDUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0zNTIsNyArMzUyLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTM5Nyw3ICszOTcsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC01NTUsNyArNTU1LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtNjAwLDcgKzYwMCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC02NDMsNyArNjQzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTcxMCw3ICs3MTAsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtODAxLDcgKzgwMSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTg0NCw3ICs4NDQsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC04ODMsNyArODgzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxOwpAQCAtOTQxLDcgKzk0MSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMTsKQEAgLTEwMTcsNyArMTAxNyw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUID0gMDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIExUUCA9IDA7CkBAIC0xMzQwLDcgKzEzNDAsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQogewotICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CkBAIC0xNDI0LDcgKzE0MjQsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7CkBAIC0xNDU5LDkgKzE0NTksOSBAQAogICAgICAgICB9CiAgICAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCA0IDogMDsKICAgICAgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwotICAgICAgICBib29sIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOwotICAgICAgICBib29sIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOwotICAgICAgICBib29sIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKKyAgICAgICAgRlhfQk9PTCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKKyAgICAgICAgRlhfQk9PTCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKKyAgICAgICAgRlhfQk9PTCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CiAgICAgICAgIGxpbmUxX3IgPSBsaW5lMV9yX29rID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUl0gOiAwOwogICAgICAgICBsaW5lMl9yID0gbGluZTJfcl9vayA/IHBMaW5lUltuT2Zmc2V0XSA6IDA7CiAgICAgICAgIGxpbmUzX3IgPSBsaW5lM19yX29rID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUl0gOiAwOwpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMywgbGluZTQsIGxpbmU1OwpAQCAtMTYzMyw3ICsxNjMzLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCiB7Ci0gICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMV9yLCBsaW5lMl9yLCBsaW5lM19yOwpAQCAtMTY2OCw5ICsxNjY4LDkgQEAKICAgICAgICAgfQogICAgICAgICBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gPDwgMSA6IDA7CiAgICAgICAgIGludDMyX3QgcmVmZXJlbmNlX2ggPSBoIC0gR1JSRUZFUkVOQ0VEWTsKLSAgICAgICAgYm9vbCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKLSAgICAgICAgYm9vbCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKLSAgICAgICAgYm9vbCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CisgICAgICAgIEZYX0JPT0wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7CisgICAgICAgIEZYX0JPT0wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7CisgICAgICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOwogICAgICAgICBsaW5lMV9yID0gbGluZTFfcl9vayA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVJdIDogMDsKICAgICAgICAgbGluZTJfciA9IGxpbmUyX3Jfb2sgPyBwTGluZVJbbk9mZnNldF0gOiAwOwogICAgICAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKQEAgLTE3NTgsOCArMTc1OCw4IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKLSAgICBib29sIFRQR1JQSVgsIFRQR1JWQUw7CisgICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBUUEdSUElYLCBUUEdSVkFMOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBMVFAgPSAwOwpAQCAtMTg4MSwxMiArMTg4MSwxMiBAQAogICAgIENKQmlnMl9JbWFnZSAqSUJJOwogICAgIEZYX0RXT1JEIFdJLCBISTsKICAgICBpbnQzMl90IElEUzsKLSAgICBib29sIFJJOworICAgIEZYX0JPT0wgUkk7CiAgICAgaW50MzJfdCBSRFdJLCBSREhJLCBSRFhJLCBSRFlJOwogICAgIENKQmlnMl9JbWFnZSAqSUJPSTsKICAgICBGWF9EV09SRCBXT0ksIEhPSTsKICAgICBDSkJpZzJfSW1hZ2UgKlNCUkVHOwotICAgIGJvb2wgYkZpcnN0OworICAgIEZYX0JPT0wgYkZpcnN0OwogICAgIEZYX0RXT1JEIG5UbXA7CiAgICAgaW50MzJfdCBuVmFsLCBuQml0czsKICAgICBDSkJpZzJfSHVmZm1hbkRlY29kZXIgKnBIdWZmbWFuRGVjb2RlcjsKQEAgLTE5MTAsNyArMTkxMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgRFQgKj0gU0JTVFJJUFM7CiAgICAgICAgIFNUUklQVCA9IFNUUklQVCArIERUOwotICAgICAgICBiRmlyc3QgPSB0cnVlOworICAgICAgICBiRmlyc3QgPSBUUlVFOwogICAgICAgICBmb3IoOzspIHsKICAgICAgICAgICAgIGlmKGJGaXJzdCkgewogICAgICAgICAgICAgICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkZTLCAmREZTKSAhPSAwKSB7CkBAIC0xOTE5LDcgKzE5MTksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7CiAgICAgICAgICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRTLCAmSURTKTsKICAgICAgICAgICAgICAgICBpZihuVmFsID09IEpCSUcyX09PQikgewpAQCAtMjEwNiw3ICsyMTA2LDcgQEAKICAgICBDSkJpZzJfSW1hZ2UgKklCT0k7CiAgICAgRlhfRFdPUkQgV09JLCBIT0k7CiAgICAgQ0pCaWcyX0ltYWdlICpTQlJFRzsKLSAgICBib29sIGJGaXJzdDsKKyAgICBGWF9CT09MIGJGaXJzdDsKICAgICBpbnQzMl90IG5SZXQsIG5WYWw7CiAgICAgaW50MzJfdCBiUmV0YWluZWQ7CiAgICAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciAqSUFEVCwgKklBRlMsICpJQURTLCAqSUFJVCwgKklBUkksICpJQVJEVywgKklBUkRILCAqSUFSRFgsICpJQVJEWTsKQEAgLTIxMjMsNyArMjEyMyw3IEBACiAgICAgICAgIElBUkRYID0gcElEUy0+SUFSRFg7CiAgICAgICAgIElBUkRZID0gcElEUy0+SUFSRFk7CiAgICAgICAgIElBSUQgPSBwSURTLT5JQUlEOwotICAgICAgICBiUmV0YWluZWQgPSB0cnVlOworICAgICAgICBiUmV0YWluZWQgPSBUUlVFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBRFQsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBRlMsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CkBAIC0yMTM1LDcgKzIxMzUsNyBAQAogICAgICAgICBKQklHMl9BTExPQyhJQVJEWCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKICAgICAgICAgSkJJRzJfQUxMT0MoSUFSRFksIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CiAgICAgICAgIEpCSUcyX0FMTE9DKElBSUQgLCBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcihTQlNZTUNPREVMRU4pKTsKLSAgICAgICAgYlJldGFpbmVkID0gZmFsc2U7CisgICAgICAgIGJSZXRhaW5lZCA9IEZBTFNFOwogICAgIH0KICAgICBKQklHMl9BTExPQyhTQlJFRywgQ0pCaWcyX0ltYWdlKFNCVywgU0JIKSk7CiAgICAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7CkBAIC0yMTU0LDcgKzIxNTQsNyBAQAogICAgICAgICB9CiAgICAgICAgIERUICo9IFNCU1RSSVBTOwogICAgICAgICBTVFJJUFQgPSBTVFJJUFQgKyBEVDsKLSAgICAgICAgYkZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgYkZpcnN0ID0gVFJVRTsKICAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICBpZihiRmlyc3QpIHsKICAgICAgICAgICAgICAgICBpZihJQUZTLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRGUykgPT0gLTEpIHsKQEAgLTIxNjMsNyArMjE2Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKICAgICAgICAgICAgICAgICBDVVJTID0gRklSU1RTOwotICAgICAgICAgICAgICAgIGJGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuUmV0ID0gSUFEUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJRFMpOwogICAgICAgICAgICAgICAgIGlmKG5SZXQgPT0gSkJJRzJfT09CKSB7CkBAIC0yMjk5LDcgKzIyOTksNyBAQAogICAgICAgICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOwogICAgICAgICB9CiAgICAgfQotICAgIGlmKGJSZXRhaW5lZCA9PSBmYWxzZSkgeworICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgewogICAgICAgICBkZWxldGUgSUFEVDsKICAgICAgICAgZGVsZXRlIElBRlM7CiAgICAgICAgIGRlbGV0ZSBJQURTOwpAQCAtMjMxMyw3ICsyMzEzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFNCUkVHOwogZmFpbGVkOgotICAgIGlmKGJSZXRhaW5lZCA9PSBmYWxzZSkgeworICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgewogICAgICAgICBkZWxldGUgSUFEVDsKICAgICAgICAgZGVsZXRlIElBRlM7CiAgICAgICAgIGRlbGV0ZSBJQURTOwpAQCAtMjMzOCw5ICsyMzM4LDkgQEAKICAgICBpbnQzMl90IERXOwogICAgIENKQmlnMl9JbWFnZSAqQlM7CiAgICAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7Ci0gICAgYm9vbCAqRVhGTEFHUzsKKyAgICBGWF9CT09MICpFWEZMQUdTOwogICAgIEZYX0RXT1JEIEVYSU5ERVg7Ci0gICAgYm9vbCBDVVJFWEZMQUc7CisgICAgRlhfQk9PTCBDVVJFWEZMQUc7CiAgICAgRlhfRFdPUkQgRVhSVU5MRU5HVEg7CiAgICAgaW50MzJfdCBuVmFsOwogICAgIEZYX0RXT1JEIG5UbXA7CkBAIC0yNTg1LDcgKzI1ODUsNyBAQAogICAgIH0KICAgICBFWElOREVYID0gMDsKICAgICBDVVJFWEZMQUcgPSAwOwotICAgIEVYRkxBR1MgPSAoYm9vbCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihib29sKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7CisgICAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKICAgICB3aGlsZShFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKICAgICAgICAgaWYoSUFFWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZFWFJVTkxFTkdUSCkgPT0gLTEpIHsKICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKQEAgLTI2NzYsOSArMjY3Niw5IEBACiAgICAgaW50MzJfdCBEVzsKICAgICBDSkJpZzJfSW1hZ2UgKkJTLCAqQkhDOwogICAgIEZYX0RXT1JEIEksIEosIFJFRkFHR05JTlNUOwotICAgIGJvb2wgKkVYRkxBR1M7CisgICAgRlhfQk9PTCAqRVhGTEFHUzsKICAgICBGWF9EV09SRCBFWElOREVYOwotICAgIGJvb2wgQ1VSRVhGTEFHOworICAgIEZYX0JPT0wgQ1VSRVhGTEFHOwogICAgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOwogICAgIGludDMyX3QgblZhbCwgbkJpdHM7CiAgICAgRlhfRFdPUkQgblRtcDsKQEAgLTI5NzYsNyArMjk3Niw3IEBACiAgICAgQ1VSRVhGTEFHID0gMDsKICAgICBKQklHMl9BTExPQyhwVGFibGUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgIEVYRkxBR1MgPSAoYm9vbCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihib29sKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7CisgICAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKICAgICB3aGlsZShFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKICAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUocFRhYmxlLCAoaW50KikmRVhSVU5MRU5HVEgpICE9IDApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwVGFibGU7CkBAIC0zNDc3LDcgKzM0NzcsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMihJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBib29sIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRyA9ICptX3BJbWFnZTsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtMzY1MCw3ICszNjUwLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjEoSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgYm9vbCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUID0gMDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHID0gKCptX3BJbWFnZSk7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKQEAgLTM3OTksNyArMzc5OSw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIGJvb2wgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CiAgICAgdWludDhfdCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwpAQCAtMzg5MSw3ICszODkxLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBib29sIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKICAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewpAQCAtMzk0MCw3ICszOTQwLDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgYm9vbCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKICAgICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CkBAIC00MDMxLDcgKzQwMzEsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIGJvb2wgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwogICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CkBAIC00MDc4LDcgKzQwNzgsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBib29sIFNMVFAsIGJWYWw7CisgICAgRlhfQk9PTCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwogICAgIHVpbnQ4X3QgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKQEAgLTQxNjksNyArNDE2OSw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgYm9vbCBTTFRQLCBiVmFsOworICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKQEAgLTQyMTQsNyArNDIxNCw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIGJvb2wgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMTsKICAgICB1aW50OF90ICpwTGluZTEsIGNWYWw7CkBAIC00MjkwLDcgKzQyOTAsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIGJvb2wgU0xUUCwgYlZhbDsKKyAgICBGWF9CT09MIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CiAgICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaAppbmRleCBmMzQ4ZTk2Li4yYmQyY2VhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oCkBAIC03Niw3ICs3Niw3IEBACiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqbV9wQXJpdGhEZWNvZGVyOwogICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0OwogICAgIEZYX1dPUkQJCW1fRGVjb2RlVHlwZTsKLSAgICBib29sIExUUDsKKyAgICBGWF9CT09MIExUUDsKICAgICBGWF9SRUNUIG1fUmVwbGFjZVJlY3Q7CiBwcml2YXRlOgogCkBAIC0xMTIsMTIgKzExMiwxMiBAQAogCiAgICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CiBwdWJsaWM6Ci0gICAgYm9vbCBNTVI7CisgICAgRlhfQk9PTCBNTVI7CiAgICAgRlhfRFdPUkQgR0JXOwogICAgIEZYX0RXT1JEIEdCSDsKICAgICB1aW50OF90IEdCVEVNUExBVEU7Ci0gICAgYm9vbCBUUEdET047Ci0gICAgYm9vbCBVU0VTS0lQOworICAgIEZYX0JPT0wgVFBHRE9OOworICAgIEZYX0JPT0wgVVNFU0tJUDsKICAgICBDSkJpZzJfSW1hZ2UgKiBTS0lQOwogICAgIHNpZ25lZCBjaGFyIEdCQVRbOF07CiB9OwpAQCAtMTM5LDExICsxMzksMTEgQEAKIHB1YmxpYzoKICAgICBGWF9EV09SRCBHUlc7CiAgICAgRlhfRFdPUkQgR1JIOwotICAgIGJvb2wgR1JURU1QTEFURTsKKyAgICBGWF9CT09MIEdSVEVNUExBVEU7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRkVSRU5DRTsKICAgICBpbnQzMl90IEdSUkVGRVJFTkNFRFg7CiAgICAgaW50MzJfdCBHUlJFRkVSRU5DRURZOwotICAgIGJvb2wgVFBHUk9OOworICAgIEZYX0JPT0wgVFBHUk9OOwogICAgIHNpZ25lZCBjaGFyCUdSQVRbNF07CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTY3LDggKzE2Nyw4IEBACiAgICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlICpwSURTID0gTlVMTCk7CiBwdWJsaWM6Ci0gICAgYm9vbCBTQkhVRkY7Ci0gICAgYm9vbCBTQlJFRklORTsKKyAgICBGWF9CT09MIFNCSFVGRjsKKyAgICBGWF9CT09MIFNCUkVGSU5FOwogICAgIEZYX0RXT1JEIFNCVzsKICAgICBGWF9EV09SRCBTQkg7CiAgICAgRlhfRFdPUkQgU0JOVU1JTlNUQU5DRVM7CkBAIC0xNzksMTAgKzE3OSwxMCBAQAogICAgIHVpbnQ4X3QgU0JTWU1DT0RFTEVOOwogCiAgICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TOwotICAgIGJvb2wgU0JERUZQSVhFTDsKKyAgICBGWF9CT09MIFNCREVGUElYRUw7CiAKICAgICBKQmlnMkNvbXBvc2VPcCBTQkNPTUJPUDsKLSAgICBib29sIFRSQU5TUE9TRUQ7CisgICAgRlhfQk9PTCBUUkFOU1BPU0VEOwogCiAgICAgSkJpZzJDb3JuZXIgUkVGQ09STkVSOwogICAgIHNpZ25lZCBjaGFyIFNCRFNPRkZTRVQ7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUkRZLAogICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJTSVpFOwotICAgIGJvb2wgU0JSVEVNUExBVEU7CisgICAgRlhfQk9PTCBTQlJURU1QTEFURTsKICAgICBzaWduZWQgY2hhciBTQlJBVFs0XTsKIH07CiBjbGFzcyBDSkJpZzJfU0REUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0CkBAIC0yMDUsOCArMjA1LDggQEAKIAogICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgotICAgIGJvb2wgU0RIVUZGOwotICAgIGJvb2wgU0RSRUZBR0c7CisgICAgRlhfQk9PTCBTREhVRkY7CisgICAgRlhfQk9PTCBTRFJFRkFHRzsKICAgICBGWF9EV09SRCBTRE5VTUlOU1lNUzsKICAgICBDSkJpZzJfSW1hZ2UgKiogU0RJTlNZTVM7CiAgICAgRlhfRFdPUkQgU0ROVU1ORVdTWU1TOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAqU0RIVUZGQUdHSU5TVDsKICAgICB1aW50OF90IFNEVEVNUExBVEU7CiAgICAgc2lnbmVkIGNoYXIgU0RBVFs4XTsKLSAgICBib29sIFNEUlRFTVBMQVRFOworICAgIEZYX0JPT0wgU0RSVEVNUExBVEU7CiAgICAgc2lnbmVkIGNoYXIgU0RSQVRbNF07CiB9OwogY2xhc3MgQ0pCaWcyX0hUUkRQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QKQEAgLTIzMCwxMyArMjMwLDEzIEBACiBwdWJsaWM6CiAgICAgRlhfRFdPUkQgSEJXLAogICAgICAgICAgICAgIEhCSDsKLSAgICBib29sIEhNTVI7CisgICAgRlhfQk9PTCBITU1SOwogICAgIHVpbnQ4X3QgSFRFTVBMQVRFOwogICAgIEZYX0RXT1JEIEhOVU1QQVRTOwogICAgIENKQmlnMl9JbWFnZSAqKkhQQVRTOwotICAgIGJvb2wgSERFRlBJWEVMOworICAgIEZYX0JPT0wgSERFRlBJWEVMOwogICAgIEpCaWcyQ29tcG9zZU9wIEhDT01CT1A7Ci0gICAgYm9vbCBIRU5BQkxFU0tJUDsKKyAgICBGWF9CT09MIEhFTkFCTEVTS0lQOwogICAgIEZYX0RXT1JEIEhHVywKICAgICAgICAgICAgICBIR0g7CiAgICAgaW50MzJfdCBIR1gsCkBAIC0yNTQsNyArMjU0LDcgQEAKIAogICAgIENKQmlnMl9QYXR0ZXJuRGljdCAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiBwdWJsaWM6Ci0gICAgYm9vbCBIRE1NUjsKKyAgICBGWF9CT09MIEhETU1SOwogICAgIHVpbnQ4X3QgSERQVywKICAgICAgICAgICAgIEhEUEg7CiAgICAgRlhfRFdPUkQgR1JBWU1BWDsKQEAgLTI2OCw4ICsyNjgsOCBAQAogCiAgICAgRlhfRFdPUkQgKmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgotICAgIGJvb2wgR1NNTVI7Ci0gICAgYm9vbCBHU1VTRVNLSVA7CisgICAgRlhfQk9PTCBHU01NUjsKKyAgICBGWF9CT09MIEdTVVNFU0tJUDsKICAgICB1aW50OF90IEdTQlBQOwogICAgIEZYX0RXT1JEIEdTVywKICAgICAgICAgICAgICBHU0g7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAKaW5kZXggNDkzMmU1Ny4uMDYxNjEyMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6Q0pCaWcyX0h1ZmZtYW5UYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLAotICAgICAgICBib29sIGJIVE9PQikKKyAgICAgICAgRlhfQk9PTCBiSFRPT0IpCiB7CiAgICAgaW5pdCgpOwogICAgIG1fYk9LID0gcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShwVGFibGUsIG5MaW5lcywgYkhUT09CKTsKQEAgLTM4LDE0ICszOCwxNCBAQAogfQogdm9pZCBDSkJpZzJfSHVmZm1hblRhYmxlOjppbml0KCkKIHsKLSAgICBIVE9PQiA9IGZhbHNlOworICAgIEhUT09CID0gRkFMU0U7CiAgICAgTlRFTVAgPSAwOwogICAgIENPREVTID0gTlVMTDsKICAgICBQUkVGTEVOID0gTlVMTDsKICAgICBSQU5HRUxFTiA9IE5VTEw7CiAgICAgUkFOR0VMT1cgPSBOVUxMOwogfQotaW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgYm9vbCBiSFRPT0IpCitpbnQgQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6cGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQikKIHsKICAgICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7CiAgICAgaW50ICpMRU5DT1VOVDsKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIH0KICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwogICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogZmFpbGVkOgotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaAppbmRleCBkNmJjM2QxLi5kNjhjZWQyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKQEAgLTEzLDcgKzEzLDcgQEAKIHsKIHB1YmxpYzoKIAotICAgIENKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgYm9vbCBiSFRPT0IpOworICAgIENKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpOwogCiAgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKTsKIApAQCAtMjEsMjIgKzIxLDIyIEBACiAKICAgICB2b2lkIGluaXQoKTsKIAotICAgIGludCBwYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIGJvb2wgYkhUT09CKTsKKyAgICBpbnQgcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQik7CiAKICAgICBpbnQgcGFyc2VGcm9tQ29kZWRCdWZmZXIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSk7CiAKLSAgICBib29sIGlzT0soKQorICAgIEZYX0JPT0wgaXNPSygpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iT0s7CiAgICAgfQogcHJpdmF0ZToKLSAgICBib29sIEhUT09COworICAgIEZYX0JPT0wgSFRPT0I7CiAgICAgaW50IE5URU1QOwogICAgIGludCAqQ09ERVM7CiAgICAgaW50ICpQUkVGTEVOOwogICAgIGludCAqUkFOR0VMRU47CiAgICAgaW50ICpSQU5HRUxPVzsKLSAgICBib29sIG1fYk9LOworICAgIEZYX0JPT0wgbV9iT0s7CiAgICAgZnJpZW5kIGNsYXNzIENKQmlnMl9IdWZmbWFuRGVjb2RlcjsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oCmluZGV4IGMwOGQyNDUuLjQyOGIyYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaApAQCAtMTEsNyArMTEsNyBAQAogICAgIGludCBSQU5ERUxFTjsKICAgICBpbnQgUkFOR0VMT1c7CiB9IEpCaWcyVGFibGVMaW5lOwotY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEgPSBmYWxzZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjFbXSA9IHsKICAgICB7IDEsCTQsCQkwIH0sCiAgICAgeyAyLAk4LAkgICAxNiB9LApAQCAtMTksNyArMTksNyBAQAogICAgIHsgMCwgICAzMiwJICAgLTEgfSwKICAgICB7IDMsICAgMzIsCTY1ODA4IH0KIH07Ci1jb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMiA9IHRydWU7Citjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMiA9IFRSVUU7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjJbXSA9IHsKICAgICB7IDEsCTAsCQkwIH0sCiAgICAgeyAyLAkwLAkJMSB9LApAQCAtMzAsNyArMzAsNyBAQAogICAgIHsgNiwgICAzMiwgICAgIDc1IH0sCiAgICAgeyA2LAkwLCAgICAgIDAgfQogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gdHJ1ZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gVFJVRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CM1tdID0gewogICAgIHsgOCwJOCwgICAtMjU2IH0sCiAgICAgeyAxLAkwLAkJMCB9LApAQCAtNDIsNyArNDIsNyBAQAogICAgIHsgNywgICAzMiwgICAgIDc1IH0sCiAgICAgeyA2LAkwLAkJMCB9CiB9OwotY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjQgPSBmYWxzZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I0ID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjRbXSA9IHsKICAgICB7IDEsCTAsCQkxIH0sCiAgICAgeyAyLAkwLAkJMiB9LApAQCAtNTIsNyArNTIsNyBAQAogICAgIHsgMCwgICAzMiwgICAgIC0xIH0sCiAgICAgeyA1LCAgIDMyLAkgICA3NiB9LAogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I1ID0gZmFsc2U7Citjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNSA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I1W10gPSB7CiAgICAgeyA3LAk4LAkgLTI1NSB9LAogICAgIHsgMSwJMCwJICAgIDEgfSwKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB7IDcsICAgMzIsICAgLTI1NiB9LAogICAgIHsgNiwgICAzMiwgICAgIDc2IH0KIH07Ci1jb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNiA9IGZhbHNlOworY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjYgPSBGQUxTRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNltdID0gewogICAgIHsgNSwgICAxMCwJLTIwNDggfSwKICAgICB7IDQsICAgIDksCS0xMDI0IH0sCkBAIC04MCw3ICs4MCw3IEBACiAgICAgeyA2LCAgIDMyLAktMjA0OSB9LAogICAgIHsgNiwgICAzMiwJIDIwNDggfQogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I3ID0gZmFsc2U7Citjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNyA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I3W10gPSB7CiAgICAgeyA0LAk5LAktMTAyNCB9LAogICAgIHsgMywJOCwJIC01MTIgfSwKQEAgLTk4LDcgKzk4LDcgQEAKICAgICB7IDUsICAgMzIsCS0xMDI1IH0sCiAgICAgeyA1LCAgIDMyLAkgMjA0OCB9LAogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I4ID0gdHJ1ZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I4ID0gVFJVRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9COFtdID0gewogICAgIHsgOCwJMywJICAtMTUgfSwKICAgICB7IDksCTEsCSAgIC03IH0sCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICB7IDksICAgMzIsCSAxNjcwIH0sCiAgICAgeyAyLAkwLAkJMCB9CiB9OwotY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjkgPSB0cnVlOworY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjkgPSBUUlVFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I5W10gPSB7CiAgICAgeyA4LAk0LAkgIC0zMSB9LAogICAgIHsgOSwJMiwJICAtMTUgfSwKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIHsgOSwgICAzMiwJIDMzMzkgfSwKICAgICB7IDIsCTAsCQkwIH0KIH07Ci1jb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSB0cnVlOworY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjEwID0gVFJVRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTBbXSA9IHsKICAgICB7IDcsCTQsCSAgLTIxIH0sCiAgICAgeyA4LAkwLAkgICAtNSB9LApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgeyA4LCAgIDMyLAkgNDE2NiB9LAogICAgIHsgMiwJMCwJCTAgfQogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxMSA9IGZhbHNlOworY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjExID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjExW10gPSB7CiAgICAgeyAxLAkwLAkJMSB9LAogICAgIHsgMiwJMSwJCTIgfSwKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIHsgMCwgICAzMiwJCTAgfSwKICAgICB7IDcsICAgMzIsCSAgMTQxIH0KIH07Ci1jb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTIgPSBmYWxzZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMiA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMltdID0gewogICAgIHsgMSwJMCwJCTEgfSwKICAgICB7IDIsCTAsCQkyIH0sCkBAIC0yMDUsNyArMjA1LDcgQEAKICAgICB7IDAsICAgMzIsCQkwIH0sCiAgICAgeyA4LCAgIDMyLAkgICA3MyB9CiB9OwotY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEzID0gZmFsc2U7Citjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBGQUxTRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTNbXSA9IHsKICAgICB7IDEsCTAsCQkxIH0sCiAgICAgeyAzLAkwLAkJMiB9LApAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgeyAwLCAgIDMyLAkJMCB9LAogICAgIHsgNywgICAzMiwJICAxNDEgfQogfTsKLWNvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxNCA9IGZhbHNlOworY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0ID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE0W10gPSB7CiAgICAgeyAzLAkwLAkgICAtMiB9LAogICAgIHsgMywJMCwJICAgLTEgfSwKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgIHsgMCwgICAzMiwJICAgLTMgfSwKICAgICB7IDAsICAgMzIsCQkzIH0KIH07Ci1jb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUgPSBmYWxzZTsKK2NvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxNSA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxNVtdID0gewogICAgIHsgNywJNCwJICAtMjQgfSwKICAgICB7IDYsCTIsCSAgIC04IH0sCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCmluZGV4IDAzMGIwYzIuLjllZjQ0NjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAgICAgbV9uSGVpZ2h0CT0gaDsKICAgICBpZiAobV9uV2lkdGggPD0gMCB8fCBtX25IZWlnaHQgPD0gMCB8fCBtX25XaWR0aCA+IElOVF9NQVggLSAzMSkgewogICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgbV9iTmVlZEZyZWUgPSBmYWxzZTsKKyAgICAgICAgbV9iTmVlZEZyZWUgPSBGQUxTRTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX25TdHJpZGUgID0gKCh3ICsgMzEpID4+IDUpIDw8IDI7CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgfQotICAgIG1fYk5lZWRGcmVlID0gdHJ1ZTsKKyAgICBtX2JOZWVkRnJlZSA9IFRSVUU7CiB9CiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBzdHJpZGUsIHVpbnQ4X3QqcEJ1ZikKIHsKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBtX25IZWlnaHQgPSBoOwogICAgIG1fblN0cmlkZSA9IHN0cmlkZTsKICAgICBtX3BEYXRhID0gcEJ1ZjsKLSAgICBtX2JOZWVkRnJlZSA9IGZhbHNlOworICAgIG1fYk5lZWRGcmVlID0gRkFMU0U7CiB9CiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShDSkJpZzJfSW1hZ2UgJmltKQogewpAQCAtNDcsNyArNDcsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcERhdGEgPSBOVUxMOwogICAgIH0KLSAgICBtX2JOZWVkRnJlZSA9IHRydWU7CisgICAgbV9iTmVlZEZyZWUgPSBUUlVFOwogfQogQ0pCaWcyX0ltYWdlOjp+Q0pCaWcyX0ltYWdlKCkKIHsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcERhdGEpOwogICAgIH0KIH0KLWJvb2wgQ0pCaWcyX0ltYWdlOjpnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkKK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgcmV0dXJuICgobV9wRGF0YVttXSA+PiAoNyAtIG4pKSAmIDEpOwogfQogCi1pbnQzMl90IENKQmlnMl9JbWFnZTo6c2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIGJvb2wgdikKK2ludDMyX3QgQ0pCaWcyX0ltYWdlOjpzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCB2KQogewogICAgIGlmICghbV9wRGF0YSkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTEwNCwzMSArMTA0LDMxIEBACiAgICAgICAgIEpCSUcyX21lbWNweShtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCBtX3BEYXRhICsgaEZyb20gKiBtX25TdHJpZGUsIG1fblN0cmlkZSk7CiAgICAgfQogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoYm9vbCB2KQordm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoRlhfQk9PTCB2KQogewogICAgIGlmICghbV9wRGF0YSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEpCSUcyX21lbXNldChtX3BEYXRhLCB2ID8gMHhmZiA6IDAsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7CiB9Ci1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCk7CiB9Ci1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcFNyY1JlY3QgfHwgKnBTcmNSZWN0ID09IEZYX1JFQ1QoMCwgMCwgbV9uV2lkdGgsIG1fbkhlaWdodCkpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wKTsKICAgICB9CiAgICAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wLCBwU3JjUmVjdCk7CiB9Ci1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKIHsKICAgICBpbnQzMl90IHcsIGgsIGR4LCBkeTsKICAgICBpbnQzMl90IGksIGo7CkBAIC0xOTIsMTcgKzE5MiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGludDMyX3QgeDAsIHgxLCB5MCwgeTEsIHh4LCB5eTsKICAgICB1aW50OF90ICpwTGluZVNyYywgKnBMaW5lRHN0LCAqc3JjUHRyLCAqZGVzdFB0cjsKICAgICBGWF9EV09SRCBzcmMwLCBzcmMxLCBzcmMsIGRlc3QsIHMxLCBzMiwgbTEsIG0yLCBtMzsKLSAgICBib29sIG9uZUJ5dGU7CisgICAgRlhfQk9PTCBvbmVCeXRlOwogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHkgPCAwKSB7CiAgICAgICAgIHkwID0gLXk7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgICAgeTEgPSBtX25IZWlnaHQ7CiAgICAgfQogICAgIGlmICh5MCA+PSB5MSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHggPj0gMCkgewogICAgICAgICB4MCA9IHggJiB+NzsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICB4MSA9IHBEc3QtPm1fbldpZHRoOwogICAgIH0KICAgICBpZiAoeDAgPj0geDEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHMxID0geCAmIDc7CiAgICAgczIgPSA4IC0gczE7CkBAIC02NzksMTkgKzY3OSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCk7CiB9Ci1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKIHsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBwU3JjLT5jb21wb3NlVG8odGhpcywgeCwgeSwgb3AsIHBTcmNSZWN0KTsKIH0KQEAgLTc2NSw3ICs3NjUsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEltYWdlOwogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChpbnQzMl90IGgsIGJvb2wgdikKK3ZvaWQgQ0pCaWcyX0ltYWdlOjpleHBhbmQoaW50MzJfdCBoLCBGWF9CT09MIHYpCiB7CiAgICAgaWYgKCFtX3BEYXRhIHx8IGggPD0gbV9uSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybjsKQEAgLTc4OCw3ICs3ODgsNyBAQAogICAgIEpCSUcyX21lbXNldChtX3BEYXRhICsgZHdIZWlnaHQgKiBkd1N0cmlkZSwgdiA/IDB4ZmYgOiAwLCAoZHdIIC0gZHdIZWlnaHQpICogZHdTdHJpZGUpOwogICAgIG1fbkhlaWdodCA9IGg7CiB9Ci1ib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCitGWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCiB7CiAgICAgaW50MzJfdCB4czAgPSAwLCB5czAgID0gMCwgeHMxICA9IDAsIHlzMSAgID0gMCwgeGQwICAgID0gMCwgeWQwICAgICAgICAgID0gMCwgeGQxICAgICAgPSAwLCAKICAgICAgICAgICAgICB5ZDEgPSAwLCB4eCAgID0gMCwgeXkgICA9IDAsIHcgICAgID0gMCwgaCAgICAgID0gMCwgbWlkZGxlRHdvcmRzID0gMCwgbGluZUxlZnQgPSAwOwpAQCAtNzk5LDEwICs3OTksMTAgQEAKICAgICB1aW50OF90ICpsaW5lU3JjID0gTlVMTCwgKmxpbmVEc3QgPSBOVUxMLCAqc3AgPSBOVUxMLCAqZHAgPSBOVUxMOwogCiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoeCA8IC0xMDQ4NTc2IHx8IHggPiAxMDQ4NTc2IHx8IHkgPCAtMTA0ODU3NiB8fCB5ID4gMTA0ODU3NikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYoeSA8IDApIHsKICAgICAgICAgeXMwID0gLXk7CkBAIC0xMjA1LDE3ICsxMjA1LDE3IEBACiAgICAgfQogICAgIHJldHVybiAxOwogfQotYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCiB7CiAgICAgaW50MzJfdCB4czAsIHlzMCwgeHMxLCB5czEsIHhkMCwgeWQwLCB4ZDEsIHlkMSwgeHgsIHl5LCB3LCBoLCBtaWRkbGVEd29yZHMsIGxpbmVMZWZ0OwogICAgIEZYX0RXT1JEIHMxLCBkMSwgZDIsIHNoaWZ0LCBzaGlmdDEsIHNoaWZ0MiwgdG1wLCB0bXAxLCB0bXAyLCBtYXNrTCwgbWFza1IsIG1hc2tNOwogICAgIHVpbnQ4X3QgKmxpbmVTcmMsICpsaW5lRHN0LCAqc3AsICpkcDsKICAgICBpbnQzMl90IHN3LCBzaDsKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBzdyA9IHBTcmNSZWN0LT5XaWR0aCgpOwogICAgIHNoID0gcFNyY1JlY3QtPkhlaWdodCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCmluZGV4IGQ1MWQ5OTkuLjQyM2JlYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgKQEAgLTI4LDMxICsyOCwzMSBAQAogCiAgICAgfkNKQmlnMl9JbWFnZSgpOwogCi0gICAgYm9vbCBnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSk7CisgICAgRlhfQk9PTCBnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSk7CiAKLSAgICBpbnQzMl90IHNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBib29sIHYpOworICAgIGludDMyX3Qgc2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgdik7CiAKICAgICB2b2lkIGNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKTsKIAotICAgIHZvaWQgZmlsbChib29sIHYpOworICAgIHZvaWQgZmlsbChGWF9CT09MIHYpOwogCi0gICAgYm9vbCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIGJvb2wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CisgICAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIEZYX0JPT0wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CiAKLSAgICBib29sIGNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CisgICAgRlhfQk9PTCBjb21wb3NlVG9fdW5vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwogCi0gICAgYm9vbCBjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgICBGWF9CT09MIGNvbXBvc2VUb19vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwogCi0gICAgYm9vbCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7Ci0gICAgYm9vbCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOworICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKIAotICAgIGJvb2wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIGJvb2wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKKyAgICBGWF9CT09MIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgICBGWF9CT09MIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CiAgICAgQ0pCaWcyX0ltYWdlICpzdWJJbWFnZV91bm9wdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpOwogCiAgICAgQ0pCaWcyX0ltYWdlICpzdWJJbWFnZShpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpOwogCi0gICAgdm9pZCBleHBhbmQoaW50MzJfdCBoLCBib29sIHYpOworICAgIHZvaWQgZXhwYW5kKGludDMyX3QgaCwgRlhfQk9PTCB2KTsKIHB1YmxpYzoKIAogICAgIGludDMyX3QgbV9uV2lkdGg7CkBAIC02Myw2ICs2Myw2IEBACiAKICAgICB1aW50OF90ICptX3BEYXRhOwogCi0gICAgYm9vbCBtX2JOZWVkRnJlZTsKKyAgICBGWF9CT09MIG1fYk5lZWRGcmVlOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAppbmRleCBiNGUxNTlmLi5iMDdlYmE4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaApAQCAtMTMsNyArMTMsNyBAQAogICAgIEZYX0RXT1JEIG1fZHdSZXNvbHV0aW9uWCwKICAgICAgICAgICAgICBtX2R3UmVzb2x1dGlvblk7CiAgICAgdWludDhfdCBtX2NGbGFnczsKLSAgICBib29sIG1fYklzU3RyaXBlZDsKKyAgICBGWF9CT09MIG1fYklzU3RyaXBlZDsKICAgICBGWF9XT1JEIG1fd01heFN0cmlwZVNpemU7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcAppbmRleCBjMTBkNDYxLi4wZTViOTJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAKQEAgLTksNyArOSw3IEBACiB7CiAgICAgU0ROVU1FWFNZTVMgPSAwOwogICAgIFNERVhTWU1TID0gTlVMTDsKLSAgICBtX2JDb250ZXh0UmV0YWluZWQgPSBmYWxzZTsKKyAgICBtX2JDb250ZXh0UmV0YWluZWQgPSBGQUxTRTsKICAgICBtX2diQ29udGV4dCA9IG1fZ3JDb250ZXh0ID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAppbmRleCA1Zjk0ZGM3Li45MTU2ZTMwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaApAQCAtMTksNyArMTksNyBAQAogcHVibGljOgogICAgIEZYX0RXT1JEIFNETlVNRVhTWU1TOwogICAgIENKQmlnMl9JbWFnZSAqKlNERVhTWU1TOwotICAgIGJvb2wgbV9iQ29udGV4dFJldGFpbmVkOworICAgIEZYX0JPT0wgbV9iQ29udGV4dFJldGFpbmVkOwogICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0LAogICAgICAgICAgICAgICAgICAgKm1fZ3JDb250ZXh0OwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2V4dGVuc2lvbi5oIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKaW5kZXggMmQ3ZjNhZS4uYmE0MjkxNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKQEAgLTE0LDggKzE0LDggQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JRlhDUlRfRmlsZUFjY2VzcygpIHt9Ci0gICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0ID0gMDsKQEAgLTI1LDE0ICsyNSwxNCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgPSAwOwogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgPSAwOwotICAgIHZpcnR1YWwgYm9vbAkJRmx1c2goKSA9IDA7Ci0gICAgdmlydHVhbCBib29sCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7CiB9OwogSUZYQ1JUX0ZpbGVBY2Nlc3MqCUZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7CiBjbGFzcyBDRlhfQ1JURmlsZVN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQogewogcHVibGljOgotICAgIENGWF9DUlRGaWxlU3RyZWFtKElGWENSVF9GaWxlQWNjZXNzKiBwRkEpIDogbV9wRmlsZShwRkEpLCBtX2R3Q291bnQoMSksIG1fYlVzZVJhbmdlKGZhbHNlKSwgbV9uT2Zmc2V0KDApLCBtX25TaXplKDApIHt9CisgICAgQ0ZYX0NSVEZpbGVTdHJlYW0oSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSkgOiBtX3BGaWxlKHBGQSksIG1fZHdDb3VudCgxKSwgbV9iVXNlUmFuZ2UoRkFMU0UpLCBtX25PZmZzZXQoMCksIG1fblNpemUoMCkge30KICAgICB+Q0ZYX0NSVEZpbGVTdHJlYW0oKQogICAgIHsKICAgICAgICAgaWYgKG1fcEZpbGUpIHsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IG1fblNpemUgOiBtX3BGaWxlLT5HZXRTaXplKCk7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCQlJc0VPRigpIG92ZXJyaWRlCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBHZXRQb3NpdGlvbigpID49IEdldFNpemUoKTsKICAgICB9CkBAIC02Nyw0MiArNjcsNDIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcG9zOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSBvdmVycmlkZQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBwb3MgPSBzaXplOwogICAgICAgICBwb3MgKz0gb2Zmc2V0OwogCiAgICAgICAgIGlmICghcG9zLklzVmFsaWQoKSB8fCBwb3MuVmFsdWVPckRpZSgpID4gbV9wRmlsZS0+R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIAogICAgICAgICBtX25PZmZzZXQgPSBvZmZzZXQsIG1fblNpemUgPSBzaXplOwotICAgICAgICBtX2JVc2VSYW5nZSA9IHRydWU7CisgICAgICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKICAgICAgICAgbV9wRmlsZS0+U2V0UG9zaXRpb24obV9uT2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xlYXJSYW5nZSgpIG92ZXJyaWRlCiAgICAgewotICAgICAgICBtX2JVc2VSYW5nZSA9IGZhbHNlOworICAgICAgICBtX2JVc2VSYW5nZSA9IEZBTFNFOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmIChtX2JVc2VSYW5nZSAmJiBvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBwb3MgPSBvZmZzZXQ7CiAKICAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7CiAgICAgICAgICAgICBwb3MgKz0gbV9uT2Zmc2V0OwogICAgICAgICAgICAgaWYgKCFwb3MuSXNWYWxpZCgpIHx8IHBvcy5WYWx1ZU9yRGllKCkgPiAoc2l6ZV90KUdldFNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChib29sKW1fcEZpbGUtPlJlYWRQb3MoYnVmZmVyLCBzaXplLCBwb3MuVmFsdWVPckRpZSgpKTsKKyAgICAgICAgcmV0dXJuIChGWF9CT09MKW1fcEZpbGUtPlJlYWRQb3MoYnVmZmVyLCBzaXplLCBwb3MuVmFsdWVPckRpZSgpKTsKICAgICB9CiAgICAgdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlCiAgICAgewpAQCAtMTE0LDIwICsxMTQsMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbV9wRmlsZS0+UmVhZChidWZmZXIsIHNpemUpOwogICAgIH0KLSAgICB2aXJ0dWFsCWJvb2wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlCisgICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7CiAgICAgICAgICAgICBvZmZzZXQgKz0gbV9uT2Zmc2V0OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoYm9vbCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCQlGbHVzaCgpICBvdmVycmlkZQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGbHVzaCgpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcEZpbGUtPkZsdXNoKCk7CiAgICAgfQogICAgIElGWENSVF9GaWxlQWNjZXNzKgltX3BGaWxlOwogICAgIEZYX0RXT1JECQkJbV9kd0NvdW50OwotICAgIGJvb2wJCQkJbV9iVXNlUmFuZ2U7CisgICAgRlhfQk9PTAkJCQltX2JVc2VSYW5nZTsKICAgICBGWF9GSUxFU0laRQkJCW1fbk9mZnNldDsKICAgICBGWF9GSUxFU0laRQkJCW1fblNpemU7CiB9OwpAQCAtMTM3LDIzICsxMzcsMjMgQEAKIGNsYXNzIENGWF9NZW1vcnlTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbQogewogcHVibGljOgotICAgIENGWF9NZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpCisgICAgQ0ZYX01lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkKICAgICAgICAgOiBtX2R3Q291bnQoMSkKICAgICAgICAgLCBtX25Ub3RhbFNpemUoMCkKICAgICAgICAgLCBtX25DdXJTaXplKDApCiAgICAgICAgICwgbV9uQ3VyUG9zKDApCiAgICAgICAgICwgbV9uR3Jvd1NpemUoRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSkKLSAgICAgICAgLCBtX2JVc2VSYW5nZShmYWxzZSkKKyAgICAgICAgLCBtX2JVc2VSYW5nZShGQUxTRSkKICAgICB7CiAgICAgICAgIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9UYWtlT3ZlciB8IChiQ29uc2VjdXRpdmUgPyBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgOiAwKTsKICAgICB9Ci0gICAgQ0ZYX01lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyKQorICAgIENGWF9NZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlcikKICAgICAgICAgOiBtX2R3Q291bnQoMSkKICAgICAgICAgLCBtX25Ub3RhbFNpemUoblNpemUpCiAgICAgICAgICwgbV9uQ3VyU2l6ZShuU2l6ZSkKICAgICAgICAgLCBtX25DdXJQb3MoMCkKICAgICAgICAgLCBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKQotICAgICAgICAsIG1fYlVzZVJhbmdlKGZhbHNlKQorICAgICAgICAsIG1fYlVzZVJhbmdlKEZBTFNFKQogICAgIHsKICAgICAgICAgbV9CbG9ja3MuQWRkKHBCdWZmZXIpOwogICAgICAgICBtX2R3RmxhZ3MgPSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgfCAoYlRha2VPdmVyID8gRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDogMCk7CkBAIC0xODQsNyArMTg0LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IChGWF9GSUxFU0laRSkgbV9uU2l6ZSA6IChGWF9GSUxFU0laRSltX25DdXJTaXplOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQkJSXNFT0YoKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBtX25DdXJQb3MgPj0gKHNpemVfdClHZXRTaXplKCk7CiAgICAgfQpAQCAtMTk2LDMwICsxOTYsMzAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcG9zOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IHNpemUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSByYW5nZSA9IHNpemU7CiAgICAgICAgIHJhbmdlICs9IG9mZnNldDsKICAgICAgICAgaWYgKCFyYW5nZS5Jc1ZhbGlkKCkgfHwgcmFuZ2UuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKICAgICAgICAgbV9uT2Zmc2V0ID0gKHNpemVfdClvZmZzZXQsIG1fblNpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gdHJ1ZTsKKyAgICAgICAgbV9iVXNlUmFuZ2UgPSBUUlVFOwogICAgICAgICBtX25DdXJQb3MgPSBtX25PZmZzZXQ7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyUmFuZ2UoKSAgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gZmFsc2U7CisgICAgICAgIG1fYlVzZVJhbmdlID0gRkFMU0U7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBzYWZlT2Zmc2V0ID0gb2Zmc2V0OwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXNhZmVPZmZzZXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIAogICAgICAgICBvZmZzZXQgPSBzYWZlT2Zmc2V0LlZhbHVlT3JEaWUoKTsKQEAgLTIzNiwxMyArMjM2LDEzIEBACiAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CiAgICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRlZmF1bHQoMCkgPT0gMCB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKICAgICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKICAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgewogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgKHVpbnQ4X3QqKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwogICAgICAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICAgICAgblN0YXJ0QmxvY2sgKys7CiAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpICBvdmVycmlkZQogICAgIHsKQEAgLTI3NiwxMCArMjc2LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5SZWFkOwogICAgIH0KLSAgICB2aXJ0dWFsCWJvb2wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpICBvdmVycmlkZQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX2JVc2VSYW5nZSkgewogICAgICAgICAgICAgb2Zmc2V0ICs9IChGWF9GSUxFU0laRSltX25PZmZzZXQ7CkBAIC0yODgsNyArMjg4LDcgQEAKICAgICAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CiAgICAgICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwogICAgICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CiAgICAgICAgICAgICBpZiAobV9uQ3VyUG9zID4gbV9uVG90YWxTaXplKSB7CkBAIC0zMDEsMjQgKzMwMSwyNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIW1fQmxvY2tzWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWFNZU19tZW1jcHkoKHVpbnQ4X3QqKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgICAgICBpZiAobV9uQ3VyU2l6ZSA8IG1fbkN1clBvcykgewogICAgICAgICAgICAgICAgIG1fbkN1clNpemUgPSBtX25DdXJQb3M7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAKICAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIUV4cGFuZEJsb2NrcyhuZXdQb3MuVmFsdWVPckRpZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CiAgICAgICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7CkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogICAgICAgICAgICAgblN0YXJ0QmxvY2sgKys7CiAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sCQkJCUZsdXNoKCkgIG92ZXJyaWRlCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCkgIG92ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgIG92ZXJyaWRlCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzQ29uc2VjdXRpdmUoKSBjb25zdCAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIHJldHVybiBtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmU7CiAgICAgfQpAQCAtMzYwLDcgKzM2MCw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbV9CbG9ja3MuR2V0U2l6ZSgpID8gKHVpbnQ4X3QqKW1fQmxvY2tzWzBdIDogTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpICBvdmVycmlkZQorICAgIHZpcnR1YWwgdm9pZAkJCQlBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmICghKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM5MCwxNiArMzkwLDE2IEBACiAgICAgc2l6ZV90CQkJbV9uQ3VyUG9zOwogICAgIHNpemVfdAkJCW1fbkdyb3dTaXplOwogICAgIEZYX0RXT1JECQltX2R3RmxhZ3M7Ci0gICAgYm9vbAkJCW1fYlVzZVJhbmdlOworICAgIEZYX0JPT0wJCQltX2JVc2VSYW5nZTsKICAgICBzaXplX3QJCQltX25PZmZzZXQ7CiAgICAgc2l6ZV90CQkJbV9uU2l6ZTsKLSAgICBib29sCUV4cGFuZEJsb2NrcyhzaXplX3Qgc2l6ZSkKKyAgICBGWF9CT09MCUV4cGFuZEJsb2NrcyhzaXplX3Qgc2l6ZSkKICAgICB7CiAgICAgICAgIGlmIChtX25DdXJTaXplIDwgc2l6ZSkgewogICAgICAgICAgICAgbV9uQ3VyU2l6ZSA9IHNpemU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOwogICAgICAgICBzaXplID0gKHNpemUgLSBtX25Ub3RhbFNpemUgKyBtX25Hcm93U2l6ZSAtIDEpIC8gbV9uR3Jvd1NpemU7CkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgICAgIG1fQmxvY2tzLlNldEF0KGlDb3VudCArKywgcEJsb2NrKTsKICAgICAgICAgICAgIG1fblRvdGFsU2l6ZSArPSBtX25Hcm93U2l6ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogfTsKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtNDI0LDE1ICs0MjQsMTUgQEAKICAgICBfRlhfTVRSQU5ET01DT05URVhUKCkKICAgICB7CiAgICAgICAgIG10aSA9IE1UX04gKyAxOwotICAgICAgICBiSGF2ZVNlZWQgPSBmYWxzZTsKKyAgICAgICAgYkhhdmVTZWVkID0gRkFMU0U7CiAgICAgfQogICAgIEZYX0RXT1JEIG10aTsKLSAgICBib29sCSBiSGF2ZVNlZWQ7CisgICAgRlhfQk9PTAkgYkhhdmVTZWVkOwogICAgIEZYX0RXT1JEIG10W01UX05dOwogfSBGWF9NVFJBTkRPTUNPTlRFWFQsICogRlhfTFBNVFJBTkRPTUNPTlRFWFQ7CiB0eXBlZGVmIEZYX01UUkFORE9NQ09OVEVYVCBjb25zdCAqIEZYX0xQQ01UUkFORE9NQ09OVEVYVDsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1ib29sIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CitGWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CiAjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKaW5kZXggNDk3YzFiYS4uM2NiMmZkMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmV0dXJuIG5ldyBDRlhfQmlkaUNoYXI7CiB9CiBDRlhfQmlkaUNoYXI6OkNGWF9CaWRpQ2hhcigpCi0gICAgOiBtX2JTZXBhcmF0ZU5ldXRyYWwodHJ1ZSkKKyAgICA6IG1fYlNlcGFyYXRlTmV1dHJhbChUUlVFKQogICAgICwgbV9pQ3VyU3RhcnQoMCkKICAgICAsIG1faUN1ckNvdW50KDApCiAgICAgLCBtX2lDdXJCaWRpKDApCkBAIC0yMiwxMiArMjIsMTIgQEAKICAgICAsIG1faUxhc3RDb3VudCgwKQogewogfQotdm9pZCBDRlhfQmlkaUNoYXI6OlNldFBvbGljeShib29sIGJTZXBhcmF0ZU5ldXRyYWwpCit2b2lkIENGWF9CaWRpQ2hhcjo6U2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCkKIHsKICAgICBtX2JTZXBhcmF0ZU5ldXRyYWwgPSBiU2VwYXJhdGVOZXV0cmFsOwogfQogCi1ib29sIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpCitGWF9CT09MIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpCiB7CiAgICAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKICAgICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKQEAgLTQzLDEwICs0MywxMCBAQAogICAgICAgICAgICAgaUNvbnRleHQgPSAyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGJvb2wgYlJldCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwogICAgIGlmIChpQ29udGV4dCAhPSBtX2lDdXJCaWRpKSB7CiAgICAgICAgIGlmIChtX2JTZXBhcmF0ZU5ldXRyYWwpIHsKLSAgICAgICAgICAgIGJSZXQgPSB0cnVlOworICAgICAgICAgICAgYlJldCA9IFRSVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobV9pQ3VyQmlkaSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgYlJldCA9IChtX2lDdXJDb3VudCA+IDApOwpAQCAtNjcsNyArNjcsNyBAQAogICAgIG1faUN1ckNvdW50ICsrOwogICAgIHJldHVybiBiUmV0OwogfQotYm9vbCBDRlhfQmlkaUNoYXI6OkVuZENoYXIoKQorRlhfQk9PTCBDRlhfQmlkaUNoYXI6OkVuZENoYXIoKQogewogICAgIG1faUxhc3RCaWRpID0gbV9pQ3VyQmlkaTsKICAgICBtX2lMYXN0U3RhcnQgPSBtX2lDdXJTdGFydDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5oIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKaW5kZXggMTBhMTZhZi4uZTRjMWRkYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKQEAgLTE1LDE0ICsxNSwxNCBAQAogICAgIENGWF9CaWRpQ2hhcigpOwogICAgIH5DRlhfQmlkaUNoYXIoKSBvdmVycmlkZSB7fQogCi0gICAgdm9pZCBTZXRQb2xpY3koYm9vbCBiU2VwYXJhdGVOZXV0cmFsID0gdHJ1ZSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbmRDaGFyKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTZXRQb2xpY3koRlhfQk9PTCBiU2VwYXJhdGVOZXV0cmFsID0gVFJVRSkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTCBFbmRDaGFyKCkgb3ZlcnJpZGU7CiAgICAgaW50MzJfdCBHZXRCaWRpSW5mbyhpbnQzMl90ICZpU3RhcnQsIGludDMyX3QgJmlDb3VudCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIGJvb2wJbV9iU2VwYXJhdGVOZXV0cmFsOworICAgIEZYX0JPT0wJbV9iU2VwYXJhdGVOZXV0cmFsOwogICAgIGludDMyX3QJbV9pQ3VyU3RhcnQ7CiAgICAgaW50MzJfdAltX2lDdXJDb3VudDsKICAgICBpbnQzMl90CW1faUN1ckJpZGk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAKaW5kZXggZjEzOTM2NS4uNGFiMzRiYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcApAQCAtMjIsNyArMjIsNyBAQAogewogICAgIEZYX0ZyZWUobV9wRGF0YSk7CiB9Ci1ib29sIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKGludCBuTmV3U2l6ZSkKK0ZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUoaW50IG5OZXdTaXplKQogewogICAgIGlmIChuTmV3U2l6ZSA8PSAwKSB7CiAgICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7CkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKICAgICAgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpKSB7CiAgICAgICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOwogICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IG5OZXdTaXplOwpAQCAtNTAsMzggKzUwLDM4IEBACiAgICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB0b3RhbFNpemUgPSBuTmV3TWF4OwogICAgICAgICB0b3RhbFNpemUgKj0gbV9uVW5pdFNpemU7CiAgICAgICAgIGlmICghdG90YWxTaXplLklzVmFsaWQoKSB8fCBuTmV3TWF4IDwgbV9uU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHVpbnQ4X3QqIHBOZXdEYXRhID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BEYXRhLCB0b3RhbFNpemUuVmFsdWVPckRpZSgpKTsKICAgICAgICAgaWYgKHBOZXdEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWFNZU19tZW1zZXQocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7CiAgICAgICAgIG1fcERhdGEgPSBwTmV3RGF0YTsKICAgICAgICAgbV9uU2l6ZSA9IG5OZXdTaXplOwogICAgICAgICBtX25NYXhTaXplID0gbk5ld01heDsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9CYXNpY0FycmF5OjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYykKK0ZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQogewogICAgIGludCBuT2xkU2l6ZSA9IG1fblNpemU7CiAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IG5ld1NpemUgPSBtX25TaXplOwogICAgIG5ld1NpemUgKz0gc3JjLm1fblNpemU7CiAgICAgaWYgKG1fblVuaXRTaXplICE9IHNyYy5tX25Vbml0U2l6ZSB8fCAhbmV3U2l6ZS5Jc1ZhbGlkKCkgfHwgIVNldFNpemUobmV3U2l6ZS5WYWx1ZU9yRGllKCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgbk9sZFNpemUgKiBtX25Vbml0U2l6ZSwgc3JjLm1fcERhdGEsIHNyYy5tX25TaXplICogbV9uVW5pdFNpemUpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQmFzaWNBcnJheTo6Q29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQorRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6Q29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQogewogICAgIGlmICghU2V0U2l6ZShzcmMubV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYU1lTX21lbWNweShtX3BEYXRhLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB1aW50OF90KiBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0U3BhY2VBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQogewpAQCAtMTAzLDMxICsxMDMsMzEgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZTsKIH0KLWJvb2wgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCitGWF9CT09MIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQogewogICAgIGlmIChuSW5kZXggPCAwIHx8IG5Db3VudCA8PSAwIHx8IG1fblNpemUgPCBuSW5kZXggKyBuQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBuTW92ZUNvdW50ID0gbV9uU2l6ZSAtIChuSW5kZXggKyBuQ291bnQpOwogICAgIGlmIChuTW92ZUNvdW50KSB7CiAgICAgICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwgbk1vdmVDb3VudCAqIG1fblVuaXRTaXplKTsKICAgICB9CiAgICAgbV9uU2l6ZSAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCitGWF9CT09MIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCiB7CiAgICAgaWYgKHBOZXdBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocE5ld0FycmF5LT5tX25TaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoIUluc2VydFNwYWNlQXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheS0+bV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgblN0YXJ0SW5kZXggKiBtX25Vbml0U2l6ZSwgcE5ld0FycmF5LT5tX3BEYXRhLCBwTmV3QXJyYXktPm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBjb25zdCB2b2lkKiBDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbnQgaW5kZXgpIGNvbnN0CiB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBTcG90OwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZVNlZ21lbnQoY29uc3QgdWludDhfdCogcFNlZ21lbnQsIGludCBjb3VudCwgYm9vbCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0CiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICBpZiAoIWNhbGxiYWNrKHBhcmFtLCAodm9pZCopKHBTZWdtZW50ICsgaSAqIG1fVW5pdFNpemUpKSkgewpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZUluZGV4KGludCBsZXZlbCwgaW50JiBzdGFydCwgdm9pZCoqIHBJbmRleCwgYm9vbCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0CiB7CiAgICAgaWYgKGxldmVsID09IDApIHsKICAgICAgICAgaW50IGNvdW50ID0gbV9EYXRhU2l6ZSAtIHN0YXJ0OwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotdm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZShib29sICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAogewogICAgIGlmIChtX3BJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcAppbmRleCA0N2MxYzViLi41ZWViMzNiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcApAQCAtMTA4Niw5ICsxMDg2LDkgQEAKICAgICBpZiAoZCA9PSAwLjBmKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICAgaWYgKGQgPCAwKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CisgICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7CiAgICAgICAgIGQgPSAtZDsKICAgICB9CiAgICAgaW50IHNjYWxlID0gMTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwCmluZGV4IGQ3YzFhMWEuLjlmYzQwMGUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcApAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgbV9Mb2FkaW5nUG9zID0gMDsKICAgICBtX0xvYWRpbmdTaXplID0gZHdTaXplOwogfQotYm9vbCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQorRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQogewogICAgIHJldHVybiBtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZTsKIH0KQEAgLTM3MiwxNCArMzcyLDE0IEBACiAgICAgc3RyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKChjb25zdCB1bnNpZ25lZCBzaG9ydCopZW5jb2RlZC5jX3N0cigpLCBlbmNvZGVkLkdldExlbmd0aCgpKTsKICAgICByZXR1cm4gKnRoaXM7CiB9Ci1ib29sIENGWF9BcmNoaXZlTG9hZGVyOjpSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSkKK0ZYX0JPT0wgQ0ZYX0FyY2hpdmVMb2FkZXI6OlJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKQogewogICAgIGlmIChtX0xvYWRpbmdQb3MgKyBkd1NpemUgPiBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWFNZU19tZW1jcHkocEJ1ZiwgbV9wTG9hZGluZ0J1ZiArIG1fTG9hZGluZ1BvcywgZHdTaXplKTsKICAgICBtX0xvYWRpbmdQb3MgKz0gZHdTaXplOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDRlhfQml0U3RyZWFtOjpJbml0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpCiB7CkBAIC00NDEsOSArNDQxLDkgQEAKICAgICAgICAgbV9wQnVmZmVyID0gTlVMTDsKICAgICB9CiB9Ci1ib29sIElGWF9CdWZmZXJBcmNoaXZlOjpGbHVzaCgpCitGWF9CT09MIElGWF9CdWZmZXJBcmNoaXZlOjpGbHVzaCgpCiB7Ci0gICAgYm9vbCBiUmV0ID0gRG9Xb3JrKG1fcEJ1ZmZlciwgbV9MZW5ndGgpOworICAgIEZYX0JPT0wgYlJldCA9IERvV29yayhtX3BCdWZmZXIsIG1fTGVuZ3RoKTsKICAgICBtX0xlbmd0aCA9IDA7CiAgICAgcmV0dXJuIGJSZXQ7CiB9CkBAIC00ODgsNyArNDg4LDcgQEAKIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKEZYX1NUUlNJWkUgc2l6ZSkKICAgICA6IElGWF9CdWZmZXJBcmNoaXZlKHNpemUpCiAgICAgLCBtX3BGaWxlKE5VTEwpCi0gICAgLCBtX2JUYWtlb3ZlcihmYWxzZSkKKyAgICAsIG1fYlRha2VvdmVyKEZBTFNFKQogewogfQogQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkKQEAgLTUwMSw1OCArNTAxLDU4IEBACiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9iVGFrZW92ZXIgPSBmYWxzZTsKKyAgICBtX2JUYWtlb3ZlciA9IEZBTFNFOwogICAgIElGWF9CdWZmZXJBcmNoaXZlOjpDbGVhcigpOwogfQotYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgYm9vbCBiVGFrZW92ZXIgKQorRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgKQogewogICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IHBGaWxlOwogICAgIG1fYlRha2VvdmVyID0gYlRha2VvdmVyOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKQorRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKQogewogICAgIGlmICghZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7CiAgICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX2JUYWtlb3ZlciA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9iVGFrZW92ZXIgPSBUUlVFOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpCitGWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkKIHsKICAgICBpZiAoIWZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgewogICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CiAgICAgfQogICAgIG1fcEZpbGUgPSBGWF9DcmVhdGVGaWxlV3JpdGUoZmlsZW5hbWUpOwogICAgIGlmICghbV9wRmlsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9iVGFrZW92ZXIgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIG1fYlRha2VvdmVyID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpCitGWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6RG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKQogewogICAgIGlmICghbV9wRmlsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFwQnVmIHx8IHNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcEZpbGUtPldyaXRlQmxvY2socEJ1Ziwgc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcAppbmRleCAyMmI5YmQ0Li4yZTgzMDgwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICAgIGJvdHRvbSA9IGJvdHRvbSA+IG90aGVyLmJvdHRvbSA/IGJvdHRvbSA6IG90aGVyLmJvdHRvbTsKICAgICB0b3AgPSB0b3AgPCBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7CiB9Ci1ib29sIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCitGWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpCiB7CiAgICAgaWYgKGxvdzEgPj0gaGlnaDIgfHwgbG93MiA+PSBoaWdoMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50ZXJsb3cgPSBsb3cxID4gbG93MiA/IGxvdzEgOiBsb3cyOwogICAgIGludGVyaGlnaCA9IGhpZ2gxID4gaGlnaDIgPyBoaWdoMiA6IGhpZ2gxOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogZXh0ZXJuICJDIiBpbnQgRlhTWVNfcm91bmQoRlhfRkxPQVQgZCkKIHsKQEAgLTE5OCwxOCArMTk4LDE4IEBACiAgICAgcmVjdC5Ob3JtYWxpemUoKTsKICAgICByZXR1cm4gcmVjdDsKIH0KLWJvb2wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3QKIHsKICAgICBDRlhfRmxvYXRSZWN0IG4xID0gKnRoaXM7CiAgICAgbjEuTm9ybWFsaXplKCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBuMiA9IG90aGVyX3JlY3Q7CiAgICAgbjIuTm9ybWFsaXplKCk7CiAgICAgaWYgKG4yLmxlZnQgPj0gbjEubGVmdCAmJiBuMi5yaWdodCA8PSBuMS5yaWdodCAmJiBuMi5ib3R0b20gPj0gbjEuYm90dG9tICYmIG4yLnRvcCA8PSBuMS50b3ApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdAorRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdAogewogICAgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKICAgICBuMS5Ob3JtYWxpemUoKTsKQEAgLTI5OSwxMyArMjk5LDEzIEBACiAgICAgRlhfRkxPQVQgZmYgPSBtMS5lICogbTIuYiArIG0xLmYgKiBtMi5kICsgbTIuZjsKICAgICBtLmEgPSBhYSwgbS5iID0gYmIsIG0uYyA9IGNjLCBtLmQgPSBkZCwgbS5lID0gZWUsIG0uZiA9IGZmOwogfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgYm9vbCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgRlhfQk9PTCBiUHJlcGVuZGVkKQogewogICAgIENGWF9NYXRyaXggbTsKICAgICBtLlNldChhLCBiLCBjLCBkLCBlLCBmKTsKICAgICBDb25jYXQobSwgYlByZXBlbmRlZCk7CiB9Ci12b2lkIENGWF9NYXRyaXg6OkNvbmNhdChjb25zdCBDRlhfTWF0cml4ICZtLCBib29sIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OkNvbmNhdChjb25zdCBDRlhfTWF0cml4ICZtLCBGWF9CT09MIGJQcmVwZW5kZWQpCiB7CiAgICAgaWYgKGJQcmVwZW5kZWQpIHsKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOwpAQCAtMzEzLDI1ICszMTMsMjUgQEAKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwogICAgIH0KIH0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBzcmMsIGJvb2wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBzcmMsIEZYX0JPT0wgYlByZXBlbmRlZCkKIHsKICAgICBDRlhfTWF0cml4IG07CiAgICAgbS5TZXRSZXZlcnNlKHNyYyk7CiAgICAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOwogfQotYm9vbCBDRlhfTWF0cml4OjpJc0ludmVydGlibGUoKSBjb25zdAorRlhfQk9PTCBDRlhfTWF0cml4OjpJc0ludmVydGlibGUoKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiBkIC0gYiAqIGMpID49IDAuMDAwMWY7CiB9Ci1ib29sIENGWF9NYXRyaXg6OklzOTBSb3RhdGVkKCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX01hdHJpeDo6SXM5MFJvdGF0ZWQoKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYikgJiYgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOwogfQotYm9vbCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0CitGWF9CT09MIENGWF9NYXRyaXg6OklzU2NhbGVkKCkgY29uc3QKIHsKICAgICByZXR1cm4gRlhTWVNfZmFicyhiICogMTAwMCkgPCBGWFNZU19mYWJzKGEpICYmIEZYU1lTX2ZhYnMoYyAqIDEwMDApIDwgRlhTWVNfZmFicyhkKTsKIH0KLXZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0JPT0wgYlByZXBlbmRlZCkKIHsKICAgICBpZiAoYlByZXBlbmRlZCkgewogICAgICAgICBlICs9IHggKiBhICsgeSAqIGM7CkBAIC0zNDAsNyArMzQwLDcgQEAKICAgICAgICAgZSArPSB4LCBmICs9IHk7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIGJvb2wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6U2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBGWF9CT09MIGJQcmVwZW5kZWQpCiB7CiAgICAgYSAqPSBzeCwgZCAqPSBzeTsKICAgICBpZiAoYlByZXBlbmRlZCkgewpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIGYgKj0gc3k7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbiwgRlhfQk9PTCBiUHJlcGVuZGVkKQogewogICAgIEZYX0ZMT0FUIGNvc1ZhbHVlID0gRlhTWVNfY29zKGZSYWRpYW4pOwogICAgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOwpAQCAtMzY1LDEzICszNjUsMTMgQEAKICAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwogICAgIH0KIH0KLXZvaWQgQ0ZYX01hdHJpeDo6Um90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5LCBib29sIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSwgRlhfQk9PTCBiUHJlcGVuZGVkKQogewogICAgIFRyYW5zbGF0ZShkeCwgZHksIGJQcmVwZW5kZWQpOwogICAgIFJvdGF0ZShmUmFkaWFuLCBiUHJlcGVuZGVkKTsKICAgICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOwogfQotdm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBib29sIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OlNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwgRlhfRkxPQVQgZkJldGFSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCkKIHsKICAgICBDRlhfTWF0cml4IG07CiAgICAgbS5TZXQoMSwgRlhTWVNfdGFuKGZBbHBoYVJhZGlhbiksIEZYU1lTX3RhbihmQmV0YVJhZGlhbiksIDEsIDAsIDApOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKaW5kZXggNTYyZjc0MS4uMjQ5N2M3NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCkBAIC0xMiwxMiArMTIsMTIgQEAKIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTVFJfVD4KIFQgRlhTWVNfU3RyVG9JbnQoU1RSX1Qgc3RyKQogewotICAgIGJvb2wgbmVnID0gZmFsc2U7CisgICAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKICAgICBpZiAoc3RyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmICgqc3RyID09ICctJykgewotICAgICAgICBuZWcgPSB0cnVlOworICAgICAgICBuZWcgPSBUUlVFOwogICAgICAgICBzdHIgKys7CiAgICAgfQogICAgIFQgbnVtID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21hcHMuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKaW5kZXggN2RlN2I2MS4uZTM0YWNiMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAKQEAgLTY5LDE1ICs2OSwxNSBAQAogICAgIHJLZXkgPSBwQXNzb2NSZXQtPmtleTsKICAgICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOwogfQotYm9vbCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0CitGWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6TG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKIHsKICAgICBGWF9EV09SRCBuSGFzaDsKICAgICBDQXNzb2MqIHBBc3NvYyA9IEdldEFzc29jQXQoa2V5LCBuSGFzaCk7CiAgICAgaWYgKHBBc3NvYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByVmFsdWUgPSBwQXNzb2MtPnZhbHVlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCogQ0ZYX01hcFB0clRvUHRyOjpHZXRWYWx1ZUF0KHZvaWQqIGtleSkgY29uc3QKIHsKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgIHJldHVybiBwQXNzb2M7CiB9CiB2b2lkIENGWF9NYXBQdHJUb1B0cjo6SW5pdEhhc2hUYWJsZSgKLSAgICBGWF9EV09SRCBuSGFzaFNpemUsIGJvb2wgYkFsbG9jTm93KQorICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpCiB7CiAgICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwogICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKQEAgLTE1MywxMCArMTUzLDEwIEBACiAgICAgfQogICAgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7CiB9Ci1ib29sIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KHZvaWQqIGtleSkKK0ZYX0JPT0wgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkodm9pZCoga2V5KQogewogICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7CiAgICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwpAQCAtMTY1LDExICsxNjUsMTEgQEAKICAgICAgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgewogICAgICAgICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKICAgICAgICAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogdm9pZCBDRlhfTWFwUHRyVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jKQogewpAQCAtMzI1LDE4ICszMjUsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1ib29sIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6Okxvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKK0ZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAogewogICAgIEZYX0RXT1JEIG5IYXNoOwogICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKICAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkluaXRIYXNoVGFibGUoCi0gICAgRlhfRFdPUkQgbkhhc2hTaXplLCBib29sIGJBbGxvY05vdykKKyAgICBGWF9EV09SRCBuSGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93KQogewogICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKICAgICBBU1NFUlQobkhhc2hTaXplID4gMCk7CkBAIC0zNTksMTAgKzM1OSwxMCBAQAogICAgIH0KICAgICByZXR1cm4gbkhhc2g7CiB9Ci1ib29sIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkKK0ZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KQogewogICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7CiAgICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwpAQCAtMzcxLDExICszNzEsMTEgQEAKICAgICAgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgewogICAgICAgICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKICAgICAgICAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogc3RydWN0IF9Db21wYWN0U3RyaW5nIHsKICAgICB1aW50OF90CQltX0NvbXBhY3RMZW47CkBAIC0zOTAsMTYgKzM5MCwxNiBAQAogICAgICAgICBGWF9GcmVlKHBDb21wYWN0LT5tX3BCdWZmZXIpOwogICAgIH0KIH0KLXN0YXRpYyBib29sIF9Db21wYWN0U3RyaW5nU2FtZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsIGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludCBsZW4pCitzdGF0aWMgRlhfQk9PTCBfQ29tcGFjdFN0cmluZ1NhbWUoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0LCBjb25zdCB1aW50OF90KiBwU3RyLCBpbnQgbGVuKQogewogICAgIGlmIChsZW4gPCBzaXplb2YoX0NvbXBhY3RTdHJpbmcpKSB7CiAgICAgICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuICE9IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbikgPT0gMDsKICAgICB9CiAgICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gIT0gMHhmZiB8fCBwQ29tcGFjdC0+bV9MZW5IaWdoICogMjU2ICsgcENvbXBhY3QtPm1fTGVuTG93ICE9IGxlbikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIEZYU1lTX21lbWNtcChwQ29tcGFjdC0+bV9wQnVmZmVyLCBwU3RyLCBsZW4pID09IDA7CiB9CkBAIC00OTcsMTggKzQ5NywxOCBAQAogICAgIHJOZXh0UG9zaXRpb24gPSBOVUxMOwogICAgIHJldHVybiByVmFsdWU7CiB9Ci1ib29sIF9DTWFwTG9va3VwQ2FsbGJhY2sodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKQorRlhfQk9PTCBfQ01hcExvb2t1cENhbGxiYWNrKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSkKIHsKICAgICByZXR1cm4gIV9Db21wYWN0U3RyaW5nU2FtZSgoX0NvbXBhY3RTdHJpbmcqKXBEYXRhLCAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRQdHIoKSwgKChDRlhfQnl0ZVN0cmluZ0MqKXBhcmFtKS0+R2V0TGVuZ3RoKCkpOwogfQotYm9vbCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAorRlhfQk9PTCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAogewogICAgIHZvaWQqIHAgPSBtX0J1ZmZlci5JdGVyYXRlKF9DTWFwTG9va3VwQ2FsbGJhY2ssICh2b2lkKikma2V5KTsKICAgICBpZiAoIXApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJWYWx1ZSA9ICoodm9pZCoqKSgoX0NvbXBhY3RTdHJpbmcqKXAgKyAxKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiB2YWx1ZSkKIHsKQEAgLTU3OSwxNSArNTc5LDE1IEBACiAgICAgRlhfRFdPUkQga2V5OwogICAgIEZYX0RXT1JEIHZhbHVlOwogfTsKLWJvb2wgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6Okxvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6Okxvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QKIHsKICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgma2V5LCBtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0RXb3JkUGFpciksIF9Db21wYXJlRFdvcmQpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBGWF9QT1NJVElPTiBDRlhfQ01hcERXb3JkVG9EV29yZDo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY191dGlsLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCmluZGV4IDEzNDMzNzQuLjI2ZWVhY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIG1fcENhbGxiYWNrKG1fcERhdGEpOwogICAgIH0KIH0KLXZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpBZGREYXRhKHZvaWQqIHBNb2R1bGVJZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLCBib29sIGJTZWxmRGVzdHJ1Y3QpCit2b2lkIENGWF9Qcml2YXRlRGF0YTo6QWRkRGF0YSh2b2lkKiBwTW9kdWxlSWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywgRlhfQk9PTCBiU2VsZkRlc3RydWN0KQogewogICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC00NiwyNiArNDYsMjYgQEAKIH0KIHZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykKIHsKLSAgICBBZGREYXRhKHBNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBmYWxzZSk7CisgICAgQWRkRGF0YShwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgRkFMU0UpOwogfQogdm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVPYmoodm9pZCogcE1vZHVsZUlkLCBDRlhfRGVzdHJ1Y3RPYmplY3QqIHBPYmopCiB7Ci0gICAgQWRkRGF0YShwTW9kdWxlSWQsIHBPYmosIE5VTEwsIHRydWUpOworICAgIEFkZERhdGEocE1vZHVsZUlkLCBwT2JqLCBOVUxMLCBUUlVFKTsKIH0KLWJvb2wgQ0ZYX1ByaXZhdGVEYXRhOjpSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQpCitGWF9CT09MIENGWF9Qcml2YXRlRGF0YTo6UmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKQogewogICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CiAgICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7CiAgICAgICAgICAgICBtX0RhdGFMaXN0LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogdm9pZCogQ0ZYX1ByaXZhdGVEYXRhOjpHZXRQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQpCiB7CkBAIC05MCwxOCArOTAsMTggQEAKICAgICB9CiAgICAgbV9EYXRhTGlzdC5SZW1vdmVBbGwoKTsKIH0KLXZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYywgYm9vbCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKQordm9pZCBGWF9hdG9udW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjLCBGWF9CT09MJiBiSW50ZWdlciwgdm9pZCogcERhdGEpCiB7CiAgICAgaWYgKEZYU1lTX21lbWNocihzdHJjLkdldFB0cigpLCAnLicsIHN0cmMuR2V0TGVuZ3RoKCkpID09IE5VTEwpIHsKLSAgICAgICAgYkludGVnZXIgPSB0cnVlOworICAgICAgICBiSW50ZWdlciA9IFRSVUU7CiAgICAgICAgIGludCBjYyA9IDAsIGludGVnZXIgPSAwOwogICAgICAgICBjb25zdCBGWF9DSEFSKiBzdHIgPSBzdHJjLkdldENTdHIoKTsKICAgICAgICAgaW50IGxlbiA9IHN0cmMuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICAgICAgIGlmIChzdHJbMF0gPT0gJysnKSB7CiAgICAgICAgICAgICBjYysrOwogICAgICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKLSAgICAgICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOwogICAgICAgICAgICAgY2MrKzsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICB9CiAgICAgICAgICooaW50KilwRGF0YSA9IGludGVnZXI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYkludGVnZXIgPSBmYWxzZTsKKyAgICAgICAgYkludGVnZXIgPSBGQUxTRTsKICAgICAgICAgKihGWF9GTE9BVCopcERhdGEgPSBGWF9hdG9mKHN0cmMpOwogICAgIH0KIH0KQEAgLTEyOSwxMyArMTI5LDEzIEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogICAgIGludCBjYyA9IDA7Ci0gICAgYm9vbCBiTmVnYXRpdmUgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwogICAgIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOwogICAgIGlmIChzdHJbMF0gPT0gJysnKSB7CiAgICAgICAgIGNjKys7CiAgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CisgICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7CiAgICAgICAgIGNjKys7CiAgICAgfQogICAgIHdoaWxlIChjYyA8IGxlbikgewpAQCAtMTg3LDEzICsxODcsMTMgQEAKIH0KICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKIAotc3RhdGljIGJvb2wgRlhfSXNEaWdpdCh1aW50OF90IGNoKQorc3RhdGljIEZYX0JPT0wgRlhfSXNEaWdpdCh1aW50OF90IGNoKQogewotICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgPyB0cnVlIDogZmFsc2U7CisgICAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSA/IFRSVUUgOiBGQUxTRTsKIH0KLXN0YXRpYyBib29sIEZYX0lzWERpZ2l0KHVpbnQ4X3QgY2gpCitzdGF0aWMgRlhfQk9PTCBGWF9Jc1hEaWdpdCh1aW50OF90IGNoKQogewotICAgIHJldHVybiAoRlhfSXNEaWdpdChjaCkgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgPyB0cnVlIDogZmFsc2U7CisgICAgcmV0dXJuIChGWF9Jc0RpZ2l0KGNoKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSA/IFRSVUUgOiBGQUxTRTsKIH0KIHN0YXRpYyB1aW50OF90IEZYX01ha2VVcHBlcih1aW50OF90IGNoKQogewpAQCAtMjk5LDcgKzI5OSw3IEBACiBwdWJsaWM6CiAgICAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YSgpIHt9CiAgICAgSEFORExFCQkJCW1fSGFuZGxlOwotICAgIGJvb2wJCQkJbV9iRW5kOworICAgIEZYX0JPT0wJCQkJbV9iRW5kOwogfTsKIGNsYXNzIENGaW5kRmlsZURhdGFBIDogcHVibGljIENGaW5kRmlsZURhdGEKIHsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgICAgICBkZWxldGUgcERhdGE7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBwRGF0YS0+bV9iRW5kID0gZmFsc2U7CisgICAgcERhdGEtPm1fYkVuZCA9IEZBTFNFOwogICAgIHJldHVybiBwRGF0YTsKICNlbHNlCiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOwpAQCAtMzUyLDgyICszNTIsODIgQEAKICAgICAgICAgZGVsZXRlIHBEYXRhOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcERhdGEtPm1fYkVuZCA9IGZhbHNlOworICAgIHBEYXRhLT5tX2JFbmQgPSBGQUxTRTsKICAgICByZXR1cm4gcERhdGE7CiAjZWxzZQogICAgIERJUiogZGlyID0gb3BlbmRpcihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocGF0aCkpOwogICAgIHJldHVybiBkaXI7CiAjZW5kaWYKIH0KLWJvb2wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGJGb2xkZXIpCitGWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQogewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2lmbmRlZiBfV0lOMzJfV0NFCiAgICAgQ0ZpbmRGaWxlRGF0YUEqIHBEYXRhID0gKENGaW5kRmlsZURhdGFBKiloYW5kbGU7CiAgICAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwogICAgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOwogICAgIGlmICghRmluZE5leHRGaWxlQShwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKLSAgICAgICAgcERhdGEtPm1fYkVuZCA9IHRydWU7CisgICAgICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKICNlbHNlCiAgICAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gKENGaW5kRmlsZURhdGFXKiloYW5kbGU7CiAgICAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZSk7CiAgICAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CiAgICAgaWYgKCFGaW5kTmV4dEZpbGVXKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgewotICAgICAgICBwRGF0YS0+bV9iRW5kID0gdHJ1ZTsKKyAgICAgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogI2VuZGlmCiAjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQogICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKICNlbHNlCiAgICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7CiAgICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gZGUtPmRfbmFtZTsKICAgICBiRm9sZGVyID0gZGUtPmRfdHlwZSA9PSBEVF9ESVI7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiAjZW5kaWYKIH0KLWJvb2wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGJGb2xkZXIpCitGWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQogewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOwogICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmaWxlbmFtZSA9IHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZTsKICAgICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKICAgICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7Ci0gICAgICAgIHBEYXRhLT5tX2JFbmQgPSB0cnVlOworICAgICAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiAjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQogICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKICNlbHNlCiAgICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7CiAgICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChkZS0+ZF9uYW1lKTsKICAgICBiRm9sZGVyID0gZGUtPmRfdHlwZSA9PSBEVF9ESVI7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiAjZW5kaWYKIH0KIHZvaWQgRlhfQ2xvc2VGb2xkZXIodm9pZCogaGFuZGxlKQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfd3N0cmluZy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcAppbmRleCBiYjIzNmFjLi5iNmI1OTU1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcApAQCAtOTgwLDExICs5ODAsMTEgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAgICAgaW50IGNjID0gMDsKLSAgICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKICAgICAgICAgY2MrKzsKICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKLSAgICAgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKICAgICAgICAgY2MrKzsKICAgICB9CiAgICAgaW50IGludGVnZXIgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKaW5kZXggZmU2ZjI5Zi4uNDY2MmU4ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCkBAIC03MiwxMiArNzIsMTIgQEAKICAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7CiAgICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+V3JpdGVQb3MocEJ1ZmZlciwgc3pCdWZmZXIsIHBvcyk7CiB9Ci1ib29sIEZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpCitGWF9CT09MIEZYX0ZpbGVfRmx1c2goRlhfSEZJTEUgaEZpbGUpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwogICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPkZsdXNoKCk7CiB9Ci1ib29sIEZYX0ZpbGVfVHJ1bmNhdGUoRlhfSEZJTEUgaEZpbGUsIEZYX0ZJTEVTSVpFIHN6RmlsZSkKK0ZYX0JPT0wgRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKQogewogICAgIEZYU1lTX2Fzc2VydChoRmlsZSAhPSBOVUxMKTsKICAgICByZXR1cm4gKChJRlhDUlRfRmlsZUFjY2VzcyopaEZpbGUpLT5UcnVuY2F0ZShzekZpbGUpOwpAQCAtMTIyLDExICsxMjIsMTEgQEAKIHsKICAgICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfUmVhZE9ubHkpOwogfQotSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBkd1NpemUsIGJvb2wgYlRha2VPdmVyKQorSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBkd1NpemUsIEZYX0JPT0wgYlRha2VPdmVyKQogewogICAgIHJldHVybiBuZXcgQ0ZYX01lbW9yeVN0cmVhbShwQnVmZmVyLCBkd1NpemUsIGJUYWtlT3Zlcik7CiB9Ci1JRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpCitJRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpCiB7CiAgICAgcmV0dXJuIG5ldyBDRlhfTWVtb3J5U3RyZWFtKGJDb25zZWN1dGl2ZSk7CiB9CkBAIC0xNjAsMTAgKzE2MCwxMCBAQAogICAgICAgICByZXR1cm4gMC4wZjsKICAgICB9CiAgICAgaW50MzJfdCBpVXNlZExlbiA9IDA7Ci0gICAgYm9vbCBiTmVndGl2ZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYk5lZ3RpdmUgPSBGQUxTRTsKICAgICBzd2l0Y2ggKHB3c1N0cltpVXNlZExlbl0pIHsKICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICBiTmVndGl2ZSA9IHRydWU7CisgICAgICAgICAgICBiTmVndGl2ZSA9IFRSVUU7CiAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgaVVzZWRMZW4rKzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgfQogICAgIHJldHVybiBjaDEgLSBjaDI7CiB9Ci1GWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIGJvb2wgYklnbm9yZUNhc2UpCitGWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7CiAgICAgaWYgKGlMZW5ndGggPCAwKSB7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGR3SGFzaENvZGU7CiB9Ci1GWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlKQorRlhfRFdPUkQgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSkKIHsKICAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKICAgICBpZiAoaUxlbmd0aCA8IDApIHsKQEAgLTI4Myw3ICsyODMsNyBAQAogICAgIGZvciAoaSA9IDE7IGkgPCBNVF9OOyBpICsrKSB7CiAgICAgICAgIHBCdWZbaV0gPSAoMTgxMjQzMzI1M1VMICogKHBCdWZbaSAtIDFdIF4gKHBCdWZbaSAtIDFdID4+IDMwKSkgKyBpKTsKICAgICB9Ci0gICAgcENvbnRleHQtPmJIYXZlU2VlZCA9IHRydWU7CisgICAgcENvbnRleHQtPmJIYXZlU2VlZCA9IFRSVUU7CiAgICAgcmV0dXJuIHBDb250ZXh0OwogfQogRlhfRFdPUkQgRlhfUmFuZG9tX01UX0dlbmVyYXRlKHZvaWQqIHBDb250ZXh0KQpAQCAtMzQ3LDggKzM0Nyw4IEBACiAgICAgZG8gewogICAgICAgICA6OkdldFN5c3RlbVRpbWUoJnN0Mik7CiAgICAgfSB3aGlsZSAoRlhTWVNfbWVtY21wKCZzdDEsICZzdDIsIHNpemVvZihTWVNURU1USU1FKSkgPT0gMCk7Ci0gICAgRlhfRFdPUkQgZHdIYXNoMSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QxLCBzaXplb2Yoc3QxKSwgdHJ1ZSk7Ci0gICAgRlhfRFdPUkQgZHdIYXNoMiA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QyLCBzaXplb2Yoc3QyKSwgdHJ1ZSk7CisgICAgRlhfRFdPUkQgZHdIYXNoMSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QxLCBzaXplb2Yoc3QxKSwgVFJVRSk7CisgICAgRlhfRFdPUkQgZHdIYXNoMiA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QyLCBzaXplb2Yoc3QyKSwgVFJVRSk7CiAgICAgOjpzcmFuZCgoZHdIYXNoMSA8PCAxNikgfCAoRlhfRFdPUkQpZHdIYXNoMik7CiAjZWxzZQogICAgIHRpbWVfdCB0bUxhc3QgPSB0aW1lKE5VTEwpLCB0bUN1cjsKQEAgLTM2MCwxNSArMzYwLDE1IEBACiAgICAgfQogfQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLWJvb2wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KQorRlhfQk9PTCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCiB7CiAgICAgSENSWVBUUFJPViBoQ1AgPSBOVUxMOwogICAgIGlmICghOjpDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ1AsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIDApIHx8IGhDUCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICA6OkNyeXB0R2VuUmFuZG9tKGhDUCwgaUNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKSwgKHVpbnQ4X3QqKXBCdWZmZXIpOwogICAgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ1AsIDApOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiB2b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUNyeXB0byhGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCmluZGV4IDFkNjNkYTkuLmQ2NmE1OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCkBAIC0xMywyNyArMTMsMjcgQEAKIHsKICAgICByZXR1cm4gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogfQotYm9vbCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKQorRlhfQk9PTCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKQogewogICAgIEZYX0RXT1JEIGR3UmV0ID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpY2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7CiAgICAgcmV0dXJuIGR3UmV0ID09IEZYX0NIQVJUWVBFX1RhYiB8fCBkd1JldCA9PSBGWF9DSEFSVFlQRV9Db250cm9sOwogfQotYm9vbCBGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCkKK0ZYX0JPT0wgRlhfSXNSb3RhdGlvbkNvZGUoRlhfV0NIQVIgY2gpCiB7CiAgICAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKWNoXSAmIDB4ODAwMCkgIT0gMDsKIH0KLWJvb2wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKQorRlhfQk9PTCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpCiB7CiAgICAgRlhfRFdPUkQgZHdQcm9wcyA9IChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsKICAgICByZXR1cm4gZHdQcm9wcyA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsKIH0KLWJvb2wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpCitGWF9CT09MCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKQogewogICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07CiAgICAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7CiAgICAgcmV0dXJuIChGWF9CSURJQ0xBU1NfUiA9PSBpQmlkaUNscyB8fCBGWF9CSURJQ0xBU1NfQUwgPT0gaUJpZGlDbHMpOwogfQotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIGJvb2wgYlJUTCwgYm9vbCBiVmVydGljYWwpCitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCkKIHsKICAgICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogICAgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgfQogICAgIHJldHVybiB3Y2g7CiB9Ci1GWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfRFdPUkQgZHdQcm9wcywgYm9vbCBiUlRMLCBib29sIGJWZXJ0aWNhbCkKK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKQogewogICAgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CiAgICAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAppbmRleCA3MzY5NWE2Li5kY2Y5MWQxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcApAQCAtMTIsMzQgKzEyLDM0IEBACiAgICAgICAgIG1fcERhdGFBY2MtPlJlbGVhc2UoKTsKICAgICB9CiB9Ci1ib29sIENYTUxfUGFyc2VyOjpJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQorRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBtX3BEYXRhQWNjID0gbmV3IENYTUxfRGF0YUJ1ZkFjYyhwQnVmZmVyLCBzaXplKTsKLSAgICByZXR1cm4gSW5pdCh0cnVlKTsKKyAgICByZXR1cm4gSW5pdChUUlVFKTsKIH0KLWJvb2wgQ1hNTF9QYXJzZXI6OkluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpCitGWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkKQogewogICAgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhU3RtQWNjKHBGaWxlUmVhZCk7Ci0gICAgcmV0dXJuIEluaXQodHJ1ZSk7CisgICAgcmV0dXJuIEluaXQoVFJVRSk7CiB9Ci1ib29sIENYTUxfUGFyc2VyOjpJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKQorRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlcikKIHsKICAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fcERhdGFBY2MgPSBwQnVmZmVyOwotICAgIHJldHVybiBJbml0KGZhbHNlKTsKKyAgICByZXR1cm4gSW5pdChGQUxTRSk7CiB9Ci1ib29sIENYTUxfUGFyc2VyOjpJbml0KGJvb2wgYk93bmRlZFN0cmVhbSkKK0ZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoRlhfQk9PTCBiT3duZGVkU3RyZWFtKQogewogICAgIG1fYk93bmVkU3RyZWFtID0gYk93bmRlZFN0cmVhbTsKICAgICBtX25PZmZzZXQgPSAwOwogICAgIHJldHVybiBSZWFkTmV4dEJsb2NrKCk7CiB9Ci1ib29sIENYTUxfUGFyc2VyOjpSZWFkTmV4dEJsb2NrKCkKK0ZYX0JPT0wgQ1hNTF9QYXJzZXI6OlJlYWROZXh0QmxvY2soKQogewogICAgIGlmICghbV9wRGF0YUFjYy0+UmVhZE5leHRCbG9jaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BCdWZmZXIgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja0J1ZmZlcigpOwogICAgIG1fZHdCdWZmZXJTaXplID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tTaXplKCk7CkBAIC00NywxMCArNDcsMTAgQEAKICAgICBtX2R3SW5kZXggPSAwOwogICAgIHJldHVybiBtX2R3QnVmZmVyU2l6ZSA+IDA7CiB9Ci1ib29sIENYTUxfUGFyc2VyOjpJc0VPRigpCitGWF9CT09MIENYTUxfUGFyc2VyOjpJc0VPRigpCiB7CiAgICAgaWYgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gbV9kd0luZGV4ID49IG1fZHdCdWZmZXJTaXplOwogfQpAQCAtODIsMjcgKzgyLDI3IEBACiAgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKICAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAxLCAweDAxLAogfTsKLWJvb2wgZ19GWENSVF9YTUxfSXNXaGl0ZVNwYWNlKHVpbnQ4X3QgY2gpCitGWF9CT09MIGdfRlhDUlRfWE1MX0lzV2hpdGVTcGFjZSh1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyKSAhPSAwOwogfQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc0xldHRlcih1aW50OF90IGNoKQorRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0xldHRlcih1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTGV0dGVyKSAhPSAwOwogfQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNEaWdpdGFsKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsKSAhPSAwOwogfQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKQorRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKSAhPSAwOwogfQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpCitGWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIodWludDhfdCBjaCkKIHsKICAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyKSAhPSAwOwogfQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc0hleENoYXIodWludDhfdCBjaCkKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNIZXhDaGFyKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyKSAhPSAwOwogfQpAQCAtMzEwLDEzICszMTAsMTMgQEAKICAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwogICAgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKIH0KLXZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgYm9vbCAmYkVuZFRhZywgYm9vbCBiU3RhcnRUYWcpCit2b2lkIENYTUxfUGFyc2VyOjpHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUsIEZYX0JPT0wgJmJFbmRUYWcsIEZYX0JPT0wgYlN0YXJ0VGFnKQogewogICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CiAgICAgaWYgKElzRU9GKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBiRW5kVGFnID0gZmFsc2U7CisgICAgYkVuZFRhZyA9IEZBTFNFOwogICAgIHVpbnQ4X3QgY2g7CiAgICAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKICAgICBkbyB7CkBAIC0zNDUsMTAgKzM0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7CiAgICAgICAgICAgICAgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0zNTksMTQgKzM1OSwxNCBAQAogICAgICAgICB9CiAgICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9QYXJzZXI6OlBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIGJvb2wgYlN0YXJ0VGFnKQorQ1hNTF9FbGVtZW50KiBDWE1MX1BhcnNlcjo6UGFyc2VFbGVtZW50KENYTUxfRWxlbWVudCogcFBhcmVudCwgRlhfQk9PTCBiU3RhcnRUYWcpCiB7CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKICAgICBpZiAoSXNFT0YoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnX25hbWUsIHRhZ19zcGFjZTsKLSAgICBib29sIGJFbmRUYWc7CisgICAgRlhfQk9PTCBiRW5kVGFnOwogICAgIEdldFRhZ05hbWUodGFnX3NwYWNlLCB0YWdfbmFtZSwgYkVuZFRhZywgYlN0YXJ0VGFnKTsKICAgICBpZiAodGFnX25hbWUuSXNFbXB0eSgpIHx8IGJFbmRUYWcpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MjcsNyArNDI3LDcgQEAKICAgICB9CiAgICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CiAgICAgQ0ZYX1dpZGVUZXh0QnVmIGNvbnRlbnQ7Ci0gICAgYm9vbCBiQ0RBVEEgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJDREFUQSA9IEZBTFNFOwogICAgIGludDMyX3QgaVN0YXRlID0gMDsKICAgICBkbyB7CiAgICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewpAQCAtNDY1LDEwICs0NjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydENvbnRlbnRTZWdtZW50KGJDREFUQSwgZGF0YVN0ciwgcEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5DbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkNEQVRBID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBiQ0RBVEEgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBTdWJFbGVtZW50ID0gUGFyc2VFbGVtZW50KHBFbGVtZW50LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBQYXJzZUVsZW1lbnQocEVsZW1lbnQsIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdWJFbGVtZW50ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwOSwxMCArNTA5LDEwIEBACiAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7CiAgICAgY29udGVudC5DbGVhcigpOwogICAgIGRlY29kZXIuQ2xlYXIoKTsKLSAgICBiQ0RBVEEgPSBmYWxzZTsKKyAgICBiQ0RBVEEgPSBGQUxTRTsKICAgICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci12b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChib29sIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KQordm9pZCBDWE1MX1BhcnNlcjo6SW5zZXJ0Q29udGVudFNlZ21lbnQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCkKIHsKICAgICBpZiAoY29udGVudC5Jc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNTIyLDE2ICs1MjIsMTYgQEAKICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQoKHZvaWQqKUNYTUxfRWxlbWVudDo6Q29udGVudCk7CiAgICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBDb250ZW50KTsKIH0KLXN0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyICZwYXJzZXIsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCitzdGF0aWMgQ1hNTF9FbGVtZW50KiBYTUxfQ29udGludWVQYXJzZShDWE1MX1BhcnNlciAmcGFyc2VyLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIHBhcnNlci5tX2JTYXZlU3BhY2VDaGFycyA9IGJTYXZlU3BhY2VDaGFyczsKLSAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gcGFyc2VyLlBhcnNlRWxlbWVudChOVUxMLCBmYWxzZSk7CisgICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IHBhcnNlci5QYXJzZUVsZW1lbnQoTlVMTCwgRkFMU0UpOwogICAgIGlmIChwUGFyc2VkU2l6ZSkgewogICAgICAgICAqcFBhcnNlZFNpemUgPSBwYXJzZXIubV9uT2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCiB7CiAgICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwogICAgIGlmICghcGFyc2VyLkluaXQoKHVpbnQ4X3QqKXBCdWZmZXIsIHNpemUpKSB7CkBAIC01MzksNyArNTM5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgYm9vbCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIENYTUxfUGFyc2VyIHBhcnNlcjsKICAgICBpZiAoIXBhcnNlci5Jbml0KHBGaWxlKSkgewpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgfQogICAgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOwogfQotQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBib29sIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQorQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQogewogICAgIENYTUxfUGFyc2VyIHBhcnNlcjsKICAgICBpZiAoIXBhcnNlci5Jbml0KHBCdWZmZXIpKSB7CkBAIC02MDAsNyArNjAwLDcgQEAKICAgICB9CiAgICAgbV9DaGlsZHJlbi5SZW1vdmVBbGwoKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0VGFnTmFtZShib29sIGJRdWFsaWZpZWQpIGNvbnN0CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldFRhZ05hbWUoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdAogewogICAgIGlmICghYlF1YWxpZmllZCB8fCBtX1FTcGFjZU5hbWUuSXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBtX1RhZ05hbWU7CkBAIC02MTAsNyArNjEwLDcgQEAKICAgICBic1RhZyArPSBtX1RhZ05hbWU7CiAgICAgcmV0dXJuIGJzVGFnOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2UoYm9vbCBiUXVhbGlmaWVkKSBjb25zdAorQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2UoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdAogewogICAgIGlmIChiUXVhbGlmaWVkKSB7CiAgICAgICAgIHJldHVybiBtX1FTcGFjZU5hbWU7CkBAIC02NDQsNjEgKzY0NCw2MSBAQAogICAgIG5hbWUgPSBpdGVtLm1fQXR0ck5hbWU7CiAgICAgdmFsdWUgPSBpdGVtLm1fVmFsdWU7CiB9Ci1ib29sIENYTUxfRWxlbWVudDo6SGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CitGWF9CT09MIENYTUxfRWxlbWVudDo6SGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0CiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKICAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgcmV0dXJuIG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKSAhPSBOVUxMOwogfQotYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICByZXR1cm4gR2V0QXR0clZhbHVlKGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKIH0KLWJvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdAorRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoc3BhY2UsIG5hbWUpOwogICAgIGlmIChwVmFsdWUpIHsKICAgICAgICAgYXR0cmlidXRlID0gKnBWYWx1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgaWYgKHB3c1ZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wJQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdAorRlhfQk9PTAlDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHB3c1ZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CiAgICAgaWYgKHB3c1ZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdAorRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKICAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CiAgICAgcmV0dXJuIEdldEF0dHJGbG9hdChic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CiB9Ci1ib29sIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdAogewogICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKICAgICBpZiAocFZhbHVlKSB7CiAgICAgICAgIGF0dHJpYnV0ZSA9IHBWYWx1ZS0+R2V0RmxvYXQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogRlhfRFdPUkQgQ1hNTF9FbGVtZW50OjpDb3VudENoaWxkcmVuKCkgY29uc3QKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCmluZGV4IDgxM2FmMDIuLmU3MTgyOTQzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKQEAgLTQwLDIwICs0MCwyMCBAQAogewogICAgIENsb3NlKCk7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHN0ck1vZGU7CiAgICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oZmlsZU5hbWUuR2V0Q1N0cigpLCBzdHJNb2RlLmNfc3RyKCkpOwogICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIHN0ck1vZGU7CiAgICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKQEAgLTEyOCw0NSArMTI4LDQ1IEBACiAgICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7CiAgICAgcmV0dXJuIEZYU1lTX2Z3cml0ZShwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Rmx1c2goKQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkZsdXNoKCkKIHsKICAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiAhRlhTWVNfZmZsdXNoKG1faEZpbGUpOwogfQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIGFjY2VzcyhmaWxlTmFtZS5HZXRDU3RyKCksIEZfT0spID4gLTE7CiB9Ci1ib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKIH0KLWJvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKIH0KLWJvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwogfQotYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK0ZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIHNyYywgZHN0OwogICAgIGlmICghc3JjLk9wZW4oZmlsZU5hbWVTcmMsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgc2l6ZSA9IHNyYy5HZXRTaXplKCk7CiAgICAgaWYgKCFzaXplKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIG51bSA9IDA7CiAgICAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDMyNzY4KTsKQEAgLTE3NiwxNyArMTc2LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitGWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiBGWF9GaWxlX0NvcHkoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKIH0KLWJvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitGWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiByZW5hbWUoZmlsZU5hbWVTcmMuR2V0Q1N0cigpLCBmaWxlTmFtZURzdC5HZXRDU3RyKCkpOwogfQotYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK0ZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfTW92ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmggYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAppbmRleCBkOTVhZTRmLi40ZmQwNTg4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaApAQCAtMTcsOCArMTcsOCBAQAogcHVibGljOgogICAgIENGWENSVF9GaWxlQWNjZXNzX0NSVCgpOwogICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpOwotICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKTsKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBjb25zdDsKQEAgLTI4LDggKzI4LDggQEAKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIGJvb2wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBib29sCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CiBwcm90ZWN0ZWQ6CiAgICAgRlhTWVNfRklMRSoJbV9oRmlsZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAKaW5kZXggZWI3MjEzZS4uODQ2NDZlZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcApAQCAtMzQsMTcgKzM0LDE3IEBACiB7CiAgICAgQ2xvc2UoKTsKIH0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1fbkZEID4gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludDMyX3QgbkZsYWdzLCBuTWFza3M7CiAgICAgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoZHdNb2RlLCBuRmxhZ3MsIG5NYXNrcyk7CiAgICAgbV9uRkQgPSBvcGVuKGZpbGVOYW1lLkdldENTdHIoKSwgbkZsYWdzLCBuTWFza3MpOwogICAgIHJldHVybiBtX25GRCA+IC0xOwogfQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKIHsKICAgICByZXR1cm4gT3BlbihGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSwgZHdNb2RlKTsKIH0KQEAgLTEyMSw0OCArMTIxLDQ4IEBACiAgICAgfQogICAgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpCitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpCiB7CiAgICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIGZzeW5jKG1fbkZEKSA+IC0xOwogfQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQogewogICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiAhZnRydW5jYXRlKG1fbkZELCBzekZpbGUpOwogfQotYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCitGWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKIH0KLWJvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfRXhpc3QoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwogfQotYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiByZW1vdmUoZmlsZU5hbWUuR2V0Q1N0cigpKSA+IC0xOwogfQotYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBGWF9GaWxlX0RlbGV0ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSk7CiB9Ci1ib29sIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCBzcmMsIGRzdDsKICAgICBpZiAoIXNyYy5PcGVuKGZpbGVOYW1lU3JjLCBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIHNpemUgPSBzcmMuR2V0U2l6ZSgpOwogICAgIGlmICghc2l6ZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFkc3QuT3BlbihmaWxlTmFtZURzdCwgRlhfRklMRU1PREVfVHJ1bmNhdGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBzaXplX3QgbnVtID0gMDsKICAgICB1aW50OF90KiBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgMzI3NjgpOwpAQCAtMTc0LDE3ICsxNzQsMTcgQEAKICAgICAgICAgbnVtID0gc3JjLlJlYWQocEJ1ZmZlciwgMzI3NjgpOwogICAgIH0KICAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK0ZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfQ29weShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQotYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK0ZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1ib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9Nb3ZlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguaAppbmRleCA2NTNhMTUwLi4zOWRmMWM4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKQEAgLTE1LDggKzE1LDggQEAKIHB1YmxpYzoKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOwogICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCk7Ci0gICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CiAgICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwpAQCAtMjYsOCArMjYsOCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwogICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgYm9vbAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIGJvb2wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CisgICAgdmlydHVhbCBGWF9CT09MCQlGbHVzaCgpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKIHByb3RlY3RlZDoKICAgICBpbnQzMl90CW1fbkZEOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKaW5kZXggN2VmZmFiNi4uZDRlMzgzMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKQEAgLTgsMTkgKzgsMTkgQEAKICNpbmNsdWRlICJmeGNydF93aW5kb3dzLmgiCiAKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1ib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShmaWxlTmFtZS5HZXRDU3RyKCkpOwogICAgIGlmIChkd0F0dHJpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gKGR3QXR0cmkgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpID09IDA7CiB9Ci1ib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7CiAgICAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKIH0KQEAgLTU1LDEwICs1NSwxMCBAQAogewogICAgIENsb3NlKCk7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQogewogICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKICAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwpAQCAtNjgsMTAgKzY4LDEwIEBACiAgICAgfQogICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQogewogICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKICAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwpAQCAtMTc0LDQxICsxNzQsNDEgQEAKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlKHBCdWZmZXIsIHN6QnVmZmVyKTsKIH0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkZsdXNoKCkKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkZsdXNoKCkKIHsKICAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiA6OkZsdXNoRmlsZUJ1ZmZlcnMobV9oRmlsZSk7CiB9Ci1ib29sIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCiB7CiAgICAgaWYgKFNldFBvc2l0aW9uKHN6RmlsZSkgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiA6OlNldEVuZE9mRmlsZShtX2hGaWxlKTsKIH0KLWJvb2wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gOjpEZWxldGVGaWxlQShmaWxlTmFtZS5HZXRDU3RyKCkpOwogfQotYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiA6OkRlbGV0ZUZpbGVXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpKTsKIH0KLWJvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitGWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewotICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgZmFsc2UpOworICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgRkFMU0UpOwogfQotYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK0ZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7Ci0gICAgcmV0dXJuIDo6Q29weUZpbGVXKChMUENXU1RSKWZpbGVOYW1lU3JjLkdldFB0cigpLCAoTFBDV1NUUilmaWxlTmFtZURzdC5HZXRQdHIoKSwgZmFsc2UpOworICAgIHJldHVybiA6OkNvcHlGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwgKExQQ1dTVFIpZmlsZU5hbWVEc3QuR2V0UHRyKCksIEZBTFNFKTsKIH0KLWJvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitGWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiA6Ok1vdmVGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1ib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gOjpNb3ZlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWVTcmMuR2V0UHRyKCksIChMUENXU1RSKWZpbGVOYW1lRHN0LkdldFB0cigpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaAppbmRleCA0MTRiODYzLi44ZGQyY2RkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oCkBAIC0xNSw4ICsxNSw4IEBACiBwdWJsaWM6CiAgICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKTsKICAgICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwotICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKTsKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBjb25zdDsKQEAgLTI2LDggKzI2LDggQEAKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7CiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIGJvb2wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBib29sCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCoJbV9oRmlsZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC94bWxfaW50LmggYi9jb3JlL3NyYy9meGNydC94bWxfaW50LmgKaW5kZXggZWM4YmRjMi4uMTA5YzdhNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaApAQCAtMjMsNyArMjMsNyBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCUlzRU9GKCkKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9kd0N1clBvcyA+PSBtX2R3U2l6ZTsKICAgICB9CkBAIC0zNSwxNiArMzUsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQlSZWFkTmV4dEJsb2NrKGJvb2wgYlJlc3RhcnQgPSBmYWxzZSkKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkKICAgICB7CiAgICAgICAgIGlmIChiUmVzdGFydCkgewogICAgICAgICAgICAgbV9kd0N1clBvcyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgewogICAgICAgICAgICAgbV9kd0N1clBvcyA9IG1fZHdTaXplOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0QmxvY2tCdWZmZXIoKQogICAgIHsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICB7CiAgICAgICAgIGRlbGV0ZSB0aGlzOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplID49IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CiAgICAgfQpAQCAtOTcsNyArOTcsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbAkJCVJlYWROZXh0QmxvY2soYm9vbCBiUmVzdGFydCA9IGZhbHNlKQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQogICAgIHsKICAgICAgICAgaWYgKGJSZXN0YXJ0KSB7CiAgICAgICAgICAgICBtX25TdGFydCA9IDA7CkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgRlhfRklMRVNJWkUgbkxlbmd0aCA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CiAgICAgICAgIG1fblN0YXJ0ICs9IChGWF9GSUxFU0laRSltX2R3U2l6ZTsKICAgICAgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBtX2R3U2l6ZSA9IChzaXplX3QpRlhfTUlOKEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZSwgbkxlbmd0aCAtIG1fblN0YXJ0KTsKICAgICAgICAgaWYgKCFtX3BCdWZmZXIpIHsKQEAgLTEzNiwyOCArMTM2LDI4IEBACiBwdWJsaWM6CiAgICAgfkNYTUxfUGFyc2VyKCk7CiAgICAgSUZYX0J1ZmZlclJlYWQqCW1fcERhdGFBY2M7Ci0gICAgYm9vbAkJCW1fYk93bmVkU3RyZWFtOworICAgIEZYX0JPT0wJCQltX2JPd25lZFN0cmVhbTsKICAgICBGWF9GSUxFU0laRQkJbV9uT2Zmc2V0OwotICAgIGJvb2wJCQltX2JTYXZlU3BhY2VDaGFyczsKKyAgICBGWF9CT09MCQkJbV9iU2F2ZVNwYWNlQ2hhcnM7CiAgICAgY29uc3QgdWludDhfdCoJCW1fcEJ1ZmZlcjsKICAgICBzaXplX3QJCQltX2R3QnVmZmVyU2l6ZTsKICAgICBGWF9GSUxFU0laRQkJbV9uQnVmZmVyT2Zmc2V0OwogICAgIHNpemVfdAkJCW1fZHdJbmRleDsKLSAgICBib29sCQkJSW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbAkJCUluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpOwotICAgIGJvb2wJCQlJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKTsKLSAgICBib29sCQkJSW5pdChib29sIGJPd25kZWRTdHJlYW0pOwotICAgIGJvb2wJCQlSZWFkTmV4dEJsb2NrKCk7Ci0gICAgYm9vbAkJCUlzRU9GKCk7Ci0gICAgYm9vbAkJCUhhdmVBdmFpbERhdGEoKTsKKyAgICBGWF9CT09MCQkJSW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgRlhfQk9PTAkJCUluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpOworICAgIEZYX0JPT0wJCQlJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKTsKKyAgICBGWF9CT09MCQkJSW5pdChGWF9CT09MIGJPd25kZWRTdHJlYW0pOworICAgIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKCk7CisgICAgRlhfQk9PTAkJCUlzRU9GKCk7CisgICAgRlhfQk9PTAkJCUhhdmVBdmFpbERhdGEoKTsKICAgICB2b2lkCQkJU2tpcFdoaXRlU3BhY2VzKCk7CiAgICAgdm9pZAkJCUdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAgICAgdm9pZAkJCUdldEF0dHJWYWx1ZShDRlhfV2lkZVN0cmluZyAmdmFsdWUpOwogICAgIEZYX0RXT1JECQlHZXRDaGFyUmVmKCk7Ci0gICAgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgYm9vbCAmYkVuZFRhZywgYm9vbCBiU3RhcnRUYWcgPSBmYWxzZSk7CisgICAgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgRlhfQk9PTCAmYkVuZFRhZywgRlhfQk9PTCBiU3RhcnRUYWcgPSBGQUxTRSk7CiAgICAgdm9pZAkJCVNraXBMaXRlcmFscyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gICAgQ1hNTF9FbGVtZW50KglQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBib29sIGJTdGFydFRhZyA9IGZhbHNlKTsKLSAgICB2b2lkCQkJSW5zZXJ0Q29udGVudFNlZ21lbnQoYm9vbCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CisgICAgQ1hNTF9FbGVtZW50KglQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBGWF9CT09MIGJTdGFydFRhZyA9IEZBTFNFKTsKKyAgICB2b2lkCQkJSW5zZXJ0Q29udGVudFNlZ21lbnQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CiAgICAgdm9pZAkJCUluc2VydENEQVRBU2VnbWVudChDRlhfVVRGOERlY29kZXImIGRlY29kZXIsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpOwogfTsKIHZvaWQgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRnVsbE5hbWUsIENGWF9CeXRlU3RyaW5nQyAmYnNTcGFjZSwgQ0ZYX0J5dGVTdHJpbmdDICZic05hbWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAppbmRleCBjOGQ2MjAxLi4yOWI1NmM3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaApAQCAtMjIsNyArMjIsNyBAQAogY2xhc3MgQ0ZYX0FnZ0RldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCiB7CiBwdWJsaWM6Ci0gICAgQ0ZYX0FnZ0RldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpOworICAgIENGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKICAgICB2aXJ0dWFsIH5DRlhfQWdnRGV2aWNlRHJpdmVyKCk7CiAgICAgdm9pZAkJCQlJbml0UGxhdGZvcm0oKTsKICAgICB2b2lkCQkJCURlc3Ryb3lQbGF0Zm9ybSgpOwpAQCAtMzIsMjIgKzMyLDIyIEBACiAKIAogICAgIHZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKTsKKyAgICB2aXJ0dWFsIHZvaWQJCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOwogCiAKLSAgICB2aXJ0dWFsIGJvb2wJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC01OCw0NCArNTgsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwogCi0gICAgdmlydHVhbCBib29sCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKIAogCi0gICAgdmlydHVhbCBib29sCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CiAKIAotICAgIHZpcnR1YWwgYm9vbAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBib29sIGJERWRnZSA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSk7CiAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9yaURldmljZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBib29sCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBGWF9CT09MCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBib29sCQlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIHZpcnR1YWwgdm9pZAkJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgICAgIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgYm9vbAkJUmVuZGVyUmFzdGVyaXplcihGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAorICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKICAgICB2b2lkCQkJCVNldENsaXBNYXNrKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIpOwpAQCAtMTE3LDkgKzExNyw5IEBACiAgICAgdm9pZCoJCQkJbV9wRHdSZW5kZXJUYXJ0Z2V0OwogICAgIGludAkJCQkJbV9GaWxsRmxhZ3M7CiAgICAgaW50CQkJCQltX0RpdGhlckJpdHM7Ci0gICAgYm9vbAkJCQltX2JSZ2JCeXRlT3JkZXI7CisgICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7CiAgICAgQ0ZYX0RJQml0bWFwKiAgICAgICBtX3BPcmlEZXZpY2U7Ci0gICAgYm9vbCAgICAgICAgICAgICBtX2JHcm91cEtub2Nrb3V0OworICAgIEZYX0JPT0wgICAgICAgICAgICAgbV9iR3JvdXBLbm9ja291dDsKIH07CiAKICNlbmRpZiAgLy8gRlhfQUdHX0RSSVZFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwCmluZGV4IDJmOTZlZjcuLjExOGRiN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meF9hZ2dfZHJpdmVyLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAKQEAgLTExOSw3ICsxMTksNyBAQAogc3RhdGljIHZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgYWdnOjpwYXRoX3N0b3JhZ2UmIHBhdGhfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBGWF9GTE9BVCBzY2FsZSA9IDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3Ryb2tlQWRqdXN0ID0gZmFsc2UsIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCiB7CiAgICAgYWdnOjpsaW5lX2NhcF9lIGNhcDsKICAgICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKQEAgLTE4NSwxMSArMTg1LDExIEBACiAgICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7CiAgICAgfQogfQotSUZYX1JlbmRlckRldmljZURyaXZlciogSUZYX1JlbmRlckRldmljZURyaXZlcjo6Q3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KQorSUZYX1JlbmRlckRldmljZURyaXZlciogSUZYX1JlbmRlckRldmljZURyaXZlcjo6Q3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQogewogICAgIHJldHVybiBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCAwLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiB9Ci1DRlhfQWdnRGV2aWNlRHJpdmVyOjpDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKK0NGWF9BZ2dEZXZpY2VEcml2ZXI6OkNGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQogewogICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7CiAgICAgbV9EaXRoZXJCaXRzID0gZGl0aGVyX2JpdHM7CkBAIC0yMTcsMTEgKzIxNywxMSBAQAogdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKQogewogfQotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYKIGludCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgfQogICAgIG1fU3RhdGVTdGFjay5BZGQocENsaXApOwogfQotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQogewogICAgIGlmIChtX1N0YXRlU3RhY2suR2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgZGVsZXRlIG1fcENsaXBSZ247CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICBhZ2c6OnJlbmRlcl9zY2FubGluZXMocmFzdGVyaXplciwgc2NhbmxpbmUsIGZpbmFsX3JlbmRlciwgKG1fRmlsbEZsYWdzICYgRlhGSUxMX05PUEFUSFNNT09USCkgIT0gMCk7CiAgICAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIG1hc2spOwogfQotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgICAgICAgICByZWN0Zi5JbnRlcnNlY3QoQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgKEZYX0ZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CiAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgICAgICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKQEAgLTMzMyw5ICszMzMsOSBAQAogICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwogICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORyA/IGFnZzo6ZmlsbF9ub25femVybyA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7CiAgICAgU2V0Q2xpcE1hc2socmFzdGVyaXplcik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCkBAIC0zNTAsNyArMzUwLDcgQEAKICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSk7CiAgICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoYWdnOjpmaWxsX25vbl96ZXJvKTsKICAgICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGNsYXNzIENGWF9SZW5kZXJlciAKIHsKQEAgLTM2MSw4ICszNjEsOCBAQAogICAgICAgICAgICAgICAgIG1fQmx1ZSwKICAgICAgICAgICAgICAgICBtX0dyYXk7CiAgICAgRlhfRFdPUkQJbV9Db2xvcjsKLSAgICBib29sCQltX2JGdWxsQ292ZXI7Ci0gICAgYm9vbCAgICAgbV9iUmdiQnl0ZU9yZGVyOworICAgIEZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKKyAgICBGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7CiAgICAgQ0ZYX0RJQml0bWFwKiBtX3BPcmlEZXZpY2U7CiAgICAgRlhfUkVDVAkJbV9DbGlwQm94OwogICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJbV9wQ2xpcE1hc2s7CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICB2b2lkIChDRlhfUmVuZGVyZXI6Oipjb21wb3NpdGVfc3BhbikodWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQ4X3QqLCBpbnQsIGludCwgdWludDhfdCosIHVpbnQ4X3QqKTsKIHB1YmxpYzoKICAgICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9Ci0gICAgdm9pZCBDb21wb3NpdGVTcGFuKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4sIGludCBCcHAsIGJvb2wgYkRlc3RBbHBoYSwKKyAgICB2b2lkIENvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbiwgaW50IEJwcCwgRlhfQk9PTCBiRGVzdEFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4pCiAgICAgewpAQCAtOTU1LDcgKzk1NSw3IEBACiAgICAgICAgICAgICBvcmlfc2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BPcmlEZXZpY2UtPkdldFBpdGNoKCkgKiB5OwogICAgICAgICB9CiAgICAgICAgIGludCBCcHAgPSBtX3BEZXZpY2UtPkdldEJQUCgpIC8gODsKLSAgICAgICAgYm9vbCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKKyAgICAgICAgRlhfQk9PTCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKICAgICAgICAgdW5zaWduZWQgbnVtX3NwYW5zID0gc2wubnVtX3NwYW5zKCk7CiAgICAgICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKICAgICAgICAgd2hpbGUgKDEpIHsKQEAgLTk4OCw3ICs5ODgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYlJnYkJ5dGVPcmRlciwKKyAgICBGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAogICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQogICAgIHsKICAgICAgICAgbV9wRGV2aWNlID0gcERldmljZTsKQEAgLTEwMDgsOCArMTAwOCw4IEBACiAgICAgICAgICAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKICAgICAgICAgfQogICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgICAgICBib29sIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKLSAgICAgICAgYm9vbCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisgICAgICAgIEZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgICBGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKICAgICAgICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOwogICAgICAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CkBAIC0xMDM5LDcgKzEwMzksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoYkRldmljZUNNWUspIHsKICAgICAgICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwpAQCAtMTEwMCwyMiArMTEwMCwyMiBAQAogICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAxKSB7CiAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiB9OwotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiR3JvdXBLbm9ja291dCwKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcihhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIENGWF9ESUJpdG1hcCogcHQgPSBiR3JvdXBLbm9ja291dCA/IG1fcE9yaURldmljZSA6IE5VTEw7CiAgICAgQ0ZYX1JlbmRlcmVyIHJlbmRlcjsKICAgICBpZiAoIXJlbmRlci5Jbml0KG1fcEJpdG1hcCwgcHQsIG1fcENsaXBSZ24sIGNvbG9yLCBiRnVsbENvdmVyLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBhZ2c6OnNjYW5saW5lX3U4IHNjYW5saW5lOwogICAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgcmVuZGVyLCAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitGWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTExMjcsMTAgKzExMjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoR2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIG1fRmlsbEZsYWdzID0gZmlsbF9tb2RlOwogICAgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9jb2xvcikgewpAQCAtMTE0MCw4ICsxMTQwLDggQEAKICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CiAgICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwogICAgICAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcgPyBhZ2c6OmZpbGxfbm9uX3plcm8gOiBhZ2c6OmZpbGxfZXZlbl9vZGQpOwotICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgZmlsbF9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgZmFsc2UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwpAQCAtMTE1MSwxMiArMTE1MSwxMiBAQAogICAgICAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKICAgICAgICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwogICAgICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBmYWxzZSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CiAgICAgICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICAgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIG1fYkdyb3VwS25vY2tvdXQsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7CiAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewpAQCAtMTE3NCwxMyArMTE3NCwxMyBAQAogICAgICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgJm1hdHJpeDEpOwogICAgICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsIHBHcmFwaFN0YXRlLCBtYXRyaXgxLmEsIGZhbHNlLCBmaWxsX21vZGUgJiBGWF9TVFJPS0VfVEVYVF9NT0RFKTsKKyAgICAgICAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpOwogICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgbV9iR3JvdXBLbm9ja291dCwgZmlsbF9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBSZ2JCeXRlT3JkZXJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCB4LCBpbnQgeSwgRlhfRFdPUkQgYXJnYikKIHsKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAgICAgd2lkdGggPSByZWN0LldpZHRoKCk7CiAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYiksIHNyY19nID0gRlhBUkdCX0coYXJnYiksIHNyY19iID0gRlhBUkdCX0IoYXJnYik7CiAgICAgaW50IEJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgICBib29sIGJBbHBoYSA9IHBCaXRtYXAtPkhhc0FscGhhKCk7CisgICAgRlhfQk9PTCBiQWxwaGEgPSBwQml0bWFwLT5IYXNBbHBoYSgpOwogICAgIGludCBkaWJfYXJnYiA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpOwogICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiB8fCBkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewogICAgICAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IpIHsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICBBU1NFUlQoRkFMU0UpOwogICAgIH0KIH0KIEZYX0FSR0IgX0RlZmF1bHRDTVlLMkFSR0IoRlhfQ01ZSyBjbXlrLCB1aW50OF90IGFscGhhKQpAQCAtMTM2MSw5ICsxMzYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7CiAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoYWxwaGEsIHIsIGcsIGIpOwogfQotYm9vbCBfRGliU2V0UGl4ZWwoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK0ZYX0JPT0wgX0RpYlNldFBpeGVsKENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7Ci0gICAgYm9vbCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgRlhfQk9PTCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CiAgICAgaW50IGFscGhhID0gYk9iakNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7CiAgICAgICAgICAgICBpZiAoIWJPYmpDTVlLKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChiT2JqQ01ZSykgewpAQCAtMTM4OCwxMiArMTM4OCwxMiBAQAogICAgIGlmIChwRGV2aWNlLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgcERldmljZS0+bV9wQWxwaGFNYXNrLT5TZXRQaXhlbCh4LCB5LCBhbHBoYSA8PCAyNCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CkBAIC0xNDEzLDEyICsxNDEzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgewogICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgICAgIGJvb2wgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgICAgICAgRlhfQk9PTCBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CiAgICAgICAgICAgICBpbnQgbmV3X2FscGhhID0gYkNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICAgICAgICAgIG5ld19hbHBoYSA9IG5ld19hbHBoYSAqIHBNYXNrLT5HZXRTY2FubGluZSh5KVt4XSAvIDI1NTsKICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKICAgICAgICAgICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChiQ01ZSykgewogICAgICAgICAgICAgICAgIEZYU0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcsIG5ld19hbHBoYSk7CkBAIC0xNDI4LDE1ICsxNDI4LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gX0RpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYX1JFQ1QgY2xpcF9yZWN0OwogICAgIEdldENsaXBCb3goJmNsaXBfcmVjdCk7CkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogICAgICAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7CiAgICAgfQogICAgIGlmIChkcmF3X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCB8fCBtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7CiAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKQEAgLTE0NTMsMjcgKzE0NTMsMjcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsIGRyYXdfcmVjdC5XaWR0aCgpLCBkcmF3X3JlY3QuSGVpZ2h0KCksIChjb25zdCBDRlhfRElCaXRtYXAqKW1fcENsaXBSZ24tPkdldE1hc2soKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgZHJhd19yZWN0LmxlZnQgLSBjbGlwX3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCAtIGNsaXBfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKIHsKICAgICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMKSB7CiAgICAgICAgIHBSZWN0LT5sZWZ0ID0gcFJlY3QtPnRvcCA9IDA7CiAgICAgICAgIHBSZWN0LT5yaWdodCA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7CiAgICAgICAgIHBSZWN0LT5ib3R0b20gPSBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICAqcFJlY3QgPSBtX3BDbGlwUmduLT5HZXRCb3goKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkRFZGdlKQorRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiREVkZ2UpCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChiREVkZ2UpIHsKICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewpAQCAtMTQ4MSwyMyArMTQ4MSwyMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSwgdG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwogICAgIENGWF9ESUJpdG1hcCAqcEJhY2sgPSBOVUxMOwogICAgIGlmIChtX3BPcmlEZXZpY2UpIHsKICAgICAgICAgcEJhY2sgPSBtX3BPcmlEZXZpY2UtPkNsb25lKCZyZWN0KTsKICAgICAgICAgaWYgKCFwQmFjaykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBwQmFjay0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBCYWNrLT5HZXRXaWR0aCgpLCBwQmFjay0+R2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgMCwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcEJhY2sgPSBtX3BCaXRtYXAtPkNsb25lKCZyZWN0KTsKICAgICB9CiAgICAgaWYgKCFwQmFjaykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGJvb2wgYlJldCA9IHRydWU7CisgICAgRlhfQk9PTCBiUmV0ID0gVFJVRTsKICAgICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7CiAgICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOwogICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKQEAgLTE1MDgsMTEgKzE1MDgsMTEgQEAKICAgICBkZWxldGUgcEJhY2s7CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1ib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkKICAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsIGFyZ2IsCkBAIC0xNTIwLDEyICsxNTIwLDEyIEBACiAgICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlQml0bWFwKGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsIG1fcENsaXBSZ24sIG1fYlJnYkJ5dGVPcmRlciwgcEljY1RyYW5zZm9ybSk7CiB9Ci1ib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoZGVzdF93aWR0aCA9PSBwU291cmNlLT5HZXRXaWR0aCgpICYmIGRlc3RfaGVpZ2h0ID09IHBTb3VyY2UtPkdldEhlaWdodCgpKSB7CiAgICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CkBAIC0xNTM2LDMwICsxNTM2LDMwIEBACiAgICAgRlhfUkVDVCBkZXN0X2NsaXAgPSBkZXN0X3JlY3Q7CiAgICAgZGVzdF9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKICAgICBDRlhfQml0bWFwQ29tcG9zZXIgY29tcG9zZXI7Ci0gICAgY29tcG9zZXIuQ29tcG9zZShtX3BCaXRtYXAsIG1fcENsaXBSZ24sIDI1NSwgYXJnYiwgZGVzdF9jbGlwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOworICAgIGNvbXBvc2VyLkNvbXBvc2UobV9wQml0bWFwLCBtX3BDbGlwUmduLCAyNTUsIGFyZ2IsIGRlc3RfY2xpcCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKICAgICBkZXN0X2NsaXAuT2Zmc2V0KC1kZXN0X3JlY3QubGVmdCwgLWRlc3RfcmVjdC50b3ApOwogICAgIENGWF9JbWFnZVN0cmV0Y2hlciBzdHJldGNoZXI7CiAgICAgaWYgKHN0cmV0Y2hlci5TdGFydCgmY29tcG9zZXIsIHBTb3VyY2UsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBkZXN0X2NsaXAsIGZsYWdzKSkgewogICAgICAgICBzdHJldGNoZXIuQ29udGludWUoTlVMTCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAorRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ0ZYX0ltYWdlUmVuZGVyZXIqIHBSZW5kZXJlciA9IG5ldyBDRlhfSW1hZ2VSZW5kZXJlcjsKICAgICBwUmVuZGVyZXItPlN0YXJ0KG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgcFNvdXJjZSwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgaGFuZGxlID0gcFJlbmRlcmVyOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q29udGludWVESUJpdHModm9pZCogcEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiAoKENGWF9JbWFnZVJlbmRlcmVyKilwSGFuZGxlKS0+Q29udGludWUocFBhdXNlKTsKIH0KQEAgLTE1NzIsMzAgKzE1NzIsMzAgQEAKIH0KIENGWF9GeGdlRGV2aWNlOjpDRlhfRnhnZURldmljZSgpCiB7Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBmYWxzZTsKKyAgICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOwogfQotYm9vbCBDRlhfRnhnZURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKK0ZYX0JPT0wgQ0ZYX0Z4Z2VEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCiB7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgU2V0Qml0bWFwKHBCaXRtYXApOwogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0Z4Z2VEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQorRlhfQk9PTCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpCiB7Ci0gICAgbV9iT3duZWRCaXRtYXAgPSB0cnVlOworICAgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBTZXRCaXRtYXAocEJpdG1hcCk7Ci0gICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBmYWxzZSwgcE9yaURldmljZSwgZmFsc2UpOworICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgRkFMU0UsIHBPcmlEZXZpY2UsIEZBTFNFKTsKICAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDRlhfRnhnZURldmljZTo6fkNGWF9GeGdlRGV2aWNlKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKaW5kZXggZjVhYzZjMC4uMmRhZDAxMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAKQEAgLTg3LDIzICs4NywyMyBAQAogICAgIH0KICAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSk7CiB9Ci1ib29sIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpCitGWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpCiB7CiAgICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKICAgICAgICAgaWYgKEZYRlRfU2V0X0NoYXJfU2l6ZShtX0ZhY2UsIDAsIDEwMDAgKiA2NCwgNzIsIDcyKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKICAgICAgICAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIEZYRlRfR2x5cGggZ2x5cGg7CiAgICAgICAgIGlmIChGWEZUX0dldF9HbHlwaChtX0ZhY2UtPmdseXBoLCAmZ2x5cGgpKSB7CiAgICAgICAgICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWEZUX0JCb3ggY2JveDsKICAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOwpAQCAtMTE5LDI0ICsxMTksMjQgQEAKICAgICAgICAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpID09IDA7CiAgICAgfQogICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkpOwogICAgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSk7CiAgICAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKTsKICAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGUEZfU2tpYUZvbnQ6OkdldEJCb3goRlhfUkVDVCAmcnRCQm94KQorRlhfQk9PTCBDRlBGX1NraWFGb250OjpHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCkKIHsKICAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSk7CiAgICAgcnRCQm94LnRvcCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpKTsKICAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSk7CiAgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1heChtX0ZhY2UpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0SGVpZ2h0KCkgY29uc3QKIHsKQEAgLTE2NywxMCArMTY3LDEwIEBACiAgICAgfQogICAgIHJldHVybiBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4odWxTaXplKTsKIH0KLWJvb2wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKK0ZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKIHsKICAgICBpZiAoIXBGb250TWdyIHx8ICFwRm9udERlcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgc3dpdGNoIChwRm9udERlcy0+R2V0VHlwZSgpKSB7CiAgICAgICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9QYXRoOiB7CkBAIC0xODksMTYgKzE4OSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX2R3U3R5bGUgPSBkd1N0eWxlOwogICAgIG1fdUNoYXJzZXQgPSB1Q2hhcnNldDsKICAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7CiAgICAgbV9wRm9udERlcyA9IHBGb250RGVzOwogICAgIG1fZHdSZWZDb3VudCA9IDE7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaAppbmRleCA5MGNmNWNiLi40OTgxOWQ0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oCkBAIC0zOSwxMyArMzksMTMgQEAKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGVzY2VudCgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBib29sCQkJR2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCk7Ci0gICAgdmlydHVhbCBib29sCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goRlhfUkVDVCAmcnRCQm94KTsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SGVpZ2h0KCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnREYXRhKEZYX0RXT1JEIGR3VGFibGUsIHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgYm9vbAkJCQkJSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCk7CisgICAgRlhfQk9PTAkJCQkJSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCk7CiBwcm90ZWN0ZWQ6CiAgICAgQ0ZQRl9Ta2lhRm9udE1ncgkJKm1fcEZvbnRNZ3I7CiAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IJKm1fcEZvbnREZXM7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCmluZGV4IDhjODM1MzkuLjg2YmIwNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlID0gZmFsc2UpCitzdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpCiB7CiAgICAgaWYgKCFwU3RyKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMjA4LDI3ICsyMDgsMjcgQEAKICAgICAgICAgYnNGb250ICs9ICJTZXJpZiI7CiAgICAgfQogICAgIGJzRm9udCArPSB1Q2hhcnNldDsKLSAgICByZXR1cm4gRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoYnNGb250LmNfc3RyKCksIGJzRm9udC5HZXRMZW5ndGgoKSwgdHJ1ZSk7CisgICAgcmV0dXJuIEZQRl9HZXRIYXNoQ29kZV9TdHJpbmdBKGJzRm9udC5jX3N0cigpLCBic0ZvbnQuR2V0TGVuZ3RoKCksIFRSVUUpOwogfQotc3RhdGljIGJvb2wgRlBGX1NraWFJc0NKSyh1aW50OF90IHVDaGFyc2V0KQorc3RhdGljIEZYX0JPT0wgRlBGX1NraWFJc0NKSyh1aW50OF90IHVDaGFyc2V0KQogewogICAgIHJldHVybiAodUNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpCiAgICAgICAgICAgIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwogfQotc3RhdGljIGJvb2wgRlBGX1NraWFNYXliZVN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpCitzdGF0aWMgRlhfQk9PTCBGUEZfU2tpYU1heWJlU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBic0ZhY2VuYW1lOwogICAgIGJzTmFtZS5NYWtlTG93ZXIoKTsKICAgICByZXR1cm4gYnNOYW1lLkZpbmQoInN5bWJvbCIpID4gLTE7CiB9Ci1zdGF0aWMgYm9vbCBGUEZfU2tpYU1heWJlQXJhYmljKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkKK3N0YXRpYyBGWF9CT09MIEZQRl9Ta2lhTWF5YmVBcmFiaWMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKQogewogICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7CiAgICAgYnNOYW1lLk1ha2VMb3dlcigpOwogICAgIHJldHVybiBic05hbWUuRmluZCgiYXJhYmljIikgPiAtMTsKIH0KIENGUEZfU2tpYUZvbnRNZ3I6OkNGUEZfU2tpYUZvbnRNZ3IoKQotICAgIDogbV9iTG9hZGVkKGZhbHNlKSwgbV9GVExpYnJhcnkoTlVMTCkKKyAgICA6IG1fYkxvYWRlZChGQUxTRSksIG1fRlRMaWJyYXJ5KE5VTEwpCiB7CiB9CiBDRlBGX1NraWFGb250TWdyOjp+Q0ZQRl9Ta2lhRm9udE1ncigpCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKICAgICB9CiB9Ci1ib29sIENGUEZfU2tpYUZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKQorRlhfQk9PTCBDRlBGX1NraWFGb250TWdyOjpJbml0RlRMaWJyYXJ5KCkKIHsKICAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewogICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIH0KICAgICBTY2FuUGF0aChGWF9CU1RSQygiL3N5c3RlbS9mb250cyIpKTsKICAgICBPdXRwdXRTeXN0ZW1Gb250cygpOwotICAgIG1fYkxvYWRlZCA9IHRydWU7CisgICAgbV9iTG9hZGVkID0gVFJVRTsKIH0KIHZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KElGWF9GaWxlUmVhZCogcEZvbnRGaWxlKQogewpAQCAtMjg5LDcgKzI4OSw3IEBACiAgICAgRlhfRFdPUkQgZHdGYWNlTmFtZSA9IEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUoYnNGYW1pbHluYW1lKTsKICAgICBGWF9EV09SRCBkd1N1YnN0ID0gRlBGX1NraWFHZXRTdWJzdEZvbnQoZHdGYWNlTmFtZSk7CiAgICAgRlhfRFdPUkQgZHdTdWJzdFNhbnMgPSBGUEZfU2tpYUdldFNhbnNGb250KGR3RmFjZU5hbWUpOwotICAgIGJvb2wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOworICAgIEZYX0JPT0wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOwogICAgIGlmICh1Q2hhcnNldCAhPSBGWEZPTlRfQVJBQklDX0NIQVJTRVQgJiYgRlBGX1NraWFNYXliZUFyYWJpYyhic0ZhbWlseW5hbWUpKSB7CiAgICAgICAgIHVDaGFyc2V0ID0gRlhGT05UX0FSQUJJQ19DSEFSU0VUOwogICAgIH0gZWxzZSBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAoZHdNYXRjaCAmIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpKSB7CkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgaWYgKGR3RmFjZU5hbWUgPT0gZHdTeXNGb250TmFtZSkgewogICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMTsKICAgICAgICAgfQotICAgICAgICBib29sIGJNYXRjaGVkTmFtZSA9IChuRmluZCA9PSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxKTsKKyAgICAgICAgRlhfQk9PTCBiTWF0Y2hlZE5hbWUgPSAobkZpbmQgPT0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSk7CiAgICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSkgewogICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwogICAgICAgICB9CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoZHdTdWJzdCA9PSBkd1N5c0ZvbnROYW1lIHx8IGR3U3Vic3RTYW5zID09IGR3U3lzRm9udE5hbWUpIHsKICAgICAgICAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTI7Ci0gICAgICAgICAgICBiTWF0Y2hlZE5hbWUgPSB0cnVlOworICAgICAgICAgICAgYk1hdGNoZWROYW1lID0gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fCBiTWF5YmVTeW1ib2wpIHsKICAgICAgICAgICAgIGlmIChuRmluZCA+IG5NYXggJiYgYk1hdGNoZWROYW1lKSB7CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICBhcmdzLnBhdGhuYW1lID0gKEZUX1N0cmluZyopYnNGaWxlLkdldENTdHIoKTsKICAgICBGWEZUX0ZhY2UgZmFjZTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKICAgICByZXR1cm4gZmFjZTsKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgIGFyZ3MubWVtb3J5X3NpemUgPSBzekJ1ZmZlcjsKICAgICBGWEZUX0ZhY2UgZmFjZTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKICAgICByZXR1cm4gZmFjZTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOwotICAgIGJvb2wJYkZvbGRlciA9IGZhbHNlOworICAgIEZYX0JPT0wJYkZvbGRlciA9IEZBTFNFOwogICAgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsIGZpbGVuYW1lLCBiRm9sZGVyKSkgewogICAgICAgICBpZiAoYkZvbGRlcikgewogICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IEZYX0JTVFJDKCIuIikgfHwgZmlsZW5hbWUgPT0gRlhfQlNUUkMoIi4uIikpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaAppbmRleCBiNGViZTk0Li44YzcyMWZmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oCkBAIC05NCw3ICs5NCw3IEBACiBwdWJsaWM6CiAgICAgQ0ZQRl9Ta2lhRm9udE1ncigpOwogICAgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnRNZ3IoKTsKLSAgICBib29sCQkJCQlJbml0RlRMaWJyYXJ5KCk7CisgICAgRlhfQk9PTAkJCQkJSW5pdEZUTGlicmFyeSgpOwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRTeXN0ZW1Gb250cygpOwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSk7CiAgICAgdmlydHVhbCB2b2lkCQkJTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSk7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICB2b2lkCQkJCVNjYW5GaWxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZSk7CiAgICAgdm9pZAkJCQlSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnREZXNjKTsKICAgICB2b2lkCQkJCU91dHB1dFN5c3RlbUZvbnRzKCk7Ci0gICAgYm9vbAkJCQltX2JMb2FkZWQ7CisgICAgRlhfQk9PTAkJCQltX2JMb2FkZWQ7CiAgICAgQ0ZYX1B0ckFycmF5CQltX0ZvbnRGYWNlczsKICAgICBGWEZUX0xpYnJhcnkJCW1fRlRMaWJyYXJ5OwogICAgIENGWF9NYXBQdHJUb1B0cgkJbV9GYW1pbHlGb250czsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKaW5kZXggNGYyYmMxNS4uM2UyZmM0NSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKQEAgLTEwLDIwICsxMCwyMCBAQAogICAgIDogbV9wRm9udE1ncihOVUxMKQogewogfQotYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpJbml0KElGUEZfRm9udE1nciAqcEZvbnRNZ3IpCitGWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkluaXQoSUZQRl9Gb250TWdyICpwRm9udE1ncikKIHsKICAgICBpZiAoIXBGb250TWdyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwRm9udE1nci0+TG9hZFN5c3RlbUZvbnRzKCk7CiAgICAgbV9wRm9udE1nciA9IHBGb250TWdyOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitGWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBib29sJiBiRXhhY3QpCit2b2lkKiBDRlhfQW5kcm9pZEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKIHsKICAgICBpZiAoIW1fcEZvbnRNZ3IpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01NywyMSArNTcsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuICgoSUZQRl9Gb250KiloRm9udCktPkdldEZvbnREYXRhKHRhYmxlLCBidWZmZXIsIHNpemUpOwogfQotYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCitGWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKIHsKICAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBuYW1lID0gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0RmFtaWx5TmFtZSgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQorRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQogewogICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGNoYXJzZXQgPSAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRDaGFyc2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHZvaWQgQ0ZYX0FuZHJvaWRGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaAppbmRleCAwNzViNzllLi44M2MwNGEwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oCkBAIC0xOCwxOCArMTgsMTggQEAKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQogCi0gICAgdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKIAotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgYm9vbCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCk7CiAKICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotICAgIHZpcnR1YWwgYm9vbAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2aXJ0dWFsIGJvb2wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOwogCiAgICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKICAgICB2aXJ0dWFsIHZvaWQqICAgICAgIFJldGFpbkZvbnQodm9pZCogaEZvbnQpOwotICAgIGJvb2wJCQkJSW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKTsKKyAgICBGWF9CT09MCQkJCUluaXQoSUZQRl9Gb250TWdyICpwRm9udE1ncik7CiBwcm90ZWN0ZWQ6CiAgICAgSUZQRl9Gb250TWdyCQkqbV9wRm9udE1ncjsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaAppbmRleCAwZTZjOWQ2Li43MTVlNDhkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkKglDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSk7CiAgICAgdm9pZAlEZXN0cm95Rm9udCh2b2lkKiBwRm9udCk7CiAgICAgdm9pZAlzZXRHcmFwaGljc1RleHRNYXRyaXgodm9pZCogZ3JhcGhpY3MsIENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7Ci0gICAgYm9vbAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCisgICAgRlhfQk9PTAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICBmb250U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiAgICAgICAgICAgICBnbHlwaEluZGljZXMsCkBAIC05MiwyNiArOTIsMjYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJU3RhcnRSZW5kZXJpbmcoKQorICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAlFbmRSZW5kZXJpbmcoKSB7fQogICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCk7Ci0gICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOworICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBib29sCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC0xMjEsMzYgKzEyMSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgYm9vbAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIGJvb2wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBib29sCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBib29sCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICAgIHZpcnR1YWwgRlhfQk9PTAlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotICAgIHZpcnR1YWwgYm9vbAlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBGWF9CT09MCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCisgICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIHt9Ci0gICAgdmlydHVhbCBib29sIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorICAgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgIENsZWFyRHJpdmVyKCk7CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICB2b2lkIHNldEZpbGxJbmZvKEZYX0FSR0IgYXJnYik7CiAgICAgdm9pZCBzZXRQYXRoVG9Db250ZXh0KGNvbnN0IENGWF9QYXRoRGF0YSAqIHBhdGhEYXRhKTsKICAgICBGWF9GTE9BVCBnZXRMaW5lV2lkdGgoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhICogZ3JhcGhTdGF0ZSwgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtKTsKLSAgICBib29sIENHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKKyAgICBGWF9CT09MIENHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICAgIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqICAgICAgICAgICAgICAgICAgcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCkBAIC0xOTUsOSArMTk1LDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpX3RvdGFsU2l6ZTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpIG92ZXJyaWRlCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIF9vZmZTZXQgPT0gX3RvdGFsU2l6ZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCmluZGV4IDlmNDcxMmIuLjlkYjgwN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCkBAIC0zOSw3ICszOSw3IEBACiB7CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgYm9vbCBfQ0dEcmF3R2x5cGhSdW4oQ0dDb250ZXh0UmVmICAgICAgICAgICAgICAgcENvbnRleHQsCitzdGF0aWMgRlhfQk9PTCBfQ0dEcmF3R2x5cGhSdW4oQ0dDb250ZXh0UmVmICAgICAgICAgICAgICAgcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICAgIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LApAQCAtNTEsMTAgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXg7Ci0gICAgYm9vbCBiTmVnU2l6ZSA9IGZvbnRfc2l6ZSA8IDA7CisgICAgRlhfQk9PTCBiTmVnU2l6ZSA9IGZvbnRfc2l6ZSA8IDA7CiAgICAgaWYgKGJOZWdTaXplKSB7CiAgICAgICAgIGZvbnRfc2l6ZSA9IC1mb250X3NpemU7CiAgICAgfQpAQCAtNjYsMTEgKzY2LDExIEBACiAgICAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CiAgICAgaWYgKCFwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7CiAgICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgPT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiREZIZWlTdGQtVzUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHBGb250LT5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5tX3BGb250RGF0YSwgcEZvbnQtPm1fZHdTaXplKTsKICAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfV09SRCwgMzI+IGdseXBoX2luZGljZXMobkNoYXJzKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiB9CiBzdGF0aWMgdm9pZCBfRG9Ob3RoaW5nKHZvaWQgKmluZm8sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7fQotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAogICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqCSBwQ2hhclBvcywKICAgICAgICAgQ0ZYX0ZvbnQgKgkJCQkgcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUgKgkJCSBwQ2FjaGUsCkBAIC0xMTEsMjIgKzExMSwyMiBAQAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoIXBGb250KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBib29sIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOworICAgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CiAgICAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCiAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkgKyspIHsKICAgICAgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgQ0dDb250ZXh0UmVmIGN0eCA9IENHQ29udGV4dFJlZihtX3BQbGF0Zm9ybUdyYXBoaWNzKTsKICAgICBpZiAoTlVMTCA9PSBjdHgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY3R4KTsKICAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoY3R4LCBrQ0dUZXh0RmlsbENsaXApOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgICAgICBDR0Zsb2F0IGRlY29kZV9mWzJdID0gezI1NS5mLCAwLmZ9OwogICAgICAgICAgICAgcEltYWdlQ0cgPSBDR0ltYWdlTWFza0NyZWF0ZShwQ2xpcE1hc2stPkdldFdpZHRoKCksIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIHBDbGlwTWFzay0+R2V0UGl0Y2goKSwgcENsaXBNYXNrRGF0YVByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZiwgRkFMU0UpOwogICAgICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBDbGlwTWFza0RhdGFQcm92aWRlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjdHgsIHJlY3RfY2cpOwogICAgIH0KLSAgICBib29sIHJldCA9IF9DR0RyYXdHbHlwaFJ1bihjdHgsIG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGFyZ2IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIEZYX0JPT0wgcmV0ID0gX0NHRHJhd0dseXBoUnVuKGN0eCwgbkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgYXJnYiwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgaWYgKHBJbWFnZUNHKSB7CiAgICAgICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZUNHKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcAppbmRleCA1ZTU5MDhiLi4wNGIwNGI4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzIENGWF9NYWNGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgYm9vbCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgRlhfQk9PTCYgYkV4YWN0KTsKIH07CiAjZGVmaW5lIEpBUEFOX0dPVEhJQyAiSGlyYWdpbm8gS2FrdSBHb3RoaWMgUHJvIFc2IgogI2RlZmluZSBKQVBBTl9NSU5DSE8gIkhpcmFnaW5vIE1pbmNobyBQcm8gVzYiCkBAIC00NCwxNCArNDQsMTQgQEAKICAgICAgICAgZmFjZSA9IEpBUEFOX01JTkNITzsKICAgICB9CiB9Ci12b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBib29sJiBiRXhhY3QpCit2b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBGWF9CT09MJiBiRXhhY3QpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKICAgICBpbnQgaUJhc2VGb250OwogICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKICAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7CiAgICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgYkV4YWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJFeGFjdCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKaW5kZXggOGFhNjg5Zi4uZDFlNGY1NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSkpOwogfQotYm9vbCBDUXVhcnR6MkQ6OmRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MsCitGWF9CT09MIENRdWFydHoyRDo6ZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqICAgICAgICAgICAgICAgICBncmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgIGZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICBmb250U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogICAgICAgICAgICAgIGdseXBoSW5kaWNlcywKQEAgLTg2LDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogICAgIG1hdHJpeCApCiB7CiAgICAgaWYgKCFncmFwaGljcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKSBncmFwaGljczsKICAgICBDR0NvbnRleHRTZXRGb250KGNvbnRleHQsIChDR0ZvbnRSZWYpZm9udCk7CkBAIC0xMTMsNyArMTEzLDcgQEAKICNpZiBDR0ZMT0FUX0lTX0RPVUJMRQogICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSBuZXcgQ0dQb2ludFtjaGFyc0NvdW50XTsKICAgICBpZiAoIWdseXBoUG9zaXRpb25zQ0cpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFyc0NvdW50OyArK2luZGV4KSB7CiAgICAgICAgIGdseXBoUG9zaXRpb25zQ0dbaW5kZXhdLnggPSBnbHlwaFBvc2l0aW9uc1tpbmRleF0ueDsKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgIGRlbGV0ZVtdIGdseXBoUG9zaXRpb25zQ0c7CiAjZW5kaWYKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDUXVhcnR6MkQ6OnNhdmVHcmFwaGljc1N0YXRlKHZvaWQgKiBncmFwaGljcykKIHsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOwogICAgIG1fc2F2ZUNvdW50Kys7CiB9Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShib29sIGlzS2VlcFNhdmVkICkKK3ZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgaXNLZWVwU2F2ZWQgKQogewogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwogICAgIGlmIChpc0tlZXBTYXZlZCkgewpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgICAgIG1fc2F2ZUNvdW50LS07CiAgICAgfQogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogICAgcGF0aERhdGEsCitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICBtYXRyaXgsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUgKQogewpAQCAtMjcyLDEzICsyNzIsMTMgQEAKICAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOwogICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7CiAgICAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7Ci0gICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwogICAgIGlmICgoZmlsbE1vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewogICAgICAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKICAgICB9IGVsc2UgewogICAgICAgICBDR0NvbnRleHRFT0NsaXAoX2NvbnRleHQpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIEZYX0ZMT0FUIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OmdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pCiB7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGxpbmVXaWR0aDsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICBwYXRoRGF0YSwKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgIG1hdHJpeCwKICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiAgIGdyYXBoU3RhdGUgKQogewpAQCAtMzA5LDkgKzMwOSw5IEBACiAgICAgc2V0U3Ryb2tlSW5mbyhncmFwaFN0YXRlLCAweEZGMDAwMDAwLCBsaW5lV2lkdGgpOwogICAgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOwogICAgIENHQ29udGV4dFJlcGxhY2VQYXRoV2l0aFN0cm9rZWRQYXRoKF9jb250ZXh0KTsKLSAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CiAgICAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBzdGF0aWMgQ0dCbGVuZE1vZGUgR2V0Q0dCbGVuZE1vZGUoaW50IGJsZW5kX3R5cGUpCiB7CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1vZGU7CiB9Ci1ib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICAgIHBhdGhEYXRhLAorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqICAgICAgICBwYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgICAgbWF0cml4LAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqICAgICBncmFwaFN0YXRlLAogICAgICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICBmaWxsQXJnYiwKQEAgLTQyMywxMCArNDIzLDEwIEBACiAgICAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA2KSB7CiAgICAgICAgIENHQ29udGV4dERyYXdQYXRoKF9jb250ZXh0LCBrQ0dQYXRoRU9GaWxsU3Ryb2tlKTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiAgICAgICAgIHJlY3QsCitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqICAgICAgICAgcmVjdCwKICAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgICAgICBmaWxsQXJnYiwKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUZsYWcJICAgLAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIGljY1RyYW5zZm9ybSAsCkBAIC00NDksOSArNDQ5LDkgQEAKICAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKICAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCAgICAgICAgICAgeDEsCitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgICAgICAgICAgIHgxLAogICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgeTEsCiAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICB4MiwKICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIHkyLApAQCAtNDgzLDkgKzQ4Myw5IEBACiAgICAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CiAgICAgICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcmVjdCkKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiByZWN0KQogewogICAgIENHUmVjdCByID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KF9jb250ZXh0KTsKICAgICByID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ociwgX3VzZXIyRm94aXREZXZpY2UpOwpAQCAtNDkzLDIyICs0OTMsMjIgQEAKICAgICByZWN0LT50b3AJCT0gRlhTWVNfZmxvb3Ioci5vcmlnaW4ueSk7CiAgICAgcmVjdC0+cmlnaHQJCT0gRlhTWVNfY2VpbChyLm9yaWdpbi54ICsgci5zaXplLndpZHRoKTsKICAgICByZWN0LT5ib3R0b20JPSBGWFNZU19jZWlsKHIub3JpZ2luLnkgKyByLnNpemUuaGVpZ2h0KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogICAgIGJpdG1hcCwKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogICAgIGJpdG1hcCwKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIGxlZnQsCiAgICAgICAgIGludDMyX3QgICAgICAgICAgICB0b3AsCiAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgIGJvb2wgYkRFZGdlKQorICAgICAgICBGWF9CT09MIGJERWRnZSkKIHsKICAgICBpZiAoRlhEQ19QUklOVEVSID09IF9kZXZpY2VDbGFzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGJpdG1hcC0+R2V0QlBQKCkgPCAzMikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCEoX3JlbmRlckNhcHMgfCBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0dQb2ludCBwdCA9IENHUG9pbnRNYWtlKGxlZnQsIHRvcCk7CiAgICAgcHQgPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocHQsIF9mb3hpdERldmljZTJVc2VyKTsKQEAgLTUxNyw3ICs1MTcsNyBAQAogICAgIHB0LnkgKj0gRlhTWVNfZmFicyhjdG0uZCk7CiAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKICAgICBpZiAoTlVMTCA9PSBpbWFnZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0dGbG9hdCB3aWR0aAk9IChDR0Zsb2F0KSBiaXRtYXAtPkdldFdpZHRoKCk7CiAgICAgQ0dGbG9hdCBoZWlnaHQJPSAoQ0dGbG9hdCkgYml0bWFwLT5HZXRIZWlnaHQoKTsKQEAgLTU1Miw5ICs1NTIsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAogICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgICAgYXJnYiwKICAgICAgICAgY29uc3QgRlhfUkVDVCogICAgICAgICAgICAgIHNyY1JlY3QsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlZnQsCkBAIC01OTgsOCArNTk4LDggQEAKICAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QnVmZmVyKCksCkBAIC02MjksOCArNjI5LDggQEAKICAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CiAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKQEAgLTY0MiwxNSArNjQyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcEJpdG1hcDEpIHsKLSAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewogICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CkBAIC02ODIsMTAgKzY4MiwxMCBAQAogICAgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqICAgICAgcEJpdG1hcCwKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiAgICAgIHBCaXRtYXAsCiAgICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICAgICAgICBhcmdiLAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9sZWZ0LAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF90b3AsCkBAIC03MjMsOCArNzIzLDggQEAKICAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QnVmZmVyKCksCkBAIC03NTQsOCArNzU0LDggQEAKICAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CiAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKQEAgLTc2NywxNSArNzY3LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKE5VTEwgPT0gcEJpdG1hcDEpIHsKLSAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewogICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CkBAIC03OTYsMTAgKzc5NiwxMCBAQAogICAgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpDR19EcmF3R2x5cFJ1bihpbnQgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMsCitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCiAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LAogICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCkBAIC04MTEsMTYgKzgxMSwxNiBAQAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChuQ2hhcnMgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwogICAgIGlmICghcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewogICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7CiAgICAgICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7CkBAIC04NzIsMTAgKzg3MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0dHbHlwaCopZ2x5cGhfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMpOwotICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50ICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50ICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgIHBDaGFyUG9zLAogICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICBwQ2FjaGUsCkBAIC04ODYsMjQgKzg4NiwyNCBAQAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoTlVMTCA9PSBwRm9udCB8fCBOVUxMID09IF9jb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBib29sIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOworICAgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CiAgICAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCiAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgU2F2ZVN0YXRlKCk7CiAgICAgQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlKF9jb250ZXh0LCBrQ0dUZXh0RmlsbENsaXApOwotICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKICAgICBpbnQzMl90IGkgPSAwOwogICAgIHdoaWxlIChpIDwgbkNoYXJzKSB7CiAgICAgICAgIGlmIChwQ2hhclBvc1tpXS5tX2JHbHlwaEFkanVzdCB8fCBmb250X3NpemUgPCAwKSB7CiAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtOTIwLDcgKzkyMCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bigxLCBjaGFyX3BvcywgcEZvbnQsIHBDYWNoZSwgJmdscGh5X21hdHJpeCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgKys7CkBAIC05MzQsNyArOTM0LDcgQEAKICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgcmV0ID0gQ0dfRHJhd0dseXBSdW4oaSwgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIE5VTEwsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwogICAgIHJldHVybiByZXQ7CiB9CiB2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLCBGWF9BUkdCIGFyZ2IsIEZYX0ZMT0FUIGxpbmVXaWR0aCkKQEAgLTEwNzQsNyArMTA3NCw3IEBACiB9CiBDRlhfUXVhcnR6RGV2aWNlOjpDRlhfUXVhcnR6RGV2aWNlKCkKIHsKLSAgICBtX2JPd25lZEJpdG1hcCA9IGZhbHNlOworICAgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7CiAgICAgbV9wQ29udGV4dCA9IE5VTEw7CiB9CiBDRlhfUXVhcnR6RGV2aWNlOjp+Q0ZYX1F1YXJ0ekRldmljZSgpCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogewogICAgIHJldHVybiBtX3BDb250ZXh0OwogfQotYm9vbCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzKQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgbkRldmljZUNsYXNzKQogewogICAgIGlmIChtX3BDb250ZXh0KSB7CiAgICAgICAgIENHQ29udGV4dFJlbGVhc2UobV9wQ29udGV4dCk7CkBAIC0xMDk5LDMwICsxMDk5LDMwIEBACiAgICAgQ0dDb250ZXh0UmV0YWluKG1fcENvbnRleHQpOwogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBuRGV2aWNlQ2xhc3MpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKIHsKICAgICBTZXRCaXRtYXAocEJpdG1hcCk7CiAgICAgbV9wQ29udGV4dCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKHBCaXRtYXApOwogICAgIGlmIChOVUxMID09IG1fcENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBGWERDX0RJU1BMQVkpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1F1YXJ0ekRldmljZTo6Q3JlYXRlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0KQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCiB7CiAgICAgaWYgKCh1aW50OF90KWZvcm1hdCA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX2JPd25lZEJpdG1hcCA9IHRydWU7CisgICAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOwogICAgIHJldHVybiBBdHRhY2gocEJpdG1hcCk7CiB9CiAjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oIGIvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oCmluZGV4IGE2ODM0ZmQuLjgyNWNhYmUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IGZsYWdzKTsKICAgICB+Q1N0cmV0Y2hFbmdpbmUoKTsKLSAgICBib29sCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgRlhfQk9PTAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogcHVibGljOgogICAgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CiAgICAgaW50CQltX0Rlc3RCcHAsIG1fU3JjQnBwLCBtX2JIYXNBbHBoYTsKQEAgLTg0LDggKzg0LDggQEAKICAgICBpbnQgCW1fRmxhZ3M7CiAgICAgQ1dlaWdodFRhYmxlCW1fV2VpZ2h0VGFibGU7CiAgICAgaW50CQltX0N1clJvdzsKLSAgICBib29sCVN0YXJ0U3RyZXRjaEhvcnooKTsKLSAgICBib29sCUNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIEZYX0JPT0wJU3RhcnRTdHJldGNoSG9yeigpOworICAgIEZYX0JPT0wJQ29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgdm9pZAlTdHJldGNoVmVydCgpOwogICAgIGludAkJbV9TdGF0ZTsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCmluZGV4IDlmNDU0Y2MuLmNiOTlhMzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CkBAIC00NjcsNyArNDY3LDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CkBAIC01NTgsNyArNTU4LDcgQEAKICAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTYwNSw3ICs2MDUsNyBAQAogICAgIH0KICAgICBpZiAoYmxlbmRfdHlwZSkgewogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwogICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewpAQCAtNjg5LDcgKzY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IDA7CkBAIC04OTYsNyArODk2LDcgQEAKICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtOTU3LDcgKzk1Nyw3IEBACiAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKQEAgLTExMjEsNyArMTEyMSw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKQEAgLTEyNDMsNyArMTI0Myw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtMTM1Nyw3ICsxMzU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7CiAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKQEAgLTE0ODcsNyArMTQ4Nyw3IEBACiAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIDEpOwpAQCAtMTYzMCw3ICsxNjMwLDcgQEAKIHsKICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKQEAgLTE2NjgsNyArMTY2OCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIHsKICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKQEAgLTE3NzgsNyArMTc3OCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTgzNiw3ICsxODM2LDcgQEAKICAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwogICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKQEAgLTE4NzAsNyArMTg3MCw3IEBACiAgICAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKICAgICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgdWludDhfdCBncmF5ID0gKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgPyBzZXRfZ3JheSA6IHJlc2V0X2dyYXk7CkBAIC0yNzg3LDcgKzI3ODcsNyBAQAogdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CiAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKQEAgLTI4NDQsNyArMjg0NCw3IEBACiB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCkKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CkBAIC0yODgxLDcgKzI4ODEsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CkBAIC0yOTI4LDcgKzI5MjgsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CkBAIC0yOTk1LDcgKzI5OTUsNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwpAQCAtMzAzOSw3ICszMDM5LDcgQEAKIGlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwogICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKICAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwpAQCAtMzQ5NSw3ICszNDk1LDcgQEAKICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKICAgICB9CiB9Ci1pbmxpbmUgYm9vbCBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VNYXNrKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgaW50IGFscGhhX2ZsYWcsIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCYgbWFza19hbHBoYSwKK2lubGluZSBGWF9CT09MIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBpbnQgYWxwaGFfZmxhZywgRlhfRFdPUkQgbWFza19jb2xvciwgaW50JiBtYXNrX2FscGhhLAogICAgICAgICBpbnQmIG1hc2tfcmVkLCBpbnQmIG1hc2tfZ3JlZW4sIGludCYgbWFza19ibHVlLCBpbnQmIG1hc2tfYmxhY2ssCiAgICAgICAgIHZvaWQqIGljY19tb2R1bGUsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0zNTEzLDcgKzM1MTMsNyBAQAogICAgICAgICBtYXNrX2JsdWUgPSBGWEFSR0JfQihtYXNrX2NvbG9yKTsKICAgICB9CiAgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTM1NTAsMTUgKzM1NTAsMTUgQEAKICAgICAgICAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGlubGluZSB2b2lkIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKICAgICAgICAgRlhfRFdPUkQqJiBwRGVzdFBhbGV0dGUsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKICAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7Ci0gICAgYm9vbCBpc1NyY0NteWsgPSBzcmNfZm9ybWF0ICYgMHgwNDAwID8gdHJ1ZSA6IGZhbHNlOwotICAgIGJvb2wgaXNEc3RDbXlrID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyB0cnVlIDogZmFsc2U7CisgICAgRlhfQk9PTCBpc1NyY0NteWsgPSBzcmNfZm9ybWF0ICYgMHgwNDAwID8gVFJVRSA6IEZBTFNFOworICAgIEZYX0JPT0wgaXNEc3RDbXlrID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyBUUlVFIDogRkFMU0U7CiAgICAgcERlc3RQYWxldHRlID0gTlVMTDsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgICAgICBpZiAocFNyY1BhbGV0dGUpIHsKQEAgLTM2NzksNyArMzY3OSw3IEBACiAgICAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7CiAgICAgbV9wQ2FjaGVTY2FubGluZSA9IE5VTEw7CiAgICAgbV9DYWNoZVNpemUgPSAwOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGZhbHNlOworICAgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogfQogQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6fkNGWF9TY2FubGluZUNvbXBvc2l0b3IoKQpAQCAtMzY5MSw4ICszNjkxLDggQEAKICAgICAgICAgRlhfRnJlZShtX3BDYWNoZVNjYW5saW5lKTsKICAgICB9CiB9Ci1ib29sIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCBibGVuZF90eXBlLCBib29sIGJDbGlwLCBib29sIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorRlhfQk9PTCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIGludDMyX3Qgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgRlhfQk9PTCBiQ2xpcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBtX1NyY0Zvcm1hdCA9IHNyY19mb3JtYXQ7CiAgICAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7CkBAIC0zNzA3LDcgKzM3MDcsNyBAQAogICAgIH0KICAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwogICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfMWJwcE1hc2sgfHwgbV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKICAgICAgICAgcmV0dXJuIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soZGVzdF9mb3JtYXQsIGFscGhhX2ZsYWcsIG1hc2tfY29sb3IsCkBAIC0zNzE1LDExICszNzE1LDExIEBACiAgICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7CiAgICAgfQogICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwgJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPD0gOCkgewogICAgICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlUGFsZXR0ZShzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCwgbV9wU3JjUGFsZXR0ZSwgcFNyY1BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7CkBAIC0zNzI3LDcgKzM3MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMiA6IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyA0IDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgICArICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgPyA4IDogMCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgbV9UcmFuc3BhcmVuY3kgPSAoc3JjX2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAxKQogICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAwIDogMikKQEAgLTM3MzYsNyArMzczNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICArIChzcmNfZm9ybWF0ICYgMHgwNDAwID8gMTYgOiAwKQogICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyAzMiA6IDApCiAgICAgICAgICAgICAgICAgICAgICArIChwSWNjVHJhbnNmb3JtID8gNjQgOiAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUmdiQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLCB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpCkBAIC00MDU5LDIyICs0MDU5LDIyIEBACiAgICAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CiB9Ci1ib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgYm9vbCBiUmdiQnl0ZU9yZGVyLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBBU1NFUlQoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwogICAgIEFTU0VSVChtX2JwcCA+PSA4KTsKICAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAtPkdldFdpZHRoKCksIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IE5VTEw7CiAgICAgRlhfUkVDVCBjbGlwX2JveDsKQEAgLTQwODYsMTEgKzQwODYsMTEgQEAKICAgICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7CiAgICAgaWYgKCFjb21wb3NpdG9yLkluaXQoR2V0Rm9ybWF0KCksIHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpLCB3aWR0aCwgcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpLCAwLCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCAwLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGRlc3RfQnBwID0gbV9icHAgLyA4OwogICAgIGludCBzcmNfQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIGJvb2wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOworICAgIEZYX0JPT0wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOwogICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewogICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIGRlc3RfQnBwOwpAQCAtNDEwNywyNyArNDEwNywyNyBAQAogICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBzcmNfc2Nhbl9leHRyYV9hbHBoYSwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGJvb2wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKICAgICBBU1NFUlQobV9icHAgPj0gOCk7CiAgICAgaWYgKCFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBNYXNrLT5HZXRXaWR0aCgpLCBwTWFzay0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpbnQgc3JjX2FscGhhID0gKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gTlVMTDsKICAgICBGWF9SRUNUIGNsaXBfYm94OwpAQCAtNDE0MCw3ICs0MTQwLDcgQEAKICAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwogICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKICAgICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcE1hc2stPkdldEZvcm1hdCgpLCB3aWR0aCwgTlVMTCwgY29sb3IsIGJsZW5kX3R5cGUsIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7CkBAIC00MTU2LDIxICs0MTU2LDIxIEBACiAgICAgICAgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZUJ5dGVNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuICsgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBzcmNfYWxwaGEgPSAoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOwogICAgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICB3aWR0aCA9IHJlY3QuV2lkdGgoKTsKICAgICBGWF9EV09SRCBkc3RfY29sb3I7CkBAIC00MjEwLDcgKzQyMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fYnBwID09IDEpIHsKICAgICAgICAgQVNTRVJUKCFJc0NteWtJbWFnZSgpICYmICh1aW50OF90KShhbHBoYV9mbGFnID4+IDgpID09IDApOwpAQCAtNDI0OCwxMSArNDI0OCwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEFTU0VSVChtX2JwcCA+PSAyNCk7CiAgICAgaWYgKG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkpIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwpAQCAtNDI2MiwxNSArNDI2MiwxNSBAQAogICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7CiAgICAgICAgIGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoIUlzQ215a0ltYWdlKCkpIHsKICAgICAgICAgY29sb3JfcFszXSA9ICh1aW50OF90KXNyY19hbHBoYTsKICAgICB9CiAgICAgaW50IEJwcCA9IG1fYnBwIC8gODsKLSAgICBib29sIGJBbHBoYSA9IEhhc0FscGhhKCk7Ci0gICAgYm9vbCBiQXJnYiA9IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyB0cnVlIDogZmFsc2U7CisgICAgRlhfQk9PTCBiQWxwaGEgPSBIYXNBbHBoYSgpOworICAgIEZYX0JPT0wgYkFyZ2IgPSBHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiID8gVFJVRSA6IEZBTFNFOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7CiAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwpAQCAtNDI5MSw3ICs0MjkxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewogICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwpAQCAtNDM0Niw3ICs0MzQ2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENGWF9CaXRtYXBDb21wb3Nlcjo6Q0ZYX0JpdG1hcENvbXBvc2VyKCkKIHsKQEAgLTQzNTQsNyArNDM1NCw3IEBACiAgICAgbV9wU2NhbmxpbmVBbHBoYVYgPSBOVUxMOwogICAgIG1fcENsaXBTY2FuViA9IE5VTEw7CiAgICAgbV9wQWRkQ2xpcFNjYW4gPSBOVUxMOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGZhbHNlOworICAgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOwogICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwogfQogQ0ZYX0JpdG1hcENvbXBvc2VyOjp+Q0ZYX0JpdG1hcENvbXBvc2VyKCkKQEAgLTQzNzMsOCArNDM3Myw4IEBACiAgICAgfQogfQogdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgRlhfUkVDVCYgZGVzdF9yZWN0LCBib29sIGJWZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLCBib29sIGJGbGlwWSwgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgRlhfUkVDVCYgZGVzdF9yZWN0LCBGWF9CT09MIGJWZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIG1fcEJpdG1hcCA9IHBEZXN0OwpAQCAtNDM5NywxMiArNDM5NywxMiBAQAogICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CiAgICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwogfQotYm9vbCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQorRlhfQk9PTCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQogewogICAgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKICAgICBpZiAoIW1fQ29tcG9zaXRvci5Jbml0KG1fcEJpdG1hcC0+R2V0Rm9ybWF0KCksIHNyY19mb3JtYXQsIHdpZHRoLCBwU3JjUGFsZXR0ZSwgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrICE9IE5VTEwgfHwgKG1fQml0bWFwQWxwaGEgPCAyNTUpLCBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9iVmVydGljYWwpIHsKICAgICAgICAgbV9wU2NhbmxpbmVWID0gRlhfQWxsb2ModWludDhfdCwgbV9wQml0bWFwLT5HZXRCUFAoKSAvIDggKiB3aWR0aCArIDQpOwpAQCAtNDQxNCw3ICs0NDE0LDcgQEAKICAgICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgewogICAgICAgICBtX3BBZGRDbGlwU2NhbiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fYlZlcnRpY2FsID8gbV9wQml0bWFwLT5HZXRIZWlnaHQoKSA6IG1fcEJpdG1hcC0+R2V0V2lkdGgoKSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkRvQ29tcG9zZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgZGVzdF93aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcAppbmRleCA3ZTVhMDM0Li5kNzg2MGFlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICBDRlhfUGFsZXR0ZSgpOwogICAgIH5DRlhfUGFsZXR0ZSgpOwogcHVibGljOgotICAgIGJvb2wgICAgICBCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGR3UGFsZXR0ZVR5cGUpOworICAgIEZYX0JPT0wgICAgICBCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGR3UGFsZXR0ZVR5cGUpOwogICAgIEZYX0RXT1JEKiAgICBHZXRQYWxldHRlKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BQYWxldHRlOwpAQCAtMjI3LDEwICsyMjcsMTAgQEAKICAgICB9CiAgICAgbV9sdXQgPSAwOwogfQotYm9vbCBDRlhfUGFsZXR0ZTo6QnVpbGRQYWxldHRlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBwYWxfdHlwZSkKK0ZYX0JPT0wgQ0ZYX1BhbGV0dGU6OkJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgcGFsX3R5cGUpCiB7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fcFBhbGV0dGUgIT0gTlVMTCkgewogICAgICAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOwpAQCAtMjc3LDkgKzI3Nyw5IEBACiAgICAgICAgIHdpbl9tYWNfcGFsID0gKEZYX0RXT1JEKilnX2R3TWFjUGFsZXR0ZTsKICAgICB9CiAgICAgX09idGFpbl9QYWwobV9hTHV0LCBtX2NMdXQsIG1fcFBhbGV0dGUsIHBhbF90eXBlLCB3aW5fbWFjX3BhbCwgbV9sdXQpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKQEAgLTI5Niw5ICsyOTYsOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICsrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKQEAgLTMwNiw5ICszMDYsOSBAQAogICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7CiAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CkBAIC0zNTksOSArMzU5LDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwpAQCAtNDAyLDkgKzQwMiw5IEBACiAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5WypzcmNfc2NhbisrXTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfUmdiT3JDbXlrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBCcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CkBAIC00NTEsNyArNDUxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGlubGluZSB2b2lkIF9Db252ZXJ0QnVmZmVyX0luZGV4Q29weSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9QbHQyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CkBAIC01MTUsOSArNTE1LDkgQEAKICAgICAgICAgICAgIEZYU1lTX21lbWNweShkc3RfcGx0LCBzcmNfcGx0LCBwbHRfc2l6ZSAqIDQpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotaW5saW5lIGJvb2wgX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitpbmxpbmUgRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQpCiB7CiAgICAgaW50IGJwcCA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKQEAgLTUyNyw3ICs1MjcsNyBAQAogICAgIEZYX0RXT1JEKiBjTHV0ID0gcGFsZXR0ZS5HZXRDb2xvckx1dCgpOwogICAgIEZYX0RXT1JEKiBhTHV0ID0gcGFsZXR0ZS5HZXRBbW91bnRMdXQoKTsKICAgICBpZiAoY0x1dCA9PSBOVUxMIHx8IGFMdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGx1dCA9IHBhbGV0dGUuR2V0bHV0KCk7CiAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gcGFsZXR0ZS5HZXRQYWxldHRlKCk7CkBAIC01NzEsMTIgKzU3MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIEZYU1lTX21lbWNweShkc3RfcGx0LCBwUGFsZXR0ZSwgc2l6ZW9mKEZYX0RXT1JEKSAqIDI1Nik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7Ci0gICAgYm9vbCByZXQgPSBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRzdF9wbHQpOworICAgIEZYX0JPT0wgcmV0ID0gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0oZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkc3RfcGx0KTsKICAgICBpZiAocmV0ICYmIHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CkBAIC01ODgsNyArNTg4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CkBAIC02MTEsOSArNjExLDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCiB7CiAgICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CkBAIC02MjksOSArNjI5LDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwpAQCAtNjc2LDkgKzY3Niw5IEBACiAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKQEAgLTcyMiw5ICs3MjIsOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzI0YnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CkBAIC03NDEsOSArNzQxLDkgQEAKICAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCAqIDMpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKQEAgLTc2Myw5ICs3NjMsOSBAQAogICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBkZXN0X3NjYW4sIHdpZHRoKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgX0NvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBjb21wcyA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKQEAgLTc5Myw5ICs3OTMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBfQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTgyMSw5ICs4MjEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitGWF9CT09MIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRComIGRfcGFsLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CkBAIC04MzUsOCArODM1LDggQEAKICAgICAgICAgY2FzZSBGWERJQl8xYnBwQ215azoKICAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKICAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKQEAgLTg1Myw3ICs4NTMsNyBAQAogICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYmE6IHsKQEAgLTg2Nyw3ICs4NjcsNyBAQAogICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGFsLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBGWERJQl9SZ2I6CiAgICAgICAgIGNhc2UgRlhESUJfUmdiYTogewpAQCAtODg5LDcgKzg4OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoKICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogewpAQCAtOTExLDEyICs5MTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiBDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwLCB2b2lkKiBwSWNjVHJhbnNmb3JtKSBjb25zdAogewpAQCAtOTM5LDcgKzkzOSw3IEBACiAgICAgICAgIGRlbGV0ZSBwQ2xvbmU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBib29sIHJldCA9IHRydWU7CisgICAgRlhfQk9PTCByZXQgPSBUUlVFOwogICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhID0gTlVMTDsKICAgICBpZiAobV9BbHBoYUZsYWcgJiAyKSB7CiAgICAgICAgIHBTcmNBbHBoYSA9IChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSA/IEdldEFscGhhTWFzaygpIDogbV9wQWxwaGFNYXNrOwpAQCAtOTgxLDE1ICs5ODEsMTUgQEAKICAgICB9CiAgICAgcmV0dXJuIHBDbG9uZTsKIH0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IEdldEZvcm1hdCgpOwogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0ICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzayAmJiBzcmNfZm9ybWF0ID09IEZYRElCXzhicHBSZ2IgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7CiAgICAgICAgIG1fQWxwaGFGbGFnID0gMTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiAmJiBzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewogICAgICAgICBtX0FscGhhRmxhZyA9IDI7CkBAIC0xMDAwLDEzICsxMDAwLDEzIEBACiAgICAgICAgICAgICAgICAgc2NhbmxpbmUgKz0gNDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGludCBkZXN0X2JwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKICAgICBpbnQgZGVzdF9waXRjaCA9IChkZXN0X2JwcCAqIG1fV2lkdGggKyAzMSkgLyAzMiAqIDQ7CiAgICAgdWludDhfdCogZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X3BpdGNoICogbV9IZWlnaHQgKyA0KTsKICAgICBpZiAoZGVzdF9idWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gTlVMTDsKICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgewpAQCAtMTAyNiwxMyArMTAyNiwxMyBAQAogICAgICAgICAgICAgcEFscGhhTWFzayA9IEdldEFscGhhTWFzaygpOwogICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2sgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobV9wQWxwaGFNYXNrID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIUJ1aWxkQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOwogICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7CkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKICAgICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOwogICAgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCBtX1dpZHRoLCBtX0hlaWdodCwgdGhpcywgMCwgMCwgcGFsXzhicHAsIHBJY2NUcmFuc2Zvcm0pOwogICAgIGlmICghcmV0KSB7CkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogICAgICAgICBpZiAoZGVzdF9idWYpIHsKICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wQWxwaGFNYXNrICYmIHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKSB7CiAgICAgICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CkBAIC0xMDY3LDEwICsxMDY3LDEwIEBACiAgICAgaWYgKCFtX2JFeHRCdWYpIHsKICAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwogICAgIH0KLSAgICBtX2JFeHRCdWYgPSBmYWxzZTsKKyAgICBtX2JFeHRCdWYgPSBGQUxTRTsKICAgICBtX3BCdWZmZXIgPSBkZXN0X2J1ZjsKICAgICBtX2JwcCA9ICh1aW50OF90KWRlc3RfZm9ybWF0OwogICAgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGRlc3RfZm9ybWF0ID4+IDgpOwogICAgIG1fUGl0Y2ggPSBkZXN0X3BpdGNoOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAppbmRleCBmMTQzYWMzLi43MzkwYzQzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgICBtX1NyY1BpdGNoID0gKG1fU3JjV2lkdGggKiBtX1NyY0JwcCArIDMxKSAvIDMyICogNDsKICAgICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpID09IDApIHsKLSAgICAgICAgYm9vbCBiSW50ZXJwb2wgPSBmbGFncyAmIEZYRElCX0lOVEVSUE9MIHx8IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTDsKKyAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wgPSBmbGFncyAmIEZYRElCX0lOVEVSUE9MIHx8IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTDsKICAgICAgICAgaWYgKCFiSW50ZXJwb2wgJiYgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSA8IG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIDggLyBGWFNZU19hYnMoZGVzdF93aWR0aCkpIHsKICAgICAgICAgICAgIGZsYWdzID0gRlhESUJfSU5URVJQT0w7CiAgICAgICAgIH0KQEAgLTI4MCwxNiArMjgwLDE2IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1ib29sIENTdHJldGNoRW5naW5lOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIHdoaWxlIChtX1N0YXRlID09IDEpIHsKICAgICAgICAgaWYgKENvbnRpbnVlU3RyZXRjaEhvcnoocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBtX1N0YXRlID0gMjsKICAgICAgICAgU3RyZXRjaFZlcnQoKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENTdHJldGNoRW5naW5lOjp+Q1N0cmV0Y2hFbmdpbmUoKQogewpAQCAtMzA2LDQ2ICszMDYsNDYgQEAKICAgICAgICAgRlhfRnJlZShtX3BEZXN0TWFza1NjYW5saW5lKTsKICAgICB9CiB9Ci1ib29sIENTdHJldGNoRW5naW5lOjpTdGFydFN0cmV0Y2hIb3J6KCkKK0ZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OlN0YXJ0U3RyZXRjaEhvcnooKQogewogICAgIGlmIChtX0Rlc3RXaWR0aCA9PSAwIHx8IG1fcERlc3RTY2FubGluZSA9PSBOVUxMIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA+IChpbnQpKCgxVSA8PCAyOSkgLyBtX0ludGVyUGl0Y2gpIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BJbnRlckJ1ZiA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIG1fU3JjQ2xpcC5IZWlnaHQoKSAqIG1fSW50ZXJQaXRjaCk7CiAgICAgaWYgKG1fcEludGVyQnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX3BTb3VyY2UgJiYgbV9iSGFzQWxwaGEgJiYgbV9wU291cmNlLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgbV9wRXh0cmFBbHBoYUJ1ZiA9IEZYX0FsbG9jMkQodW5zaWduZWQgY2hhciwgbV9TcmNDbGlwLkhlaWdodCgpLCBtX0V4dHJhTWFza1BpdGNoKTsKICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiA4ICsgMzEpIC8gMzIgKiA0OwogICAgICAgICBtX3BEZXN0TWFza1NjYW5saW5lID0gRlhfVHJ5QWxsb2ModW5zaWduZWQgY2hhciwgc2l6ZSk7CiAgICAgICAgIGlmICghbV9wRGVzdE1hc2tTY2FubGluZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIG1fV2VpZ2h0VGFibGUuQ2FsYyhtX0Rlc3RXaWR0aCwgbV9EZXN0Q2xpcC5sZWZ0LCBtX0Rlc3RDbGlwLnJpZ2h0LCBtX1NyY1dpZHRoLCBtX1NyY0NsaXAubGVmdCwgbV9TcmNDbGlwLnJpZ2h0LCBtX0ZsYWdzKTsKICAgICBpZiAobV9XZWlnaHRUYWJsZS5tX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9DdXJSb3cgPSBtX1NyY0NsaXAudG9wOwogICAgIG1fU3RhdGUgPSAxOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogI2RlZmluZSBGWF9TVFJFQ0hfUEFVU0VfUk9XUwkxMAotYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKCFtX0Rlc3RXaWR0aCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpbnQgQnBwID0gbV9EZXN0QnBwIC8gODsKICAgICBpbnQgcm93c190b19nbyA9IEZYX1NUUkVDSF9QQVVTRV9ST1dTOwogICAgIGZvciAoOyBtX0N1clJvdyA8IG1fU3JjQ2xpcC5ib3R0b207IG1fQ3VyUm93ICsrKSB7CiAgICAgICAgIGlmIChyb3dzX3RvX2dvID09IDApIHsKICAgICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7CiAgICAgICAgIH0KQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJvd3NfdG9fZ28gLS07CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiB2b2lkIENTdHJldGNoRW5naW5lOjpTdHJldGNoVmVydCgpCiB7CkBAIC02OTcsNyArNjk3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGZvcm1hdDsKIH0KLWJvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcmVjdCwgRlhfRFdPUkQgZmxhZ3MpCiB7CkBAIC03MjIsNyArNzIyLDcgQEAKICAgICAgICAgICAgIHBhbFtpXSA9IEFyZ2JFbmNvZGUoYSwgciwgZywgYik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgcGFsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwQ215ayAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKICAgICAgICAgRlhfQ01ZSyBwYWxbMjU2XTsKQEAgLTczNywxNyArNzM3LDE3IEBACiAgICAgICAgICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOwogICAgICAgICB9CiAgICAgICAgIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIHBhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBOVUxMKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewogICAgICAgICByZXR1cm4gU3RhcnRRdWlja1N0cmV0Y2goKTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXJ0U3RyZXRjaCgpOwogfQotYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewogICAgICAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKQEAgLTc1NSwzOSArNzU1LDM5IEBACiAgICAgcmV0dXJuIENvbnRpbnVlU3RyZXRjaChwUGF1c2UpOwogfQogI2RlZmluZSBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMJMTAwMDAwMAotYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0U3RyZXRjaCgpCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkKIHsKICAgICBtX3BTdHJldGNoRW5naW5lID0gbmV3IENTdHJldGNoRW5naW5lKG1fcERlc3QsIG1fRGVzdEZvcm1hdCwgbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9DbGlwUmVjdCwgbV9wU291cmNlLCBtX0ZsYWdzKTsKICAgICBtX3BTdHJldGNoRW5naW5lLT5TdGFydFN0cmV0Y2hIb3J6KCk7CiAgICAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPCBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKICAgICAgICAgbV9wU3RyZXRjaEVuZ2luZS0+Q29udGludWUoTlVMTCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX3BTdHJldGNoRW5naW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShwUGF1c2UpOwogfQotYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkKK0ZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydFF1aWNrU3RyZXRjaCgpCiB7Ci0gICAgbV9iRmxpcFggPSBmYWxzZTsKLSAgICBtX2JGbGlwWSA9IGZhbHNlOworICAgIG1fYkZsaXBYID0gRkFMU0U7CisgICAgbV9iRmxpcFkgPSBGQUxTRTsKICAgICBpZiAobV9EZXN0V2lkdGggPCAwKSB7Ci0gICAgICAgIG1fYkZsaXBYID0gdHJ1ZTsKKyAgICAgICAgbV9iRmxpcFggPSBUUlVFOwogICAgICAgICBtX0Rlc3RXaWR0aCA9IC1tX0Rlc3RXaWR0aDsKICAgICB9CiAgICAgaWYgKG1fRGVzdEhlaWdodCA8IDApIHsKLSAgICAgICAgbV9iRmxpcFkgPSB0cnVlOworICAgICAgICBtX2JGbGlwWSA9IFRSVUU7CiAgICAgICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7CiAgICAgfQogICAgIG1fTGluZUluZGV4ID0gMDsKICAgICBGWF9EV09SRCBzaXplID0gbV9DbGlwUmVjdC5XaWR0aCgpOwogICAgIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgc2l6ZSAqPSBtX0Rlc3RCUFA7CiAgICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCAoc2l6ZSAvIDggKyAzKSAvIDQgKiA0KTsKQEAgLTc5NiwxNCArNzk2LDE0IEBACiAgICAgfQogICAgIGlmIChtX3BTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BTb3VyY2UtPkdldEhlaWdodCgpIDwgTUFYX1BST0dSRVNTSVZFX1NUUkVUQ0hfUElYRUxTKSB7CiAgICAgICAgIENvbnRpbnVlUXVpY2tTdHJldGNoKE5VTEwpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCByZXN1bHRfd2lkdGggPSBtX0NsaXBSZWN0LldpZHRoKCksIHJlc3VsdF9oZWlnaHQgPSBtX0NsaXBSZWN0LkhlaWdodCgpOwogICAgIGludCBzcmNfaGVpZ2h0ID0gbV9wU291cmNlLT5HZXRIZWlnaHQoKTsKQEAgLTgyMyw3ICs4MjMsNyBAQAogICAgICAgICAgICAgc3JjX3kgPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BTb3VyY2UtPlNraXBUb1NjYW5saW5lKHNyY195LCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIG1fcFNvdXJjZS0+RG93blNhbXBsZVNjYW5saW5lKHNyY195LCBtX3BTY2FubGluZSwgbV9EZXN0QlBQLCBtX0Rlc3RXaWR0aCwgbV9iRmxpcFgsIG1fQ2xpcFJlY3QubGVmdCwgcmVzdWx0X3dpZHRoKTsKICAgICAgICAgaWYgKG1fcE1hc2tTY2FubGluZSkgewpAQCAtODMxLDUgKzgzMSw1IEBACiAgICAgICAgIH0KICAgICAgICAgbV9wRGVzdC0+Q29tcG9zZVNjYW5saW5lKGRlc3RfeSwgbV9wU2NhbmxpbmUsIG1fcE1hc2tTY2FubGluZSk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAKaW5kZXggZWZkODg2ZS4uOGE4NjRmMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJkaWJfaW50LmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci1ib29sIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiYgcGFsLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIHZvaWQgQ215a0RlY29kZShGWF9EV09SRCBjbXlrLCBpbnQmIGMsIGludCYgbSwgaW50JiB5LCBpbnQmIGspCiB7CkBAIC01MiwzOSArNTIsMzkgQEAKIH0KIENGWF9ESUJpdG1hcDo6Q0ZYX0RJQml0bWFwKCkKIHsKLSAgICBtX2JFeHRCdWYgPSBmYWxzZTsKKyAgICBtX2JFeHRCdWYgPSBGQUxTRTsKICAgICBtX3BCdWZmZXIgPSBOVUxMOwogICAgIG1fcFBhbGV0dGUgPSBOVUxMOwogfQogI2RlZmluZSBfTUFYX09PTV9MSU1JVF8JMTIwMDAwMDAKLWJvb2wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyLCBpbnQgcGl0Y2gpCitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgdWludDhfdCogcEJ1ZmZlciwgaW50IHBpdGNoKQogewogICAgIG1fcEJ1ZmZlciA9IE5VTEw7CiAgICAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7CiAgICAgbV9BbHBoYUZsYWcgPSAodWludDhfdCkoZm9ybWF0ID4+IDgpOwogICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwogICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBpdGNoIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChJTlRfTUFYIC0gMzEpIC8gd2lkdGggPCAoZm9ybWF0ICYgMHhmZikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghcGl0Y2gpIHsKICAgICAgICAgcGl0Y2ggPSAod2lkdGggKiAoZm9ybWF0ICYgMHhmZikgKyAzMSkgLyAzMiAqIDQ7CiAgICAgfQogICAgIGlmICgoMSA8PCAzMCkgLyBwaXRjaCA8IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKHBCdWZmZXIpIHsKICAgICAgICAgbV9wQnVmZmVyID0gcEJ1ZmZlcjsKLSAgICAgICAgbV9iRXh0QnVmID0gdHJ1ZTsKKyAgICAgICAgbV9iRXh0QnVmID0gVFJVRTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgc2l6ZSA9IHBpdGNoICogaGVpZ2h0ICsgNDsKICAgICAgICAgaW50IG9vbWxpbWl0ID0gX01BWF9PT01fTElNSVRfOwogICAgICAgICBpZiAob29tbGltaXQgPj0gMCAmJiBzaXplID49IG9vbWxpbWl0KSB7CiAgICAgICAgICAgICBtX3BCdWZmZXIgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBzaXplKTsKICAgICAgICAgICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKQEAgLTk0LDMzICs5NCwzMyBAQAogICAgIG1fSGVpZ2h0ID0gaGVpZ2h0OwogICAgIG1fUGl0Y2ggPSBwaXRjaDsKICAgICBpZiAoSGFzQWxwaGEoKSAmJiBmb3JtYXQgIT0gRlhESUJfQXJnYikgewotICAgICAgICBib29sIHJldCA9IHRydWU7CisgICAgICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKICAgICAgICAgcmV0ID0gQnVpbGRBbHBoYU1hc2soKTsKICAgICAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgICAgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlcikgewogICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKICAgICAgICAgICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9ESUJpdG1hcDo6Q29weShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYykKIHsKICAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIUNyZWF0ZShwU3JjLT5HZXRXaWR0aCgpLCBwU3JjLT5HZXRIZWlnaHQoKSwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDb3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwogICAgIENvcHlBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwU3JjLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7CiAgICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBwU3JjLT5HZXRTY2FubGluZShyb3cpLCBtX1BpdGNoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDRlhfRElCaXRtYXA6On5DRlhfRElCaXRtYXAoKQogewpAQCAtMjE4LDE5ICsyMTgsMTkgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRBbHBoYU1hc2soKQorRlhfQk9PTCBDRlhfRElCU291cmNlOjpCdWlsZEFscGhhTWFzaygpCiB7CiAgICAgaWYgKG1fcEFscGhhTWFzaykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIG1fcEFscGhhTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFtX3BBbHBoYU1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CiAgICAgICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CiAgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgMHhmZiwgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSptX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogRlhfRFdPUkQgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3QKIHsKQEAgLTM2NywxNSArMzY3LDE1IEBACiAgICAgd2lkdGggPSBkZXN0X3JlY3QucmlnaHQgLSBkZXN0X3JlY3QubGVmdDsKICAgICBoZWlnaHQgPSBkZXN0X3JlY3QuYm90dG9tIC0gZGVzdF9yZWN0LnRvcDsKIH0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCA9IEdldEZvcm1hdCgpOwogICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CkBAIC00MDIsNyArNDAyLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYnBwID09IDgpIHsKICAgICAgICAgICAgIGRlc3RfZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CkBAIC00MTAsMjUgKzQxMCwyNSBAQAogICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IG1fcEJ1ZmZlciArIGRlc3RfdG9wICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEdldEJQUCgpIC8gODsKICAgICAgICAgRlhfRFdPUkQqIGRfcGx0ID0gTlVMTDsKICAgICAgICAgaWYoIUNvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBtX1BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wbHQsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorRlhfQk9PTCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEFTU0VSVChIYXNBbHBoYSgpICYmIChtX2JwcCA+PSAyNCkpOwogICAgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CiAgICAgaWYgKCFIYXNBbHBoYSgpIHx8ICFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDI0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7CiAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpbnQgc3JjX2JwcCA9IHBNYXNrLT5HZXRCUFAoKTsKICAgICBpbnQgYWxwaGE7CkBAIC00NDksNyArNDQ5LDcgQEAKICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLCBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOwogICAgICAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmKCFJc0NteWtJbWFnZSgpKSB7CkBAIC01MDcsNyArNTA3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ0ZYX0RJQlNvdXJjZTo6Q29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmMsIEZYX0RXT1JEIHNpemUpCiB7CkBAIC01NzAsMjEgKzU3MCwyMSBAQAogICAgIH0KICAgICByZXR1cm4gcE1hc2s7CiB9Ci1ib29sIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXApCitGWF9CT09MIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXApCiB7CiAgICAgaWYgKCFIYXNBbHBoYSgpIHx8IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwQWxwaGFNYXNrKSB7CiAgICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBwQWxwaGFNYXNrLT5tX1dpZHRoLCBwQWxwaGFNYXNrLT5tX0hlaWdodCk7CiAgICAgICAgIGlmIChwQ2xpcCkgewogICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKICAgICAgICAgICAgIGlmIChyZWN0LklzRW1wdHkoKSB8fCByZWN0LldpZHRoKCkgIT0gbV9XaWR0aCB8fCByZWN0LkhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChwQWxwaGFNYXNrLT5tX1dpZHRoICE9IG1fV2lkdGggfHwgcEFscGhhTWFzay0+bV9IZWlnaHQgIT0gbV9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspCkBAIC01OTMsMjUgKzU5MywyNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcEFscGhhTWFzay0+Q2xlYXIoMHhmZjAwMDAwMCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY29uc3QgaW50IGdfQ2hhbm5lbE9mZnNldFtdID0gezAsIDIsIDEsIDAsIDAsIDEsIDIsIDMsIDN9OwotYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCkKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRElCU291cmNlKiBwU3JjQ2xvbmUgPSAoQ0ZYX0RJQlNvdXJjZSopcFNyY0JpdG1hcDsKICAgICBDRlhfRElCaXRtYXAqIHBEc3QgPSB0aGlzOwogICAgIGludCBkZXN0T2Zmc2V0LCBzcmNPZmZzZXQ7CiAgICAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKICAgICAgICAgaWYgKCFwU3JjQml0bWFwLT5IYXNBbHBoYSgpICYmICFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKICAgICAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl84YnBwTWFzayk7CiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmKHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPCAyNCkgewogICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKQEAgLTYzMCw3ICs2MzAsNyBAQAogICAgICAgICAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydCgoRlhESUJfRm9ybWF0KSgocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmMDApIHwgMHgxOCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07CkBAIC02NDEsNyArNjQxLDcgQEAKICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwogICAgICAgICB9IGVsc2UgewpAQCAtNjUwLDcgKzY1MCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewogICAgICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAzOwpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7CiAgICAgICAgICAgICBpZiAoSGFzQWxwaGEoKSkgewpAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTY4MCw3ICs2ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOwpAQCAtNjk0LDcgKzY5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTcxMCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFNyY01hdGNoZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNNYXRjaGVkOwogICAgIH0KQEAgLTczMiwyNCArNzMyLDI0IEBACiAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwICYmIHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBkZXN0T2Zmc2V0OwogICAgIGlmIChkZXN0Q2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgewogICAgICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewogICAgICAgICAgICAgaWYoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7CiAgICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewogICAgICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAzOwpAQCAtNzU3LDIxICs3NTcsMjEgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEdldEJQUCgpIDwgMjQpIHsKICAgICAgICAgICAgIGlmIChIYXNBbHBoYSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZQogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogI2Vsc2UKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIH0KQEAgLTc4MCwxMSArNzgwLDExIEBACiAgICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKICAgICBpZiAoQnBwID09IDEpIHsKICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgdmFsdWUsIG1fSGVpZ2h0ICogbV9QaXRjaCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhICYmIG1fcEFscGhhTWFzaykgewogICAgICAgICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgdmFsdWUsIG1fcEFscGhhTWFzay0+R2V0SGVpZ2h0KCkqbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyBkZXN0T2Zmc2V0OwpAQCAtNzkzLDE2ICs3OTMsMTYgQEAKICAgICAgICAgICAgIHNjYW5fbGluZSArPSBCcHA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwKQorRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEFTU0VSVChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKICAgICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghSXNBbHBoYU1hc2soKSAmJiAhSGFzQWxwaGEoKSkgewogICAgICAgICByZXR1cm4gTG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIHBTcmNCaXRtYXAsIEZYRElCX0FscGhhKTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwogICAgICAgICBBU1NFUlQocFNyY0Nsb25lICE9IE5VTEwpOwogICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewpAQCAtODIwLDcgKzgyMCw3IEBACiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIG1fUGl0Y2ggKiByb3c7CkBAIC04NDQsNyArODQ0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93ICsgMzsKQEAgLTg2MSwxNyArODYxLDE3IEBACiAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfRElCaXRtYXA6OkdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitGWF9CT09MIENGWF9ESUJpdG1hcDo6R2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CiAgICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5WzJdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewpAQCAtODgzLDcgKzg4Myw3IEBACiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgICAgICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBNYXNrLT5HZXRCdWZmZXIoKSwgZ3JheVswXSwgcE1hc2stPkdldFBpdGNoKCkgKiBtX0hlaWdodCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewpAQCAtOTAyLDcgKzkwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewogICAgICAgICAgICAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheVsyNTZdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7CkBAIC05MTQsNyArOTE0LDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwpAQCAtOTQ5LDcgKzk0OSw3IEBACiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgICAgICAgICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewogICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfcG9zID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKQEAgLTk2NCwxOSArOTY0LDE5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKQorRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewogICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgogICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAwNCwxOCArMTAwNCwxOCBAQAogICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzay0+TXVsdGlwbHlBbHBoYShhbHBoYSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKElzQ215a0ltYWdlKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoKEZYRElCX0Zvcm1hdCkoR2V0Rm9ybWF0KCkgfCAweDAyMDApKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIEZYX0RXT1JEIENGWF9ESUJpdG1hcDo6R2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdAogewpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKICAgICB9CiB9CiB2b2lkIENGWF9ESUJpdG1hcDo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTE3OSwxNSArMTE3OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogfQotYm9vbCBDRlhfRElCaXRtYXA6OkNvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKQogewogICAgIEFTU0VSVCghSXNBbHBoYU1hc2soKSk7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMIHx8IElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGludCBmYywgZm0sIGZ5LCBmaywgYmMsIGJtLCBieSwgYms7CiAgICAgaW50IGZyLCBmZywgZmIsIGJyLCBiZywgYmI7Ci0gICAgYm9vbCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7CisgICAgRlhfQk9PTCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7CiAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgIGZjID0gRlhTWVNfR2V0Q1ZhbHVlKGZvcmVjb2xvcik7CiAgICAgICAgIGZtID0gRlhTWVNfR2V0TVZhbHVlKGZvcmVjb2xvcik7CkBAIC0xMjA4LDEwICsxMjA4LDEwIEBACiAgICAgaWYgKG1fYnBwIDw9IDgpIHsKICAgICAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDAgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmICYmIG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBCdWlsZFBhbGV0dGUoKTsKQEAgLTEyMzIsNyArMTIzMiw3IEBACiAgICAgICAgICAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NSwgYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTUpOwogICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChpc0NteWtJbWFnZSkgewogICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKQEAgLTEyNDgsNyArMTI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmKSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgICAgICAgICAgICAgc2NhbmxpbmUgKz0gZ2FwOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKQEAgLTEyOTEsMTggKzEyOTEsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpEaXRoZXJGUyhjb25zdCBGWF9EV09SRCogcFBhbGV0dGUsIGludCBwYWxfc2l6ZSwgY29uc3QgRlhfUkVDVCogcFJlY3QpCitGWF9CT09MIENGWF9ESUJpdG1hcDo6RGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0KQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fYnBwICE9IDggJiYgbV9wUGFsZXR0ZSAhPSBOVUxMICYmIG1fQWxwaGFGbGFnICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX1dpZHRoIDwgNCAmJiBtX0hlaWdodCA8IDQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CiAgICAgaWYgKHBSZWN0KSB7CkBAIC0xMzc0LDkgKzEzNzQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdAorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdAogewogICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcEZsaXBwZWQtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgR2V0Rm9ybWF0KCkpKSB7CkBAIC0xNDgwLDcgKzE0ODAsNyBAQAogICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKICAgICB9CiB9Ci12b2lkIENGWF9GaWx0ZXJlZERJQjo6TG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYykKK3ZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKQogewogICAgIG1fcFNyYyA9IHBTcmM7CiAgICAgbV9iQXV0b0Ryb3BTcmMgPSBiQXV0b0Ryb3BTcmM7CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgIHJldHVybiBtX3BTY2FubGluZTsKIH0KIHZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAorICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAogewogICAgIG1fcFNyYy0+RG93blNhbXBsZVNjYW5saW5lKGxpbmUsIGRlc3Rfc2NhbiwgZGVzdF9icHAsIGRlc3Rfd2lkdGgsIGJGbGlwWCwgY2xpcF9sZWZ0LCBjbGlwX3dpZHRoKTsKICAgICBUcmFuc2xhdGVEb3duU2FtcGxlcyhkZXN0X3NjYW4sIGRlc3Rfc2NhbiwgY2xpcF93aWR0aCwgZGVzdF9icHApOwpAQCAtMTUwOCwxOCArMTUwOCwxOCBAQAogewogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gZmFsc2U7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7CiAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CiB9CiBDRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkKIHsKICAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7CiB9Ci1leHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJGbGlwWCwgYm9vbCBiRmxpcFkpOwotYm9vbCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCitleHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFkpOworRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgbV9NYXRyaXggPSAqcE1hdHJpeDsKQEAgLTE1MjgsNyArMTUyOCw3IEBACiAgICAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKICAgICBtX0NsaXBCb3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICAgIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwogICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKQEAgLTE1NDAsNyArMTU0MCw3IEBACiAgICAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKICAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwogICAgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKLSAgICBib29sIHJldCA9IHRydWU7CisgICAgRlhfQk9PTCByZXQgPSBUUlVFOwogICAgIGlmICgoRlhTWVNfZmFicyhtX01hdHJpeC5iKSA+PSAwLjVmIHx8IG1fTWF0cml4LmEgPT0gMCkgfHwKICAgICAgICAgICAgIChGWFNZU19mYWJzKG1fTWF0cml4LmMpID49IDAuNWYgfHwgbV9NYXRyaXguZCA9PSAwKSApIHsKICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9NYXRyaXguYSkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmIpIC8gMjAgJiYgRlhTWVNfZmFicyhtX01hdHJpeC5kKSA8IEZYU1lTX2ZhYnMobV9NYXRyaXguYykgLyAyMCAmJgpAQCAtMTU1MCwxOCArMTU1MCwxOCBAQAogICAgICAgICAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKICAgICAgICAgICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwogICAgICAgICAgICAgYml0bWFwX2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3goYml0bWFwX2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDApOwotICAgICAgICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwgdHJ1ZSwKKyAgICAgICAgICAgIG1fQ29tcG9zZXIuQ29tcG9zZShwRGV2aWNlLCBwQ2xpcFJnbiwgYml0bWFwX2FscGhhLCBtYXNrX2NvbG9yLCBtX0NsaXBCb3gsIFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXRyaXguYyA+IDAsIG1fTWF0cml4LmIgPCAwLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKICAgICAgICAgICAgIGlmICghbV9TdHJldGNoZXIuU3RhcnQoJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCBiaXRtYXBfY2xpcCwgZGliX2ZsYWdzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX1N0YXR1cyA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIG1fU3RhdHVzID0gMjsKICAgICAgICAgbV9wVHJhbnNmb3JtZXIgPSBuZXcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7CiAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChwU291cmNlLCAmbV9NYXRyaXgsIGRpYl9mbGFncywgJm1fQ2xpcEJveCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CiAgICAgaWYgKG1fTWF0cml4LmEgPCAwKSB7CkBAIC0xNTcyLDMyICsxNTcyLDMyIEBACiAgICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwogICAgIH0KICAgICBpZiAoZGVzdF93aWR0aCA9PSAwIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CiAgICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CiAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBtX0JsZW5kVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBtX0JsZW5kVHlwZSk7CiAgICAgbV9TdGF0dXMgPSAxOwogICAgIHJldCA9IG1fU3RyZXRjaGVyLlN0YXJ0KCZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgYml0bWFwX2NsaXAsIGRpYl9mbGFncyk7CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgQ0ZYX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKICAgICAgICAgcmV0dXJuIG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSk7CiAgICAgfQogICAgIGlmIChtX1N0YXR1cyA9PSAyKSB7CiAgICAgICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7CiAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgewpAQCAtMTYxOCw5ICsxNjE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCAwLCAwLCBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBtX3BJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENGWF9CaXRtYXBTdG9yZXI6OkNGWF9CaXRtYXBTdG9yZXIoKQogewpAQCAtMTY1MywxNiArMTY1MywxNiBAQAogICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9hbHBoYV9idWYsIHNjYW5fZXh0cmFfYWxwaGEsIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKICAgICB9CiB9Ci1ib29sIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQorRlhfQk9PTCBDRlhfQml0bWFwU3RvcmVyOjpTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkKIHsKICAgICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgc3JjX2Zvcm1hdCkpIHsKICAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKICAgICAgICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwU3JjUGFsZXR0ZSkgewogICAgICAgICBtX3BCaXRtYXAtPkNvcHlQYWxldHRlKHBTcmNQYWxldHRlKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCmluZGV4IDAxYmMxNjcuLmUzNGU3MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIHkxIC89IGJhc2U7CiAgICAgfQogfTsKLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6U3dhcFhZKGJvb2wgYlhGbGlwLCBib29sIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdAorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpTd2FwWFkoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwLCBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIGNvbnN0CiB7CiAgICAgRlhfUkVDVCBkZXN0X2NsaXAoMCwgMCwgbV9IZWlnaHQsIG1fV2lkdGgpOwogICAgIGlmIChwRGVzdENsaXApIHsKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIHJldHVybiBwVHJhbnNCaXRtYXA7CiB9CiAjZGVmaW5lIEZJWDE2XzAwNSAwLjA1ZgotRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGJGbGlwWCwgYm9vbCBiRmxpcFkpCitGWF9SRUNUIF9GWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSkKIHsKICAgICBGWF9SRUNUIHJlY3Q7CiAgICAgaWYgKGJGbGlwWSkgewpAQCAtMjA2LDcgKzIwNiw3IEBACiBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6fkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkKIHsKIH0KLWJvb2wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OlN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkKK0ZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OlN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkKIHsKICAgICBtX3BNYXRyaXggPSAoQ0ZYX0FmZmluZU1hdHJpeCopcERlc3RNYXRyaXg7CiAgICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICByZXN1bHRfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7CiAgICAgfQogICAgIGlmIChyZXN1bHRfY2xpcC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG1fUmVzdWx0TGVmdCA9IHJlc3VsdF9jbGlwLmxlZnQ7CiAgICAgbV9SZXN1bHRUb3AgPSByZXN1bHRfY2xpcC50b3A7CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgcmVzdWx0X2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3gocmVzdWx0X2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwRGVzdE1hdHJpeC0+YyA+IDAsIHBEZXN0TWF0cml4LT5iIDwgMCk7CiAgICAgICAgIG1fU3RyZXRjaGVyLlN0YXJ0KCZtX1N0b3JlciwgcFNyYywgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIHJlc3VsdF9jbGlwLCBmbGFncyk7CiAgICAgICAgIG1fU3RhdHVzID0gMTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YikgPCBGSVgxNl8wMDUgJiYgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKICAgICAgICAgaW50IGRlc3Rfd2lkdGggPSBwRGVzdE1hdHJpeC0+YSA+IDAgPyAoaW50KUZYU1lTX2NlaWwocERlc3RNYXRyaXgtPmEpIDogKGludClGWFNZU19mbG9vcihwRGVzdE1hdHJpeC0+YSk7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKICAgICAgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVzdWx0X2NsaXAsIGZsYWdzKTsKICAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGludCBzdHJldGNoX3dpZHRoID0gKGludClGWFNZU19jZWlsKEZYU1lTX3NxcnQyKHBEZXN0TWF0cml4LT5hLCBwRGVzdE1hdHJpeC0+YikpOwogICAgIGludCBzdHJldGNoX2hlaWdodCA9IChpbnQpRlhTWVNfY2VpbChGWFNZU19zcXJ0MihwRGVzdE1hdHJpeC0+YywgcERlc3RNYXRyaXgtPmQpKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgIG1fU3RyZXRjaENsaXAuSW50ZXJzZWN0KDAsIDAsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKICAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0LCBtX1N0cmV0Y2hDbGlwLCBmbGFncyk7CiAgICAgbV9TdGF0dXMgPSAzOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdWludDhfdCBfYmlsaW5lYXJfaW50ZXJwb2woY29uc3QgdWludDhfdCogYnVmLCBpbnQgcm93X29mZnNldF9sLCBpbnQgcm93X29mZnNldF9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgaW50IHNyY19jb2xfciwgaW50IHJlc194LCBpbnQgcmVzX3ksCkBAIC0zMzUsMzAgKzMzNSwzMCBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0OwogfQotYm9vbCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitGWF9CT09MIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9TdGF0dXMgPT0gMSkgewogICAgICAgICBpZiAobV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKICAgICAgICAgICAgIG1fU3RvcmVyLlJlcGxhY2UobV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX1N0YXR1cyA9PSAyKSB7CiAgICAgICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOwogICAgIH0KICAgICBpZiAobV9TdGF0dXMgIT0gMykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpbnQgc3RyZXRjaF93aWR0aCA9IG1fU3RyZXRjaENsaXAuV2lkdGgoKTsKICAgICBpbnQgc3RyZXRjaF9oZWlnaHQgPSBtX1N0cmV0Y2hDbGlwLkhlaWdodCgpOwogICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1ZiA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCdWZmZXIoKTsKICAgICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1Zl9tYXNrID0gTlVMTDsKQEAgLTM3MCw3ICszNzAsNyBAQAogICAgIEZYRElCX0Zvcm1hdCB0cmFuc2Zvcm1GID0gX0dldFRyYW5zZm9ybWVkRm9ybWF0KG1fU3RyZXRjaGVyLm1fcFNvdXJjZSk7CiAgICAgaWYgKCFwVHJhbnNmb3JtZWQtPkNyZWF0ZShtX1Jlc3VsdFdpZHRoLCBtX1Jlc3VsdEhlaWdodCwgdHJhbnNmb3JtRikpIHsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHBUcmFuc2Zvcm1lZC0+Q2xlYXIoMCk7CiAgICAgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7CkBAIC02NDEsNyArNjQxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIGJIYXNBbHBoYSA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5IYXNBbHBoYSgpOworICAgICAgICAgICAgRlhfQk9PTCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKICAgICAgICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7CiAgICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKICAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKQEAgLTc4Niw1ICs3ODYsNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1fU3RvcmVyLlJlcGxhY2UocFRyYW5zZm9ybWVkKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwCmluZGV4IGVjZGQxYjAuLjBiYWE5OWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgbV9DbGlwQm94LmJvdHRvbSA9IG1fSGVpZ2h0OwogICAgIH0KIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U3RhcnRSZW5kZXJpbmcoKQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydFJlbmRlcmluZygpCiB7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRSZW5kZXJpbmcoKTsKIH0KQEAgLTQ3LDcgKzQ3LDcgQEAKIHsKICAgICBtX3BEZXZpY2VEcml2ZXItPlNhdmVTdGF0ZSgpOwogfQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQogewogICAgIG1fcERldmljZURyaXZlci0+UmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwogICAgIFVwZGF0ZUNsaXBCb3goKTsKQEAgLTYwLDcgKzYwLDcgQEAKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRDVE0oKTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3QKIHsKICAgICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgewogICAgICAgICByZXR1cm4gcERJQi0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQ215a2EgOiBGWERJQl9DbXlrKTsKQEAgLTc0LDM3ICs3NCwzNyBAQAogICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiKTsKICNlbmRpZgogfQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIGZpbGxfbW9kZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgVXBkYXRlQ2xpcEJveCgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCkKIHsKICAgICBDRlhfUGF0aERhdGEgcGF0aDsKICAgICBwYXRoLkFwcGVuZFJlY3QoKEZYX0ZMT0FUKShwUmVjdC0+bGVmdCksIChGWF9GTE9BVCkocFJlY3QtPmJvdHRvbSksIChGWF9GTE9BVCkocFJlY3QtPnJpZ2h0KSwgKEZYX0ZMT0FUKShwUmVjdC0+dG9wKSk7CiAgICAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBOVUxMLCBGWEZJTExfV0lORElORykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpCiB7CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX1dpZHRoOwogICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLCBpbnQgZmlsbF9tb2RlLApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICB5MiA9IHBQb2ludHNbMV0ubV9Qb2ludFk7CiAgICAgICAgIH0KICAgICAgICAgRHJhd0Nvc21ldGljTGluZSh4MSwgeTEsIHgyLCB5MiwgZmlsbF9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2Y7CkBAIC0xODQsMTMgKzE4NCwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChGaWxsUmVjdCgmcmVjdF9pLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmKChmaWxsX21vZGUgJiAzKSAmJiBzdHJva2VfYWxwaGEgPT0gMCAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfVEVYVF9NT0RFKSkgewogICAgICAgICBDRlhfUGF0aERhdGEgbmV3UGF0aDsKLSAgICAgICAgYm9vbCBiVGhpbiA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJUaGluID0gRkFMU0U7CiAgICAgICAgIGlmIChwUGF0aERhdGEtPkdldFplcm9BcmVhUGF0aChuZXdQYXRoLCAoQ0ZYX01hdHJpeCopcE9iamVjdDJEZXZpY2UsIGJUaGluLCBtX3BEZXZpY2VEcml2ZXItPkdldERyaXZlclR5cGUoKSkpIHsKICAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOwogICAgICAgICAgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDAuMGY7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICB9CiAgICAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2FscGhhICYmIHN0cm9rZV9hbHBoYSA8IDB4ZmYgJiYgKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSkgewogICAgICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIENGWF9GbG9hdFJlY3QgYmJveDsKICAgICAgICAgaWYgKHBHcmFwaFN0YXRlKSB7CkBAIC0yMzIsMTkgKzIzMiwxOSBAQAogICAgICAgICBGWF9SRUNUIHJlY3QgPSBiYm94LkdldE91dHRlclJlY3QoKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcCwgQmFja2Ryb3A7CiAgICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChiaXRtYXAuSGFzQWxwaGEoKSkgewogICAgICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgTlVMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKICAgICAgICAgfQogICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOwotICAgICAgICBiaXRtYXBfZGV2aWNlLkF0dGFjaCgmYml0bWFwLCAwLCBmYWxzZSwgJkJhY2tkcm9wLCB0cnVlKTsKKyAgICAgICAgYml0bWFwX2RldmljZS5BdHRhY2goJmJpdG1hcCwgMCwgRkFMU0UsICZCYWNrZHJvcCwgVFJVRSk7CiAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwogICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKICAgICAgICAgICAgIG1hdHJpeCA9ICpwT2JqZWN0MkRldmljZTsKQEAgLTI1Miw1MSArMjUyLDUxIEBACiAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CiAgICAgICAgIG1hdHJpeC5Db25jYXQoZlNjYWxlWCwgMCwgMCwgZlNjYWxlWSwgMCwgMCk7CiAgICAgICAgIGlmICghYml0bWFwX2RldmljZS5HZXREZXZpY2VEcml2ZXIoKS0+RHJhd1BhdGgocFBhdGhEYXRhLCAmbWF0cml4LCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKTsKICAgICAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCh4LCB5LCB4ICsgMSwgeSArIDEpOwogICAgIHJldHVybiBGaWxsUmVjdCgmcmVjdCwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZVJlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSk7CiAgICAgbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICBpbnQgZmlsbF9tb2RlLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKCgobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9QQVRIKSAmJgogICAgICAgICAgICAgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgJiYgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgPT0gMHhmZikpIHx8CiAgICAgICAgICAgICBjb2xvciA+PSAweGZmMDAwMDAwKQogICAgICAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3Q29zbWV0aWNMaW5lKHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7CiAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CkBAIC0zMDUsMTAgKzMwNSwxMCBAQAogICAgIHBhdGguU2V0UG9pbnQoMSwgeDIsIHkyLCBGWFBUX0xJTkVUTyk7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsICZncmFwaF9zdGF0ZSwgMCwgY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CiB9Ci1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0RElCaXRzKHBCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CiB9CkBAIC0zMTYsNyArMzE2LDcgQEAKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRCYWNrRHJvcCgpOwogfQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF9tb2RlLAorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBBU1NFUlQoIXBCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAgICAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBGWFNZU19yb3VuZChsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSAvIGZTY2FsZVgpLCBGWFNZU19yb3VuZCh0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSAvIGZTY2FsZVkpKTsKICAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CiAgICAgaWYgKGRlc3RfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9SRUNUIHNyY19yZWN0KGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCwgZGVzdF9yZWN0LnRvcCAtIHRvcCwKICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCArIGRlc3RfcmVjdC5XaWR0aCgpLCBkZXN0X3JlY3QudG9wIC0gdG9wICsgZGVzdF9yZWN0LkhlaWdodCgpKTsKQEAgLTMzNywyOSArMzM3LDI5IEBACiAgICAgaWYgKChibGVuZF9tb2RlICE9IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHx8CiAgICAgICAgICAgICAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfSU1BR0UpKSkgewogICAgICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGludCBiZ19waXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5XaWR0aCgpICogZlNjYWxlWCk7CiAgICAgICAgIGludCBiZ19waXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CiAgICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYmFja2dyb3VuZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3ApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAsIHNyY19yZWN0LmxlZnQsIHNyY19yZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBmYWxzZSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQpOwogICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgfQogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBibGVuZF9tb2RlLCAwLCBwSWNjVHJhbnNmb3JtKTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfbW9kZSkKIHsKQEAgLTM2NywxNyArMzY3LDE3IEBACiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fQ2xpcEJveDsKICAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKICAgICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCAwLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAmY2xpcF9ib3gsIGZsYWdzLCAwLCBwSWNjVHJhbnNmb3JtLCBibGVuZF9tb2RlKTsKIH0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgYXJnYiwKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgYXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1ib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYXJnYiwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpAQCAtMzg2LDEzICszODYsMTMgQEAKICAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGFyZ2IsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF9tb2RlKQogewogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlN0YXJ0RElCaXRzKHBCaXRtYXAsIGJpdG1hcF9hbHBoYSwgYXJnYiwgcE1hdHJpeCwgZmxhZ3MsIGhhbmRsZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfbW9kZSk7CiB9Ci1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+Q29udGludWVESUJpdHMoaGFuZGxlLCBwUGF1c2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKaW5kZXggN2E1ZTBjYy4uNmE5NTBiZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiB7CiAgICAgbV9wU3Vic3RGb250ID0gTlVMTDsKICAgICBtX0ZhY2UgPSBOVUxMOwotICAgIG1fYkVtYmVkZGVkID0gZmFsc2U7Ci0gICAgbV9iVmVydGljYWwgPSBmYWxzZTsKKyAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOworICAgIG1fYlZlcnRpY2FsID0gRkFMU0U7CiAgICAgbV9wRm9udERhdGEgPSBOVUxMOwogICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwpAQCAtMjQsNyArMjQsNyBAQAogICAgIG1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb24gPSBOVUxMOwogICAgIG1fcER3Rm9udCA9IE5VTEw7CiAgICAgbV9oSGFuZGxlID0gTlVMTDsKLSAgICBtX2JEd0xvYWRlZCA9IGZhbHNlOworICAgIG1fYkR3TG9hZGVkID0gRkFMU0U7CiB9CiBDRlhfRm9udDo6fkNGWF9Gb250KCkKIHsKQEAgLTYxLDEwICs2MSwxMCBAQAogICAgIEZYRlRfRG9uZV9GYWNlKG1fRmFjZSk7CiAgICAgbV9GYWNlID0gTlVMTDsKIH0KLWJvb2wgQ0ZYX0ZvbnQ6OkxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgYm9vbCBiVmVydGljYWwpCitGWF9CT09MIENGWF9Gb250OjpMb2FkU3Vic3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIEZYX0JPT0wgYlZlcnRpY2FsKQogewotICAgIG1fYkVtYmVkZGVkID0gZmFsc2U7CisgICAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKICAgICBtX2JWZXJ0aWNhbCA9IGJWZXJ0aWNhbDsKICAgICBtX3BTdWJzdEZvbnQgPSBuZXcgQ0ZYX1N1YnN0Rm9udDsKICAgICBtX0ZhY2UgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgbV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKG1fRmFjZSk7CiAgICAgICAgIG1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShtX0ZhY2UpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGV4dGVybiAiQyIgewogICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LApAQCAtOTksNyArOTksNyBAQAogICAgIHsKICAgICB9CiB9OwotYm9vbCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSkKK0ZYX0JPT0wgX0xvYWRGaWxlKEZYRlRfTGlicmFyeSBsaWJyYXJ5LCBGWEZUX0ZhY2UqIEZhY2UsIElGWF9GaWxlUmVhZCogcEZpbGUsIEZYRlRfU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgRlhGVF9TdHJlYW0gc3RyZWFtMSA9IChGWEZUX1N0cmVhbSlGWF9BbGxvYyh1aW50OF90LCBzaXplb2YgKEZYRlRfU3RyZWFtUmVjKSk7CiAgICAgc3RyZWFtMS0+YmFzZSA9IE5VTEw7CkBAIC0xMTMsMTYgKzExMywxNiBAQAogICAgIGFyZ3Muc3RyZWFtID0gc3RyZWFtMTsKICAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmFyZ3MsIDAsIEZhY2UpKSB7CiAgICAgICAgIEZYX0ZyZWUoc3RyZWFtMSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoc3RyZWFtKSB7CiAgICAgICAgICpzdHJlYW0gPSBzdHJlYW0xOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0ZvbnQ6OkxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpCitGWF9CT09MIENGWF9Gb250OjpMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlKQogewotICAgIG1fYkVtYmVkZGVkID0gZmFsc2U7CisgICAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKICAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKICAgICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSA9PSBOVUxMKSB7CiAgICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSk7CkBAIC0xMzAsMTEgKzEzMCwxMSBAQAogICAgIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5OwogICAgIEZYRlRfU3RyZWFtIHN0cmVhbSA9IE5VTEw7CiAgICAgaWYgKCFfTG9hZEZpbGUobGlicmFyeSwgJm1fRmFjZSwgcEZpbGUsICZzdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BPd25lZFN0cmVhbSA9IHN0cmVhbTsKICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIGludCBDRlhfRm9udDo6R2V0R2x5cGhXaWR0aChGWF9EV09SRCBnbHlwaF9pbmRleCkKIHsKQEAgLTE2OSwyMCArMTY5LDIwIEBACiAgICAgfQogICAgIHJldHVybiBmYWNlOwogfQotYm9vbCBDRlhfRm9udDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpCitGWF9CT09MIENGWF9Gb250OjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkKIHsKICAgICBtX3BGb250RGF0YUFsbG9jYXRpb24gPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKICAgICBGWFNZU19tZW1jcHkobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKICAgICBtX0ZhY2UgPSBGVF9Mb2FkRm9udCgodWludDhfdCopbV9wRm9udERhdGFBbGxvY2F0aW9uLCBzaXplKTsKICAgICBtX3BGb250RGF0YSA9ICh1aW50OF90KiltX3BGb250RGF0YUFsbG9jYXRpb247Ci0gICAgbV9iRW1iZWRkZWQgPSB0cnVlOworICAgIG1fYkVtYmVkZGVkID0gVFJVRTsKICAgICBtX2R3U2l6ZSA9IHNpemU7CiAgICAgcmV0dXJuIG1fRmFjZSAhPSBOVUxMOwogfQotYm9vbCBDRlhfRm9udDo6SXNUVEZvbnQoKQorRlhfQk9PTCBDRlhfRm9udDo6SXNUVEZvbnQoKQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9UVF9PVChtX0ZhY2UpID09IEZYRlRfRkFDRV9GTEFHX1NGTlQ7CiB9CkBAIC0yMDIsMjUgKzIwMiwyNSBAQAogICAgIGludCBkZXNjZW50ID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKICAgICByZXR1cm4gZGVzY2VudDsKIH0KLWJvb2wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCkKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKICAgICAgICAgaW50IGVycm9yID0gRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpOwogICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKICAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgRlhGVF9CQm94IGNib3g7CiAgICAgICAgIEZUX0dseXBoIGdseXBoOwogICAgICAgICBlcnJvciA9IEZYRlRfR2V0X0dseXBoKCgoRlhGVF9GYWNlKW1fRmFjZSktPmdseXBoLCAmZ2x5cGgpOwogICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7CiAgICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnhfcHBlbSwKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKICAgICB9CiAgICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CiAgICAgaWYgKGVtID09IDApIHsKQEAgLTI2MCwzNCArMjYwLDM0IEBACiAgICAgICAgIGJib3gucmlnaHQgPSAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKICAgICAgICAgYmJveC5ib3R0b20gPSAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkpICogMTAwMCAvIGVtOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX0ZvbnQ6OklzSXRhbGljKCkKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzSXRhbGljKCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGJvb2wgcmV0ID0gRlhGVF9Jc19GYWNlX0l0YWxpYyhtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19JVEFMSUM7CisgICAgRlhfQk9PTCByZXQgPSBGWEZUX0lzX0ZhY2VfSXRhbGljKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0lUQUxJQzsKICAgICBpZiAoIXJldCkgewogICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIoRlhGVF9HZXRfRmFjZV9TdHlsZV9OYW1lKG1fRmFjZSkpOwogICAgICAgICBzdHIuTWFrZUxvd2VyKCk7CiAgICAgICAgIGlmIChzdHIuRmluZCgiaXRhbGljIikgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICByZXQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci1ib29sIENGWF9Gb250OjpJc0JvbGQoKQorRlhfQk9PTCBDRlhfRm9udDo6SXNCb2xkKCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBGWEZUX0lzX0ZhY2VfQm9sZChtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19CT0xEOwogfQotYm9vbCBDRlhfRm9udDo6SXNGaXhlZFdpZHRoKCkKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgobV9GYWNlKTsKIH0KQEAgLTMzMSwxMCArMzMxLDEwIEBACiAgICAgfQogICAgIHJldHVybiBtX3BTdWJzdEZvbnQtPm1fRmFtaWx5OwogfQotYm9vbCBDRlhfRm9udDo6R2V0QkJveChGWF9SRUNUICZiYm94KQorRlhfQk9PTCBDRlhfRm9udDo6R2V0QkJveChGWF9SRUNUICZiYm94KQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CiAgICAgaWYgKGVtID09IDApIHsKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgICAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CiAgICAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogaW50IENGWF9Gb250OjpHZXRIZWlnaHQoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKaW5kZXggMTVmMDIyZS4uMTQ0MjdhNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAgICAgbV9TdWJzdEZsYWdzID0gMDsKICAgICBtX1dlaWdodCA9IDA7CiAgICAgbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9iU3Vic3RPZkNKSyA9IGZhbHNlOworICAgIG1fYlN1YnN0T2ZDSksgPSBGQUxTRTsKICAgICBtX1dlaWdodENKSyA9IDA7Ci0gICAgbV9iSXRsaWNDSksgPSBmYWxzZTsKKyAgICBtX2JJdGxpY0NKSyA9IEZBTFNFOwogfQogQ1RURm9udERlc2M6On5DVFRGb250RGVzYygpCiB7CkBAIC0zOCwxMSArMzgsMTEgQEAKICAgICAgICAgRlhfRnJlZShtX3BGb250RGF0YSk7CiAgICAgfQogfQotYm9vbCBDVFRGb250RGVzYzo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpCitGWF9CT09MIENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKIHsKICAgICBpZiAobV9UeXBlID09IDEpIHsKICAgICAgICAgaWYgKG1fU2luZ2xlRmFjZS5tX3BGYWNlICE9IGZhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKICAgICAgICAgaW50IGk7CkBAIC01MSwxNSArNTEsMTUgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgaWYgKGkgPT0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KICAgICBtX1JlZkNvdW50IC0tOwogICAgIGlmIChtX1JlZkNvdW50KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBkZWxldGUgdGhpczsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpCiB7CkBAIC05OCw3ICs5OCw3IEBACiB7CiAgICAgbV9wQnVpbHRpbk1hcHBlci0+U2V0U3lzdGVtRm9udEluZm8ocEZvbnRJbmZvKTsKIH0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKIHsKICAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNldENQLCBwU3Vic3RGb250KTsKIH0KIEZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIHVpbnQ4X3QqJiBwRm9udERhdGEpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KGZhY2VfbmFtZSk7CiAgICAga2V5ICs9ICcsJzsKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCiB7CiAgICAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IG5ldyBDVFRGb250RGVzYzsKICAgICBwRm9udERlc2MtPm1fVHlwZSA9IDE7CkBAIC00MzMsMTAgKzQzMywxMCBAQAogewogICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0U3RhbmRhcmRGb250KGRhdGEsIHNpemUsIGlkKTsKIH0KLWJvb2wgQ0ZYX0ZvbnRNZ3I6OkdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KQorRlhfQk9PTCBDRlhfRm9udE1ncjo6R2V0U3RhbmRhcmRGb250KGNvbnN0IHVpbnQ4X3QqJiBwRm9udERhdGEsIEZYX0RXT1JEJiBzaXplLCBpbnQgaW5kZXgpCiB7CiAgICAgaWYgKGluZGV4ID4gMTUgfHwgaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICB7CiAgICAgICAgIGlmIChpbmRleCA+PSAxNCkgewpAQCAtNDUyLDE0ICs0NTIsMTQgQEAKICAgICAgICAgICAgIHNpemUgPSBnX0ZveGl0Rm9udHNbaW5kZXhdLm1fZHdTaXplOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQ0ZYX0ZvbnRNYXBwZXI6OkNGWF9Gb250TWFwcGVyKCkKIHsKICAgICBGWFNZU19tZW1zZXQobV9Gb3hpdEZhY2VzLCAwLCBzaXplb2YgbV9Gb3hpdEZhY2VzKTsKICAgICBtX01NRmFjZXNbMF0gPSBtX01NRmFjZXNbMV0gPSBOVUxMOwogICAgIG1fcEZvbnRJbmZvID0gTlVMTDsKLSAgICBtX2JMaXN0TG9hZGVkID0gZmFsc2U7CisgICAgbV9iTGlzdExvYWRlZCA9IEZBTFNFOwogICAgIG1fcEZvbnRFbnVtZXJhdG9yID0gTlVMTDsKIH0KIENGWF9Gb250TWFwcGVyOjp+Q0ZYX0ZvbnRNYXBwZXIoKQpAQCAtNTgzLDEwICs1ODMsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBwdHIgPSBuYW1lOwotICAgIGJvb2wgYkxvY2FsaXplZCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkxvY2FsaXplZCA9IEZBTFNFOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5HZXRMZW5ndGgoKTsgaSArKykKICAgICAgICAgaWYgKHB0cltpXSA+IDB4ODApIHsKLSAgICAgICAgICAgIGJMb2NhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgYkxvY2FsaXplZCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChiTG9jYWxpemVkKSB7CkBAIC02MjAsNyArNjIwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BGb250SW5mby0+RW51bUZvbnRMaXN0KHRoaXMpOwotICAgIG1fYkxpc3RMb2FkZWQgPSB0cnVlOworICAgIG1fYkxpc3RMb2FkZWQgPSBUUlVFOwogfQogQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6Ok1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSkKIHsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogICAgIH0KICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKIH0KLWludDMyX3QgR2V0U3R5bGVUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZic1N0eWxlLCBib29sIGJSZXZlcnQpCitpbnQzMl90IEdldFN0eWxlVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmYnNTdHlsZSwgRlhfQk9PTCBiUmV2ZXJ0KQogewogICAgIGludDMyX3QgaUxlbiA9IGJzU3R5bGUuR2V0TGVuZ3RoKCk7CiAgICAgaWYgKCFpTGVuKSB7CkBAIC04NzIsMTUgKzg3MiwxNSBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1ib29sIENoZWNrU3VwcG9ydFRoaXJkUGFydEZvbnQoQ0ZYX0J5dGVTdHJpbmcgbmFtZSwgaW50ICZQaXRjaEZhbWlseSkKK0ZYX0JPT0wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChDRlhfQnl0ZVN0cmluZyBuYW1lLCBpbnQgJlBpdGNoRmFtaWx5KQogewogICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJNeXJpYWRQcm8iKSkgewogICAgICAgICBQaXRjaEZhbWlseSAmPSB+RlhGT05UX0ZGX1JPTUFOOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBXaW5kb3dDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKIHsKICAgICBpZiAoIShmbGFncyAmIEZYRk9OVF9VU0VFWFRFUk5BVFRSKSkgewpAQCAtOTIzLDE0ICs5MjMsMTQgQEAKICAgICB9CiAgICAgaW50IGlCYXNlRm9udCA9IDA7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFtaWx5LCBzdHlsZTsKLSAgICBib29sCWJIYXNDb21tYSA9IGZhbHNlOwotICAgIGJvb2wgYkhhc0h5cGVuID0gZmFsc2U7CisgICAgRlhfQk9PTAliSGFzQ29tbWEgPSBGQUxTRTsKKyAgICBGWF9CT09MIGJIYXNIeXBlbiA9IEZBTFNFOwogICAgIGludCBmaW5kID0gU3Vic3ROYW1lLkZpbmQoRlhfQlNUUkMoIiwiKSwgMCk7CiAgICAgaWYgKGZpbmQgPj0gMCkgewogICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKICAgICAgICAgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKGZhbWlseSk7CiAgICAgICAgIHN0eWxlID0gU3Vic3ROYW1lLk1pZChmaW5kICsgMSk7Ci0gICAgICAgIGJIYXNDb21tYSA9IHRydWU7CisgICAgICAgIGJIYXNDb21tYSA9IFRSVUU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwogICAgIH0KQEAgLTkzOSw5ICs5MzksOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBpbnQgUGl0Y2hGYW1pbHkgPSAwOwotICAgIGJvb2wgYkl0YWxpYyA9IGZhbHNlOworICAgIEZYX0JPT0wgYkl0YWxpYyA9IEZBTFNFOwogICAgIEZYX0RXT1JEIG5TdHlsZSA9IDA7Ci0gICAgYm9vbCBiU3R5bGVBdmFpbCA9IGZhbHNlOworICAgIEZYX0JPT0wgYlN0eWxlQXZhaWwgPSBGQUxTRTsKICAgICBpZiAoaUJhc2VGb250IDwgMTIpIHsKICAgICAgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKICAgICAgICAgaWYgKChpQmFzZUZvbnQgJSA0KSA9PSAxIHx8IChpQmFzZUZvbnQgJSA0KSA9PSAyKSB7CkBAIC05NjIsMTIgKzk2MiwxMiBAQAogICAgICAgICAgICAgaWYgKGZpbmQgPj0gMCkgewogICAgICAgICAgICAgICAgIHN0eWxlID0gZmFtaWx5Lk1pZChmaW5kICsgMSk7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQoZmluZCk7Ci0gICAgICAgICAgICAgICAgYkhhc0h5cGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiSGFzSHlwZW4gPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghYkhhc0h5cGVuKSB7CiAgICAgICAgICAgICBpbnQgbkxlbiA9IGZhbWlseS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShmYW1pbHksIHRydWUpOworICAgICAgICAgICAgaW50MzJfdCBuUmV0ID0gR2V0U3R5bGVUeXBlKGZhbWlseSwgVFJVRSk7CiAgICAgICAgICAgICBpZiAoblJldCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGdfRm9udFN0eWxlc1tuUmV0XS5sZW4pOwogICAgICAgICAgICAgICAgIGlmIChuUmV0ID09IDApIHsKQEAgLTk5NSwxNyArOTk1LDE3IEBACiAgICAgICAgIGludCBuTGVuID0gc3R5bGUuR2V0TGVuZ3RoKCk7CiAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBTdHlsZSA9IHN0eWxlOwogICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGJvb2wgYkZpcnN0SXRlbSA9IHRydWU7CisgICAgICAgIEZYX0JPT0wgYkZpcnN0SXRlbSA9IFRSVUU7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZjsKICAgICAgICAgd2hpbGUgKGkgPCBuTGVuKSB7CiAgICAgICAgICAgICBidWYgPSBQYXJzZVN0eWxlKHBTdHlsZSwgbkxlbiwgaSk7Ci0gICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoYnVmLCBmYWxzZSk7CisgICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoYnVmLCBGQUxTRSk7CiAgICAgICAgICAgICBpZiAoKGkgJiYgIWJTdHlsZUF2YWlsKSB8fCAoIWkgJiYgblJldCA8IDApKSB7CiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwogICAgICAgICAgICAgICAgIGlCYXNlRm9udCA9IDEyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuUmV0ID49IDApIHsKLSAgICAgICAgICAgICAgICBiU3R5bGVBdmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYlN0eWxlQXZhaWwgPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5SZXQgPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpIHsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuUmV0ID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOwogICAgICAgICB9CkBAIC0xMDQyLDkgKzEwNDIsOSBAQAogICAgICAgICB3ZWlnaHQgPSBuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGRCb2xkID8gOTAwIDogKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7CiAgICAgfQogICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgewotICAgICAgICBiSXRhbGljID0gdHJ1ZTsKKyAgICAgICAgYkl0YWxpYyA9IFRSVUU7CiAgICAgfQotICAgIGJvb2wgYkNKSyA9IGZhbHNlOworICAgIEZYX0JPT0wgYkNKSyA9IEZBTFNFOwogICAgIGludCBpRXhhY3QgPSAwOwogICAgIGludCBDaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKICAgICBpZiAoV2luZG93Q1ApIHsKQEAgLTEwNTQsNyArMTA1NCw3IEBACiAgICAgfQogICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUIHx8IENoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8CiAgICAgICAgICAgICBDaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwgQ2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgewotICAgICAgICBiQ0pLID0gdHJ1ZTsKKyAgICAgICAgYkNKSyA9IFRSVUU7CiAgICAgfQogICAgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CkBAIC0xMDY5LDIxICsxMDY5LDIxIEBACiAgICAgICAgIGlmICghYkNKSykgewogICAgICAgICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgUGl0Y2hGYW1pbHkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGl0YWxpY19hbmdsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgPSB0cnVlOworICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iU3Vic3RPZkNKSyA9IFRSVUU7CiAgICAgICAgICAgICBpZiAoblN0eWxlKSB7CiAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSB3ZWlnaHQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gRlhGT05UX0ZXX05PUk1BTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgewotICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX2JJdGxpY0NKSyA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChmbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsKLSAgICAgICAgICAgIGJJdGFsaWMgPSB0cnVlOworICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaUV4YWN0ID0gIW1hdGNoLklzRW1wdHkoKTsKQEAgLTExMzQsOSArMTEzNCw5IEBACiAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKICAgICAgICAgaWYgKGJDSkspIHsKICAgICAgICAgICAgIGlmIChpdGFsaWNfYW5nbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIGJJdGFsaWMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiSXRhbGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYkl0YWxpYyA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKICAgICAgICAgfQpAQCAtMTIyMSwxOCArMTIyMSwxOCBAQAogICAgIH0KICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9IFN1YnN0TmFtZTsKICAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OwotICAgIGJvb2wgYk5lZWRVcGRhdGVXZWlnaHQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CiAgICAgaWYgKEZYRlRfSXNfRmFjZV9Cb2xkKGZhY2UpKSB7CiAgICAgICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX0JPTEQpIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gZmFsc2U7CisgICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IEZBTFNFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSB0cnVlOworICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfTk9STUFMKSB7Ci0gICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IGZhbHNlOworICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpIHsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgbV9GaWxlU2l6ZSA9IDA7CiAgICAgbV9Gb250T2Zmc2V0ID0gMDsKICAgICBtX1dlaWdodCA9IDA7Ci0gICAgbV9iSXRhbGljID0gZmFsc2U7CisgICAgbV9iSXRhbGljID0gRkFMU0U7CiAgICAgbV9QaXRjaEZhbWlseSA9IDA7CiB9CiBDRm9udEZpbGVGYWNlSW5mbzo6fkNGb250RmlsZUZhY2VJbmZvKCkKQEAgLTEyNzIsNyArMTI3Miw3IEBACiAgICAgfQogICAgIG1fRmFjZSA9IE5VTEw7CiB9Ci1leHRlcm4gYm9vbCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSk7CitleHRlcm4gRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSk7CiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KIElGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKIHsKQEAgLTEzMDAsMTMgKzEzMDAsMTMgQEAKIHsKICAgICBkZWxldGUgdGhpczsKIH0KLWJvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitGWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKQogewogICAgIG1fcE1hcHBlciA9IHBNYXBwZXI7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhdGhMaXN0LkdldFNpemUoKTsgaSArKykgewogICAgICAgICBTY2FuUGF0aChtX1BhdGhMaXN0W2ldKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhblBhdGgoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpCiB7CkBAIC0xMzE1LDcgKzEzMTUsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOwotICAgIGJvb2wgYkZvbGRlcjsKKyAgICBGWF9CT09MIGJGb2xkZXI7CiAgICAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7CiAgICAgICAgIGlmIChiRm9sZGVyKSB7CiAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gIi4iIHx8IGZpbGVuYW1lID09ICIuLiIpIHsKQEAgLTE0NTEsNyArMTQ1MSw3IEBACiAgICAgfQogICAgIG1fRm9udExpc3QuU2V0QXQoZmFjZW5hbWUsIHBJbmZvKTsKIH0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KQordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpCiB7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC0xNTA2LDE2ICsxNTA2LDE2IEBACiB2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKIHsKIH0KLWJvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCitGWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBDRm9udEZhY2VJbmZvKiBwRm9udCA9IChDRm9udEZhY2VJbmZvKiloRm9udDsKICAgICBuYW1lID0gcEZvbnQtPm1fRmFjZU5hbWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKK0ZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCmluZGV4IDlmNDkzYTYuLjg2MWFmZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCkBAIC0zMCw5ICszMCw5IEBACiBjbGFzcyBDRlhfTGludXhGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KIHsKIHB1YmxpYzoKLSAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpIG92ZXJyaWRlOwotICAgIGJvb2wJCQkJUGFyc2VGb250Q2ZnKCk7Ci0gICAgdm9pZCoJCQkJRmluZEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBib29sIGJNYXRjaE5hbWUpOworICAgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CisgICAgRlhfQk9PTAkJCQlQYXJzZUZvbnRDZmcoKTsKKyAgICB2b2lkKgkJCQlGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSk7CiB9OwogI2RlZmluZSBMSU5VWF9HUE5BTUVTSVpFCTYKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewpAQCAtNzcsNyArNzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gMjsKIH0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCit2b2lkKiBDRlhfTGludXhGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIGludCYgaUV4YWN0KQogewogICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CiAgICAgaW50IGlCYXNlRm9udDsKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgcmV0dXJuIEdldEZvbnQoZmFjZSk7CiAgICAgfQogICAgIHZvaWQqIHAgPSBOVUxMOwotICAgIGJvb2wgYkNKSyA9IHRydWU7CisgICAgRlhfQk9PTCBiQ0pLID0gVFJVRTsKICAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKICAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDogewogICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSBHZXRKYXBhbmVzZVByZWZlcmVuY2UoY3N0cl9mYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYkNKSyA9IGZhbHNlOworICAgICAgICAgICAgYkNKSyA9IEZBTFNFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgJiYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSkgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotc3RhdGljIGludDMyX3QgX0xpbnV4R2V0U2ltaWxhclZhbHVlKGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IHBpdGNoX2ZhbWlseSwgRlhfRFdPUkQgc3R5bGUpCitzdGF0aWMgaW50MzJfdCBfTGludXhHZXRTaW1pbGFyVmFsdWUoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9EV09SRCBzdHlsZSkKIHsKICAgICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSAwOwogICAgIGlmICgoc3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHdlaWdodCA+IDQwMCkpIHsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgIH0KICAgICByZXR1cm4gaVNpbWlsYXJWYWx1ZTsKIH0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpGaW5kRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGJvb2wgYk1hdGNoTmFtZSkKK3ZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSkKIHsKICAgICBDRm9udEZhY2VJbmZvKiBwRmluZCA9IE5VTEw7CiAgICAgRlhfRFdPUkQgY2hhcnNldF9mbGFnID0gX0xpbnV4R2V0Q2hhcnNldChjaGFyc2V0KTsKQEAgLTIxNyw5ICsyMTcsOSBAQAogICAgIH0KICAgICByZXR1cm4gcEluZm87CiB9Ci1ib29sIENGWF9MaW51eEZvbnRJbmZvOjpQYXJzZUZvbnRDZmcoKQorRlhfQk9PTCBDRlhfTGludXhGb250SW5mbzo6UGFyc2VGb250Q2ZnKCkKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogdm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wYXRoLmNwcAppbmRleCA0YmM5YTg4Li5iMTQxMGIzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgICAgICBtX01hc2sgPSBuZXdfbWFzazsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBU1NFUlQoZmFsc2UpOworICAgIEFTU0VSVChGQUxTRSk7CiB9CiBDRlhfUGF0aERhdGE6OkNGWF9QYXRoRGF0YSgpCiB7CkBAIC0yNTcsOCArMjU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoYWxmX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkKIHsKICAgICBGWF9GTE9BVCBzdGFydF9rID0gMCwgc3RhcnRfYyA9IDAsIGVuZF9rID0gMCwgZW5kX2MgPSAwLCBzdGFydF9sZW4gPSAwLCBzdGFydF9kYyA9IDAsIGVuZF9sZW4gPSAwLCBlbmRfZGMgPSAwOwotICAgIGJvb2wgYlN0YXJ0VmVydCA9IEZYU1lTX2ZhYnMoc3RhcnRfeCAtIG1pZGRsZV94KSA8IDEuMGYgLyAyMDsKLSAgICBib29sIGJFbmRWZXJ0ID0gRlhTWVNfZmFicyhtaWRkbGVfeCAtIGVuZF94KSA8IDEuMGYgLyAyMDsKKyAgICBGWF9CT09MIGJTdGFydFZlcnQgPSBGWFNZU19mYWJzKHN0YXJ0X3ggLSBtaWRkbGVfeCkgPCAxLjBmIC8gMjA7CisgICAgRlhfQk9PTCBiRW5kVmVydCA9IEZYU1lTX2ZhYnMobWlkZGxlX3ggLSBlbmRfeCkgPCAxLjBmIC8gMjA7CiAgICAgaWYgKGJTdGFydFZlcnQgJiYgYkVuZFZlcnQpIHsKICAgICAgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV95ID4gc3RhcnRfeSA/IDEgOiAtMTsKICAgICAgICAgRlhfRkxPQVQgcG9pbnRfeSA9IG1pZGRsZV95ICsgaGFsZl93aWR0aCAqIHN0YXJ0X2RpcjsKQEAgLTM0MiwxMiArMzQyLDEyIEBACiAgICAgaW50IGlQb2ludCA9IDA7CiAgICAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IGxpbmVfd2lkdGg7CiAgICAgaW50IGlTdGFydFBvaW50LCBpRW5kUG9pbnQsIGlNaWRkbGVQb2ludDsKLSAgICBib29sIGJKb2luOworICAgIEZYX0JPT0wgYkpvaW47CiAgICAgd2hpbGUgKGlQb2ludCA8IG1fUG9pbnRDb3VudCkgewogICAgICAgICBpZiAobV9wUG9pbnRzW2lQb2ludF0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CiAgICAgICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCArIDE7CiAgICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7Ci0gICAgICAgICAgICBiSm9pbiA9IGZhbHNlOworICAgICAgICAgICAgYkpvaW4gPSBGQUxTRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9CRVpJRVJUTykgewogICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WCwgbV9wUG9pbnRzW2lQb2ludF0ubV9Qb2ludFkpOwpAQCAtMzU3LDEyICszNTcsMTIgQEAKICAgICAgICAgICAgIGlmIChpUG9pbnQgPT0gbV9Qb2ludENvdW50IC0gMSB8fCBtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CiAgICAgICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwogICAgICAgICAgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKLSAgICAgICAgICAgICAgICBiSm9pbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJKb2luID0gRkFMU0U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKICAgICAgICAgICAgICAgICBpTWlkZGxlUG9pbnQgPSBpUG9pbnQ7CiAgICAgICAgICAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50ICsgMTsKLSAgICAgICAgICAgICAgICBiSm9pbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYkpvaW4gPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBtX3BQb2ludHNbaVN0YXJ0UG9pbnRdLm1fUG9pbnRYOwpAQCAtMzg5LDEwICszODksMTAgQEAKICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZKTsKICAgICB9CiB9Ci1ib29sIENGWF9QYXRoRGF0YTo6R2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgYm9vbCZiVGhpbiwgYm9vbCBiQWRqdXN0KSBjb25zdAorRlhfQk9PTCBDRlhfUGF0aERhdGE6OkdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wmYlRoaW4sIEZYX0JPT0wgYkFkanVzdCkgY29uc3QKIHsKICAgICBpZiAobV9Qb2ludENvdW50IDwgMykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCA9PSAzICYmIChtX3BQb2ludHNbMF0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX01PVkVUTyAmJgogICAgICAgICAgICAgKG1fcFBvaW50c1sxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmIChtX3BQb2ludHNbMl0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX0xJTkVUTwpAQCAtNDIyLDE5ICs0MjIsMTkgQEAKICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMSwgbV9wUG9pbnRzWzFdLm1fUG9pbnRYLCBtX3BQb2ludHNbMV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1sxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRZKSB7Ci0gICAgICAgICAgICBiVGhpbiA9IHRydWU7CisgICAgICAgICAgICBiVGhpbiA9IFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBpZiAoKChtX1BvaW50Q291bnQgPiAzKSAmJiAobV9Qb2ludENvdW50ICUgMikpKSB7CiAgICAgICAgIGludCBtaWQgPSBtX1BvaW50Q291bnQgLyAyOwotICAgICAgICBib29sIGJaZXJvQXJlYSA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJaZXJvQXJlYSA9IEZBTFNFOwogICAgICAgICBDRlhfUGF0aERhdGEgdF9wYXRoOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pZDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoIShtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludFgKICAgICAgICAgICAgICAgICAgICAgJiYgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fUG9pbnRZICYmCiAgICAgICAgICAgICAgICAgICAgICgobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYgKG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPKSkpIHsKLSAgICAgICAgICAgICAgICBiWmVyb0FyZWEgPSB0cnVlOworICAgICAgICAgICAgICAgIGJaZXJvQXJlYSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gdF9wYXRoLkdldFBvaW50Q291bnQoKTsKQEAgLTQ0NCw4ICs0NDQsOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghYlplcm9BcmVhKSB7CiAgICAgICAgICAgICBOZXdQYXRoLkFwcGVuZCgmdF9wYXRoLCBOVUxMKTsKLSAgICAgICAgICAgIGJUaGluID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgYlRoaW4gPSBUUlVFOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IHN0cmF0UG9pbnQgPSAwOwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIE5ld1BhdGguQWRkUG9pbnRDb3VudCgyKTsKICAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFksIEZYUFRfTU9WRVRPKTsKICAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQgKyAxLCBtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgICAgICAgICBiVGhpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJUaGluID0gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7CkBAIC00OTcsNDIgKzQ5Nyw0MiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX1BvaW50Q291bnQgPiAzICYmIE5ld1BhdGguR2V0UG9pbnRDb3VudCgpKSB7Ci0gICAgICAgIGJUaGluID0gdHJ1ZTsKKyAgICAgICAgYlRoaW4gPSBUUlVFOwogICAgIH0KICAgICBpZiAoTmV3UGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9QYXRoRGF0YTo6SXNSZWN0KCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoKSBjb25zdAogewogICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChtX1BvaW50Q291bnQgPT0gNSAmJiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFkpKSB8fAogICAgICAgICAgICAgKG1fcFBvaW50c1swXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzBdLm1fUG9pbnRZID09IG1fcFBvaW50c1syXS5tX1BvaW50WSkgfHwKICAgICAgICAgICAgIChtX3BQb2ludHNbMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1sxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkgKyspIHsKICAgICAgICAgaWYgKChtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BQb2ludHNbaV0ubV9Qb2ludFggIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOwogfQotYm9vbCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpIGNvbnN0CiB7CiAgICAgaWYgKHBNYXRyaXggPT0gTlVMTCkgewogICAgICAgICBpZiAoIUlzUmVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBSZWN0KSB7CiAgICAgICAgICAgICBwUmVjdC0+bGVmdCA9IG1fcFBvaW50c1swXS5tX1BvaW50WDsKQEAgLTU0MSwyNyArNTQxLDI3IEBACiAgICAgICAgICAgICBwUmVjdC0+dG9wID0gbV9wUG9pbnRzWzJdLm1fUG9pbnRZOwogICAgICAgICAgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCAhPSA1ICYmIG1fUG9pbnRDb3VudCAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoKG1fUG9pbnRDb3VudCA9PSA1ICYmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRYIHx8IG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFkpKSB8fAogICAgICAgICAgICAgKG1fcFBvaW50c1sxXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChtX1BvaW50Q291bnQgPT0gNCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0ZMT0FUIHhbNV0sIHlbNV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkgKyspIHsKICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZLCB4W2ldLCB5W2ldKTsKICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgIGlmICgobV9wUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9MSU5FVE8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhbaV0gIT0geFtpIC0gMV0gJiYgeVtpXSAhPSB5W2kgLSAxXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NzIsNyArNTcyLDcgQEAKICAgICAgICAgcFJlY3QtPnRvcCA9IHlbMl07CiAgICAgICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiB2b2lkIENGWF9QYXRoRGF0YTo6Q29weShjb25zdCBDRlhfUGF0aERhdGEgJnNyYykKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcHMuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKaW5kZXggZTM3NTI4OC4uYmE1YzVmYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKQEAgLTEwLDcgKzEwLDcgQEAKIHN0cnVjdCBQU0dseXBoIHsKICAgICBDRlhfRm9udCoJCW1fcEZvbnQ7CiAgICAgRlhfRFdPUkQJCW1fR2x5cGhJbmRleDsKLSAgICBib29sCQkJbV9iR2x5cGhBZGp1c3Q7CisgICAgRlhfQk9PTAkJCW1fYkdseXBoQWRqdXN0OwogICAgIEZYX0ZMT0FUCQltX0FkanVzdE1hdHJpeFs0XTsKIH07CiBjbGFzcyBDUFNGb250CkBAIC0yMiw4ICsyMiw4IEBACiBDRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKQogewogICAgIG1fcE91dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gZmFsc2U7Ci0gICAgbV9iSW5pdGVkID0gZmFsc2U7CisgICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gRkFMU0U7CisgICAgbV9iSW5pdGVkID0gRkFMU0U7CiB9CiBDRlhfUFNSZW5kZXJlcjo6fkNGWF9QU1JlbmRlcmVyKCkKIHsKQEAgLTMzLDcgKzMzLDcgQEAKICAgICB9CiB9CiAjZGVmaW5lIE9VVFBVVF9QUyhzdHIpIG1fcE91dHB1dC0+T3V0cHV0UFMoc3RyLCBzaXplb2Ygc3RyLTEpCi12b2lkIENGWF9QU1JlbmRlcmVyOjpJbml0KElGWF9QU091dHB1dCogcE91dHB1dCwgaW50IHBzbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBiQ215a091dHB1dCkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LCBpbnQgcHNsZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJDbXlrT3V0cHV0KQogewogICAgIG1fUFNMZXZlbCA9IHBzbGV2ZWw7CiAgICAgbV9wT3V0cHV0ID0gcE91dHB1dDsKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgIG1fQ2xpcEJveC5ib3R0b20gPSBoZWlnaHQ7CiAgICAgbV9iQ215a091dHB1dCA9IGJDbXlrT3V0cHV0OwogfQotYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RhcnRSZW5kZXJpbmcoKQorRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U3RhcnRSZW5kZXJpbmcoKQogewogICAgIGlmIChtX2JJbml0ZWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBzdGF0aWMgY29uc3QgY2hhciBpbml0X3N0cltdID0gIlxuc2F2ZVxuL2ltL2luaXRtYXRyaXggbG9hZCBkZWZcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9uL25ld3BhdGggbG9hZCBkZWYvbS9tb3ZldG8gbG9hZCBkZWYvbC9saW5ldG8gbG9hZCBkZWYvYy9jdXJ2ZXRvIGxvYWQgZGVmL2gvY2xvc2VwYXRoIGxvYWQgZGVmXG4iCkBAIC01NywxNSArNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jbS9jb25jYXQgbG9hZCBkZWYvQ20vY3VycmVudG1hdHJpeCBsb2FkIGRlZi9teC9tYXRyaXggbG9hZCBkZWYvc20vc2V0bWF0cml4IGxvYWQgZGVmXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICBPVVRQVVRfUFMoaW5pdF9zdHIpOwotICAgIG1fYkluaXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9iSW5pdGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkVuZFJlbmRlcmluZygpCiB7CiAgICAgaWYgKG1fYkluaXRlZCkgewogICAgICAgICBPVVRQVVRfUFMoIlxucmVzdG9yZVxuIik7CiAgICAgfQotICAgIG1fYkluaXRlZCA9IGZhbHNlOworICAgIG1fYkluaXRlZCA9IEZBTFNFOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2F2ZVN0YXRlKCkKIHsKQEAgLTczLDcgKzczLDcgQEAKICAgICBPVVRQVVRfUFMoInFcbiIpOwogICAgIG1fQ2xpcEJveFN0YWNrLkFkZChtX0NsaXBCb3gpOwogfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCiB7CiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgICBpZiAoYktlZXBTYXZlZCkgewpAQCAtODEsNyArODEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIE9VVFBVVF9QUygiUVxuIik7CiAgICAgfQotICAgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IGZhbHNlOworICAgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOwogICAgIG1fQ2xpcEJveCA9IG1fQ2xpcEJveFN0YWNrLkdldEF0KG1fQ2xpcEJveFN0YWNrLkdldFNpemUoKSAtIDEpOwogICAgIGlmICghYktlZXBTYXZlZCkgewogICAgICAgICBtX0NsaXBCb3hTdGFjay5SZW1vdmVBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgICAgICBPVVRQVVRfUFMoInN0cm9rZXBhdGggVyBuXG4iKTsKICAgICB9CiB9Ci1ib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK0ZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTE4OSwxMyArMTg5LDEzIEBACiAgICAgaW50IGZpbGxfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKICAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwogICAgIGlmIChmaWxsX2FscGhhICYmIGZpbGxfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoZmlsbF9hbHBoYSA9PSAwICYmIHN0cm9rZV9hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7CiAgICAgICAgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgT1VUUFVUX1BTKCJcbiIpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0R3JhcGhTdGF0ZShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKQogewpAQCAtMjU5LDcgKzI1OSw3IEBACiAgICAgICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0IDw8IEZYX0JTVFJDKCIgTVxuIik7CiAgICAgfQogICAgIG1fQ3VyR3JhcGhTdGF0ZS5Db3B5KCpwR3JhcGhTdGF0ZSk7Ci0gICAgbV9iR3JhcGhTdGF0ZVNldCA9IHRydWU7CisgICAgbV9iR3JhcGhTdGF0ZVNldCA9IFRSVUU7CiAgICAgaWYgKGJ1Zi5HZXRTaXplKCkpIHsKICAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKICAgICB9CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLWJvb2wgQ0ZYX1BTUmVuZGVyZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGxlZnQsIGludCB0b3AsCitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBsZWZ0LCBpbnQgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIFN0YXJ0UmVuZGVyaW5nKCk7CkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnQpLCAoRlhfRkxPQVQpKHRvcCArIHBTb3VyY2UtPkdldEhlaWdodCgpKSk7CiAgICAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIDAsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0zMjIsMjAgKzMyMiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoZGVzdF9sZWZ0KSwgKEZYX0ZMT0FUKShkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KSk7CiAgICAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLWJvb2wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsCitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgICBpZiAoKHBNYXRyaXgtPmEgPT0gMCAmJiBwTWF0cml4LT5iID09IDApIHx8IChwTWF0cml4LT5jID09IDAgJiYgcE1hdHJpeC0+ZCA9PSAwKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoY29sb3IpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIChhbHBoYSA8IDI1NSB8fCBwU291cmNlLT5HZXRCUFAoKSAhPSAxKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgT1VUUFVUX1BTKCJxXG4iKTsKICAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwpAQCAtMzU4LDcgKzM1OCw3IEBACiAgICAgICAgIEZheENvbXByZXNzRGF0YShzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7CiAgICAgICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgICAgICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IGZhbHNlOworICAgICAgICAgICAgbV9iQ29sb3JTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIHRydWVbIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiAxWyIpOwpAQCAtNDA2LDcgKzQwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb252ZXJ0ZWQgPT0gTlVMTCkgewogICAgICAgICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGludCBCcHAgPSBwQ29udmVydGVkLT5HZXRCUFAoKSAvIDg7CiAgICAgICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBOVUxMOwpAQCAtNDYyLDE0ICs0NjIsMTQgQEAKICAgICAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKICAgICB9CiAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0Q29sb3IoRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CiAgICAgfQotICAgIGJvb2wgYkNNWUsgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJDTVlLID0gRkFMU0U7CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwogICAgICAgICBjb2xvciA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogICAgICAgICAgICAgICAgIDw8IEZYQVJHQl9CKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgcmdcbiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChiQ01ZSyA9PSBtX2JDbXlrT3V0cHV0KSB7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IHRydWU7CisgICAgICAgICAgICBtX2JDb2xvclNldCA9IFRSVUU7CiAgICAgICAgICAgICBtX0xhc3RDb2xvciA9IGNvbG9yOwogICAgICAgICB9CiAgICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CkBAIC01ODgsNyArNTg4LDcgQEAKICAgICAgICAgPDwgRlhfQlNUUkMoIi8iKSA8PCBwc19nbHlwaGluZGV4IDw8IEZYX0JTVFJDKCIgcHV0XG4iKTsKICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwogfQotYm9vbCBDRlhfUFNSZW5kZXJlcjo6RHJhd1RleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCkBAIC01OTYsMTAgKzU5NiwxMCBAQAogICAgIFN0YXJ0UmVuZGVyaW5nKCk7CiAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChwT2JqZWN0MkRldmljZS0+YSA9PSAwICYmIHBPYmplY3QyRGV2aWNlLT5iID09IDApIHx8IChwT2JqZWN0MkRldmljZS0+YyA9PSAwICYmIHBPYmplY3QyRGV2aWNlLT5kID09IDApKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgU2V0Q29sb3IoY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CkBAIC02MjgsNyArNjI4LDcgQEAKICAgICB9CiAgICAgYnVmIDw8IEZYX0JTVFJDKCJRXG4iKTsKICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6V3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKaW5kZXggYzVkYTY2YS4uNTlhNGNmYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCkBAIC00Niw3ICs0Niw3IEBACiBGWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywgaW50IG5DaGFycywgaW50IGFudGlfYWxpYXMsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKQogewogICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCAwLCAwKTsKLSAgICBib29sIGJTdGFydGVkID0gZmFsc2U7CisgICAgRlhfQk9PTCBiU3RhcnRlZCA9IEZBTFNFOwogICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7CiAgICAgICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOwogICAgICAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaCA9IGdseXBoLm1fcEdseXBoOwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmlnaHQ7CiAgICAgICAgICAgICByZWN0LnRvcCA9IGNoYXJfdG9wOwogICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjaGFyX2JvdHRvbTsKLSAgICAgICAgICAgIGJTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBjaGFyX2xlZnQpIHsKICAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBjaGFyX2xlZnQ7CkBAIC04Nyw5ICs4Nyw5IEBACiBzdGF0aWMgdm9pZCBfQWRqdXN0R2x5cGhTcGFjZShGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywgaW50IG5DaGFycykKIHsKICAgICBBU1NFUlQobkNoYXJzID4gMSk7Ci0gICAgYm9vbCBiVmVydGljYWwgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJWZXJ0aWNhbCA9IEZBTFNFOwogICAgIGlmIChwR2x5cGhBbmRQb3NbbkNoYXJzIC0gMV0ubV9PcmlnaW5YID09IHBHbHlwaEFuZFBvc1swXS5tX09yaWdpblgpIHsKLSAgICAgICAgYlZlcnRpY2FsID0gdHJ1ZTsKKyAgICAgICAgYlZlcnRpY2FsID0gVFJVRTsKICAgICB9IGVsc2UgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblkgIT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgYmdyYVszXSA9IChhbHBoYV9mbGFnID4+IDI0KSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKICAgICBhcmdiID0gRlhBUkdCX01BS0UoYmdyYVszXSwgYmdyYVsyXSwgYmdyYVsxXSwgYmdyYVswXSk7CiB9Ci1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0RXT1JEIHRleHRfZmxhZ3MsCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcERldmljZURyaXZlci0+RHJhd0RldmljZVRleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcFRleHQyRGV2aWNlLCBmb250X3NpemUsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoZmlsbF9jb2xvcik7CiAgICAgICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KQEAgLTE4Niw3ICsxODYsNyBAQAogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgICAgICAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwVGV4dDJEZXZpY2UsIGZvbnRfc2l6ZSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBjaGFyMmRldmljZSwgZGV2aWNlQ3RtLCB0ZXh0MkRldmljZTsKQEAgLTIwNCwyNCArMjA0LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX01PTk87Ci0gICAgYm9vbCBiTm9ybWFsID0gZmFsc2U7CisgICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CiAgICAgaWYgKCh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwKSB7CiAgICAgICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKLSAgICAgICAgICAgIGJvb2wgYkNsZWFyVHlwZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9DTEVBUlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJDbGVhclR5cGUgPSBGQUxTRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IHRleHRfZmxhZ3MgJiBGWFRFWFRfQ0xFQVJUWVBFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChtX1JlbmRlckNhcHMgJiAoRlhSQ19BTFBIQV9PVVRQVVQgfCBGWFJDX0NNWUtfT1VUUFVUKSkpIHsKICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fYnBwIDwgMTYpIHsKICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUw7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChiQ2xlYXJUeXBlID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgaWYgKGJDbGVhclR5cGUgPT0gRkFMU0UpIHsKICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwotICAgICAgICAgICAgICAgICAgICBiTm9ybWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwogICAgICAgICAgICAgICAgIH0KQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIGJtcF9yZWN0LkludGVyc2VjdChtX0NsaXBCb3gpOwogICAgIGlmIChibXBfcmVjdC5Jc0VtcHR5KCkpIHsKICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGludCBwaXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LldpZHRoKCkgKiBzY2FsZV94KTsKICAgICBpbnQgcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuSGVpZ2h0KCkgKiBzY2FsZV95KTsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfMWJwcE1hc2spKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwLkNsZWFyKDApOwogICAgICAgICBmb3IgKGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7CkBAIC0zMDgsMTkgKzMwOCwxOSBAQAogICAgIGlmIChtX2JwcCA9PSA4KSB7CiAgICAgICAgIGlmICghYml0bWFwLkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0KSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghYml0bWFwLkhhc0FscGhhKCkgJiYgIWJpdG1hcC5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgIGJpdG1hcC5DbGVhcigweEZGRkZGRkZGKTsKICAgICAgICAgaWYgKCFHZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgYml0bWFwLkNsZWFyKDApOwpAQCAtMzUyLDEzICszNTIsMTMgQEAKICAgICAgICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKICAgICAgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwpIHsKICAgICAgICAgICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBuY29scywgbnJvd3MsIHBHbHlwaCwgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBmYWxzZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKICAgICAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGJvb2wgYkJHUlN0cmlwZSA9IHRleHRfZmxhZ3MgJiBGWFRFWFRfQkdSX1NUUklQRTsKKyAgICAgICAgRlhfQk9PTCBiQkdSU3RyaXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9CR1JfU1RSSVBFOwogICAgICAgICBuY29scyAvPSAzOwogICAgICAgICBpbnQgeF9zdWJwaXhlbCA9IChpbnQpKGdseXBoLm1fZk9yaWdpblggKiAzKSAlIDM7CiAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwR2x5cGgtPkdldEJ1ZmZlcigpOwpAQCAtOTQ1LDkgKzk0NSw5IEBACiAgICAgICAgIFNldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApOwogICAgIH0KICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTk3Myw3ICs5NzMsNyBAQAogICAgICAgICBtYXRyaXguQ29uY2F0KCpwVGV4dDJVc2VyKTsKICAgICAgICAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGgpOwogICAgICAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICBib29sIGJIYXNBbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPworICAgICAgICBGWF9CT09MIGJIYXNBbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSB8fCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxfY29sb3IgfHwgc3Ryb2tlX2NvbG9yKTsKICAgICAgICAgaWYgKGJIYXNBbHBoYSkgewpAQCAtOTg5LDI0ICs5ODksMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbGxfbW9kZSB8PSBGWF9GSUxMX1RFWFRfTU9ERTsKICAgICAgICAgICAgIGlmICghRHJhd1BhdGgoJlRyYW5zZm9ybWVkUGF0aCwgcFVzZXIyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocENsaXBwaW5nUGF0aCkgewogICAgICAgICAgICAgcENsaXBwaW5nUGF0aC0+QXBwZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBDRlhfRm9udENhY2hlOjp+Q0ZYX0ZvbnRDYWNoZSgpCiB7Ci0gICAgRnJlZUNhY2hlKHRydWUpOworICAgIEZyZWVDYWNoZShUUlVFKTsKIH0KIAogQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCiB7CiAgICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOworICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwogICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KICAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKICAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogdm9pZCBDRlhfRm9udENhY2hlOjpSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCiB7CiAgICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOworICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwogICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KICAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKICAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gIGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOwpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0ZvbnRDYWNoZTo6RnJlZUNhY2hlKGJvb2wgYlJlbGVhc2UpCit2b2lkIENGWF9Gb250Q2FjaGU6OkZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlKQogewogICAgIGZvciAoYXV0byBpdCA9IG1fRlRGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRlRGYWNlTWFwLmVuZCgpOykgewogICAgICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIH0KICNlbmRpZgogQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGJvb2wgYkZvbnRTdHlsZSwKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpCiB7CiAgICAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gTlVMTDsKQEAgLTExMTQsNyArMTExNCw3IEBACiAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClnbHlwaF9pbmRleCwgcEdseXBoQml0bWFwKTsKICAgICByZXR1cm4gcEdseXBoQml0bWFwOwogfQotY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncykKIHsKICAgICBpZiAoZ2x5cGhfaW5kZXggPT0gKEZYX0RXT1JEKSAtIDEpIHsKQEAgLTEzMTEsNyArMTMxMSw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1DRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OlJlbmRlckdseXBoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGJvb2wgYkZvbnRTdHlsZSwKK0NGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CkBAIC0xMzIyLDcgKzEzMjIsNyBAQAogICAgIGZ0X21hdHJpeC54eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QygpIC8gNjQgKiA2NTUzNik7CiAgICAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXRCKCkgLyA2NCAqIDY1NTM2KTsKICAgICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPkdldEQoKSAvIDY0ICogNjU1MzYpOwotICAgIGJvb2wgYlVzZUNKS1N1YkZvbnQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJVc2VDSktTdWJGb250ID0gRkFMU0U7CiAgICAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKICAgICBpZiAocFN1YnN0Rm9udCkgewogICAgICAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKQEAgLTE0MjIsMTggKzE0MjIsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKIH0KLWJvb2wgX091dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsCitGWF9CT09MIF9PdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2luZGV4LCBGWF9BUkdCIGFyZ2IpCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwRGliID0gKENGWF9ESUJpdG1hcCopZGliOwogICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19CSVRNQVApOwogICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZXJyb3IgPSBGWEZUX1JlbmRlcl9HbHlwaChmYWNlLCBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCk7CiAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpbnQgYm13aWR0aCA9IEZYRlRfR2V0X0JpdG1hcF9XaWR0aChGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkpOwogICAgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CkBAIC0xNDUxLDEzICsxNDUxLDEzIEBACiAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3BpdGNoKTsKICAgICB9CiAgICAgcERpYi0+Q29tcG9zaXRlTWFzayh4ICsgbGVmdCwgeSAtIHRvcCwgYm13aWR0aCwgYm1oZWlnaHQsICZtYXNrLCBhcmdiLCAwLCAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAorRlhfQk9PTCBPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwgdW5zaWduZWQgbG9uZyBhcmdiKQogewogICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKHBGb250LT5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CkBAIC0xNDkwLDkgKzE0OTAsOSBAQAogICAgIH0KICAgICBpZiAocFRleHRfbWF0cml4KQogICAgICAgICBSZXNldFRyYW5zZm9ybShmYWNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKK0ZYX0JPT0wgT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgbG9uZyBnbHlwaF9pbmRleCwgdW5zaWduZWQgbG9uZyBhcmdiKQogewogICAgIEZYRlRfTWF0cml4ICBmdF9tYXRyaXg7CkBAIC0xNTA3LDcgKzE1MDcsNyBAQAogICAgICAgICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKGZvbnRfc2l6ZSAvIDY0ICogNjU1MzYpOwogICAgIH0KICAgICBTY29wZWRGb250VHJhbnNmb3JtIHNjb3BlZF90cmFuc2Zvcm0ocEZvbnQtPm1fRmFjZSwgJmZ0X21hdHJpeCk7Ci0gICAgYm9vbCByZXQgPSBfT3V0cHV0R2x5cGgoZGliLCB4LCB5LCBwRm9udCwKKyAgICBGWF9CT09MIHJldCA9IF9PdXRwdXRHbHlwaChkaWIsIHgsIHksIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBhcmdiKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTUzMyw3ICsxNTMzLDcgQEAKICAgICByZXR1cm4gcEdseXBoUGF0aDsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBib29sCQkJbV9iQ291bnQ7CisgICAgRlhfQk9PTAkJCW1fYkNvdW50OwogICAgIGludAkJCQltX1BvaW50Q291bnQ7CiAgICAgRlhfUEFUSFBPSU5UKgltX3BQb2ludHM7CiAgICAgaW50CQkJCW1fQ3VyWDsKQEAgLTE2ODQsNyArMTY4NCw3IEBACiAgICAgZnVuY3Muc2hpZnQgPSAwOwogICAgIGZ1bmNzLmRlbHRhID0gMDsKICAgICBPVVRMSU5FX1BBUkFNUyBwYXJhbXM7Ci0gICAgcGFyYW1zLm1fYkNvdW50ID0gdHJ1ZTsKKyAgICBwYXJhbXMubV9iQ291bnQgPSBUUlVFOwogICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwogICAgIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOwogICAgIGlmIChwYXJhbXMubV9Qb2ludENvdW50ID09IDApIHsKQEAgLTE2OTIsNyArMTY5Miw3IEBACiAgICAgfQogICAgIENGWF9QYXRoRGF0YSogcFBhdGggPSBuZXcgQ0ZYX1BhdGhEYXRhOwogICAgIHBQYXRoLT5TZXRQb2ludENvdW50KHBhcmFtcy5tX1BvaW50Q291bnQpOwotICAgIHBhcmFtcy5tX2JDb3VudCA9IGZhbHNlOworICAgIHBhcmFtcy5tX2JDb3VudCA9IEZBTFNFOwogICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwogICAgIHBhcmFtcy5tX3BQb2ludHMgPSBwUGF0aC0+R2V0UG9pbnRzKCk7CiAgICAgcGFyYW1zLm1fQ3VyWCA9IHBhcmFtcy5tX0N1clkgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oIGIvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCmluZGV4IDJlODYxYmEuLjEyZmFjNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKQEAgLTMyLDEyICszMiwxMiBAQAogICAgICAgICBtX1JlZkNvdW50ID0gMDsKICAgICB9CiAgICAgfkNUVEZvbnREZXNjKCk7Ci0gICAgYm9vbAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKKyAgICBGWF9CT09MCQkJUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOwogICAgIGludAkJCQltX1R5cGU7CiAgICAgdW5pb24gewogICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgYm9vbAkJbV9iSXRhbGljOwotICAgICAgICAgICAgYm9vbAkJbV9iQm9sZDsKKyAgICAgICAgICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKKyAgICAgICAgICAgIEZYX0JPT0wJCW1fYkJvbGQ7CiAgICAgICAgICAgICBGWEZUX0ZhY2UJbV9wRmFjZTsKICAgICAgICAgfSBtX1NpbmdsZUZhY2U7CiAgICAgICAgIHN0cnVjdCB7CkBAIC02Myw5ICs2Myw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gVW5pY29kZTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0CisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogfTsKICNkZWZpbmUgQ0hBUlNFVF9GTEFHX0FOU0kJCTEKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBGWF9EV09SRAkJCW1fRmlsZVNpemU7CiAgICAgRlhfRFdPUkQJCQltX0ZvbnRPZmZzZXQ7CiAgICAgaW50CQkJCQltX1dlaWdodDsKLSAgICBib29sCQkJCW1fYkl0YWxpYzsKKyAgICBGWF9CT09MCQkJCW1fYkl0YWxpYzsKICAgICBpbnQJCQkJCW1fUGl0Y2hGYW1pbHk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRm9udFRhYmxlczsKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAKaW5kZXggMTNiYjc1My4uMzQzN2ViNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcApAQCAtMTI5OCw3ICsxMjk4LDcgQEAKIAogCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgQ0ZYX1NraWFSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJSZ2JCeXRlT3JkZXIsCisgICAgRlhfQk9PTCBDRlhfU2tpYVJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIC8vVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCiAgICAgewogICAgICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMTMzMSw4ICsxMzMxLDggQEAKIAogICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwogCi0gICAgICAgIGJvb2wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICBib29sIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKKyAgICAgICAgRlhfQk9PTCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICAgIEZYX0JPT0wgYkRldmljZUNNWUsgPSBwRGV2aWNlLT5Jc0NteWtJbWFnZSgpOwogCiAgICAgICAgIG1fQWxwaGEgPSBiT2JqZWN0Q01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogCkBAIC0xMzc3LDcgKzEzNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJm1fQ29sb3IsIDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIE9iamVjdCBSR0IKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CiAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM4NSw3ICsxMzg1LDcgQEAKICAgICAgICAgICAgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07CiAgICAgICAgICAgICAgICAgbV9CbHVlICA9ICgodWludDhfdCopJm1fQ29sb3IpWzJdOwogICAgICAgICAgICAgICAgIG1fR3JheSAgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwpAQCAtMTQ5Niw4ICsxNDk2LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNTk1LDcgKzE1OTUsNyBAQAogICAgICAgICBibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOwogICAgIH0KIAotICAgIGJvb2wgQ0ZYX1NraWFBOFJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApCisgICAgRlhfQk9PTCBDRlhfU2tpYUE4UmVuZGVyZXI6OkluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCkKICAgICB7CiAgICAgICAgIG1fcERldmljZSA9IHBEZXZpY2U7CiAgICAgICAgIG1fTGVmdCA9IExlZnQ7CkBAIC0xNjA0LDYgKzE2MDQsNiBAQAogICAgICAgICAgICAgbV9kc3RXaWR0aCA9IG1fTGVmdCArIHBEZXZpY2UtPkdldFdpZHRoKCk7CiAgICAgICAgICAgICBtX2RzdEhlaWdodCA9IG1fVG9wICsgcERldmljZS0+R2V0SGVpZ2h0KCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmgKaW5kZXggY2Q0MTFkYS4uZTYwYzYzOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaAorKysgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oCkBAIC0xNSw5ICsxNSw5IEBACiAJCQkJbV9CbHVlLAkJLy8gWWVsbG93CiAJCQkJbV9HcmF5OwkJLy8gQmxhY2sKIAlGWF9EV09SRAltX0NvbG9yOwkvLyBGWF9BUkdCIG9yIEZYX0NNWUsKLQlib29sCQltX2JGdWxsQ292ZXI7CisJRlhfQk9PTAkJbV9iRnVsbENvdmVyOwogCWludAkJCW1fUHJvY2Vzc0ZpbHRlcjsKLQlib29sICAgICBtX2JSZ2JCeXRlT3JkZXI7CisJRlhfQk9PTCAgICAgbV9iUmdiQnl0ZU9yZGVyOwogCiAJRlhfUkVDVAkJCQltX0NsaXBCb3g7CiAJQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAogCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlib29sIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiUmdiQnl0ZU9yZGVyLAorCUZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCiAJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOyAvL1RoZSBhbHBoYSBmbGFnIG11c3QgYmUgZmlsbF9mbGFnIGlmIGV4aXN0LgogfTsKIGNsYXNzIENGWF9Ta2lhQThSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXZpcnR1YWwgdm9pZCBibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAJdmlydHVhbAl2b2lkIGJsaXRBbnRpUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgU2tBbHBoYSBsZWZ0QWxwaGEsIFNrQWxwaGEgcmlnaHRBbHBoYSk7CiAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCWJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKTsKKwlGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCk7CiAJQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7CiAJaW50IG1fTGVmdDsKIAlpbnQgbV9Ub3A7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcAppbmRleCA3MjQ3OGIxLi40MWNlMDc3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKQEAgLTQ2LDI0ICs0NiwyNCBAQAogcHVibGljOgogCXN0YXRpYyB2b2lkIERyYXdQYXRoKGNvbnN0IFNrUGF0aCYgc3JjUGF0aCwgU2tCbGl0dGVyKiBibGl0dGVyLCAgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpOwogfTsKLWJvb2wgRnhTa0RyYXdUcmVhdEFzSGFpcmxpbmUoY29uc3QgU2tQYWludCYgcGFpbnQsIFNrU2NhbGFyKiBjb3ZlcmFnZSkgeworRlhfQk9PTCBGeFNrRHJhd1RyZWF0QXNIYWlybGluZShjb25zdCBTa1BhaW50JiBwYWludCwgU2tTY2FsYXIqIGNvdmVyYWdlKSB7CiAJaWYgKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUgIT0gcGFpbnQuZ2V0U3R5bGUoKSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJRlhTWVNfYXNzZXJ0KGNvdmVyYWdlKTsKIAlTa1NjYWxhciBzdHJva2VXaWR0aCA9IHBhaW50LmdldFN0cm9rZVdpZHRoKCk7CiAJaWYgKDAgPT0gc3Ryb2tlV2lkdGgpIHsKIAkJKmNvdmVyYWdlID0gU0tfU2NhbGFyMTsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAkvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byB0cnkgdG8gZmFrZSBhIHRoaWNrLXN0cm9rZSB3aXRoIGEgbW9kdWxhdGVkCiAJLy8gaGFpcmxpbmUKIAlpZiAoIXBhaW50LmlzQW50aUFsaWFzKCkpCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCWlmIChzdHJva2VXaWR0aCA8PSBTS19TY2FsYXIxKSB7CiAJCSpjb3ZlcmFnZSA9IHN0cm9rZVdpZHRoOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgU3VwZXJCbGl0dGVyX3NraWE6OkRyYXdQYXRoKGNvbnN0IFNrUGF0aCYgc3JjUGF0aCwgU2tCbGl0dGVyKiBibGl0dGVyLCBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogc3RhdGljIHZvaWQgU2tSYXN0ZXJpemVTdHJva2UoU2tQYWludCYgc3BhaW50LCBTa1BhdGgqIGRzdFBhdGhEYXRhLCBTa1BhdGgmIHBhdGhfZGF0YSwKIAkJCQkJIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogCQkJCQkgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgRlhfRklYRkxPQVQgc2NhbGUgPSBGSVg4X09ORSwKLQkJCQkJIGJvb2wgYlN0cm9rZUFkanVzdCA9IGZhbHNlLCBib29sIGJUZXh0TW9kZSA9IGZhbHNlKQorCQkJCQkgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCiB7CiAJU2tQYWludDo6Q2FwIGNhcDsKIAlzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlzdHJva2VyLnNldEpvaW4oam9pbik7CiAJCXN0cm9rZXIuc2V0TWl0ZXJMaW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKIAkJc3Ryb2tlci5zZXRXaWR0aCh3aWR0aCk7Ci0JCXN0cm9rZXIuc2V0RG9GaWxsKGZhbHNlKTsKKwkJc3Ryb2tlci5zZXREb0ZpbGwoRkFMU0UpOwogCQlzdHJva2VyLnN0cm9rZVBhdGgocGF0aF9kYXRhLCBkc3RQYXRoRGF0YSk7CiAJCVNrTWF0cml4IHNtYXRyaXg7CiAJCXNtYXRyaXguc2V0QWxsKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5iLCBwT2JqZWN0MkRldmljZS0+ZCwgcE9iamVjdDJEZXZpY2UtPmYsIDAsIDAsIDEpOwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJfQogfQogCi1DRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KQorQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKIHsKIAltX3BBZ2dEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwogfQpAQCAtMjQzLDcgKzI0Myw3IEBACiB7CiAgICAgZGVsZXRlIG1fcEFnZ0RyaXZlcjsKIH0KLWJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAJCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpAQCAtMjU5LDcgKzI1OSw3IEBACiAJbV9wQWdnRHJpdmVyLT5TYXZlU3RhdGUoKTsKIH0KIAotdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCiB7CiAJbV9wQWdnRHJpdmVyLT5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CiB9CkBAIC0yOTQsNyArMjk0LDcgQEAKIAltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkludGVyc2VjdE1hc2tGKGNsaXBfYm94LmZMZWZ0LCBjbGlwX2JveC5mVG9wLCBtYXNrKTsKIAogfQotYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJaW50IGZpbGxfbW9kZQkvLyBmaWxsIG1vZGUsIFdJTkRJTkcgb3IgQUxURVJOQVRFCiAJCQkJCQkpCkBAIC0zMDgsNyArMzA4LDcgQEAKIAkJCXJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GSVhGTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKIAkJCUZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKIAkJCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0UmVjdChyZWN0KTsKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9CiAJQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOwpAQCAtMzE4LDE1ICszMTgsMTUgQEAKIAogCVNrUGFpbnQgc3BhaW50OwogCXNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKLQlzcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAogCVNldENsaXBNYXNrKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmc3BhaW50KTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKIAkJCQkJKQpAQCAtMzQyLDM2ICszNDIsMzYgQEAKIAlTa1BhaW50IHNwYWludDsKIAlzcGFpbnQuc2V0Q29sb3IoMHhmZmZmZmZmZik7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOwotCXNwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisJc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKIAogCVNrUGF0aCBkc3RfcGF0aDsKLQlTa1Jhc3Rlcml6ZVN0cm9rZShzcGFpbnQsICZkc3RfcGF0aCwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgMSwgZmFsc2UsIDApOworCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgMCk7CiAJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAlTZXRDbGlwTWFzayhkc3RfcGF0aCwgJnNwYWludCk7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiR3JvdXBLbm9ja291dCwKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKIAkJCQkJCQkJCQkJICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5SZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIGNvbG9yLCBiRnVsbENvdmVyLCBiR3JvdXBLbm9ja291dCxhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLWJvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkZpbGwpCitGWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyU2tpYShTa1BhdGgmIHNrUGF0aCwgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LCBTa0lSZWN0JiByZWN0LCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJGaWxsKQogewogCUNGWF9ESUJpdG1hcCogcHQgPSBiR3JvdXBLbm9ja291dD9tX3BBZ2dEcml2ZXItPkdldEJhY2tEcm9wKCk6TlVMTDsKIAlDRlhfU2tpYVJlbmRlcmVyIHJlbmRlcjsKIAlpZiAoIXJlbmRlci5Jbml0KG1fcEFnZ0RyaXZlci0+bV9wQml0bWFwLCBwdCwgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLCBjb2xvciwgYkZ1bGxDb3ZlciwgbV9wQWdnRHJpdmVyLT5tX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCVNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKHJlY3QpOwogCVN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsICByYXN0ZXJDbGlwLCBvcmlnUGFpbnQpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiAKIH0KIAotYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCiAJCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKIAkJCQkJCUZYX0RXT1JEIGZpbGxfY29sb3IsCQkJLy8gZmlsbCBjb2xvcgpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCQkJCQl2b2lkKiBwSWNjVHJhbnNmb3JtCiAJCQkJCQkpCiB7Ci0JaWYgKEdldEJ1ZmZlcigpID09IE5VTEwpIHJldHVybiB0cnVlOworCWlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSByZXR1cm4gVFJVRTsKIAlGT1hJVF9ERUJVRzEoIkNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3UGF0aDogZW50ZXJpbmciKTsKIAlTa0lSZWN0IHJlY3Q7CiAJcmVjdC5zZXQoMCwgMCwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOwpAQCAtMzk2LDExICszOTYsMTEgQEAKIAkJcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSYzKSA9PSBGWEZJTExfV0lORElORz8gU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZTpTa1BhdGg6OmtFdmVuT2RkX0ZpbGxUeXBlKTsKIAogCQlTa1BhaW50IHNwYWludDsKLQkJc3BhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKwkJc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKIAkJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAkJc3BhaW50LnNldENvbG9yKGZpbGxfY29sb3IpOwotCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBzcGFpbnQsIHJlY3QsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIGZhbHNlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkKLQkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShwYXRoX2RhdGEubV9QYXRoRGF0YSwgc3BhaW50LCByZWN0LCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpCisJCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJaW50IHN0cm9rZV9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpIDogRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKQEAgLTQyNyw0OCArNDI3LDQ4IEBACiAJCVNrUGFpbnQgc3BhaW50OwogCQlzcGFpbnQuc2V0Q29sb3Ioc3Ryb2tlX2NvbG9yKTsKIAkJc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOwotCQlzcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworCQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOwogCQlTa1BhdGggZHN0X3BhdGg7Ci0JCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsIHBHcmFwaFN0YXRlLCBtYXRyaXgxLmEsIGZhbHNlLCAwKTsKKwkJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIDApOwogCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCQlpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTw8OCB8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CiAKLQkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIGZhbHNlLCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGZhbHNlKSkKLQkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZBTFNFKSkKKwkJCXJldHVybiBGQUxTRTsKIAogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAorRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKIAkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0Q2xpcEJveChwUmVjdCk7CiB9CiAKLWJvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBib29sIGJERWRnZSkKK0ZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJERWRnZSkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtLCBiREVkZ2UpOwogfQogCi1ib29sCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKK0ZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogCQkJCQkJCQkJICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIGJsZW5kX3R5cGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1ib29sCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK0ZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogCQkJCQkJCWludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAkJCQkJCQlhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwKK0ZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCiAJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCQkJCQkJcE1hdHJpeCwgcmVuZGVyX2ZsYWdzLCBoYW5kbGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1ib29sCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK0ZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKHZvaWQqIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPkNvbnRpbnVlRElCaXRzKHBIYW5kbGUsIHBQYXVzZSk7CiB9CkBAIC00OTcsMzEgKzQ5NywzMSBAQAogCiBDRlhfU2tpYURldmljZTo6Q0ZYX1NraWFEZXZpY2UoKQogewotCW1fYk93bmVkQml0bWFwID0gZmFsc2U7CisJbV9iT3duZWRCaXRtYXAgPSBGQUxTRTsKIH0KIAotYm9vbCBDRlhfU2tpYURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCiB7CiAJaWYgKHBCaXRtYXAgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJU2V0Qml0bWFwKHBCaXRtYXApOwogCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiAJU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQogewotCW1fYk93bmVkQml0bWFwID0gdHJ1ZTsKKwltX2JPd25lZEJpdG1hcCA9IFRSVUU7CiAJQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKIAlpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CiAJCWRlbGV0ZSBwQml0bWFwOwotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAl9CiAJU2V0Qml0bWFwKHBCaXRtYXApOwotCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gIG5ldyBDRlhfU2tpYURldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgZmFsc2UsIHBPcmlEZXZpY2UsIGZhbHNlKTsKKwlDRlhfU2tpYURldmljZURyaXZlciogcERyaXZlciA9ICBuZXcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIEZBTFNFLCBwT3JpRGV2aWNlLCBGQUxTRSk7CiAJU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogQ0ZYX1NraWFEZXZpY2U6On5DRlhfU2tpYURldmljZSgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCmluZGV4IDcyNzg2NzEuLmFiNTFlNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCkBAIC05LDcgKzksNyBAQAogY2xhc3MgQ0ZYX1NraWFEZXZpY2VEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlcgogewogcHVibGljOgotCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCk7CisJQ0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKIAl2aXJ0dWFsIH5DRlhfU2tpYURldmljZURyaXZlcigpOwogCiAJLyoqIE9wdGlvbnMgKi8KQEAgLTE3LDIyICsxNywyMiBAQAogCiAJLyoqIFNhdmUgYW5kIHJlc3RvcmUgYWxsIGdyYXBoaWMgc3RhdGVzICovCiAJdmlydHVhbCB2b2lkCQlTYXZlU3RhdGUoKTsKLQl2aXJ0dWFsIHZvaWQJCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpOworCXZpcnR1YWwgdm9pZAkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCk7CiAKIAkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgZmlsbGVkIHJlZ2lvbiAqLwotCXZpcnR1YWwgYm9vbAkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCisJdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KIAkJCQkJCQlpbnQgZmlsbF9tb2RlCS8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUKIAkJCQkJCQkpOwogCiAJLyoqIFNldCBjbGlwcGluZyBwYXRoIHVzaW5nIHN0cm9rZWQgcmVnaW9uICovCi0JdmlydHVhbCBib29sCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbworCXZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KIAkJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KIAkJCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCS8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcwogCQkJCQkJCSk7CiAKIAkvKiogRHJhdyBhIHBhdGggKi8KLQl2aXJ0dWFsIGJvb2wJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorCXZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKIAkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAJCQkJCQlGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtNDIsNDQgKzQyLDQ0IEBACiAJCQkJCQl2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAogCQkJCQkJCSk7CiAKLQl2aXJ0dWFsIGJvb2wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisJdmlydHVhbCBGWF9CT09MCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLQl2aXJ0dWFsIGJvb2wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAorCXZpcnR1YWwgRlhfQk9PTAkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAogCS8qKiBEcmF3IGEgc2luZ2xlIHBpeGVsIChkZXZpY2UgZGVwZW5kYW50KSBsaW5lICovCi0JdmlydHVhbCBib29sCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZJWEZMT0FUIHgxLCBGWF9GSVhGTE9BVCB5MSwgRlhfRklYRkxPQVQgeDIsIEZYX0ZJWEZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpIHsgcmV0dXJuIGZhbHNlOyB9CisJdmlydHVhbCBGWF9CT09MCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZJWEZMT0FUIHgxLCBGWF9GSVhGTE9BVCB5MSwgRlhfRklYRkxPQVQgeDIsIEZYX0ZJWEZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKwkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpIHsgcmV0dXJuIEZBTFNFOyB9CiAKLQl2aXJ0dWFsIGJvb2wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworCXZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CiAKIAkvKiogTG9hZCBkZXZpY2UgYnVmZmVyIGludG8gYSBESUIgKi8KLQl2aXJ0dWFsIGJvb2wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7CisJdmlydHVhbCBGWF9CT09MCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOwogCiAJdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKSB7IHJldHVybiBtX3BBZ2dEcml2ZXItPkdldEJhY2tEcm9wKCk7IH0KIAotCXZpcnR1YWwgYm9vbAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKwl2aXJ0dWFsIEZYX0JPT0wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAJCQkJCQlpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAogCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci0JdmlydHVhbCBib29sCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisJdmlydHVhbCBGWF9CT09MCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAJCQkJaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKIAkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgYm9vbAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisJdmlydHVhbCBGWF9CT09MCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKIAkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKIAkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQl2aXJ0dWFsIGJvb2wJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworCXZpcnR1YWwgRlhfQk9PTAkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAJdmlydHVhbCB2b2lkCQlDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKIAotCXZpcnR1YWwgYm9vbCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisJdmlydHVhbCBGWF9CT09MICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKIAkJCQkJCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgYm9vbAkJUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAorCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAogCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLQl2aXJ0dWFsIGJvb2wJCVJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkZpbGwgPSB0cnVlKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCVJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkZpbGwgPSBUUlVFKTsKIAl2b2lkCQkJCVNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpOwogCXZvaWQJCQkJU2V0Q2xpcE1hc2soU2tQYXRoJiBza1BhdGgsIFNrUGFpbnQqIHNwYWludCk7CiAJdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdCB7cmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QnVmZmVyKCk7fQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmggYi9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaAppbmRleCA0ODk2MTYxLi5kYzJhMzM4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaApAQCAtMzUsMTUgKzM1LDE1IEBACiAgICAgdm9pZAkJCUxvYWQoKTsKICAgICB2b2lkICAgICAgICAgICAgVW5sb2FkKCk7CiAKLSAgICBib29sCQkJSXNBdmFpbGFibGUoKQorICAgIEZYX0JPT0wJCQlJc0F2YWlsYWJsZSgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9wRFdyaXRlRmFjdG9yeSAhPSBOVUxMOwogICAgIH0KIAogICAgIHZvaWQqCQkJRHdDcmVhdGVGb250RmFjZUZyb21TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBzaW11bGF0aW9uX3N0eWxlKTsKLSAgICBib29sICAgICAgICAgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwU3JjLCB2b2lkKiogcmVuZGVyVGFyZ2V0KTsKKyAgICBGWF9CT09MICAgICAgICAgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwU3JjLCB2b2lkKiogcmVuZGVyVGFyZ2V0KTsKICAgICB2b2lkICAgICAgICAgICAgRHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KTsKLSAgICBib29sCQkJRHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9SRUNUJiBzdHJpbmdSZWN0LCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgIEZYX0JPT0wJCQlEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpmb250LCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0FSR0IgdGV4dF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9jb3VudCwgdW5zaWduZWQgc2hvcnQqIGdseXBoX2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblgsIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAppbmRleCBlNjY2N2IxLi4xOGJjYzU5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwCkBAIC0yNCwxOCArMjQsMTggQEAKICAgICBDV2luMzJGb250SW5mbygpOwogICAgIH5DV2luMzJGb250SW5mbygpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwJYm9vbAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGJvb2wmIGJFeGFjdCk7CisgICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgRlhfQk9PTCYgYkV4YWN0KTsKICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpCiAgICAgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSk7CiAgICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKLSAgICB2aXJ0dWFsCWJvb2wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgdmlydHVhbCBib29sCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KTsKLSAgICBib29sCQkJCUlzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBICpwbGYpOwotICAgIGJvb2wJCQkJSXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZik7CisgICAgdmlydHVhbAlGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CisgICAgRlhfQk9PTAkJCQlJc09wZW5UeXBlRnJvbURpdihjb25zdCBMT0dGT05UQSAqcGxmKTsKKyAgICBGWF9CT09MCQkJCUlzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpOwogICAgIHZvaWQJCQkJQWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSAqcGxmLCBGWF9EV09SRCBGb250VHlwZSk7CiAgICAgdm9pZAkJCQlHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpOwogICAgIHZvaWQJCQkJR2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKQEAgLTU5LDEwICs1OSwxMCBAQAogICAgIGRlbGV0ZSB0aGlzOwogfQogI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgKCgoRlhfRFdPUkQpeDE8PDI0KXwoKEZYX0RXT1JEKXgyPDwxNil8KChGWF9EV09SRCl4Mzw8OCl8KEZYX0RXT1JEKXg0KQotYm9vbCBDV2luMzJGb250SW5mbzo6SXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZikKK0ZYX0JPT0wgQ1dpbjMyRm9udEluZm86OklzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBICpwbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBGWF9CT09MIHJldCA9IEZBTFNFOwogICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CiAgICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKICAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwpAQCAtNzQsMTYgKzc0LDE2IEBACiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgcmV0ID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBEZWxldGVGb250KGhGb250KTsKICAgICByZXR1cm4gcmV0OwogfQotYm9vbCBDV2luMzJGb250SW5mbzo6SXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZikKK0ZYX0JPT0wgQ1dpbjMyRm9udEluZm86OklzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpCiB7CiAgICAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBGWF9CT09MIHJldCA9IEZBTFNFOwogICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CiAgICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKICAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwpAQCAtOTUsMTAgKzk1LDEwIEBACiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgcmV0ID0gVFJVRTsKICAgICAgICAgfSBlbHNlIGlmICgobFZlcnNpb24gJiAweEZGRkYwMDAwKSA9PSBUVF9NQUtFX1RBRygweDgwLCAweDAxLCAweDAwLCAweDAwKSB8fAogICAgICAgICAgICAgICAgICAgIChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKCclJywgJyEnLCAwLCAwKSkgewotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldCA9IFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgRGVsZXRlRm9udChoRm9udCk7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBwRm9udEluZm8tPkFkZEluc3RhbGxlZEZvbnQocGxmLCBGb250VHlwZSk7CiAgICAgcmV0dXJuIDE7CiB9Ci1ib29sIENXaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCitGWF9CT09MIENXaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCiB7CiAgICAgbV9wTWFwcGVyID0gcE1hcHBlcjsKICAgICBMT0dGT05UQSBsZjsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIGlmIChwTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7CiAgICAgICAgIHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkZpbmlzaCgpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fcEZhY2VOYW1lOwpAQCAtMTYzLDIyICsxNjMsMjIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIGNvbnN0IEZYX0NIQVIqCW1fcE5hbWU7CiAgICAgY29uc3QgRlhfQ0hBUioJbV9wV2luTmFtZTsKLSAgICBib29sCQltX2JCb2xkOwotICAgIGJvb2wJCW1fYkl0YWxpYzsKKyAgICBGWF9CT09MCQltX2JCb2xkOworICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKIH0KIEJhc2UxNFN1YnN0c1tdID0gewotICAgIHsiQ291cmllciIsICJDb3VyaWVyIE5ldyIsIGZhbHNlLCBmYWxzZX0sCi0gICAgeyJDb3VyaWVyLUJvbGQiLCAiQ291cmllciBOZXciLCB0cnVlLCBmYWxzZX0sCi0gICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IiwgdHJ1ZSwgdHJ1ZX0sCi0gICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAiQ291cmllciBOZXciLCBmYWxzZSwgdHJ1ZX0sCi0gICAgeyJIZWx2ZXRpY2EiLCAiQXJpYWwiLCBmYWxzZSwgZmFsc2V9LAotICAgIHsiSGVsdmV0aWNhLUJvbGQiLCAiQXJpYWwiLCB0cnVlLCBmYWxzZX0sCi0gICAgeyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCAiQXJpYWwiLCB0cnVlLCB0cnVlfSwKLSAgICB7IkhlbHZldGljYS1PYmxpcXVlIiwgIkFyaWFsIiwgZmFsc2UsIHRydWV9LAotICAgIHsiVGltZXMtUm9tYW4iLCAiVGltZXMgTmV3IFJvbWFuIiwgZmFsc2UsIGZhbHNlfSwKLSAgICB7IlRpbWVzLUJvbGQiLCAiVGltZXMgTmV3IFJvbWFuIiwgdHJ1ZSwgZmFsc2V9LAotICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCB0cnVlLCB0cnVlfSwKLSAgICB7IlRpbWVzLUl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCBmYWxzZSwgdHJ1ZX0sCisgICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgRkFMU0UsIEZBTFNFfSwKKyAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyIsIFRSVUUsIEZBTFNFfSwKKyAgICB7IkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllciBOZXciLCBUUlVFLCBUUlVFfSwKKyAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIEZBTFNFLCBUUlVFfSwKKyAgICB7IkhlbHZldGljYSIsICJBcmlhbCIsIEZBTFNFLCBGQUxTRX0sCisgICAgeyJIZWx2ZXRpY2EtQm9sZCIsICJBcmlhbCIsIFRSVUUsIEZBTFNFfSwKKyAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCIsIFRSVUUsIFRSVUV9LAorICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCAiQXJpYWwiLCBGQUxTRSwgVFJVRX0sCisgICAgeyJUaW1lcy1Sb21hbiIsICJUaW1lcyBOZXcgUm9tYW4iLCBGQUxTRSwgRkFMU0V9LAorICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4iLCBUUlVFLCBGQUxTRX0sCisgICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIFRSVUUsIFRSVUV9LAorICAgIHsiVGltZXMtSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIEZBTFNFLCBUUlVFfSwKIH07CiBDRlhfQnl0ZVN0cmluZyBDV2luMzJGb250SW5mbzo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCiB7CkBAIC0yMTIsMTcgKzIxMiwxNyBAQAogICAgICAgICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoY29uc3QgRlhfQ0hBUiopa2V5LCAoKF9Gb250TmFtZU1hcCopZWxlbWVudCktPm1fcFNyY0ZvbnROYW1lKTsKICAgICB9CiB9Ci1ib29sIF9HZXRTdWJGb250TmFtZShDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK0ZYX0JPT0wgX0dldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGludCBzaXplID0gc2l6ZW9mIGdfSnBGb250TmFtZU1hcDsKICAgICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOwogICAgIF9Gb250TmFtZU1hcCogZm91bmQgPSAoX0ZvbnROYW1lTWFwKilGWFNZU19ic2VhcmNoKG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gc2l6ZW9mIChfRm9udE5hbWVNYXApLCBzaXplb2YgKF9Gb250TmFtZU1hcCksIGNvbXBhcmVTdHJpbmcpOwogICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBuYW1lID0gZm91bmQtPm1fcFN1YkZvbnROYW1lOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogdm9pZCBDV2luMzJGb250SW5mbzo6R2V0R0JQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KQogewpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgIGZhY2UgPSAiTVMgUE1pbmNobyI7CiAgICAgfQogfQotdm9pZCogQ1dpbjMyRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBib29sJiBiRXhhY3QpCit2b2lkKiBDV2luMzJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOwogICAgIGludCBpQmFzZUZvbnQ7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgICAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BXaW5OYW1lOwogICAgICAgICAgICAgd2VpZ2h0ID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iQm9sZCA/IEZXX0JPTEQgOiBGV19OT1JNQUw7CiAgICAgICAgICAgICBiSXRhbGljID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iSXRhbGljOwotICAgICAgICAgICAgYkV4YWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJFeGFjdCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChjaGFyc2V0ID09IEFOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7CkBAIC0zNzMsMjYgKzM3MywyNiBAQAogICAgIH0KICAgICByZXR1cm4gc2l6ZTsKIH0KLWJvb2wgQ1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK0ZYX0JPT0wgQ1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKIHsKICAgICBjaGFyIGZhY2VidWZbMTAwXTsKICAgICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgKEhGT05UKWhGb250KTsKICAgICBpbnQgcmV0ID0gOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7CiAgICAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG5hbWUgPSBmYWNlYnVmOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDV2luMzJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKK0ZYX0JPT0wgQ1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCiB7CiAgICAgVEVYVE1FVFJJQyB0bTsKICAgICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgKEhGT05UKWhGb250KTsKICAgICA6OkdldFRleHRNZXRyaWNzKG1faERDLCAmdG0pOwogICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CiAgICAgY2hhcnNldCA9IHRtLnRtQ2hhclNldDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIElGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKIHsKQEAgLTQ2NiwxNiArNDY2LDE2IEBACiAgICAgfQogICAgIHJldHVybiAodm9pZCopaENsaXBSZ247CiB9Ci1ib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU2V0RElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIpIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcEJpdG1hcDEtPkZsaXBJbWFnZShmYWxzZSwgdHJ1ZSk7CisgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOwogICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCiAgICAgICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CiAgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CkBAIC00OTMsNyArNDkzLDcgQEAKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CiAgICAgICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgogICAgICAgICAgICAgICAgIChwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYiwgTlVMTCwgcEljY1RyYW5zZm9ybSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwogICAgICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwpAQCAtNTA1LDE4ICs1MDUsMTggQEAKICAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCB8fCBkZXN0X3dpZHRoID09IDAgIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgogICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOwogICAgIGlmICgoaW50NjRfdClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpIDwgKGludDY0X3QpcEJpdG1hcDEtPkdldFdpZHRoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCkgKiA0IHx8CkBAIC01MzgsMTUgKzUzOCwxNSBAQAogICAgIGlmIChkZWwpIHsKICAgICAgICAgZGVsZXRlIHBUb1N0cmVjaEJpdG1hcDsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXAxOwogICAgIGlmIChwQml0bWFwID09IE5VTEwgfHwgZGVzdF93aWR0aCA9PSAwICB8fCBkZXN0X2hlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBfQ29sb3IyQXJnYihiaXRtYXBfY29sb3IsIGJpdG1hcF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CkBAIC01OTIsMTYgKzU5MiwxNiBAQAogICAgIFNlbGVjdE9iamVjdChtX2hEQywgaE9sZCk7CiAgICAgRGVsZXRlT2JqZWN0KGhQYXR0ZXJuKTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQogewogICAgIHJldHVybiA6OkdldENsaXBCb3gobV9oREMsIChSRUNUKilwUmVjdCk7CiB9Ci1ib29sIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBSZ24odm9pZCogaFJnbikKK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcFJnbih2b2lkKiBoUmduKQogewogICAgIDo6U2VsZWN0Q2xpcFJnbihtX2hEQywgKEhSR04paFJnbik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiBzdGF0aWMgSFBFTiBfQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGFyZ2IpCiB7CkBAIC03NDksMTEgKzc0OSwxMSBAQAogICAgIE1vdmVUb0V4KG1faERDLCBGWFNZU19yb3VuZCh4MSksIEZYU1lTX3JvdW5kKHkxKSwgTlVMTCk7CiAgICAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CiB9Ci1zdGF0aWMgYm9vbCBfTWF0cml4Tm9TY2FsZWQoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKK3N0YXRpYyBGWF9CT09MIF9NYXRyaXhOb1NjYWxlZChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQogewogICAgIHJldHVybiBwTWF0cml4LT5HZXRBKCkgPT0gMS4wZiAmJiBwTWF0cml4LT5HZXRCKCkgPT0gMCAmJiBwTWF0cml4LT5HZXRDKCkgPT0gMCAmJiBwTWF0cml4LT5HZXREKCkgPT0gMS4wZjsKIH0KLWJvb2wgQ0dkaURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgX0NvbG9yMkFyZ2IoZmlsbF9jb2xvciwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgX0NvbG9yMkFyZ2Ioc3Ryb2tlX2NvbG9yLCBzdHJva2VfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwpAQCAtNzg2LDkgKzc4Niw5IEBACiAgICAgfQogICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7CiAgICAgaW50IHN0cm9rZV9hbHBoYSA9IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7Ci0gICAgYm9vbCBiRHJhd0FscGhhID0gKGZpbGxfYWxwaGEgPiAwICYmIGZpbGxfYWxwaGEgPCAyNTUpIHx8IChzdHJva2VfYWxwaGEgPiAwICYmIHN0cm9rZV9hbHBoYSA8IDI1NSAmJiBwR3JhcGhTdGF0ZSk7CisgICAgRlhfQk9PTCBiRHJhd0FscGhhID0gKGZpbGxfYWxwaGEgPiAwICYmIGZpbGxfYWxwaGEgPCAyNTUpIHx8IChzdHJva2VfYWxwaGEgPiAwICYmIHN0cm9rZV9hbHBoYSA8IDI1NSAmJiBwR3JhcGhTdGF0ZSk7CiAgICAgaWYgKCFwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIGJEcmF3QWxwaGEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgIGlmIChiRHJhd0FscGhhIHx8ICgobV9EZXZpY2VDbGFzcyAhPSBGWERDX1BSSU5URVIgJiYgIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSkgfHwgKHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkpKSB7CkBAIC03OTcsNyArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYKICAgICAgICAgICAgICAgICAgICAgcFBhdGhEYXRhLT5Jc1JlY3QoKSkgKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LkRyYXdQYXRoKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODUyLDI5ICs4NTIsMjkgQEAKICAgICAgICAgaEJydXNoID0gKEhCUlVTSClTZWxlY3RPYmplY3QobV9oREMsIGhCcnVzaCk7CiAgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0dkaURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwogICAgIGludCBhbHBoYTsKICAgICBGWF9DT0xPUlJFRiByZ2I7CiAgICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhbHBoYSwgcmdiKTsKICAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKICAgICA6OkZpbGxSZWN0KG1faERDLCAoUkVDVCopcFJlY3QsIGhCcnVzaCk7CiAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTg4NCwxNSArODg0LDE1IEBACiAgICAgICAgIGlmIChwUGF0aERhdGEtPklzUmVjdChwTWF0cml4LCAmcmVjdGYpKSB7CiAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgICAgICAgICBJbnRlcnNlY3RDbGlwUmVjdChtX2hEQywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7CiAgICAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBmaWxsX21vZGUgJiAzKTsKICAgICBTZWxlY3RDbGlwUGF0aChtX2hEQywgUkdOX0FORCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTkwMiwyMyArOTAyLDIzIEBACiAgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwogICAgIFdpZGVuUGF0aChtX2hEQyk7CiAgICAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBXSU5ESU5HKTsKLSAgICBib29sIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKKyAgICBGWF9CT09MIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKICAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKICAgICBEZWxldGVPYmplY3QoaFBlbik7CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50CWJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBfQ29sb3IyQXJnYihjb2xvciwgY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwogICAgIGludCBhOwogICAgIEZYX0NPTE9SUkVGIHJnYjsKICAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByZ2IpOwogICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBIUEVOIGhQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIHJnYik7CiAgICAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CkBAIC05MjYsMTIgKzkyNiwxMiBAQAogICAgIExpbmVUbyhtX2hEQywgRlhTWVNfcm91bmQoeDIpLCBGWFNZU19yb3VuZCh5MikpOwogICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwogICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pCitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRlbGV0ZURldmljZVJnbih2b2lkKiBwUmduKQogewogICAgIERlbGV0ZU9iamVjdCgoSEdESU9CSilwUmduKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIENHZGlEaXNwbGF5RHJpdmVyOjpDR2RpRGlzcGxheURyaXZlcihIREMgaERDKSA6IENHZGlEZXZpY2VEcml2ZXIoaERDLCBGWERDX0RJU1BMQVkpCiB7CkBAIC05NDAsOSArOTQwLDkgQEAKICAgICAgICAgbV9SZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfUEFUSCB8IEZYUkNfQUxQSEFfSU1BR0U7CiAgICAgfQogfQotYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkRFZGdlKQorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQogewotICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKICAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwogICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKG1faERDLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTk2OSw3ICs5NjksNyBAQAogICAgICAgICAgICAgOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIGJpdG1hcC5HZXRCdWZmZXIoKSwgJmJtaSwgRElCX1JHQl9DT0xPUlMpOwogICAgICAgICAgICAgcmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgJmJpdG1hcCwgMCwgMCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldCA9IEZBTFNFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpICYmIHJldCkgewpAQCAtOTc5LDIyICs5NzksMjIgQEAKICAgICBEZWxldGVPYmplY3QoaERDTWVtb3J5KTsKICAgICByZXR1cm4gcmV0OwogfQotYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CiAgICAgICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICAgICAgYm9vbCBiR0RJID0gcFNvdXJjZS0+R2V0QlBQKCkgPT0gMSAmJiBhbHBoYSA9PSAyNTU7CisgICAgICAgIEZYX0JPT0wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OwogICAgICAgICBpZiAoIWJHREkpIHsKICAgICAgICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKICAgICAgICAgICAgICAgICAhR2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBsZWZ0LCB0b3AsIE5VTEwpIHx8CiAgICAgICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwpAQCAtMTAwOCw4ICsxMDA4LDggQEAKICAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKICAgICAgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikgfHwKICAgICAgICAgICAgICFHZXRESUJpdHMoJmJpdG1hcCwgbGVmdCwgdG9wLCBOVUxMKSB8fAotICAgICAgICAgICAgIWJpdG1hcC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAhYml0bWFwLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICByZXR1cm4gU2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwpAQCAtMTAxOSw5ICsxMDE5LDkgQEAKICAgICBpZiAocEJpdG1hcCkgewogICAgICAgICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OlVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IHJlbmRlcl9mbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewpAQCAtMTAzNSwxNCArMTAzNSwxNCBAQAogICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtZGVzdF9sZWZ0LCAtZGVzdF90b3ApOwogICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IHBTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVuZGVyX2ZsYWdzLCAmYml0bWFwX2NsaXApOwogICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBTdHJldGNoZWQtPkdldFdpZHRoKCksIHBTdHJldGNoZWQtPkdldEhlaWdodCgpKTsKLSAgICBib29sIHJldCA9IFNldERJQml0cyhwU3RyZXRjaGVkLCBjb2xvciwgJnNyY19yZWN0LCBwQ2xpcFJlY3QtPmxlZnQsIHBDbGlwUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIEZYX0JPT0wgcmV0ID0gU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CiAgICAgcmV0dXJuIHJldDsKIH0KLWJvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK0ZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewpAQCAtMTA2MywxNyArMTA2MywxNyBAQAogICAgICAgICBpbnQgY2xpcF93aWR0aCA9IGNsaXBfcmVjdC5XaWR0aCgpLCBjbGlwX2hlaWdodCA9IGNsaXBfcmVjdC5IZWlnaHQoKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgJmNsaXBfcmVjdCk7CiAgICAgICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CiAgICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIEZYRElCX1JnYjMyKSB8fAogICAgICAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgTlVMTCkgfHwKLSAgICAgICAgICAgICFiYWNrZ3JvdW5kLkNvbXBvc2l0ZU1hc2soMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIHBTdHJldGNoZWQsIGNvbG9yLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIGZhbHNlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgcFN0cmV0Y2hlZCwgY29sb3IsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CiAgICAgICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0KTsKLSAgICAgICAgYm9vbCByZXQgPSBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKKyAgICAgICAgRlhfQk9PTCByZXQgPSBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKICAgICAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTA4Myw3ICsxMDgzLDcgQEAKICAgICAgICAgICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5TdHJldGNoRElCaXRzKG1faERDLCBwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncyk7CiAgICAgICAgIH0KQEAgLTEwOTUsNyArMTA5NSw3IEBACiAgICAgaWYgKHBCaXRtYXApIHsKICAgICAgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAjZGVmaW5lIEdFVF9QU19GRUFUVVJFU0VUVElORyAgICAgICAgNDEyMQogI2RlZmluZSBGRUFUVVJFU0VUVElOR19QU0xFVkVMICAgICAgIDIKQEAgLTExMzQsNyArMTEzNCw3IEBACiAgICAgcmV0dXJuIDI7CiB9CiBpbnQgQ0ZYX1dpbmRvd3NEZXZpY2U6Om1fcHNMZXZlbCA9IDI7Ci1DRlhfV2luZG93c0RldmljZTo6Q0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCwgYm9vbCBiRm9yY2VQU091dHB1dCwgaW50IHBzTGV2ZWwpCitDRlhfV2luZG93c0RldmljZTo6Q0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCwgRlhfQk9PTCBiRm9yY2VQU091dHB1dCwgaW50IHBzTGV2ZWwpCiB7CiAgICAgbV9iRm9yY2VQU091dHB1dCA9IGJGb3JjZVBTT3V0cHV0OwogICAgIG1fcHNMZXZlbCA9IHBzTGV2ZWw7CkBAIC0xMTU0LDcgKzExNTQsNyBAQAogICAgIH0KICAgICByZXR1cm4gKEhEQylwUkRELT5HZXRQbGF0Zm9ybVN1cmZhY2UoKTsKIH0KLUlGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywgYm9vbCBiQ215a091dHB1dCkKK0lGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCkKIHsKICAgICBpbnQgZGV2aWNlX3R5cGUgPSA6OkdldERldmljZUNhcHMoaERDLCBURUNITk9MT0dZKTsKICAgICBpbnQgb2JqX3R5cGUgPSA6OkdldE9iamVjdFR5cGUoaERDKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcAppbmRleCA2MTBjNjllLi4zZGNmY2U0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RpYi5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCkBAIC00OSwxOSArNDksMTkgQEAKICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4pOwogICAgIHJldHVybiByZXN1bHQ7CiB9Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgYm9vbCBiQWxwaGEpCitDRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpCiB7CiAgICAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7CiAgICAgaW50IGhlaWdodCA9IHBibWktPmJtaUhlYWRlci5iaUhlaWdodDsKLSAgICBCT09MIGJCb3R0b21VcCA9IHRydWU7CisgICAgQk9PTCBiQm90dG9tVXAgPSBUUlVFOwogICAgIGlmIChoZWlnaHQgPCAwKSB7CiAgICAgICAgIGhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgICAgIGJCb3R0b21VcCA9IGZhbHNlOworICAgICAgICBiQm90dG9tVXAgPSBGQUxTRTsKICAgICB9CiAgICAgaW50IHBpdGNoID0gKHdpZHRoICogcGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gYkFscGhhID8gKEZYRElCX0Zvcm1hdCkocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAweDIwMCkgOiAoRlhESUJfRm9ybWF0KXBibWktPmJtaUhlYWRlci5iaUJpdENvdW50OwotICAgIGJvb2wgcmV0ID0gcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgRlhfQk9PTCByZXQgPSBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKICAgICBpZiAoIXJldCkgewogICAgICAgICBkZWxldGUgcEJpdG1hcDsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05Myw3ICs5Myw3IEBACiB9CiBDRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEpCiB7Ci0gICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBmYWxzZSk7CisgICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBGQUxTRSk7CiB9CiBIQklUTUFQCUNGWF9XaW5kb3dzRElCOjpHZXREREJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEhEQyBoREMpCiB7CkBAIC0xNzQsNyArMTc0LDcgQEAKIH0KIENGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRERCKEhEQyBoREMsIEhCSVRNQVAgaEJpdG1hcCwgRlhfRFdPUkQqIHBQYWxldHRlLCBGWF9EV09SRCBwYWxzaXplKQogewotICAgIGJvb2wgYkNyZWF0ZWREQyA9IGhEQyA9PSBOVUxMOworICAgIEZYX0JPT0wgYkNyZWF0ZWREQyA9IGhEQyA9PSBOVUxMOwogICAgIGlmIChoREMgPT0gTlVMTCkgewogICAgICAgICBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCmluZGV4IDg1MzMzNDMuLjY1YTM1ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIElEV3JpdGVGYWN0b3J5KiBwRHdGYWN0b3J5ID0gKElEV3JpdGVGYWN0b3J5KiltX3BEV3JpdGVGYWN0b3J5OwogICAgIElEV3JpdGVGb250RmlsZSogcER3Rm9udEZpbGUgPSBOVUxMOwogICAgIElEV3JpdGVGb250RmFjZSogcER3Rm9udEZhY2UgPSBOVUxMOwotICAgIEJPT0wgaXNTdXBwb3J0ZWRGb250VHlwZSA9IGZhbHNlOworICAgIEJPT0wgaXNTdXBwb3J0ZWRGb250VHlwZSA9IEZBTFNFOwogICAgIERXUklURV9GT05UX0ZJTEVfVFlQRSBmb250RmlsZVR5cGU7CiAgICAgRFdSSVRFX0ZPTlRfRkFDRV9UWVBFIGZvbnRGYWNlVHlwZTsKICAgICBVSU5UMzIgbnVtYmVyT2ZGYWNlczsKQEAgLTE3NCwxMCArMTc0LDEwIEBACiAgICAgU2FmZVJlbGVhc2UoJnBEd0ZvbnRGaWxlKTsKICAgICByZXR1cm4gTlVMTDsKIH0KLWJvb2wgQ0RXcml0ZUV4dDo6RHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogcmVuZGVyVGFyZ2V0KQorRlhfQk9PTCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKiByZW5kZXJUYXJnZXQpCiB7CiAgICAgaWYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID4gRlhESUJfQXJnYikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgSURXcml0ZUZhY3RvcnkqIHBEd0ZhY3RvcnkgPSAoSURXcml0ZUZhY3RvcnkqKW1fcERXcml0ZUZhY3Rvcnk7CiAgICAgSURXcml0ZUdkaUludGVyb3AqIHBHZGlJbnRlcm9wID0gTlVMTDsKQEAgLTIxMiwxNCArMjEyLDE0IEBACiAgICAgU2FmZVJlbGVhc2UoJnBHZGlJbnRlcm9wKTsKICAgICBTYWZlUmVsZWFzZSgmcEJpdG1hcFJlbmRlclRhcmdldCk7CiAgICAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogZmFpbGVkOgogICAgIFNhZmVSZWxlYXNlKCZwR2RpSW50ZXJvcCk7CiAgICAgU2FmZVJlbGVhc2UoJnBCaXRtYXBSZW5kZXJUYXJnZXQpOwogICAgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbAlDRFdyaXRlRXh0OjpEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCitGWF9CT09MCUNEV3JpdGVFeHQ6OkR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsIENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfUkVDVCYgc3RyaW5nUmVjdCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfQVJHQiB0ZXh0X2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LCB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLApAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZ2x5cGhfYWR2YW5jZXMpCiB7CiAgICAgaWYgKHJlbmRlclRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgQ0R3R2RpVGV4dFJlbmRlcmVyKiBwVGV4dFJlbmRlcmVyID0gKENEd0dkaVRleHRSZW5kZXJlciopcmVuZGVyVGFyZ2V0OwogICAgIERXUklURV9NQVRSSVggdHJhbnNmb3JtOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgZ2x5cGhSdW4uZ2x5cGhJbmRpY2VzID0gZ2x5cGhfaW5kaWNlczsKICAgICBnbHlwaFJ1bi5nbHlwaEFkdmFuY2VzID0gZ2x5cGhfYWR2YW5jZXM7CiAgICAgZ2x5cGhSdW4uZ2x5cGhPZmZzZXRzID0gKERXUklURV9HTFlQSF9PRkZTRVQqKWdseXBoX29mZnNldHM7Ci0gICAgZ2x5cGhSdW4uaXNTaWRld2F5cyA9IGZhbHNlOworICAgIGdseXBoUnVuLmlzU2lkZXdheXMgPSBGQUxTRTsKICAgICBnbHlwaFJ1bi5iaWRpTGV2ZWwgPSAwOwogICAgIGhyID0gcFRleHRSZW5kZXJlci0+RHJhd0dseXBoUnVuKAogICAgICAgICAgICAgIHN0cmluZ1JlY3QsCkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAmZ2x5cGhSdW4sCiAgICAgICAgICAgICAgUkdCKEZYQVJHQl9SKHRleHRfY29sb3IpLCBGWEFSR0JfRyh0ZXh0X2NvbG9yKSwgRlhBUkdCX0IodGV4dF9jb2xvcikpCiAgICAgICAgICApOwotICAgIHJldHVybiBTVUNDRUVERUQoaHIpID8gdHJ1ZSA6IGZhbHNlOworICAgIHJldHVybiBTVUNDRUVERUQoaHIpID8gVFJVRSA6IEZBTFNFOwogfQogdm9pZCBDRFdyaXRlRXh0OjpEd0RlbGV0ZVJlbmRlcmluZ1RhcmdldCh2b2lkKiByZW5kZXJUYXJnZXQpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcAppbmRleCA5NGZhYzY5Li5kNzZkNTJlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKQEAgLTI3NCwxMiArMjc0LDEyIEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotYm9vbCBDR2RpcGx1c0V4dDo6R2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKQorRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKQogewogICAgIGlmIChtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCkgewogICAgICAgICByZXR1cm4gKChGdW5jVHlwZV9HZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCltX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCkoKEhBTkRMRSloYW5kbGUpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogc3RhdGljIEdwQnJ1c2gqIF9HZGlwQ3JlYXRlQnJ1c2goRFdPUkQgYXJnYikKIHsKQEAgLTI5MSwxMSArMjkxLDExIEBACiBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBfU3RyZXRjaE1vbm9Ub0dyYXkoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBTb3VyY2UsIEZYX1JFQ1QqIHBDbGlwUmVjdCkKIHsKLSAgICBib29sIGJGbGlwWCA9IGRlc3Rfd2lkdGggPCAwOworICAgIEZYX0JPT0wgYkZsaXBYID0gZGVzdF93aWR0aCA8IDA7CiAgICAgaWYgKGJGbGlwWCkgewogICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CiAgICAgfQotICAgIGJvb2wgYkZsaXBZID0gZGVzdF9oZWlnaHQgPCAwOworICAgIEZYX0JPT0wgYkZsaXBZID0gZGVzdF9oZWlnaHQgPCAwOwogICAgIGlmIChiRmxpcFkpIHsKICAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CiAgICAgfQpAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgICAgIGlmIChzcmNfd2lkdGggKiBzcmNfaGVpZ2h0ID4gMTAwMDApIHsKICAgICAgICAgICAgIHBTdHJldGNoZWQgPSBfU3RyZXRjaE1vbm9Ub0dyYXkoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBCaXRtYXAsICZpbWFnZV9jbGlwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTdHJldGNoZWQgPSBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZhbHNlLCAmaW1hZ2VfY2xpcCk7CisgICAgICAgICAgICBwU3RyZXRjaGVkID0gcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBGQUxTRSwgJmltYWdlX2NsaXApOwogICAgICAgICB9CiAgICAgICAgIEdwQml0bWFwKiBiaXRtYXA7CiAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKGltYWdlX2NsaXAuV2lkdGgoKSwgaW1hZ2VfY2xpcC5IZWlnaHQoKSwKQEAgLTUzNiw3ICs1MzYsNyBAQAogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVByaXZhdGVGb250Q29sbGVjdGlvbikoKEdwRm9udENvbGxlY3Rpb24qKikmcENvbGxlY3Rpb24pOwogfQotYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCkKK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKipiaXRtYXApCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBQaXhlbEZvcm1hdCBmb3JtYXQ7CkBAIC01NTEsNDEgKzU1MSw0MSBAQAogICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcEFSR0I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkocEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0UGl0Y2goKSwgZm9ybWF0LCBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEdwQml0bWFwKiopYml0bWFwKTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpCitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRnJvbUltYWdlKHZvaWQqIGJpdG1hcCwgdm9pZCoqIGdyYXBoaWNzKQogewogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0KSgoR3BCaXRtYXAqKWJpdG1hcCwgKEdwR3JhcGhpY3MqKilncmFwaGljcyk7CiAgICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpCitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKSgoR0RJUENPTlNUIFdDSEFSICopbmFtZSwgKEdwRm9udENvbGxlY3Rpb24qKXBGb250Q29sbGVjdGlvbiwgKEdwRm9udEZhbWlseSoqKXBGYW1pbHkpOwogICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tRmFtaWx5KHZvaWQqIHBGYW1pbHksIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSwgaW50IGZsYWcsIHZvaWQqKiBwRm9udCkKK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoKEdwRm9udEZhbWlseSopcEZhbWlseSwgZm9udF9zaXplLCBmb250c3R5bGUsIFVuaXQoZmxhZyksIChHcEZvbnQqKilwRm9udCk7CiAgICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiB2b2lkIENHZGlwbHVzRXh0OjpHZGlwR2V0Rm9udFNpemUodm9pZCAqcEZvbnQsIEZYX0ZMT0FUICpzaXplKQogewpAQCAtNjA4LDE2ICs2MDgsMTYgQEAKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR3BVbml0KXVuaXQpOwogfQotYm9vbCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwKK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBEcmF3RHJpdmVyU3RyaW5nKHZvaWQgKmdyYXBoaWNzLCAgdW5zaWduZWQgc2hvcnQgKnRleHQsIGludCBsZW5ndGgsCiAgICAgICAgIHZvaWQgKmZvbnQsIHZvaWQqIGJydXNoLCB2b2lkICpwb3NpdGlvbnMsIGludCBmbGFncywgY29uc3Qgdm9pZCAqbWF0cml4KQogewogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcERyYXdEcml2ZXJTdHJpbmcpKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYgKil0ZXh0LCAoSU5UKWxlbmd0aCwgKEdESVBDT05TVCBHcEZvbnQgKilmb250LCAoR0RJUENPTlNUIEdwQnJ1c2gqKWJydXNoLAogICAgICAgICAgICAgICAgICAgICAgIChHRElQQ09OU1QgUG9pbnRGICopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4ICopbWF0cml4KTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCcnVzaChGWF9EV09SRCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpCiB7CkBAIC02ODQsNyArNjg0LDcgQEAKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzKTsKIH0KLWJvb2wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorRlhfQk9PTCBDR2RpcGx1c0V4dDo6U3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncykKIHsKICAgICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7CkBAIC02OTksOSArNjk5LDkgQEAKICAgICB9CiAgICAgT3V0cHV0SW1hZ2VNYXNrKHBHcmFwaGljcywgYk1vbm9EZXZpY2UsIHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBhcmdiLCBwQ2xpcFJlY3QpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitGWF9CT09MIENHZGlwbHVzRXh0OjpTdHJldGNoRElCaXRzKEhEQyBoREMsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncykKIHsKICAgICBHcEdyYXBoaWNzKiBwR3JhcGhpY3M7CkBAIC03MTksOSArNzE5LDkgQEAKICAgICBPdXRwdXRJbWFnZShwR3JhcGhpY3MsIHBCaXRtYXAsICZzcmNfcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMgR3BQZW4qIF9HZGlwQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIERXT1JEIGFyZ2IsIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpCitzdGF0aWMgR3BQZW4qIF9HZGlwQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIERXT1JEIGFyZ2IsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlID8gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDogMS4wZjsKQEAgLTczNSw3ICs3MzUsNyBAQAogICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKSgoQVJHQilhcmdiLCB3aWR0aCwgVW5pdFdvcmxkLCAmcFBlbik7CiAgICAgTGluZUNhcCBsaW5lQ2FwOwogICAgIERhc2hDYXAgZGFzaENhcCA9IERhc2hDYXBGbGF0OwotICAgIGJvb2wgYkRhc2hFeHRlbmQgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJEYXNoRXh0ZW5kID0gRkFMU0U7CiAgICAgc3dpdGNoKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKICAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OgogICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBGbGF0OwpAQCAtNzQzLDExICs3NDMsMTEgQEAKICAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKICAgICAgICAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwUm91bmQ7CiAgICAgICAgICAgICBkYXNoQ2FwID0gRGFzaENhcFJvdW5kOwotICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSB0cnVlOworICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOgogICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBTcXVhcmU7Ci0gICAgICAgICAgICBiRGFzaEV4dGVuZCA9IHRydWU7CisgICAgICAgICAgICBiRGFzaEV4dGVuZCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKHBQZW4sIGxpbmVDYXAsIGxpbmVDYXAsIGRhc2hDYXApOwpAQCAtODM5LDEwICs4MzksMTAgQEAKICAgICAgICAgaWYgKGRpc3RhbmNlX3NxdWFyZSA8ICgxLjBmICogMiArIDEuMGYgLyA0KSkgewogICAgICAgICAgICAgdjEgPSBpOwogICAgICAgICAgICAgdjIgPSBwYWlyMTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIEJPT0wgQ0dkaXBsdXNFeHQ6OkRyYXdQYXRoKEhEQyBoREMsIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCkBAIC04NTQsNyArODU0LDcgQEAKIHsKICAgICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwogICAgIGlmIChuUG9pbnRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOwogICAgIEdwR3JhcGhpY3MqIHBHcmFwaGljcyA9IE5VTEw7CkBAIC04NzAsOSArODcwLDkgQEAKICAgICBQb2ludEYgKnBvaW50cyA9IEZYX0FsbG9jKFBvaW50RiwgblBvaW50cyk7CiAgICAgQllURSAqIHR5cGVzICA9IEZYX0FsbG9jKEJZVEUsIG5Qb2ludHMpOwogICAgIGludCBuU3ViUGF0aGVzID0gMDsKLSAgICBib29sIGJTdWJDbG9zZSA9IGZhbHNlOworICAgIEZYX0JPT0wgYlN1YkNsb3NlID0gRkFMU0U7CiAgICAgaW50IHBvc19zdWJjbG9zZSA9IDA7Ci0gICAgYm9vbCBiU21vb3RoID0gZmFsc2U7CisgICAgRlhfQk9PTCBiU21vb3RoID0gRkFMU0U7CiAgICAgaW50IHN0YXJ0cG9pbnQgPSAwOwogICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKICAgICAgICAgcG9pbnRzW2ldLlggPSBwUG9pbnRzW2ldLm1fUG9pbnRYOwpAQCAtOTAwLDcgKzkwMCw3IEBACiAgICAgICAgIGlmKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKICAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZVN0YXJ0OwogICAgICAgICAgICAgblN1YlBhdGhlcyArKzsKLSAgICAgICAgICAgIGJTdWJDbG9zZSA9IGZhbHNlOworICAgICAgICAgICAgYlN1YkNsb3NlID0gRkFMU0U7CiAgICAgICAgICAgICBzdGFydHBvaW50ID0gaTsKICAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CiAgICAgICAgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVMaW5lOwpAQCAtOTEwLDMxICs5MTAsMzEgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbaSAtIDFdLlggJiYgcG9pbnRzW2ldLlkgIT0gcG9pbnRzW2kgLSAxXS5ZKSB7Ci0gICAgICAgICAgICAgICAgYlNtb290aCA9IHRydWU7CisgICAgICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKQl7CiAgICAgICAgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVCZXppZXI7Ci0gICAgICAgICAgICBiU21vb3RoID0gdHJ1ZTsKKyAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKICAgICAgICAgICAgIGlmIChiU3ViQ2xvc2UpIHsKICAgICAgICAgICAgICAgICB0eXBlc1twb3Nfc3ViY2xvc2VdICY9IH5QYXRoUG9pbnRUeXBlQ2xvc2VTdWJwYXRoOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiU3ViQ2xvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJTdWJDbG9zZSA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwb3Nfc3ViY2xvc2UgPSBpOwogICAgICAgICAgICAgdHlwZXNbaV0gfD0gUGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKICAgICAgICAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbc3RhcnRwb2ludF0uWCAmJiBwb2ludHNbaV0uWSAhPSBwb2ludHNbc3RhcnRwb2ludF0uWSkgewotICAgICAgICAgICAgICAgIGJTbW9vdGggPSB0cnVlOworICAgICAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKSB7Ci0gICAgICAgIGJTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgYlNtb290aCA9IEZBTFNFOwogICAgICAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlTm9uZSk7CiAgICAgfSBlbHNlIGlmICghKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpKSB7CiAgICAgICAgIGlmICghYlNtb290aCAmJiAoZmlsbF9tb2RlICYgMykpIHsKLSAgICAgICAgICAgIGJTbW9vdGggPSB0cnVlOworICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJTbW9vdGggfHwgKHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA+IDIpKSB7CiAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlQW50aUFsaWFzKTsKQEAgLTk0OSw3ICs5NDksNyBAQAogICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdMaW5lSSkocEdyYXBoaWNzLCBwUGVuLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlgpLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5YKSwgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5ZKSk7CiAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGVuKShwUGVuKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgR3BQYXRoKiBwR3BQYXRoID0gTlVMTDsKQEAgLTk2MSw3ICs5NjEsNyBAQAogICAgICAgICBGWF9GcmVlKHBvaW50cyk7CiAgICAgICAgIEZYX0ZyZWUodHlwZXMpOwogICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAobmV3X2ZpbGxfbW9kZSkgewogICAgICAgICBHcEJydXNoKiBwQnJ1c2ggPSBfR2RpcENyZWF0ZUJydXNoKGZpbGxfYXJnYik7CkBAIC05OTQsNyArOTk0LDcgQEAKICAgICBGWF9GcmVlKHR5cGVzKTsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocEdwUGF0aCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogY2xhc3MgR3BTdHJlYW0gZmluYWwgOiBwdWJsaWMgSVN0cmVhbQogewpAQCAtMTIyOSw3ICsxMjI5LDcgQEAKICAgICB9CiAgICAgRlhfRnJlZShwSW5mbyk7CiB9Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgYm9vbCBiQWxwaGEpOworQ0ZYX0RJQml0bWFwKiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEsIEZYX0JPT0wgYkFscGhhKTsKIENGWF9ESUJpdG1hcCogQ0dkaXBsdXNFeHQ6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKQogewogICAgIFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbyA9IDo6TG9hZERJQml0bWFwKGFyZ3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAppbmRleCA2M2MzODQ5Li44NmRiZjliIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcApAQCAtMTgsNyArMTgsNyBAQAogewogICAgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKICAgICBtX1ZlcnRTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUU0laRSk7Ci0gICAgbV9iU3VwcG9ydFJPUCA9IHRydWU7CisgICAgbV9iU3VwcG9ydFJPUCA9IFRSVUU7CiB9CiBpbnQgQ0dkaVByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCiB7CkBAIC0zMCw3ICszMCw3IEBACiAgICAgfQogICAgIHJldHVybiBDR2RpRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGNhcHNfaWQpOwogfQotYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CkBAIC00MSwyOCArNDEsMjggQEAKICAgICBBU1NFUlQocFNvdXJjZSAhPSBOVUxMICYmICFwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIHBTcmNSZWN0ICE9IE5VTEwpOwogICAgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CiAgICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwogICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBHRElfU2V0RElCaXRzKHBCaXRtYXAsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgICAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCBhbHBoYSAhPSAyNTUgfHwgIW1fYlN1cHBvcnRST1ApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDAgfHwgZGVzdF9oZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwogICAgICAgICAgICAgaWYgKHBGbGlwcGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CiAgICAgICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CkBAIC03MCwyNCArNzAsMjQgQEAKICAgICAgICAgICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKICAgICAgICAgICAgICAgICBkZXN0X3RvcCArPSBkZXN0X2hlaWdodDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgcmV0ID0gR0RJX1N0cmV0Y2hCaXRNYXNrKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgICAgICBGWF9CT09MIHJldCA9IEdESV9TdHJldGNoQml0TWFzayhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgZGVsZXRlIHBGbGlwcGVkOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gR0RJX1N0cmV0Y2hCaXRNYXNrKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIH0KICAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgewogICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwogICAgICAgICBpZiAocEZsaXBwZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewogICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CkBAIC05NSwxNCArOTUsMTQgQEAKICAgICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewogICAgICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCByZXQgPSBHRElfU3RyZXRjaERJQml0cyhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBmbGFncywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIEZYX0JPT0wgcmV0ID0gR0RJX1N0cmV0Y2hESUJpdHMocEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwgYWJzKGRlc3RfaGVpZ2h0KSwgZmxhZ3MsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICBkZWxldGUgcEZsaXBwZWQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwogICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBHRElfU3RyZXRjaERJQml0cyhwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsIHBJY2NUcmFuc2Zvcm0pOwogfQpAQCAtMTg5LDE4ICsxODksMTggQEAKICAgICB9CiAgICAgcmV0dXJuIHBUZW1wQml0bWFwOwogfQotYm9vbAlDR2RpUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCitGWF9CT09MCUNHZGlQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1IHx8IHBTb3VyY2UtPkhhc0FscGhhKCkgfHwgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgKHBTb3VyY2UtPkdldEJQUCgpICE9IDEgfHwgIW1fYlN1cHBvcnRST1ApKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwTWF0cml4LT5HZXRVbml0UmVjdCgpOwogICAgIEZYX1JFQ1QgZnVsbF9yZWN0ID0gdW5pdF9yZWN0LkdldE91dHRlclJlY3QoKTsKICAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmIEZYU1lTX2ZhYnMocE1hdHJpeC0+YykgPCAwLjVmICYmIHBNYXRyaXgtPmQgIT0gMCkgewotICAgICAgICBib29sIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOwotICAgICAgICBib29sIGJGbGlwWSA9IHBNYXRyaXgtPmQgPiAwOworICAgICAgICBGWF9CT09MIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOworICAgICAgICBGWF9CT09MIGJGbGlwWSA9IHBNYXRyaXgtPmQgPiAwOwogICAgICAgICByZXR1cm4gU3RyZXRjaERJQml0cyhwU291cmNlLCBjb2xvciwgYkZsaXBYID8gZnVsbF9yZWN0LnJpZ2h0IDogZnVsbF9yZWN0LmxlZnQsIGJGbGlwWSA/IGZ1bGxfcmVjdC5ib3R0b20gOiBmdWxsX3JlY3QudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmxpcFggPyAtZnVsbF9yZWN0LldpZHRoKCkgOiBmdWxsX3JlY3QuV2lkdGgoKSwgYkZsaXBZID8gLWZ1bGxfcmVjdC5IZWlnaHQoKSA6IGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CkBAIC0yMDgsOSArMjA4LDkgQEAKICAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5kKSA8IDAuNWYpIHsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwU291cmNlLT5Td2FwWFkocE1hdHJpeC0+YyA+IDAsIHBNYXRyaXgtPmIgPCAwKTsKICAgICAgICAgaWYgKHBUcmFuc2Zvcm1lZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbCByZXQgPSBTdHJldGNoRElCaXRzKHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAorICAgICAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIxOCwyMCArMjE4LDIwIEBACiAgICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEpIHsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBUcmFuc2Zvcm0xYnBwQml0bWFwKHBTb3VyY2UsIHBNYXRyaXgpOwogICAgICAgICBpZiAocEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgU2F2ZVN0YXRlKCk7CiAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwogICAgICAgICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgMS4wZiwgMS4wZik7CiAgICAgICAgIFNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIFdJTkRJTkcpOwotICAgICAgICBib29sIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCisgICAgICAgIEZYX0JPT0wgcmV0ID0gU3RyZXRjaERJQml0cyhwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogICAgICAgICBSZXN0b3JlU3RhdGUoKTsKICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKICAgICAgICAgaGFuZGxlID0gTlVMTDsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIENQU091dHB1dDo6Q1BTT3V0cHV0KEhEQyBoREMpCiB7CkBAIC0yNjYsMTQgKzI2NiwxNCBAQAogQ1BTUHJpbnRlckRyaXZlcjo6Q1BTUHJpbnRlckRyaXZlcigpCiB7CiAgICAgbV9wUFNPdXRwdXQgPSBOVUxMOwotICAgIG1fYkNteWtPdXRwdXQgPSBmYWxzZTsKKyAgICBtX2JDbXlrT3V0cHV0ID0gRkFMU0U7CiB9CiBDUFNQcmludGVyRHJpdmVyOjp+Q1BTUHJpbnRlckRyaXZlcigpCiB7CiAgICAgRW5kUmVuZGVyaW5nKCk7CiAgICAgZGVsZXRlIG1fcFBTT3V0cHV0OwogfQotYm9vbCBDUFNQcmludGVyRHJpdmVyOjpJbml0KEhEQyBoREMsIGludCBwc2xldmVsLCBib29sIGJDbXlrT3V0cHV0KQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpJbml0KEhEQyBoREMsIGludCBwc2xldmVsLCBGWF9CT09MIGJDbXlrT3V0cHV0KQogewogICAgIG1faERDID0gaERDOwogICAgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIDo6RGVsZXRlT2JqZWN0KGhSZ24pOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogaW50IENQU1ByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCiB7CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1ib29sIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0UmVuZGVyaW5nKCkKK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRSZW5kZXJpbmcoKQogewogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU3RhcnRSZW5kZXJpbmcoKTsKIH0KQEAgLTMzOSw2OSArMzM5LDY5IEBACiB7CiAgICAgbV9QU1JlbmRlcmVyLlNhdmVTdGF0ZSgpOwogfQotdm9pZCBDUFNQcmludGVyRHJpdmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKQordm9pZCBDUFNQcmludGVyRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQogewogICAgIG1fUFNSZW5kZXJlci5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CiB9Ci1ib29sCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgaW50IGZpbGxfbW9kZSkKIHsKICAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBmaWxsX21vZGUpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQotYm9vbAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitGWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpCiB7CiAgICAgbV9QU1JlbmRlcmVyLlNldENsaXBfUGF0aFN0cm9rZShwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9Ci1ib29sCUNQU1ByaW50ZXJEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfQVJHQiBzdHJva2VfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgMywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1ib29sIENQU1ByaW50ZXJEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCiB7CiAgICAgKnBSZWN0ID0gbV9QU1JlbmRlcmVyLkdldENsaXBCb3goKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU2V0RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBsZWZ0LCB0b3AsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbCBDUFNQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU3RyZXRjaERJQml0cyhwQml0bWFwLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLWJvb2wJQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCitGWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGhhbmRsZSA9IE5VTEw7CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5EcmF3RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotYm9vbAlDUFNQcmludGVyRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKK0ZYX0JPT0wJQ1BTUHJpbnRlckRyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKaW5kZXggZjliNmE2My4uNTY5YzRmNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oCkBAIC0xMywxNSArMTMsMTUgQEAKICAgICBDR2RpcGx1c0V4dCgpOwogICAgIH5DR2RpcGx1c0V4dCgpOwogICAgIHZvaWQJCQlMb2FkKCk7Ci0gICAgYm9vbAkJCUlzQXZhaWxhYmxlKCkKKyAgICBGWF9CT09MCQkJSXNBdmFpbGFibGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1faE1vZHVsZSAhPSBOVUxMOwogICAgIH0KLSAgICBib29sCQkJU3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgRlhfQk9PTAkJCVN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncyk7Ci0gICAgYm9vbAkJCVN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgRlhfQk9PTAkJCVN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpOwotICAgIGJvb2wJCQlEcmF3UGF0aChIREMgaERDLCBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBGWF9CT09MCQkJRHJhd1BhdGgoSERDIGhEQywgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IsCkBAIC0zMSwyNiArMzEsMjYgQEAKIAogICAgIHZvaWQqCQkJTG9hZE1lbUZvbnQodWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogICAgIHZvaWQJCQlEZWxldGVNZW1Gb250KHZvaWQqIHBGb250Q29sbGVjdGlvbik7Ci0gICAgYm9vbCAgICAgICAgIEdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpOworICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlRnJvbUltYWdlKHZvaWQqIGJpdG1hcCwgdm9pZCoqIGdyYXBoaWNzKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFRleHRSZW5kZXJpbmdIaW50KHZvaWQqIGdyYXBoaWNzLCBpbnQgbW9kZSk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBTZXRQYWdlVW5pdCh2b2lkKiBncmFwaGljcywgRlhfRFdPUkQgdW5pdCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBTZXRXb3JsZFRyYW5zZm9ybSh2b2lkKiBncmFwaGljcywgdm9pZCogcE1hdHJpeCk7Ci0gICAgYm9vbCAgICAgICAgIEdkaXBEcmF3RHJpdmVyU3RyaW5nKHZvaWQgKmdyYXBoaWNzLCAgdW5zaWduZWQgc2hvcnQgKnRleHQsIGludCBsZW5ndGgsIHZvaWQgKmZvbnQsIHZvaWQqIGJydXNoLCB2b2lkICpwb3NpdGlvbnMsIGludCBmbGFncywgY29uc3Qgdm9pZCAqbWF0cml4KTsKKyAgICBGWF9CT09MICAgICAgICAgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBDcmVhdGVNYXRyaXgoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgdm9pZCoqIG1hdHJpeCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVNYXRyaXgodm9pZCogbWF0cml4KTsKLSAgICBib29sICAgICAgICAgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCBGWF9XQ0hBUiogbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKKyAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCBGWF9XQ0hBUiogbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnRGYW1pbHkodm9pZCogcEZhbWlseSk7Ci0gICAgYm9vbCAgICAgICAgIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpOworICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlLCBpbnQgZmxhZywgdm9pZCoqIHBGb250KTsKICAgICB2b2lkKiAgICAgICAgICAgR2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVGb250KHZvaWQqIHBGb250KTsKLSAgICBib29sICAgICAgICAgR2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCk7CisgICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKipiaXRtYXApOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBHZXRGb250U2l6ZSh2b2lkICpwRm9udCwgRlhfRkxPQVQgKnNpemUpOwogICAgIHZvaWQqICAgICAgICAgICBHZGlBZGRGb250TWVtUmVzb3VyY2VFeCh2b2lkICpwRm9udGRhdGEsIEZYX0RXT1JEIHNpemUsIHZvaWQqIHBkdiwgRlhfRFdPUkQqIG51bV9mYWNlKTsKLSAgICBib29sICAgICAgICAgR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKTsKKyAgICBGWF9CT09MICAgICAgICAgR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKTsKICAgICB2b2lkKgkJCW1fRnVuY3Rpb25zWzEwMF07CiAgICAgdm9pZCogICAgICAgICAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4OwogICAgIHZvaWQqICAgICAgICAgICBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeDsKQEAgLTYzLDcgKzYzLDcgQEAKIGNsYXNzIENXaW4zMlBsYXRmb3JtCiB7CiBwdWJsaWM6Ci0gICAgYm9vbAkJCW1fYkhhbGZUb25lOworICAgIEZYX0JPT0wJCQltX2JIYWxmVG9uZTsKICAgICBDR2RpcGx1c0V4dAkJbV9HZGlwbHVzRXh0OwogICAgIENEV3JpdGVFeHQgICAgICBtX0RXcml0ZUV4dDsKIH07CkBAIC03NSwyMiArNzUsMjIgQEAKICAgICB7CiAgICAgICAgIFNhdmVEQyhtX2hEQyk7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkID0gZmFsc2UpCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkKICAgICB7CiAgICAgICAgIFJlc3RvcmVEQyhtX2hEQywgLTEpOwogICAgICAgICBpZiAoYktlZXBTYXZlZCkgewogICAgICAgICAgICAgU2F2ZURDKG1faERDKTsKICAgICAgICAgfQogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgYm9vbAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMTAwLDI2ICsxMDAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgYm9vbCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBib29sCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwogICAgIHZpcnR1YWwgdm9pZCogR2V0Q2xpcFJnbigpIDsKLSAgICB2aXJ0dWFsIGJvb2wgU2V0Q2xpcFJnbih2b2lkKiBwUmduKSA7Ci0gICAgdmlydHVhbCBib29sIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotICAgIHZpcnR1YWwgYm9vbCBEZWxldGVEZXZpY2VSZ24odm9pZCogcFJnbik7CisgICAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZ24odm9pZCogcFJnbikgOworICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKKyAgICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pOwogICAgIHZpcnR1YWwgdm9pZAlEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7CiAgICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQogICAgIHsKICAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKICAgICB9Ci0gICAgYm9vbAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCisgICAgRlhfQk9PTAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgYm9vbAkJCUdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIEZYX0JPT0wJCQlHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIGJvb2wJCQlHRElfU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgRlhfQk9PTAkJCUdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAgICAgSERDCQkJCW1faERDOwpAQCAtMTMzLDE5ICsxMzMsMTkgQEAKIHB1YmxpYzoKICAgICBDR2RpRGlzcGxheURyaXZlcihIREMgaERDKTsKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBib29sIGJERWRnZSA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIGJvb2wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBib29sCQkJVXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgRlhfQk9PTAkJCVVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgcmVuZGVyX2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogfTsKQEAgLTE1NSwxNiArMTU1LDE2IEBACiAgICAgQ0dkaVByaW50ZXJEcml2ZXIoSERDIGhEQyk7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgYm9vbCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCisgICAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKICAgICBpbnQJCQkJbV9Ib3J6U2l6ZSwgbV9WZXJ0U2l6ZTsKLSAgICBib29sCQkJbV9iU3VwcG9ydFJPUDsKKyAgICBGWF9CT09MCQkJbV9iU3VwcG9ydFJPUDsKIH07CiBjbGFzcyBDUFNPdXRwdXQgOiBwdWJsaWMgSUZYX1BTT3V0cHV0CiB7CkBAIC0xODQsMjcgKzE4NCwyNyBAQAogewogcHVibGljOgogICAgIENQU1ByaW50ZXJEcml2ZXIoKTsKLSAgICBib29sCQkJSW5pdChIREMgaERDLCBpbnQgcHNfbGV2ZWwsIGJvb2wgYkNteWtPdXRwdXQpOworICAgIEZYX0JPT0wJCQlJbml0KEhEQyBoREMsIGludCBwc19sZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCk7CiAgICAgfkNQU1ByaW50ZXJEcml2ZXIoKTsKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgSXNQU1ByaW50RHJpdmVyKCkKKyAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgYm9vbAlTdGFydFJlbmRlcmluZygpOworICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpOwogICAgIHZpcnR1YWwgdm9pZAlFbmRSZW5kZXJpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSk7CisgICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIGJvb2wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBGWF9CT09MCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTIxNCwxNiArMjE0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisgICAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisgICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAgICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQpAQCAtMjMxLDcgKzIzMSw3IEBACiAgICAgICAgIHJldHVybiAodm9pZCopbV9oREM7CiAgICAgfQogICAgIEhEQwkJCQltX2hEQzsKLSAgICBib29sCQkJbV9iQ215a091dHB1dDsKKyAgICBGWF9CT09MCQkJbV9iQ215a091dHB1dDsKICAgICBpbnQJCQkJbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkJpdHNQZXJQaXhlbDsKICAgICBpbnQJCQkJbV9Ib3J6U2l6ZSwgbV9WZXJ0U2l6ZTsKICAgICBDUFNPdXRwdXQqCQltX3BQU091dHB1dDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKaW5kZXggNjg4MDk3Ny4uM2RlZWFlOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKQEAgLTE3LDExICsxNywxMSBAQAogCiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgYm9vbAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKaW5kZXggOTU3ZmRhNC4uZTVjNjVjMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKQEAgLTMxLDE5ICszMSwxOSBAQAogCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKIAotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogIAl2aXJ0dWFsIHZvaWQJCQkJR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CiAgCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKLSAJdmlydHVhbCBib29sCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKKyAJdmlydHVhbCBGWF9CT09MCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgQ1BXTF9XbmQqCQkJUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpOworCXZpcnR1YWwgdm9pZAkJCQlPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9VSU5UIG5GbGFnKTsKIAogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKQEAgLTUzLDkgKzUzLDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpOwogCiBwdWJsaWM6Ci0JdmlydHVhbCBib29sCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBib29sCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKIHByaXZhdGU6CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0U2VsZWN0RXhwb3J0VGV4dCgpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKaW5kZXggOTg5OTVjMS4uZmM4NThhOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCkBAIC0zOSwyMyArMzksMjMgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBib29sCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCBib29sCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBib29sCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAJdmlydHVhbCB2b2lkCQkJCURvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CkBAIC03MiwxNSArNzIsMTUgQEAKICAJCQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKICAJdmlydHVhbCB2b2lkCQkJCVNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAgCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgYm9vbAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAJdmlydHVhbCBGWF9CT09MCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwogCiAJdmlydHVhbCB2b2lkCQkJCVNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgQ1BXTF9XbmQqIAkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKTsKKwl2aXJ0dWFsIENQV0xfV25kKiAJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25LZXlTdHJva2UoYm9vbCBiS2V5RG93bik7CisJdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24pOwogCiAJQ1BERl9NYXRyaXgJCQkJCUdldEN1ck1hdHJpeCgpOwogCkBAIC05NSwxOSArOTUsMTkgQEAKIAl2b2lkCQkJCQkJU2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3cpOwogCUNQREZfUmVjdAkJCQkJR2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JYm9vbAkJCQkJCUNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCUZYX0JPT0wJCQkJCQlDb21taXREYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCUNQV0xfV25kKgkJCQkJR2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiTmV3KTsKKwlDUFdMX1duZCoJCQkJCUdldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYk5ldyk7CiAJdm9pZAkJCQkJCURlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2b2lkCQkJCQkJRXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiRGVzdHJveVBERldpbmRvdyk7CisJdm9pZAkJCQkJCUVzY2FwZUZpbGxlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYkRlc3Ryb3lQREZXaW5kb3cpOwogCiAJdmlydHVhbAlQV0xfQ1JFQVRFUEFSQU0JCUdldENyZWF0ZVBhcmFtKCk7CiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA9IDA7CiAJdmlydHVhbCBDUERGX1JlY3QJCQlHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JYm9vbAkJCQkJCUlzVmFsaWQoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJSXNWYWxpZCgpIGNvbnN0OwogCUNQREZfUmVjdAkJCQkJR2V0UERGV2luZG93UmVjdCgpIGNvbnN0OwogCiAJQ1BERlNES19QYWdlVmlldyoJCQlHZXRDdXJQYWdlVmlldygpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgQ1BERlNES19XaWRnZXQqIG1fcFdpZGdldDsKICAgICBDUERGU0RLX0Fubm90KiBtX3BBbm5vdDsKIAotICAgIGJvb2wgbV9iVmFsaWQ7CisgICAgRlhfQk9PTCBtX2JWYWxpZDsKICAgICBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyBtX01hcHM7CiAgICAgQ1BERl9Qb2ludCBtX3B0T2xkUG9zOwogfTsKQEAgLTEzNyw5ICsxMzcsOSBAQAogCiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKIAkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKQEAgLTE0OCw4ICsxNDgsOCBAQAogCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOwogcHJvdGVjdGVkOgotCWJvb2wJCQkJCQltX2JNb3VzZUluOwotCWJvb2wJCQkJCQltX2JNb3VzZURvd247CisJRlhfQk9PTAkJCQkJCW1fYk1vdXNlSW47CisJRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0ZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKaW5kZXggNTFiMDI3OS4uZTU1MzcyMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAlDRkZMX0lGb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwogCXZpcnR1YWwgfkNGRkxfSUZvcm1GaWxsZXIoKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpOwogCXZpcnR1YWwgRlhfUkVDVAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIC8qSERDIGhEQywqLyBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAJCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLApAQCAtMzQsNDEgKzM0LDQxIEBACiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJUXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwgaW50MzJfdCAmIG5SZXQsIEZYX0ZMT0FUICYgZlBvcHVwUmV0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25CZWZvcmVLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLAorCXZpcnR1YWwgdm9pZAkJCQlPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCiAJCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKIAkJCQkJCQkJCQlpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLQkJCQkJCQkJCQlib29sIGJLZXlEb3duLCBib29sICYgYlJDLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25BZnRlcktleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpIDsKKwkJCQkJCQkJCQlGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYlJDLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25BZnRlcktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpIDsKIAotCUNGRkxfRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgYm9vbCBiUmVnaXN0ZXIpOworCUNGRkxfRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfQk9PTCBiUmVnaXN0ZXIpOwogCXZvaWQJCQkJCQlSZW1vdmVGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQlzdGF0aWMgYm9vbAkJCQlJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotCXN0YXRpYyBib29sCQkJCUlzUmVhZE9ubHkoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotCXN0YXRpYyBib29sCQkJCUlzRmlsbGluZ0FsbG93ZWQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotIAlzdGF0aWMgYm9vbAkJCQlJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworCXN0YXRpYyBGWF9CT09MCQkJCUlzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisJc3RhdGljIEZYX0JPT0wJCQkJSXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisJc3RhdGljIEZYX0JPT0wJCQkJSXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgCXN0YXRpYyBGWF9CT09MCQkJCUlzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2b2lkCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJDLCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSQywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCXZvaWQJCQkJCQlPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQlPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSZXNldCwgYm9vbCYgYkV4aXQsRlhfVUlOVCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCxGWF9VSU5UIG5GbGFnKTsKIAogcHJpdmF0ZToKICAgICB1c2luZyBDRkZMX1dpZGdldDJGaWxsZXIgPSBzdGQ6Om1hcDxDUERGU0RLX0Fubm90KiwgQ0ZGTF9Gb3JtRmlsbGVyKj47CkBAIC03Nyw3ICs3Nyw3IEBACiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CiAgICAgQ0ZGTF9XaWRnZXQyRmlsbGVyIG1fTWFwczsKLSAgICBib29sIG1fYk5vdGlmeWluZzsKKyAgICBGWF9CT09MIG1fYk5vdGlmeWluZzsKIH07CiAKIGNsYXNzIENGRkxfUHJpdmF0ZURhdGEKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oCmluZGV4IDU5ZTNkNmMuLjRjMDgxM2YgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaApAQCAtMjMsMTAgKzIzLDEwIEBACiAgICAgdmlydHVhbCBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwKKyAgICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKTsKIAotICAgIHZpcnR1YWwgYm9vbCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgICAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKICAgICB2aXJ0dWFsIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogICAgIHZpcnR1YWwgdm9pZCBHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTQwLDggKzQwLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKICAgICB2aXJ0dWFsIENQV0xfV25kKiBSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVzdG9yZVZhbHVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgT25LZXlTdHJva2UoYm9vbCBiS2V5RG93biwgRlhfRFdPUkQgbkZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CisgICAgdmlydHVhbCB2b2lkIE9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJpdmF0ZToKICAgICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAppbmRleCA4YTljMDRjLi45NjFkNGI3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCkBAIC0yMCwzNSArMjAsMzUgQEAKIAl2aXJ0dWFsIH5DRkZMX05vdGlmeSgpOwogCiBwdWJsaWM6Ci0JYm9vbAkJCQkJCQkJCU9uU2V0Rm9jdXMoYm9vbCAmIGJFeGl0KTsKLQlib29sCQkJCQkJCQkJT25Nb3VzZUVudGVyKGJvb2wgJiBiRXhpdCk7Ci0JYm9vbAkJCQkJCQkJCU9uTW91c2VEb3duKGJvb2wgJiBiRXhpdCk7Ci0JYm9vbAkJCQkJCQkJCU9uTW91c2VVcChib29sICYgYkV4aXQpOwotCWJvb2wJCQkJCQkJCQlPbk1vdXNlRXhpdChib29sICYgYkV4aXQpOwotCWJvb2wJCQkJCQkJCQlPbktpbGxGb2N1cyhib29sICYgYkV4aXQpOworCUZYX0JPT0wJCQkJCQkJCQlPblNldEZvY3VzKEZYX0JPT0wgJiBiRXhpdCk7CisJRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VFbnRlcihGWF9CT09MICYgYkV4aXQpOworCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlRG93bihGWF9CT09MICYgYkV4aXQpOworCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlVXAoRlhfQk9PTCAmIGJFeGl0KTsKKwlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZUV4aXQoRlhfQk9PTCAmIGJFeGl0KTsKKwlGWF9CT09MCQkJCQkJCQkJT25LaWxsRm9jdXMoRlhfQk9PTCAmIGJFeGl0KTsKIAotCWJvb2wJCQkJCQkJCQlPbkNhbGN1bGF0ZSgpOwotCWJvb2wJCQkJCQkJCQlPbkZvcm1hdChpbnQgaUNvbW1pdEtleSk7Ci0JYm9vbAkJCQkJCQkJCU9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkJCSAgIGJvb2wgYlNoaWZ0LCBib29sICYgYlJDKTsKLQlib29sCQkJCQkJCQkJT25LZXlTdHJva2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGludCBuQ29tbWl0S2V5LCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkJCSAgIGJvb2wgYlNoaWZ0LCBib29sIGJXaWxsQ29tbWl0LCBib29sIGJGaWVsZEZ1bGwsCi0JCQkJCQkJCQkJCSAgIGludCYgblNlbFN0YXJ0LCBpbnQmIG5TZWxFbmQsIGJvb2wmIGJSQyk7CisJRlhfQk9PTAkJCQkJCQkJCU9uQ2FsY3VsYXRlKCk7CisJRlhfQk9PTAkJCQkJCQkJCU9uRm9ybWF0KGludCBpQ29tbWl0S2V5KTsKKwlGWF9CT09MCQkJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKKwkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpOworCUZYX0JPT0wJCQkJCQkJCQlPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKKwkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwKKwkJCQkJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgRlhfQk9PTCYgYlJDKTsKIAogCXZvaWQJCQkJCQkJCQlCZWZvcmVOb3RpZnkoKTsKIAl2b2lkCQkJCQkJCQkJQWZ0ZXJOb3RpZnkoKTsKLQlib29sCQkJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fbk5vdGlmeUZsYWcgPiAwO30KKwlGWF9CT09MCQkJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fbk5vdGlmeUZsYWcgPiAwO30KIAogcHJpdmF0ZToKLSAJYm9vbAkJCQkJCQkJCURvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIGJvb2wgJiBiRXhpdCk7Ci0gCWJvb2wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOwotIAlib29sCQkJCQkJCQkJRmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKTsKLSAJYm9vbAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgQ1BERl9BY3Rpb24gJiBhY3Rpb24sIGJvb2wmIGJFeGl0KTsKLSAJYm9vbAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLGJvb2wmIGJFeGl0KTsKKyAJRlhfQk9PTAkJCQkJCQkJCURvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgJiBiRXhpdCk7CisgCUZYX0JPT0wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOworIAlGWF9CT09MCQkJCQkJCQkJRmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKTsKKyAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KTsKKyAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLEZYX0JPT0wmIGJFeGl0KTsKIAotCWJvb2wJCQkJCQkJCQltX2JEb0FjdGlvbmluZzsKKwlGWF9CT09MCQkJCQkJCQkJbV9iRG9BY3Rpb25pbmc7CiAJaW50MzJfdAkJCQkJCQkJbV9uTm90aWZ5RmxhZzsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oCmluZGV4IDI2ZGU3YTEuLjNjZmFlZmIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaApAQCAtMTcsNyArMTcsNyBAQAogCiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKIAkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKaW5kZXggZTg1ODUzMy4uNDYzMzJlMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogCXZpcnR1YWwgfkNGRkxfUmFkaW9CdXR0b24oKTsKIAogCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0gIAl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIAl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiB9OwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKaW5kZXggMTA1YjkwYy4uMTBiZDVjMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaApAQCAtMzIsMjEgKzMyLDIxIEBACiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogCi0JdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBib29sCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAgCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogIAkJCQkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpOwogIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIGJvb2wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKICAJCQkJCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSk7CisJdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CiAKIHB1YmxpYzoKIAl2aXJ0dWFsIHZvaWQJCQkJT25TZXRGb2N1cyhDUFdMX1duZCogcFduZCk7CkBAIC01Niw5ICs1Niw5IEBACiAJdmlydHVhbCB2b2lkCQkJCU9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKIAogcHVibGljOgotCXZpcnR1YWwgYm9vbAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBib29sCQkJCUNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgYm9vbAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCiBwcml2YXRlOgogCUNCQV9Gb250TWFwKgkJCQltX3BGb250TWFwOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaAppbmRleCA4ZGZjNjRlLi5mZTAyNWVjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaApAQCAtMTcsNyArMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQmIGZTaXplKTsKICAgICBzdGF0aWMgQ1BERl9SZWN0IERlZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgY3JSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQmIGZTaXplKTsKLSAgICBzdGF0aWMgYm9vbCBUcmFjZU9iamVjdChDUERGX09iamVjdCogcE9iaik7CisgICAgc3RhdGljIEZYX0JPT0wgVHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaAppbmRleCA3YzQxYTFkLi4zOWVjNGY0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oCkBAIC0yMywxOCArMjMsMTggQEAKIGNsYXNzIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIKIHsKIHB1YmxpYzoKLQlib29sCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlib29sCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlib29sCURvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCWJvb2wJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJRG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJRlhfQk9PTAlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCiBjbGFzcyBDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcgogewogcHVibGljOgotCWJvb2wJRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JYm9vbAlEb0FjdGlvbl9Tb3VuZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCWJvb2wJRG9BY3Rpb25fTW92aWUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlGWF9CT09MCURvQWN0aW9uX1JlbmRpdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJRG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlGWF9CT09MCURvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCiBjbGFzcyBDUERGU0RLX0FjdGlvbkhhbmRsZXIKQEAgLTQ0LDMxICs0NCwzMSBAQAogCiAJdm9pZCBTZXRNZWRpYUFjdGlvbkhhbmRsZXIoQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXIqIHBIYW5kbGVyKTsKIAotCWJvb2wJCURvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlib29sCQlEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlib29sCQlEb0FjdGlvbl9QYWdlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlib29sCQlEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JYm9vbAkJRG9BY3Rpb25fQm9va01hcmsoQ1BERl9Cb29rbWFyayAqcEJvb2tNYXJrLCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JYm9vbAkJRG9BY3Rpb25fU2NyZWVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQlib29sCQlEb0FjdGlvbl9MaW5rKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JYm9vbAkJRG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKLQlib29sCQlEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7CisJRlhfQk9PTAkJRG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJCURvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJCURvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCUZYX0JPT0wJCURvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlGWF9CT09MCQlEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlGWF9CT09MCQlEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCUZYX0JPT0wJCURvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlGWF9CT09MCQlEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOworCUZYX0JPT0wJCURvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKIAogcHJpdmF0ZToKLQlib29sCQkJCUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCWJvb2wJCQkJRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlib29sCQkJCUV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlib29sCQkJCUV4ZWN1dGVTY3JlZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGU0RLX0Fubm90KiBwU2NyZWVuLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JYm9vbAkJCQlFeGVjdXRlQm9va01hcmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JYm9vbAkJCQlFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7CisJRlhfQk9PTAkJCQlFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKKwlGWF9CT09MCQkJCUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7CisJRlhfQk9PTAkJCQlFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDRlhfUHRyTGlzdCYgbGlzdCk7CisJRlhfQk9PTAkJCQlFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERlNES19Bbm5vdCogcFNjcmVlbiwgQ0ZYX1B0ckxpc3QmIGxpc3QpOworCUZYX0JPT0wJCQkJRXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywgQ0ZYX1B0ckxpc3QmIGxpc3QpOworCUZYX0JPT0wJCQkJRXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOwogCiAJdm9pZAkJCQlEb0FjdGlvbl9Ob0pzKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAJdm9pZAkJCQlSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKIAl2b2lkCQkJCVJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwogCXZvaWQJCQkJUnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKIAotCWJvb2wJCQkJSXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKLQlib29sCQkJCUlzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJRlhfQk9PTAkJCQlJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworCUZYX0JPT0wJCQkJSXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAogCXZvaWQJCQkJRG9BY3Rpb25fR29UbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKIAl2b2lkCQkJCURvQWN0aW9uX0dvVG9SKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCmluZGV4IDZmM2JlZTUuLmI0NzA1NjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgPSAwOwogCi0JdmlydHVhbCBib29sCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCiAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CkBAIC00MSw3ICs0MSw3IEBACiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBib29sCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CiAKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCkBAIC02OCwyNCArNjgsMjQgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKIAotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwogLy9ieSB3am0uCi0JdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9MCA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9MCA7CiAKIAl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCXZpcnR1YWwJdm9pZAkJCQlPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBib29sCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKIH07CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZSgpICB7cmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXRIYW5kbGVyIik7fQogCi0JdmlydHVhbCBib29sCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAogCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpOwogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSA7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCkBAIC0xMzcsMjUgKzEzNywyNSBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIDsKIAogCi0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBib29sCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7cmV0dXJuIGZhbHNlO30KKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHtyZXR1cm4gRkFMU0U7fQogCiAvL2J5IHdqbS4KLQl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7Ci0JdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAogCXZpcnR1YWwJdm9pZAkJCQlPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQogCXZpcnR1YWwJdm9pZAkJCQlPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgYm9vbAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2b2lkCQkJCQkJU2V0Rm9ybUZpbGxlcihDRkZMX0lGb3JtRmlsbGVyKiBwRmlsbGVyKXttX3BGb3JtRmlsbGVyID0gcEZpbGxlcjt9CiAJQ0ZGTF9JRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKCkge3JldHVybiBtX3BGb3JtRmlsbGVyO30KQEAgLTE5MCwyOSArMTkwLDI5IEBACiAJdmlydHVhbCB2b2lkCQkJCUFubm90X09uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncyk7CiAJdmlydHVhbCB2b2lkCQkJCUFubm90X09uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCUFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCUFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBib29sCQkJCUFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCUFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBib29sCQkJCUFubm90X09uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCiAKLQl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7Ci0JdmlydHVhbCBib29sCQkJCUFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7CisJdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCUFubm90X09uR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKIHByaXZhdGU6CiAJSVBERlNES19Bbm5vdEhhbmRsZXIqCQkJR2V0QW5ub3RIYW5kbGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzVHlwZSkgY29uc3Q7Ci0JQ1BERlNES19Bbm5vdCoJCQkJR2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCxib29sIGJOZXh0KTsKKwlDUERGU0RLX0Fubm90KgkJCQlHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX0JPT0wgYk5leHQpOwogcHJpdmF0ZToKIAlDQkFfQW5ub3RIYW5kbGVyQXJyYXkJCW1fSGFuZGxlcnM7CiAJQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgkJbV9tYXBUeXBlMkhhbmRsZXI7CkBAIC0yMjQsOCArMjI0LDggQEAKIGNsYXNzIENQREZTREtfQW5ub3RJdGVyYXRvcgogewogcHVibGljOgotICAgIENQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBib29sIGJSZXZlcnNlLAotCQlib29sIGJJZ25vcmVUb3Btb3N0PWZhbHNlLGJvb2wgYkNpcmNsZT1mYWxzZSxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXZlcnNlLAorCQlGWF9CT09MIGJJZ25vcmVUb3Btb3N0PUZBTFNFLEZYX0JPT0wgYkNpcmNsZT1GQUxTRSxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOwogICAgIHZpcnR1YWwgfkNQREZTREtfQW5ub3RJdGVyYXRvcigpIHsgfQogCiAJdmlydHVhbCBDUERGU0RLX0Fubm90KglOZXh0IChjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkgOwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJdmlydHVhbCBDUERGU0RLX0Fubm90KglQcmV2KGludCYgaW5kZXggKSA7CiAJdmlydHVhbCBpbnQgICAgICAgICAgICAgQ291bnQoKXtyZXR1cm4gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpO30KIAotCXZpcnR1YWwgYm9vbCAgICAgICAgIEluaXRJdGVyYXRvckFubm90TGlzdChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LENGWF9QdHJBcnJheSogcExpc3Q9TlVMTCk7CisJdmlydHVhbCBGWF9CT09MICAgICAgICAgSW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5KiBwTGlzdD1OVUxMKTsKIAogCXZvaWQJCQkJCUluc2VydFNvcnQoQ0ZYX1B0ckFycmF5ICZhcnJheUxpc3QsIEFJX0NPTVBBUkUgcENvbXBhcmUpOwogCkBAIC0yNDUsOSArMjQ1LDkgQEAKIAlDUERGU0RLX0Fubm90KglQcmV2QW5ub3QoaW50JiBpbmRleCApIDsKIAogCUNGWF9QdHJBcnJheQkgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0OwotCWJvb2wJCQkgICAgIG1fYlJldmVyc2U7Ci0JYm9vbCAgICAgICAgICAgICAgbV9iSWdub3JlVG9wbW9zdDsKLQlib29sICAgICAgICAgICAgICBtX2JDaXJjbGU7CisJRlhfQk9PTAkJCSAgICAgbV9iUmV2ZXJzZTsKKwlGWF9CT09MICAgICAgICAgICAgICBtX2JJZ25vcmVUb3Btb3N0OworCUZYX0JPT0wgICAgICAgICAgICAgIG1fYkNpcmNsZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfQU5OT1RIQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlYW5ub3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCmluZGV4IGI5ZjFmY2QuLmRjZDI5NWQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCkBAIC0zOCwxMiArMzgsMTIgQEAKIAogCUNQREZTREtfRGF0ZVRpbWUmCW9wZXJhdG9yID0gKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKIAlDUERGU0RLX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBGWF9TWVNURU1USU1FJiBzdCk7Ci0JYm9vbAkJCQlvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCWJvb2wJCQkJb3BlcmF0b3IgIT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlib29sCQkJCW9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlib29sCQkJCW9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JYm9vbAkJCQlvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JYm9vbAkJCQlvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCUZYX0JPT0wJCQkJb3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKwlGWF9CT09MCQkJCW9wZXJhdG9yICE9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJRlhfQk9PTAkJCQlvcGVyYXRvciA+IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJRlhfQk9PTAkJCQlvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCUZYX0JPT0wJCQkJb3BlcmF0b3IgPCAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCUZYX0JPT0wJCQkJb3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKIAkJCQkJCW9wZXJhdG9yIHRpbWVfdCgpOwogCiAJQ1BERlNES19EYXRlVGltZSYJRnJvbVBERkRhdGVUaW1lU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkdFN0cik7CkBAIC05Miw4ICs5Miw4IEBACiAJdm9pZAkJCQkJCVNldFRhYk9yZGVyKGludCBpVGFiT3JkZXIpOwogCiAJLy8gU2VsZWN0aW9uCi0JYm9vbAkJCQkJCUlzU2VsZWN0ZWQoKTsKLQl2b2lkCQkJCQkJU2V0U2VsZWN0ZWQoYm9vbCBiU2VsZWN0ZWQpOworCUZYX0JPT0wJCQkJCQlJc1NlbGVjdGVkKCk7CisJdm9pZAkJCQkJCVNldFNlbGVjdGVkKEZYX0JPT0wgYlNlbGVjdGVkKTsKIAogCUNGWF9CeXRlU3RyaW5nCQkJCUdldFR5cGUoKSBjb25zdDsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRTdWJUeXBlKCkgY29uc3Q7CkBAIC0xNDYsOSArMTQ2LDkgQEAKIAogCXZvaWQJCQkJCQlTZXRDb2xvcihGWF9DT0xPUlJFRiBjb2xvcik7CiAJdm9pZAkJCQkJCVJlbW92ZUNvbG9yKCk7Ci0JYm9vbAkJCQkJCUdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJRlhfQk9PTAkJCQkJCUdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CiAKLQlib29sCQkJCQkJSXNWaXNpYmxlKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0OwogCS8vYWN0aW9uCiAKIAlDUERGX0FjdGlvbgkJCQkJR2V0QWN0aW9uKCkgY29uc3Q7CkBAIC0xNjIsOCArMTYyLDggQEAKIAl2aXJ0dWFsIENQREZfQWN0aW9uCQkJR2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpOwogCiBwdWJsaWM6Ci0JYm9vbAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKCk7Ci0JYm9vbAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworCUZYX0JPT0wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZCgpOworCUZYX0JPT0wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKIAl2b2lkCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAJdm9pZAkJCQkJCURyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKQEAgLTE4MSwxMSArMTgxLDExIEBACiAKIAogcHJpdmF0ZToKLQlib29sIENyZWF0ZUZvcm1GaWxsZXIoKTsKKwlGWF9CT09MIENyZWF0ZUZvcm1GaWxsZXIoKTsKIHByb3RlY3RlZDoKIAlDUERGX0Fubm90KgkJCW1fcEFubm90OwogCUNQREZTREtfUGFnZVZpZXcqCW1fcFBhZ2VWaWV3OwotCWJvb2wJCQkJbV9iU2VsZWN0ZWQ7CisJRlhfQk9PTAkJCQltX2JTZWxlY3RlZDsKIAlpbnQJCQkJCW1fblRhYk9yZGVyOwogCiB9OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKaW5kZXggNmI5NzRjNS4uZWRiZDVlNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCkBAIC0zNSwyOCArMzUsMjggQEAKIHsKIAlfUERGU0RLX0ZpZWxkQWN0aW9uKCkKIAl7Ci0JCWJNb2RpZmllciA9IGZhbHNlOwotCQliU2hpZnQgPSBmYWxzZTsKKwkJYk1vZGlmaWVyID0gRkFMU0U7CisJCWJTaGlmdCA9IEZBTFNFOwogCQluQ29tbWl0S2V5ID0gMDsKLQkJYktleURvd24gPSBmYWxzZTsKKwkJYktleURvd24gPSBGQUxTRTsKIAkJblNlbEVuZCA9IG5TZWxTdGFydCA9IDA7Ci0JCWJXaWxsQ29tbWl0ID0gZmFsc2U7Ci0JCWJGaWVsZEZ1bGwgPSBmYWxzZTsKLQkJYlJDID0gdHJ1ZTsKKwkJYldpbGxDb21taXQgPSBGQUxTRTsKKwkJYkZpZWxkRnVsbCA9IEZBTFNFOworCQliUkMgPSBUUlVFOwogCX0KIAotCWJvb2wJCQkJCWJNb2RpZmllcjsJCS8vaW4KLQlib29sCQkJCQliU2hpZnQ7CQkJLy9pbgorCUZYX0JPT0wJCQkJCWJNb2RpZmllcjsJCS8vaW4KKwlGWF9CT09MCQkJCQliU2hpZnQ7CQkJLy9pbgogCWludAkJCQkJCW5Db21taXRLZXk7CQkvL2luCiAJQ0ZYX1dpZGVTdHJpbmcJCQlzQ2hhbmdlOwkJLy9pbltvdXRdCiAJQ0ZYX1dpZGVTdHJpbmcJCQlzQ2hhbmdlRXg7CQkvL2luCi0JYm9vbAkJCQkJYktleURvd247CQkvL2luCisJRlhfQk9PTAkJCQkJYktleURvd247CQkvL2luCiAJaW50CQkJCQkJblNlbEVuZDsJCS8vaW5bb3V0XQogCWludAkJCQkJCW5TZWxTdGFydDsJCS8vaW5bb3V0XQogCUNGWF9XaWRlU3RyaW5nCQkJc1ZhbHVlOwkJCS8vaW5bb3V0XQotCWJvb2wJCQkJCWJXaWxsQ29tbWl0OwkvL2luCi0JYm9vbAkJCQkJYkZpZWxkRnVsbDsJCS8vaW4KLQlib29sCQkJCQliUkM7CQkJLy9pbltvdXRdCisJRlhfQk9PTAkJCQkJYldpbGxDb21taXQ7CS8vaW4KKwlGWF9CT09MCQkJCQliRmllbGRGdWxsOwkJLy9pbgorCUZYX0JPT0wJCQkJCWJSQzsJCQkvL2luW291dF0KIH1QREZTREtfRmllbGRBY3Rpb247CiBjbGFzcyBDUERGU0RLX1dpZGdldCA6IHB1YmxpYyBDUERGU0RLX0Fubm90CiB7CkBAIC04MCw5ICs4MCw5IEBACiAJaW50CQkJCQkJCQlHZXRGaWVsZEZsYWdzKCkgY29uc3Q7CiAJaW50CQkJCQkJCQlHZXRSb3RhdGUoKSBjb25zdDsKIAotCWJvb2wJCQkJCQkJR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JYm9vbAkJCQkJCQlHZXRCb3JkZXJDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OwotCWJvb2wJCQkJCQkJR2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKIAlGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAKIAlpbnQJCQkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkgY29uc3Q7CkBAIC05MCw5ICs5MCw5IEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRPcHRpb25MYWJlbChpbnQgbkluZGV4KSBjb25zdDsKIAlpbnQJCQkJCQkJCUNvdW50T3B0aW9ucygpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IG5JbmRleCkgY29uc3Q7CiAJaW50CQkJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKLQlib29sCQkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CiAJLyoKIAlCRl9BTElHTl9MRUZUCiAJQkZfQUxJR05fTUlEREwKQEAgLTEwMywyMCArMTAzLDIwIEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldEFsdGVybmF0ZU5hbWUoKSBjb25zdDsKIAogLy9TZXQgUHJvcGVydGllcy4KLQl2b2lkCQkJCQkJCVNldENoZWNrKGJvb2wgYkNoZWNrZWQsIGJvb2wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlLCBib29sIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQlTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSk7Ci0Jdm9pZAkJCQkJCQlTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCUNsZWFyU2VsZWN0aW9uKGJvb2wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQlTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCUNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50IGluZGV4KTsKIAotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCk7Ci0Jdm9pZAkJCQkJCQlSZXNldEZpZWxkQXBwZWFyYW5jZShib29sIGJWYWx1ZUNoYW5nZWQpOworCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisJdm9pZAkJCQkJCQlSZXNldEZpZWxkQXBwZWFyYW5jZShGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOwogCXZvaWQJCQkJCQkJVXBkYXRlRmllbGQoKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoYm9vbCYgYkZvcm1hdGVkKTsKKwlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoRlhfQk9PTCYgYkZvcm1hdGVkKTsKIAogLy9NZXNzYWdlLgotIAlib29sCQkJCQkJCU9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKKyAJRlhfQk9PTAkJCQkJCQlPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCiAJCQkJCQkJCQkJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAJQ1BERlNES19JbnRlckZvcm0qCQkJCUdldEludGVyRm9ybSgpIGNvbnN0IHtyZXR1cm4gbV9wSW50ZXJGb3JtO30KQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAJdm9pZAkJCQkJCQlTZXRBcHBNb2RpZmllZCgpOwogCXZvaWQJCQkJCQkJQ2xlYXJBcHBNb2RpZmllZCgpOwotCWJvb2wJCQkJCQkJSXNBcHBNb2RpZmllZCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNBcHBNb2RpZmllZCgpIGNvbnN0OwogCiAJaW50MzJfdAkJCQkJCUdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdDsKIAlpbnQzMl90CQkJCQkJR2V0VmFsdWVBZ2UoKSBjb25zdDsKQEAgLTE1NSwxNCArMTU1LDE0IEBACiAJdm9pZAkJCQkJCQlBZGRJbWFnZVRvQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSk7CiAJdm9pZAkJCQkJCQlSZW1vdmVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKTsKIHB1YmxpYzoKLQlib29sCQkJCQkJCUlzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworCUZYX0JPT0wJCQkJCQkJSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CiAJdm9pZAkJCQkJCQlEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQlDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIHB1YmxpYzoKLQlib29sCQkJCQkJCUhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKKwlGWF9CT09MCQkJCQkJCUhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKIHByaXZhdGU6CiAJQ1BERlNES19JbnRlckZvcm0qCQkJCW1fcEludGVyRm9ybTsKLQlib29sCQkJCQkJCW1fYkFwcE1vZGlmaWVkOworCUZYX0JPT0wJCQkJCQkJbV9iQXBwTW9kaWZpZWQ7CiAJaW50MzJfdAkJCQkJCW1fbkFwcEFnZTsKIAlpbnQzMl90CQkJCQkJbV9uVmFsdWVBZ2U7CiB9OwpAQCAtMTc2LDkgKzE3Niw5IEBACiAJQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQogCUNQREZTREtfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotCWJvb2wJCQkJCQkJSGlnaGxpZ2h0V2lkZ2V0cygpOworCUZYX0JPT0wJCQkJCQkJSGlnaGxpZ2h0V2lkZ2V0cygpOwogCi0JQ1BERlNES19XaWRnZXQqCQkJCQlHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBib29sIGJOZXh0KSBjb25zdDsKKwlDUERGU0RLX1dpZGdldCoJCQkJCUdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYk5leHQpIGNvbnN0OwogCUNQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSBjb25zdDsKIAl2b2lkCQkJCQkJCUdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CiAJdm9pZAkJCQkJCQlHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CkBAIC0xODYsMzMgKzE4NiwzMyBAQAogCXZvaWQJCQkJCQkJQWRkTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAJdm9pZAkJCQkJCQlSZW1vdmVNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwogCi0Jdm9pZAkJCQkJCQlFbmFibGVDYWxjdWxhdGUoYm9vbCBiRW5hYmxlZCk7Ci0JYm9vbAkJCQkJCQlJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCUVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKTsKKwlGWF9CT09MCQkJCQkJCUlzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0OwogCiAjaWZkZWYgX1dJTjMyCiAJQ1BERl9TdHJlYW0qCQkJCQlMb2FkSW1hZ2VGcm9tRmlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGUpOwogI2VuZGlmCiAKLQl2b2lkCQkJCQkJCU9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgYm9vbCYgYlJDKTsKLQl2b2lkCQkJCQkJCU9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBib29sJiBiUkMpOworCXZvaWQJCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBGWF9CT09MJiBiUkMpOworCXZvaWQJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQyk7CiAJdm9pZAkJCQkJCQlPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IE5VTEwpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQlPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgYm9vbCYgYkZvcm1hdGVkKTsKKwlDRlhfV2lkZVN0cmluZwkJCQkJT25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIEZYX0JPT0wmIGJGb3JtYXRlZCk7CiAKLQl2b2lkCQkJCQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBib29sIGJWYWx1ZUNoYW5nZWQpOworCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CiAJdm9pZAkJCQkJCQlVcGRhdGVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7CiAKLQlib29sCQkJCQkJCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JYm9vbAkJCQkJCQlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCWJvb2wJCQkJCQkJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCWJvb2wJCQkJCQkJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKwlGWF9CT09MCQkJCQkJCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisJRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKIAogCXZvaWQJCQkJCQkJR2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKTsKLQlib29sCQkJCQkJCUlzVmFsaWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotCWJvb2wJCQkJCQkJU3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLQkJYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwgYm9vbCBiVXJsRW5jb2RlZCk7Ci0JYm9vbAkJCQkJCQlTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIGJvb2wgYlVybEVuY29kZWQpOwotCWJvb2wJCQkJCQkJRXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwotCWJvb2wJCQkJCQkJRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7CisJRlhfQk9PTAkJCQkJCQlJc1ZhbGlkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKKwlGWF9CT09MCQkJCQkJCVN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisJCUZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYlVybEVuY29kZWQpOworCUZYX0JPT0wJCQkJCQkJU3VibWl0Rm9ybShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0Rlc3RpbmF0aW9uLCBGWF9CT09MIGJVcmxFbmNvZGVkKTsKKwlGWF9CT09MCQkJCQkJCUV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKKwlGWF9CT09MCQkJCQkJCUV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZW1wb3JhcnlGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGVFeHQpOwogCiBwcml2YXRlOgpAQCAtMjI2LDggKzIyNiw4IEBACiAJdmlydHVhbCBpbnQJCQkJCQlCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwogCXZpcnR1YWwgaW50CQkJCQkJQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwogCi0JYm9vbAkJCQkJCQlGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKTsKLQlib29sCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKTsKKwlGWF9CT09MCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOworCUZYX0JPT0wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOwogCWludAkJCQkJCQkJR2V0UGFnZUluZGV4QnlBbm5vdERpY3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIGNvbnN0OwogCXZvaWQJCQkJCQkJRG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcik7CiAKQEAgLTIzNiwxMSArMjM2LDExIEBACiAgICAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAgICAgQ1BERl9JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKICAgICBDUERGU0RLX1dpZGdldE1hcCBtX01hcDsKLSAgICBib29sIG1fYkNhbGN1bGF0ZTsKLSAgICBib29sIG1fYkJ1c3k7CisgICAgRlhfQk9PTCBtX2JDYWxjdWxhdGU7CisgICAgRlhfQk9PTCBtX2JCdXN5OwogCiBwdWJsaWM6Ci0JYm9vbCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOworCUZYX0JPT0wgSXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKTsKIAl2b2lkICAgIFJlbW92ZUFsbEhpZ2hMaWdodCgpOwogCXZvaWQgICAgU2V0SGlnaGxpZ2h0QWxwaGEodWludDhfdCBhbHBoYSkge21faUhpZ2hsaWdodEFscGhhID0gYWxwaGE7fQogCXVpbnQ4X3QgR2V0SGlnaGxpZ2h0QWxwaGEoKSB7cmV0dXJuIG1faUhpZ2hsaWdodEFscGhhO30KQEAgLTI0OSw3ICsyNDksNyBAQAogcHJpdmF0ZToKIAlGWF9DT0xPUlJFRiBtX2FIaWdobGlnaHRDb2xvcls2XTsKIAl1aW50OF90IG1faUhpZ2hsaWdodEFscGhhOwotCWJvb2wJbV9iTmVlZEhpZ2h0bGlnaHRbNl07CisJRlhfQk9PTAltX2JOZWVkSGlnaHRsaWdodFs2XTsKIH07CiAKICNkZWZpbmUgQkFJX1NUUlVDVFVSRQkJMApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAppbmRleCA0MTYwNzkyLi4yOWIyNjVhIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaApAQCAtNDksNyArNDksNyBAQAogCiAJdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgb3ZlcnJpZGUgeyBkZWxldGUgdGhpczsgfQogCi0JdmlydHVhbCBib29sCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKwl2aXJ0dWFsIEZYX0JPT0wJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogCUZQREZfRklMRUFDQ0VTUwkJbV9GaWxlQWNjZXNzOwpAQCAtNjAsNyArNjAsNyBAQAogRlBERl9CT09MIEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX0RXT1JEIHBvbGljeSk7CiB2b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGUERGX1BBR0UgcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLCBib29sIGJOZWVkVG9SZXN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncywgRlhfQk9PTCBiTmVlZFRvUmVzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRV9BZGFwdGVyKiBwYXVzZSk7CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfREVGSU5FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCmluZGV4IDFjZTU3YzUuLmQ1NzEzOGIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oCkBAIC05MiwyNCArOTIsMjQgQEAKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9PbkNoYW5nZShtX3BJbmZvKTsKICAgICB9CiAKLSAgICBib29sIEZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKKyAgICBGWF9CT09MIEZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KSAhPSAwOwogICAgIH0KIAotICAgIGJvb2wgRkZJX0lzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CisgICAgRlhfQk9PTCBGRklfSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7CiAgICAgfQogCi0gICAgYm9vbCBGRklfSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorICAgIEZYX0JPT0wgRkZJX0lzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0FsdEtleSkgIT0gMDsKICAgICB9CiAKLSAgICBib29sIEZGSV9Jc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CisgICAgRlhfQk9PTCBGRklfSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50IEpTX2FwcEFsZXJ0KGNvbnN0IEZYX1dDSEFSKiBNc2csIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwgRlhfVUlOVCBUeXBlLCBGWF9VSU5UIEljb24pOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAgICAgICBtX3BJbmZvLT5GRklfRXhlY3V0ZU5hbWVkQWN0aW9uKG1fcEluZm8sIG5hbWVkQWN0aW9uKTsKICAgICB9CiAKLSAgICB2b2lkIEZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyh2b2lkKiBmaWVsZCxGUERGX1dJREVTVFJJTkcgZm9jdXNUZXh0LCBGUERGX0RXT1JEIG5UZXh0TGVuLCBib29sIGJGb2N1cykKKyAgICB2b2lkIEZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyh2b2lkKiBmaWVsZCxGUERGX1dJREVTVFJJTkcgZm9jdXNUZXh0LCBGUERGX0RXT1JEIG5UZXh0TGVuLCBGWF9CT09MIGJGb2N1cykKICAgICB7CiAgICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cykKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cyhtX3BJbmZvLCBmb2N1c1RleHQsIG5UZXh0TGVuLCBiRm9jdXMpOwpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICAgICAgICBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKG1fcEluZm8sIG5QYWdlSW5kZXgsIHpvb21Nb2RlLCBmUG9zQXJyYXksIHNpemVPZkFycmF5KTsKICAgICB9CiAKLSAgICBib29sIElzSlNJbml0aWF0ZWQoKSBjb25zdCB7IHJldHVybiBtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm07IH0KKyAgICBGWF9CT09MIElzSlNJbml0aWF0ZWQoKSBjb25zdCB7IHJldHVybiBtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm07IH0KICAgICB2b2lkIFNldFNES0RvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBGWERvYykgeyBtX3BTREtEb2MgPSBwRlhEb2M7IH0KICAgICBDUERGU0RLX0RvY3VtZW50KiBHZXRTREtEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFNES0RvYzsgfQogICAgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wUERGRG9jOyB9CkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICBDUERGU0RLX0ludGVyRm9ybSogICAgICBHZXRJbnRlckZvcm0oKSA7CiAgICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgR2V0RG9jdW1lbnQoKSB7cmV0dXJuIG1fcERvYzt9CiAKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiAgICAgICBHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBib29sIFJlTmV3ID0gdHJ1ZSk7CisgICAgQ1BERlNES19QYWdlVmlldyogICAgICAgR2V0UGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSwgRlhfQk9PTCBSZU5ldyA9IFRSVUUpOwogICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldFBhZ2VWaWV3KGludCBuSW5kZXgpOwogICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldEN1cnJlbnRWaWV3KCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVNb3ZlUGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSk7CkBAIC0yMzcsMjUgKzIzNywyNSBAQAogCiAgICAgSUZYSlNfUnVudGltZSAqICAgICAgICAgR2V0SnNSdW50aW1lKCk7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApOwotICAgIGJvb2wgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWdlcyhjb25zdCBDRlhfV29yZEFycmF5ICZhcnJFeHRyYVBhZ2VzLCBDUERGX0RvY3VtZW50KiBwRHN0RG9jKTsKLSAgICBib29sICAgICAgICAgICAgICAgICBJbnNlcnRQYWdlcyhpbnQgbkluc2VydEF0LCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgUmVwbGFjZVBhZ2VzKGludCBuUGFnZSwgY29uc3QgQ1BERl9Eb2N1bWVudCogcFNyY0RvYywgY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyU3JjUGFnZXMpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWdlcyhjb25zdCBDRlhfV29yZEFycmF5ICZhcnJFeHRyYVBhZ2VzLCBDUERGX0RvY3VtZW50KiBwRHN0RG9jKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJbnNlcnRQYWdlcyhpbnQgbkluc2VydEF0LCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgUmVwbGFjZVBhZ2VzKGludCBuUGFnZSwgY29uc3QgQ1BERl9Eb2N1bWVudCogcFNyY0RvYywgY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyU3JjUGFnZXMpOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgT25DbG9zZURvY3VtZW50KCk7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRQYWdlQ291bnQoKSB7cmV0dXJuIG1fcERvYy0+R2V0UGFnZUNvdW50KCk7fQotICAgIGJvb2wgICAgICAgICAgICAgICAgIEdldFBlcm1pc3Npb25zKGludCBuRmxhZyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgR2V0Q2hhbmdlTWFyaygpIHtyZXR1cm4gbV9iQ2hhbmdlTWFzazt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgU2V0Q2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrID0gdHJ1ZTt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ2xlYXJDaGFuZ2VNYXJrKCkge21fYkNoYW5nZU1hc2s9IGZhbHNlO30KKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEdldENoYW5nZU1hcmsoKSB7cmV0dXJuIG1fYkNoYW5nZU1hc2s7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIFNldENoYW5nZU1hcmsoKSB7bV9iQ2hhbmdlTWFzayA9IFRSVUU7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIENsZWFyQ2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrPSBGQUxTRTt9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgICAgICAgICAgR2V0UGF0aCgpIDsKICAgICBDUERGX1BhZ2UqICAgICAgICAgICAgICBHZXRQYWdlKGludCBuSW5kZXgpOwogICAgIENQREZEb2NfRW52aXJvbm1lbnQgKiAgIEdldEVudigpIHtyZXR1cm4gbV9wRW52OyB9CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUHJvY0phdmFzY3JpcHRGdW4oKTsKLSAgICBib29sICAgICAgICAgICAgICAgICBQcm9jT3BlbkFjdGlvbigpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIFByb2NPcGVuQWN0aW9uKCk7CiAgICAgQ1BERl9PQ0NvbnRleHQqICAgICAgICAgR2V0T0NDb250ZXh0KCk7CiBwcml2YXRlOgogICAgIHN0ZDo6bWFwPENQREZfUGFnZSosIENQREZTREtfUGFnZVZpZXcqPiBtX3BhZ2VNYXA7CkBAIC0yNjQsNyArMjY0LDcgQEAKICAgICBDUERGU0RLX0Fubm90KiBtX3BGb2N1c0Fubm90OwogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEVudjsKICAgICBDUERGX09DQ29udGV4dCogbV9wT2Njb250ZW50OwotICAgIGJvb2wgbV9iQ2hhbmdlTWFzazsKKyAgICBGWF9CT09MIG1fYkNoYW5nZU1hc2s7CiB9OwogY2xhc3MgQ1BERlNES19QYWdlVmlldyBmaW5hbAogewpAQCAtMjc4LDI4ICsyNzgsMjggQEAKICAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0Rm9jdXNBbm5vdCgpIDsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX1VJTlQgbkZsYWcgPSAwKSB7bV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KHBTREtBbm5vdCwgbkZsYWcpO30KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKSB7cmV0dXJuIG1fcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QobkZsYWcpO30KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgIEtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKSB7cmV0dXJuIG1fcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QobkZsYWcpO30KKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KTsKIAogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoY29uc3QgRlhfQ0hBUiogbHBTdWJUeXBlLENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKICAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEFkZEFubm90KENQREZfQW5ub3QgKiBwUERGQW5ub3QpOwotICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgICAgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudEFubm90cygpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0QW5ub3QoaW50IG5JbmRleCk7CiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBHZXRBbm5vdEJ5RGljdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCk7CiAgICAgQ1BERl9QYWdlKiAgICAgICAgICAgICAgICAgICAgICBHZXRQREZQYWdlKCl7cmV0dXJuIG1fcGFnZTt9CiAgICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgICAgICAgICBHZXRQREZEb2N1bWVudCgpOwogICAgIENQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgR2V0U0RLRG9jdW1lbnQoKSB7cmV0dXJuIG1fcFNES0RvYzt9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgT25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgT25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLSAgICBib29sICAgICAgICAgICAgICAgICBPbktleVVwKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbktleURvd24oaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBpbnQgbkZsYWcpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uTW91c2VXaGVlbChkb3VibGUgZGVsdGFYLCBkb3VibGUgZGVsdGFZLGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgIElzVmFsaWRBbm5vdCh2b2lkKiBwKTsKKyAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZyk7CisgICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNWYWxpZEFubm90KHZvaWQqIHApOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRNYXRyaXgoQ1BERl9NYXRyaXgmIG1hdHJpeCkge21hdHJpeCA9IG1fY3VyTWF0cml4O30KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBVcGRhdGVSZWN0cyhDRlhfUmVjdEFycmF5JiByZWN0cyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVWaWV3KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CkBAIC0zMDgsMTEgKzMwOCwxMSBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VJbmRleCgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEZYQW5ub3RzKCk7CiAKLSAgICAgICAgdm9pZCBTZXRWYWxpZChib29sIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KLSAgICAgICAgYm9vbCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9Ci0gICAgICAgIHZvaWQgU2V0TG9jayhib29sIGJMb2NrZWQpIHttX2JMb2NrZWQ9IGJMb2NrZWQ7fQotICAgICAgICBib29sIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQotICAgICAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSB0cnVlO30KKyAgICAgICAgdm9pZCBTZXRWYWxpZChGWF9CT09MIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KKyAgICAgICAgRlhfQk9PTCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9CisgICAgICAgIHZvaWQgU2V0TG9jayhGWF9CT09MIGJMb2NrZWQpIHttX2JMb2NrZWQ9IGJMb2NrZWQ7fQorICAgICAgICBGWF9CT09MIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQorICAgICAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSBUUlVFO30KIHByaXZhdGU6CiAgICAgdm9pZCBQYWdlVmlld19PbkhpZ2hsaWdodEZvcm1GaWVsZHMoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwogICAgICAgICBDUERGX01hdHJpeCBtX2N1ck1hdHJpeDsKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAgICAgQ0ZYX1B0ckFycmF5ICBtX2Z4QW5ub3RBcnJheTsKICAgICBDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7CiAgICAgQ1BERlNES19XaWRnZXQqIG1fQ2FwdHVyZVdpZGdldDsKLSAgICBib29sIG1fYkVudGVyV2lkZ2V0OwotICAgIGJvb2wgbV9iRXhpdFdpZGdldDsKLSAgICBib29sIG1fYk9uV2lkZ2V0OwotICAgIGJvb2wgbV9iVmFsaWQ7Ci0gICAgICAgIGJvb2wgbV9iTG9ja2VkOwotICAgICAgICBib29sIG1fYlRha2VPdmVyUGFnZTsKKyAgICBGWF9CT09MIG1fYkVudGVyV2lkZ2V0OworICAgIEZYX0JPT0wgbV9iRXhpdFdpZGdldDsKKyAgICBGWF9CT09MIG1fYk9uV2lkZ2V0OworICAgIEZYX0JPT0wgbV9iVmFsaWQ7CisgICAgICAgIEZYX0JPT0wgbV9iTG9ja2VkOworICAgICAgICBGWF9CT09MIG1fYlRha2VPdmVyUGFnZTsKIH07CiAKIApAQCAtMzQwLDE0ICszNDAsMTQgQEAKIAogICAgIHR5cGVkZWYgaW50ICgqTFBfQ09NUEFSRSkoVFlQRSBwMSwgVFlQRSBwMik7CiAKLSAgICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgYm9vbCBiQXNjZW50ID0gdHJ1ZSkKKyAgICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgRlhfQk9PTCBiQXNjZW50ID0gVFJVRSkKICAgICB7CiAgICAgICAgIGludCBuU2l6ZSA9IHRoaXMtPkdldFNpemUoKTsKICAgICAgICAgUXVpY2tTb3J0KDAsIG5TaXplIC0xLCBiQXNjZW50LCBwQ29tcGFyZSk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIHZvaWQgUXVpY2tTb3J0KEZYX1VJTlQgblN0YXJ0UG9zLCBGWF9VSU5UIG5TdG9wUG9zLCBib29sIGJBc2NlbmQsIExQX0NPTVBBUkUgcENvbXBhcmUpCisgICAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsIEZYX1VJTlQgblN0b3BQb3MsIEZYX0JPT0wgYkFzY2VuZCwgTFBfQ09NUEFSRSBwQ29tcGFyZSkKICAgICB7CiAgICAgICAgIGlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oCmluZGV4IDg5NDVkMTguLmIyYmMxNjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgKQEAgLTM0LDcgKzM0LDcgQEAKIHsKIHB1YmxpYzoKIAlJRlNES19QQVVTRV9BZGFwdGVyKElGU0RLX1BBVVNFKiBJUGF1c2UgKTsKLQlib29sIE5lZWRUb1BhdXNlTm93KCk7CisJRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOwogCiBwcml2YXRlOgogCUlGU0RLX1BBVVNFKiBtX0lQYXVzZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oCmluZGV4IDMwMTY4ZDQuLmJmNTllNDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaApAQCAtNDcsMTAgKzQ3LDEwIEBACiAJdmlydHVhbCB2b2lkCQkJCUludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQkJCU91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JnJlY3QpID0gMDsKIAotCXZpcnR1YWwgYm9vbAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkgPSAwOwogCiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJR2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJQ2xpZW50VG9TY3JlZW4oRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCVNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgPSAwOwpAQCAtNjYsMjMgKzY2LDIzIEBACiAJdmlydHVhbCB2b2lkCQkJCVNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKSA9IDA7CiAKIAl2aXJ0dWFsIEZYX0hNRU5VCQkJQ3JlYXRlUG9wdXBNZW51KCkgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSUROZXdJdGVtLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgYm9vbCBiRW5hYmxlZCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSUROZXdJdGVtLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOwogCXZpcnR1YWwgaW50MzJfdAkJCVRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfSFdORCBoUGFyZW50KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCURlc3Ryb3lNZW51KEZYX0hNRU5VIGhNZW51KSA9IDA7CiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCkgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJRmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSA9IDA7CiAJdmlydHVhbCBDUERGX0ZvbnQqCQkJQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwgdWludDhfdCBuQ2hhcnNldCkgPSAwOwogCiAJdmlydHVhbCBpbnQzMl90CQkJU2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCUtpbGxUaW1lcihpbnQzMl90IG5JRCkgPSAwOwogCiAKLQl2aXJ0dWFsIGJvb2wJCQkJSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwogCiAJdmlydHVhbAlGWF9TWVNURU1USU1FCQlHZXRMb2NhbFRpbWUoKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKaW5kZXggNDVkMjY0Ni4uYmY0NmU5MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKQEAgLTkzLDcgKzkzLDcgQEAKIAkvL3NldCB0aGUgcG9zaXRpb24gb2YgdmVydGljYWwgc2Nyb2xsYmFyLgogCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSA9IDA7CiAJLy9zZXQgdGhlIGNhcmV0IGluZm9ybWF0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRDYXJldChib29sIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKIAkvL2lmIHRoZSBjYXJldCBwb3NpdGlvbiBpcyBjaGFuZ2VkICxzZW5kIHRoZSBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IHBvc3Rpb24gdG8gdXNlci4KIAl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcykgPSAwOwogCS8vaWYgdGhlIHRleHQgYXJlYSBpcyBjaGFuZ2VkLCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB1c2VyLgpAQCAtMTMxLDI1ICsxMzEsMjUgQEAKIAl2aXJ0dWFsIH5JRlhfRWRpdF9JdGVyYXRvcigpICB7fQogcHVibGljOgogCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCB3b3JkLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0V29yZCgpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFdvcmQoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IGxpbmUuCi0JdmlydHVhbCBib29sCQkJCQkJCU5leHRMaW5lKCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0TGluZSgpID0gMDsKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgc2VjdGlvbi4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRTZWN0aW9uKCkgPSAwOwogCiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyB3b3JkLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2V29yZCgpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldldvcmQoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBsaW5lLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2TGluZSgpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldkxpbmUoKSA9IDA7CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CiAKIAkvL2dldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgd29yZC4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdCA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOwogCS8vZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CiAJLy9nZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uCi0JdmlydHVhbCBib29sCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAkvL3NldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KIAl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CiAJLy9zZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCkBAIC0xOTUsNjkgKzE5NSw2OSBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCQlJbml0aWFsaXplKCkgPSAwOwogCiAJLy9zZXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGV4dCBhcmVhLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgc2Nyb2xsIG9yaWdpbgogCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSA9IDA7CiAKIAkvL3NldCB0aGUgaG9yaXpvbnRhbCB0ZXh0IGFsaWdubWVudCBpbiB0ZXh0IGJveCwgbkZvcm1hdCAoMDpsZWZ0IDE6bWlkZGxlIDI6cmlnaHQpLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwogCS8vc2V0IHRoZSB2ZXJ0aWNhbCB0ZXh0IGFsaWdubWVudCBpbiB0ZXh0IGJveCwgbkZvcm1hdCAoMDp0b3AgMTpjZW50ZXIgMjpib3R0b20pLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwogCS8vaWYgdGhlIHRleHQgaXMgc2hvd24gaW4gc2VjcmV0ICwgc2V0IGEgY2hhcmFjdGVyIGZvciBzdWJzdGl0dXRlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgbWF4aW1hbCBjb3VudCBvZiB3b3JkcyBvZiB0aGUgdGV4dC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CiAJLy9pZiBzZXQgdGhlIGNvdW50IG9mIGNoYXJBcnJheSAsIHRoZW4gYWxsIHdvcmRzIGlzIHNob3duIGluIGVxdWFsIHNwYWNlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CiAJLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgbGVhZGluZyBvZiBhbGwgbGluZXMKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL2lmIHNldCwgQ1JMRiBpcyBhbGxvd2VkLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL2lmIHNldCwgYWxsIHdvcmRzIGF1dG8gZml0IHRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgYm94LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CiAJLy9pZiBzZXQsIGEgZm9udCBzaXplIGlzIGNhbGN1bGF0ZWQgdG8gZnVsbCBmaXQgdGhlIGJvdW5kaW5nIGJveC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL2lzIHNldCwgdGhlIHRleHQgaXMgYWxsb3dlZCB0byBzY3JvbGwuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9TY3JvbGwoYm9vbCBiQXV0byA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgZm9udCBzaXplIG9mIGFsbCB3b3Jkcy4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKIAkvL3RoZSB0ZXh0IGlzIGFsbG93ZWQgdG8gYXV0by1zY3JvbGwsIGFsbG93IHRoZSB0ZXh0IG92ZXJmbG93PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCA9IGZhbHNlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgPSBGQUxTRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CiAKIAkvL3F1ZXJ5IGlmIHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOwogCS8vc2V0IHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dCA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwogCS8vc2V0IHRoZSBmb250c2l6ZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKIAkvL3NldCB0aGUgZm9udGluZGV4IG9mIHNlbGVjdGVkIHRleHQsIHVzZXIgY2FuIGNoYW5nZSB0aGUgZm9udCBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCS8vc2V0IHRoZSB0ZXh0Y29sb3Igb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgPSAwOwogCS8vc2V0IHRoZSB0ZXh0IHNjcmlwdCB0eXBlIG9mIHNlbGVjdGVkIHRleHQuICgwOm5vcm1hbCAxOnN1cGVyc2NyaXB0IDI6c3Vic2NyaXB0KQotCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpID0gMDsKIAkvL3NldCB0aGUgYm9sZCBmb250IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0Qm9sZChib29sIGJCb2xkID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgaXRhbGljIGZvbnQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoYm9vbCBiSXRhbGljID0gdHJ1ZSkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMgPSBUUlVFKSA9IDA7CiAJLy9zZXQgdGhlIHVuZGVybGluZSBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dFVuZGVybGluZShib29sIGJVbmRlcmxpbmUgPSB0cnVlKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgY3Jvc3NvdXQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRDcm9zc291dChib29sIGJDcm9zc291dCA9IHRydWUpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRDcm9zc291dChGWF9CT09MIGJDcm9zc291dCA9IFRSVUUpID0gMDsKIAkvL3NldCB0aGUgY2hhcnNwYWNlIG9mIHNlbGVjdGVkIHRleHQsIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsCWJvb2wJCQkJCQkJU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOworCXZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7CiAJLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2Ygc2VsZWN0ZWQgdGV4dCwgZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi0JdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApID0gMDsKIAkvL3NldCB0aGUgbGVhZGluZyBvZiBzZWxlY3RlZCBzZWN0aW9uLCBpbiB1c2VyIGNvb3JkaW5hdGUuCi0JdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CiAJLy9zZXQgdGhlIGluZGVudCBvZiBzZWxlY3RlZCBzZWN0aW9uLCBpbiB1c2VyIGNvb3JkaW5hdGUuCi0JdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpID0gMDsKIAkvL3NldCB0aGUgYWxpZ25tZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIG5BbGlnbm1lbnQoMDpsZWZ0IDE6bWlkZGxlIDI6cmlnaHQpCi0JdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpID0gMDsKIAogCS8vc2V0IHRoZSBzZWxlY3RlZCByYW5nZSBvZiB0ZXh0LgogCS8vaWYgblN0YXJ0Q2hhciA9PSAwIGFuZCBuRW5kQ2hhciA9PSAtMSwgc2VsZWN0IGFsbCB0aGUgdGV4dC4KQEAgLTI3Niw3ICsyNzYsNyBAQAogCS8vZ2V0IHRoZSB0ZXh0IGNvbmVudAogCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdCA9IDA7CiAJLy9xdWVyeSBpZiBhbnkgdGV4dCBpcyBzZWxlY3RlZC4KLQl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgc2Nyb2xsIG9yaWdpbgogCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCkBAIC0yOTEsNDQgKzI5MSw0NCBAQAogCXZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKIAogCS8vc2VuZCB0aGUgbW91c2Vkb3duIG1lc3NhZ2UgdG8gZWRpdCBmb3IgcmVzcG9uc2UuCi0JLy9pZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIHRydWUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIHRydWUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyB0cnVlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCS8vaWYgU2hpZnQga2V5IGlzIGhvbGQsIGJTaGlmdCBpcyBUUlVFLCBpcyBDdHJsIGtleSBpcyBob2xkLCBiQ3RybCBpcyBUUlVFLgorCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCS8vc2VuZCB0aGUgbW91c2Vtb3ZlIG1lc3NhZ2UgdG8gZWRpdCB3aGVuIG1vdXNlIGRvd24gaXMgVFJVRS4KKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIFVQIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIERPV04ga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIExFRlQga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIFJJR0hUIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIEhPTUUga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAkvL3NlbmQgdGhlIEVORCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKIAogCS8vcHV0IHRleHQgaW50byBlZGl0LgogCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9pbnNlcnQgYSB3b3JkIGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBib29sCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCS8vaW5zZXJ0IGEgcmV0dXJuIGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBib29sCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9pbnNlcnQgdGV4dCBpbnRvIHRoZSBlZGl0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9kbyBiYWNrc3BhY2Ugb3BlcmF0aW9uLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlCYWNrc3BhY2UoKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUJhY2tzcGFjZSgpID0gMDsKIAkvL2RvIGRlbGV0ZSBvcGVyYXRpb24uCi0JdmlydHVhbCBib29sCQkJCQkJCURlbGV0ZSgpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJRGVsZXRlKCkgPSAwOwogCS8vZGVsZXRlIHRoZSBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgYm9vbAkJCQkJCQlDbGVhcigpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2xlYXIoKSA9IDA7CiAKIAkvL2RvIFJlZG8gb3BlcmF0aW9uLgotCXZpcnR1YWwgYm9vbAkJCQkJCQlSZWRvKCkgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlSZWRvKCkgPSAwOwogCS8vZG8gVW5kbyBvcGVyYXRpb24uCi0JdmlydHVhbCBib29sCQkJCQkJCVVuZG8oKSA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCVVuZG8oKSA9IDA7CiAJLy9tb3ZlIGNhcmV0CiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldENhcmV0KGludDMyX3QgblBvcykgPSAwOwogCkBAIC0zMzYsMTggKzMzNiwxOCBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCQlQYWludCgpID0gMDsKIAogCS8vYWxsb3cgdG8gcmVmcmVzaCBzY3JlZW4/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJCQlSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgPSAwOwogCiAJLy9hbGxvdyB1bmRvL3JlZG8/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVVuZG8oYm9vbCBiVW5kbykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pID0gMDsKIAogCS8vYWxsb3cgbm90aWZ5PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpID0gMDsKIAogCS8vYWxsb3cgb3ByIG5vdGlmeT8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlT3ByTm90aWZ5KGJvb2wgYk5vdGlmeSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSA9IDA7CiAKIAkvL21hcCB3b3JkIHBsYWNlIHRvIHdvcmQgaW5kZXguCiAJdmlydHVhbCBpbnQzMl90CQkJCQkJV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOwpAQCAtMzgyLDExICszODIsMTEgQEAKIAkvL2dldCB0aGUgbGF0aW4gd29yZHMgb2Ygc3BlY2lmaWVkIHJhbmdlCiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0ID0gMDsKIAkvL2lzIHRoZSB0ZXh0IGZ1bGwgaW4gYm91bmRpbmcgYm94Ci0JdmlydHVhbCBib29sCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBib29sCQkJCQkJCUNhblVuZG8oKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBib29sCQkJCQkJCUNhblJlZG8oKSBjb25zdCA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdCA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblVuZG8oKSBjb25zdCA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblJlZG8oKSBjb25zdCA9IDA7CiAJLy9pZiB0aGUgY29udGVudCBpcyBjaGFuZ2VkIGFmdGVyIHNldHRleHQ/Ci0JdmlydHVhbCBib29sCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCA9IDA7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCA9IDA7CiAJLy9nZXQgdGhlIHRvdGFsIHdvcmRzIGluIGVkaXQKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3QgPSAwOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKIAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwsCi0JCQkJCQkJCQkJCQkJYm9vbCBiQ29udGludW91cyA9IHRydWUsIEZYX1dPUkQgU3ViV29yZCA9IDApOworCQkJCQkJCQkJCQkJCUZYX0JPT0wgYkNvbnRpbnVvdXMgPSBUUlVFLCBGWF9XT1JEIFN1YldvcmQgPSAwKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LCBGWF9DT0xPUlJFRiBjclRleHRGaWxsLCBGWF9DT0xPUlJFRiBjclRleHRTdHJva2UsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKTsKQEAgLTQ1MSwxMiArNDUxLDEyIEBACiAJdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QgPSAwOwogCXZpcnR1YWwgSUZYX0VkaXQqCQkJCQkJR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdCA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0ID0gMDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QgPSAwOwogCiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpID0gMDsKQEAgLTQ3NywxNiArNDc3LDE2IEBACiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0ID0gMDsKIAogCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLKGludDMyX3Qgbkl0ZW1JbmRleCxib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCBib29sCQkJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgICAgIH5JRlhfTGlzdCgpIHsgfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKaW5kZXggZjcyOGQ4Ny4uN2EyNzQyZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCkBAIC02OCwyNyArNjgsMjcgQEAKIAl7CiAJfQogCi0JYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmbGluZXJlY3QsIHNpemVvZihDRlhfRWRpdF9MaW5lUmVjdCkpICE9IDA7CiAJfQogCi0JYm9vbCBJc1NhbWVIZWlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlGWF9CT09MIElzU2FtZUhlaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8oKG1fcmNMaW5lLnRvcCAtIG1fcmNMaW5lLmJvdHRvbSkgLSAobGluZXJlY3QubV9yY0xpbmUudG9wIC1saW5lcmVjdC5tX3JjTGluZS5ib3R0b20pKTsKIAl9CiAKLQlib29sIElzU2FtZVRvcChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCUZYX0JPT0wgSXNTYW1lVG9wKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOwogCX0KIAotCWJvb2wgSXNTYW1lTGVmdChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCUZYX0JPT0wgSXNTYW1lTGVmdChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8obV9yY0xpbmUubGVmdCAtIGxpbmVyZWN0Lm1fcmNMaW5lLmxlZnQpOwogCX0KIAotCWJvb2wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKKwlGWF9CT09MIElzU2FtZVJpZ2h0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS5yaWdodCAtIGxpbmVyZWN0Lm1fcmNMaW5lLnJpZ2h0KTsKIAl9CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCQlFbmRQb3MgPSBlbmQ7CiAJfQogCi0JYm9vbCBJc0V4aXN0KCkgY29uc3QKKwlGWF9CT09MIElzRXhpc3QoKSBjb25zdAogCXsKIAkJcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKIAl9CiAKLQlib29sIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKSBjb25zdAorCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CiAJewogCQlyZXR1cm4gd3IuQmVnaW5Qb3MgIT0gQmVnaW5Qb3MgfHwgd3IuRW5kUG9zICE9IEVuZFBvczsKIAl9CkBAIC0yOTMsMTAgKzI5MywxMCBAQAogCiAJdm9pZAkJCQkJCQkJCUFkZEl0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBJdGVtKTsKIAotCWJvb2wJCQkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKLQlib29sCQkJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJCQlJc1dvcmtpbmcoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJSXNXb3JraW5nKCkgY29uc3Q7CiAKIAl2b2lkCQkJCQkJCQkJUmVzZXQoKTsKIApAQCAtMzE2LDI2ICszMTYsMjYgQEAKIAogCWludDMyX3QJCQkJCQkJCW1fbkN1clVuZG9Qb3M7CiAJaW50MzJfdAkJCQkJCQkJbV9uQnVmU2l6ZTsKLQlib29sCQkJCQkJCQkJbV9iTW9kaWZpZWQ7Ci0JYm9vbAkJCQkJCQkJCW1fYlZpcmdpbjsKLQlib29sCQkJCQkJCQkJbV9iV29ya2luZzsKKwlGWF9CT09MCQkJCQkJCQkJbV9iTW9kaWZpZWQ7CisJRlhfQk9PTAkJCQkJCQkJCW1fYlZpcmdpbjsKKwlGWF9CT09MCQkJCQkJCQkJbV9iV29ya2luZzsKIH07CiAKIGNsYXNzIENGWF9FZGl0X1VuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtCiB7CiBwdWJsaWM6Ci0JQ0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KHRydWUpLCBtX2JMYXN0KHRydWUpIHt9CisJQ0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KFRSVUUpLCBtX2JMYXN0KFRSVUUpIHt9CiAKIAlDRlhfV2lkZVN0cmluZyBHZXRVbmRvVGl0bGUoKSBvdmVycmlkZSB7IHJldHVybiBMIiI7IH0KIAotCXZvaWQJCQkJCQkJCQlTZXRGaXJzdChib29sIGJGaXJzdCl7bV9iRmlyc3QgPSBiRmlyc3Q7fQotCWJvb2wJCQkJCQkJCQlJc0ZpcnN0KCl7cmV0dXJuIG1fYkZpcnN0O30KLQl2b2lkCQkJCQkJCQkJU2V0TGFzdChib29sIGJMYXN0KXttX2JMYXN0ID0gYkxhc3Q7fQotCWJvb2wJCQkJCQkJCQlJc0xhc3QoKXtyZXR1cm4gbV9iTGFzdDt9CisJdm9pZAkJCQkJCQkJCVNldEZpcnN0KEZYX0JPT0wgYkZpcnN0KXttX2JGaXJzdCA9IGJGaXJzdDt9CisJRlhfQk9PTAkJCQkJCQkJCUlzRmlyc3QoKXtyZXR1cm4gbV9iRmlyc3Q7fQorCXZvaWQJCQkJCQkJCQlTZXRMYXN0KEZYX0JPT0wgYkxhc3Qpe21fYkxhc3QgPSBiTGFzdDt9CisJRlhfQk9PTAkJCQkJCQkJCUlzTGFzdCgpe3JldHVybiBtX2JMYXN0O30KIAogcHJpdmF0ZToKLQlib29sCQkJCQkJCQkJbV9iRmlyc3Q7Ci0JYm9vbAkJCQkJCQkJCW1fYkxhc3Q7CisJRlhfQk9PTAkJCQkJCQkJCW1fYkZpcnN0OworCUZYX0JPT0wJCQkJCQkJCQltX2JMYXN0OwogfTsKIAogY2xhc3MgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSA6IHB1YmxpYyBJRlhfRWRpdF9VbmRvSXRlbQpAQCAtNDI0LDcgKzQyNCw3IEBACiBwdWJsaWM6CiAJQ0ZYRVVfRGVsZXRlKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAogCQkJCQkJRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBib29sIGJTZWNFbmQpOworCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgRlhfQk9PTCBiU2VjRW5kKTsKIAl2aXJ0dWFsIH5DRlhFVV9EZWxldGUoKTsKIAogCXZvaWQJCQkJCQlSZWRvKCk7CkBAIC00MzksNyArNDM5LDcgQEAKIAlpbnQzMl90CQkJCQltX25DaGFyc2V0OwogCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKIAlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKLQlib29sCQkJCQkJbV9iU2VjRW5kOworCUZYX0JPT0wJCQkJCQltX2JTZWNFbmQ7CiB9OwogCiBjbGFzcyBDRlhFVV9DbGVhciA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQpAQCAtNTc1LDYxICs1NzUsNjEgQEAKIAlJRlhfRWRpdF9Gb250TWFwKgkJCQkJCUdldEZvbnRNYXAoKTsKIAogCXZvaWQJCQkJCQkJCQlJbml0aWFsaXplKCk7Ci0Jdm9pZAkJCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKIAl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7CiAKLQl2b2lkCQkJCQkJCQkJU2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQgPSAwLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7Ci0Jdm9pZAkJCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKLQl2b2lkCQkJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKLQl2b2lkCQkJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKLQl2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKLQl2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvU2Nyb2xsKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFRleHRPdmVyZmxvdyhib29sIGJBbGxvd2VkID0gZmFsc2UsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0QXV0b1Njcm9sbChGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCA9IEZBTFNFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwogCi0JYm9vbAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoYm9vbCBiUmljaFRleHQgPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQlib29sCQkJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKLQlib29sCQkJCQkJCQkJU2V0UmljaFRleHRCb2xkKGJvb2wgYkJvbGQgPSB0cnVlKTsKLQlib29sCQkJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoYm9vbCBiSXRhbGljID0gdHJ1ZSk7Ci0JYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKGJvb2wgYlVuZGVybGluZSA9IHRydWUpOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KGJvb2wgYkNyb3Nzb3V0ID0gdHJ1ZSk7Ci0JYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOwotCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7Ci0JYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7Ci0JYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CisJRlhfQk9PTAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKwlGWF9CT09MCQkJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKKwlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQgPSBUUlVFKTsKKwlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSk7CisJRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSk7CisJRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7CisJRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7CisJRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CiAKLQl2b2lkCQkJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRE9XTihib29sIGJTaGlmdCxib29sIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX0hPTUUoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CiAKIAl2b2lkCQkJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCiAJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JYm9vbAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCWJvb2wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JYm9vbAkJCQkJCQkJCUJhY2tzcGFjZSgpOwotCWJvb2wJCQkJCQkJCQlEZWxldGUoKTsKLQlib29sCQkJCQkJCQkJQ2xlYXIoKTsKLQlib29sCQkJCQkJCQkJRW1wdHkoKTsKLQlib29sCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKKwlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOworCUZYX0JPT0wJCQkJCQkJCQlCYWNrc3BhY2UoKTsKKwlGWF9CT09MCQkJCQkJCQkJRGVsZXRlKCk7CisJRlhfQk9PTAkJCQkJCQkJCUNsZWFyKCk7CisJRlhfQk9PTAkJCQkJCQkJCUVtcHR5KCk7CisJRlhfQk9PTAkJCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLQlib29sCQkJCQkJCQkJUmVkbygpOwotCWJvb2wJCQkJCQkJCQlVbmRvKCk7CisJRlhfQk9PTAkJCQkJCQkJCVJlZG8oKTsKKwlGWF9CT09MCQkJCQkJCQkJVW5kbygpOwogCUNQVlRfV29yZFBsYWNlCQkJCQkJCURvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCiAJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwogCWludDMyX3QJCQkJCQkJCUdldENoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpOwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJdm9pZAkJCQkJCQkJCVNlbGVjdEFsbCgpOwogCXZvaWQJCQkJCQkJCQlTZWxlY3ROb25lKCk7CiAJdm9pZAkJCQkJCQkJCVNldFNlbChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKTsKLQlib29sCQkJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CiAKIAl2b2lkCQkJCQkJCQkJUmVhcnJhbmdlQWxsKCk7CiAJdm9pZAkJCQkJCQkJCVJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSk7CkBAIC02NzcsMjMgKzY3NywyMyBAQAogCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKIAl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsTGltaXQoKTsKIAl2b2lkCQkJCQkJCQkJU2V0Q29udGVudENoYW5nZWQoKTsKLQl2b2lkCQkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOwogCiAJdm9pZAkJCQkJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLQlib29sCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLQlib29sCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLQlib29sCQkJCQkJCQkJQmFja3NwYWNlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLQlib29sCQkJCQkJCQkJRGVsZXRlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLQlib29sCQkJCQkJCQkJQ2xlYXIoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpOwotCWJvb2wJCQkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7Ci0JYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKwkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisJRlhfQk9PTAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisJRlhfQk9PTAkJCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisJRlhfQk9PTAkJCQkJCQkJCUJhY2tzcGFjZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisJRlhfQk9PTAkJCQkJCQkJCURlbGV0ZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisJRlhfQk9PTAkJCQkJCQkJCUNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKKwlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAorCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOworCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCiAJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwotCWJvb2wJCQkJCQkJCQlTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAotCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBib29sIGJBZGRVbmRvKTsKLQlib29sCQkJCQkJCQkJU2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pOworCUZYX0JPT0wJCQkJCQkJCQlTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAorCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKTsKKwlGWF9CT09MCQkJCQkJCQkJU2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCisJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pOwogCXZvaWQJCQkJCQkJCQlQYWludFNldFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpOwogCXZvaWQJCQkJCQkJCQlQYWludEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ldyk7CiAKQEAgLTcwMiw3ICs3MDIsNyBAQAogCWlubGluZSBDUERGX1JlY3QJCQkJCQlWVFRvRWRpdChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKIAlpbmxpbmUgQ1BERl9SZWN0CQkJCQkJRWRpdFRvVlQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKIAl2b2lkCQkJCQkJCQkJUmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbixjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTEgPSBOVUxMLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMiA9IE5VTEwpOwogCXZvaWQJCQkJCQkJCQlSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKIAl2b2lkCQkJCQkJCQkJUmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKQEAgLTcyMCwxNCArNzIwLDE0IEBACiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cjIpOwogCUNQVlRfV29yZFJhbmdlCQkJCQkJCUdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJCUVuYWJsZVVuZG8oYm9vbCBiVW5kbyk7Ci0Jdm9pZAkJCQkJCQkJCUVuYWJsZU9wck5vdGlmeShib29sIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJCQlFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pOworCXZvaWQJCQkJCQkJCQlFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKIAotCWJvb2wJCQkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQkJCUlzVGV4dE92ZXJmbG93KCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlib29sCQkJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OwotCWJvb2wJCQkJCQkJCQlJc01vZGlmaWVkKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJCQlCZWdpbkdyb3VwVW5kbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKTsKIAl2b2lkCQkJCQkJCQkJRW5kR3JvdXBVbmRvKCk7CkBAIC03NTEsMTkgKzc1MSwxOSBAQAogCiAJQ1BERl9Qb2ludAkJCQkJCQkJbV9wdFNjcm9sbFBvczsKIAlDUERGX1BvaW50CQkJCQkJCQltX3B0UmVmcmVzaFNjcm9sbFBvczsKLQlib29sCQkJCQkJCQkJbV9iRW5hYmxlU2Nyb2xsOworCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVTY3JvbGw7CiAJSUZYX0VkaXRfSXRlcmF0b3IgKgkJCQkJCW1fcEl0ZXJhdG9yOwogCUNGWF9FZGl0X1JlZnJlc2gJCQkJCQltX1JlZnJlc2g7CiAJQ1BERl9Qb2ludAkJCQkJCQkJbV9wdENhcmV0OwogCUNGWF9FZGl0X1VuZG8JCQkJCQkJbV9VbmRvOwogCWludDMyX3QJCQkJCQkJCW1fbkFsaWdubWVudDsKLQlib29sCQkJCQkJCQkJbV9iTm90aWZ5RmxhZzsKLQlib29sCQkJCQkJCQkJbV9iRW5hYmxlT3ZlcmZsb3c7Ci0JYm9vbAkJCQkJCQkJCW1fYkVuYWJsZVJlZnJlc2g7CisJRlhfQk9PTAkJCQkJCQkJCW1fYk5vdGlmeUZsYWc7CisJRlhfQk9PTAkJCQkJCQkJCW1fYkVuYWJsZU92ZXJmbG93OworCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVSZWZyZXNoOwogCUNQREZfUmVjdAkJCQkJCQkJbV9yY09sZENvbnRlbnQ7Ci0JYm9vbAkJCQkJCQkJCW1fYkVuYWJsZVVuZG87Ci0JYm9vbAkJCQkJCQkJCW1fYk5vdGlmeTsKLQlib29sCQkJCQkJCQkJbV9iT3ByTm90aWZ5OworCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVVbmRvOworCUZYX0JPT0wJCQkJCQkJCQltX2JOb3RpZnk7CisJRlhfQk9PTAkJCQkJCQkJCW1fYk9wck5vdGlmeTsKIAlDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKgkJCQkJbV9wR3JvdXBVbmRvSXRlbTsKIH07CiAKQEAgLTc3NSwxNiArNzc1LDE2IEBACiAJQ0ZYX0VkaXRfSXRlcmF0b3IoQ0ZYX0VkaXQgKiBwRWRpdCxJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBWVEl0ZXJhdG9yKTsKIAl2aXJ0dWFsIH5DRlhfRWRpdF9JdGVyYXRvcigpOwogCi0JYm9vbAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0JYm9vbAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0JYm9vbAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0JYm9vbAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0JYm9vbAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0JYm9vbAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CisJRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7CisJRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7CisJRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7CisJRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7CisJRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7CisJRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CiAKLQlib29sCQkJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdDsKLQlib29sCQkJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdDsKLQlib29sCQkJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdDsKIAl2b2lkCQkJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KTsKIAl2b2lkCQkJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7CiAJY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCQkJR2V0QXQoKSBjb25zdDsKQEAgLTgwOCw3ICs4MDgsNyBAQAogCWludDMyX3QJCQkJCUdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7CiAJaW50MzJfdAkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKIAlpbnQzMl90CQkJCQlHZXREZWZhdWx0Rm9udEluZGV4KCk7Ci0JYm9vbAkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CisJRlhfQk9PTAkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CiAKIHByaXZhdGU6CiAJSUZYX0VkaXRfRm9udE1hcCoJCQltX3BGb250TWFwOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKaW5kZXggMDdlZGI0Ni4uZmU3NWIwZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCkBAIC0zMSw3ICszMSw3IEBACiAJCXkgPSAwLjBmOwogCX0KIAotCWJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENMU1RfU2l6ZSAmIHNpemUpIGNvbnN0CisJRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9TaXplICYgc2l6ZSkgY29uc3QKIAl7CiAJCXJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnNpemUsIHNpemVvZihDTFNUX1NpemUpKSAhPSAwOwogCX0KQEAgLTgxLDEyICs4MSwxMiBAQAogCQlyZXR1cm4gKnRoaXM7CiAJfQogCi0JYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ0xTVF9SZWN0ICYgcmVjdCkgY29uc3QKKwlGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpID09IDA7CiAJfQogCi0JYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9SZWN0ICYgcmVjdCkgY29uc3QKKwlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpICE9IDA7CiAJfQpAQCAtMTYyLDIyICsxNjIsMjIgQEAKIAogcHVibGljOgogCXZvaWQJCQkJCQkJU2V0UmVjdChjb25zdCBDTFNUX1JlY3QgJiByZWN0KTsKLQl2b2lkCQkJCQkJCVNldFNlbGVjdChib29sIGJTZWxlY3RlZCk7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChib29sIGJDYXJldCk7CisJdm9pZAkJCQkJCQlTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpOworCXZvaWQJCQkJCQkJU2V0Q2FyZXQoRlhfQk9PTCBiQ2FyZXQpOwogCXZvaWQJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCk7CiAJdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3Q7CiAKIAlDTFNUX1JlY3QJCQkJCQlHZXRSZWN0KCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc0NhcmV0KCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc0NhcmV0KCkgY29uc3Q7CiAJRlhfRkxPQVQJCQkJCQlHZXRJdGVtSGVpZ2h0KCkgY29uc3Q7CiAJRlhfV09SRAkJCQkJCQlHZXRGaXJzdENoYXIoKSBjb25zdDsKIAogcHJpdmF0ZToKIAlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwotCWJvb2wJCQkJCQkJbV9iU2VsZWN0ZWQ7Ci0JYm9vbAkJCQkJCQltX2JDYXJldDsKKwlGWF9CT09MCQkJCQkJCW1fYlNlbGVjdGVkOworCUZYX0JPT0wJCQkJCQkJbV9iQ2FyZXQ7CiAJQ0xTVF9SZWN0CQkJCQkJbV9yY0xpc3RJdGVtOwogfTsKIApAQCAtMjA5LDcgKzIwOSw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBUWVBFPiBjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4KIHsKIHB1YmxpYzoKLQlib29sIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KKwlGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KIAlUWVBFIEdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdCB7IGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldEF0KG5JbmRleCk7IHJldHVybiBOVUxMO30KIAl2b2lkIFJlbW92ZUF0KGludDMyX3QgbkluZGV4KXtpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7fQogfTsKQEAgLTIzMCwxMiArMjMwLDEyIEBACiAJdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwogCXZpcnR1YWwgSUZYX0VkaXQqCQkJCUdldEl0ZW1FZGl0KGludDMyX3QgbkluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJR2V0Q291bnQoKSBjb25zdDsKLQl2aXJ0dWFsIGJvb2wJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldE11bHRpcGxlU2VsKGJvb2wgYk11bHRpcGxlKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKLQl2aXJ0dWFsIGJvb2wJCQkJCUlzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQJCQkJCVNldE11bHRpcGxlU2VsKEZYX0JPT0wgYk11bHRpcGxlKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKIAl2aXJ0dWFsIGludDMyX3QJCQkJRmluZE5leHQoaW50MzJfdCBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CkBAIC0yNDcsOCArMjQ3LDggQEAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3Q7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldEl0ZW1UZXh0KGludDMyX3QgbkluZGV4KSBjb25zdDsKIAotCXZvaWQJCQkJCQkJU2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKLQl2b2lkCQkJCQkJCVNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYkNhcmV0KTsKKwl2b2lkCQkJCQkJCVNldEl0ZW1TZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7CisJdm9pZAkJCQkJCQlTZXRJdGVtQ2FyZXQoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJDYXJldCk7CiAKIAl2aXJ0dWFsIGludDMyX3QJCQkJR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEZpcnN0U2VsZWN0ZWQoKSBjb25zdDsKQEAgLTI1OSw3ICsyNTksNyBAQAogCUNMU1RfQXJyYXlUZW1wbGF0ZTxDRlhfTGlzdEl0ZW0qPgltX2FMaXN0SXRlbXM7CiAJRlhfRkxPQVQJCQkJCQkJbV9mRm9udFNpemU7CiAJSUZYX0VkaXRfRm9udE1hcCoJCQkJCW1fcEZvbnRNYXA7Ci0JYm9vbAkJCQkJCQkJbV9iTXVsdGlwbGU7CisJRlhfQk9PTAkJCQkJCQkJbV9iTXVsdGlwbGU7CiB9OwogCiBzdHJ1Y3QgQ1BMU1RfU2VsZWN0X0l0ZW0KQEAgLTI4NSw3ICsyODUsNyBAQAogCXZvaWQJCQkJCQkJQWRkKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKIAl2b2lkCQkJCQkJCVN1YihpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJU3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKLQlib29sCQkJCQkJCUlzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKIAlpbnQzMl90CQkJCQkJRmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRJdGVtSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwpAQCAtMzA2LDE2ICszMDYsMTYgQEAKIHB1YmxpYzoKIAl2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KTsKIAotCXZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfRE9XTihib29sIGJTaGlmdCxib29sIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfTEVGVChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0hPTUUoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0VORChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwotCWJvb2wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJRlhfQk9PTAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKIAogCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlJblRvT3V0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7CiAJdmlydHVhbCBDUERGX1BvaW50CQkJCU91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKQEAgLTM0MSwyMyArMzQxLDIzIEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKIAogcHJpdmF0ZToKLQl2b2lkCQkJCQkJCVNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpOworCXZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7CiAJdm9pZAkJCQkJCQlTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKIAl2b2lkCQkJCQkJCUludmFsaWRhdGVJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7CiAJdm9pZAkJCQkJCQlTZWxlY3RJdGVtcygpOwotCWJvb2wJCQkJCQkJSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsSW5mbygpOwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CiAJdmlydHVhbCB2b2lkCQkJCQlSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KTsKIAogcHJpdmF0ZToKIAlJRlhfTGlzdF9Ob3RpZnkqCQkJCW1fcE5vdGlmeTsKLQlib29sCQkJCQkJCW1fYk5vdGlmeUZsYWc7CisJRlhfQk9PTAkJCQkJCQltX2JOb3RpZnlGbGFnOwogCUNQREZfUG9pbnQJCQkJCQltX3B0U2Nyb2xsUG9zOwogCUNQTFNUX1NlbGVjdAkJCQkJbV9hU2VsSXRlbXM7CS8vZm9yIG11bHRpcGxlCiAJaW50MzJfdAkJCQkJCW1fblNlbEl0ZW07CQkvL2ZvciBzaW5nbGUKIAlpbnQzMl90CQkJCQkJbV9uRm9vdEluZGV4OwkvL2ZvciBtdWx0aXBsZQotCWJvb2wJCQkJCQkJbV9iQ3RybFNlbDsJCS8vZm9yIG11bHRpcGxlCisJRlhfQk9PTAkJCQkJCQltX2JDdHJsU2VsOwkJLy9mb3IgbXVsdGlwbGUKIAlpbnQzMl90CQkJCQkJbV9uQ2FyZXRJbmRleDsJLy9mb3IgbXVsdGlwbGUKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oCmluZGV4IGVhZTNlMDcuLmI2NDQ3ZmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaApAQCAtMTYsMTQgKzE2LDE0IEBACiAJdmlydHVhbCB+UHJpbnRQYXJhbXNPYmooKXt9CiAKIHB1YmxpYzoKLQlib29sIGJVSTsKKwlGWF9CT09MIGJVSTsKIAlpbnQgblN0YXJ0OwogCWludCBuRW5kOwotCWJvb2wgYlNpbGVudDsKLQlib29sIGJTaHJpbmtUb0ZpdDsKLQlib29sIGJQcmludEFzSW1hZ2U7Ci0JYm9vbCBiUmV2ZXJzZTsKLQlib29sIGJBbm5vdGF0aW9uczsKKwlGWF9CT09MIGJTaWxlbnQ7CisJRlhfQk9PTCBiU2hyaW5rVG9GaXQ7CisJRlhfQk9PTCBiUHJpbnRBc0ltYWdlOworCUZYX0JPT0wgYlJldmVyc2U7CisJRlhfQk9PTCBiQW5ub3RhdGlvbnM7CiB9OwogCiBjbGFzcyBDSlNfUHJpbnRQYXJhbXNPYmogOiBwdWJsaWMgQ0pTX09iamVjdApAQCAtODUsODQgKzg1LDg0IEBACiAJdmlydHVhbCB+RG9jdW1lbnQoKTsKIAogcHVibGljOgotCWJvb2wJQURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAliYXNlVVJMKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJQ29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAljcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWZpbGVzaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlpY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJaW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJa2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCW1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCW1vdXNlWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAludW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCW51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJcGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJcHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCXN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCXRpdGxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAl6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAl6b29tVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJQURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAliYXNlVVJMKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJQ29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAljcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWZpbGVzaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlpY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJaW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJa2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCW1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCW1vdXNlWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAludW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCW51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJcGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJcHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCXN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCXRpdGxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAl6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAl6b29tVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0JYm9vbCBhZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJYWRkTGluayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAljYWxjdWxhdGVOb3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAljbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZ2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZ2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWdldE50aEZpZWxkTmFtZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWdldE9DR3MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZ2V0UGFnZU50aFdvcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlnZXRQYWdlTnRoV29yZFF1YWRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJZ2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZ2V0UHJpbnRQYXJhbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlpbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCWltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgaW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAltYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCXByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJcmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCByZXBsYWNlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlyZXNldEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAlzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJbWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCXJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBhZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJYWRkTGluayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAljYWxjdWxhdGVOb3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAljbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZ2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZ2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWdldE50aEZpZWxkTmFtZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWdldE9DR3MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZ2V0UGFnZU50aFdvcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlnZXRQYWdlTnRoV29yZFF1YWRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJZ2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZ2V0UHJpbnRQYXJhbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlpbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCWltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgaW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAltYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCXByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJcmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCByZXBsYWNlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlyZXNldEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAlzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJbWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCXJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNoRG9jKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwogCUNQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgICAgICAgICBHZXRSZWFkZXJEb2MoKTsKLQlzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGaWxlTmFtZSk7Ci0Jc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKTsKKwlzdGF0aWMgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGaWxlTmFtZSk7CisJc3RhdGljIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCk7CiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZERlbGF5QW5ub3REYXRhKENKU19Bbm5vdE9iaiAqcERhdGEpOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKIAlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqV29yZFN0cihDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBpbnQgbldvcmRJbmRleCk7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlclBhcmFtcyhKU09iamVjdCAqcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKTsKKwlGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VyUGFyYW1zKEpTT2JqZWN0ICpwT2JqLENKU19Bbm5vdE9iaiYgYW5ub3RvYmopOwogCiAJdjg6Oklzb2xhdGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faXNvbGF0ZTsKIAlJY29uVHJlZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNvblRyZWU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlDSlNfRG9jdW1lbnQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0RvY3VtZW50KCl7fTsKIAotCXZpcnR1YWwgYm9vbAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOworCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwogCiAJREVDTEFSRV9KU19DTEFTUyhDSlNfRG9jdW1lbnQpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaAppbmRleCAyYTZiYTdkLi43MGQxZDM5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgKQEAgLTEwMyw4NSArMTAzLDg1IEBACiAJRmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKIAl2aXJ0dWFsIH5GaWVsZCh2b2lkKTsKIAotICAgIGJvb2wgYWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgYm9vbCBib3JkZXJTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgYnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgYnV0dG9uUG9zaXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJ1dHRvblNjYWxlSG93KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgYm9vbCBidXR0b25TY2FsZVdoZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBjaGFyTGltaXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGNvbWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgYm9vbCBkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGRlZmF1bHRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZG9Ob3RTY3JvbGwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGRvTm90U3BlbGxDaGVjayhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBib29sIGRvYyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZWRpdGFibGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZmlsZVNlbGVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBib29sIGhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgbGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBtdWx0aWxpbmUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIG11bHRpcGxlU2VsZWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBudW1JdGVtcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIGJvb2wgcGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcGFzc3dvcmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHByaW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCByYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcmVhZG9ubHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHJlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBib29sIHJlcXVpcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCByaWNoVGV4dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCByb3RhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzdWJtaXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB0ZXh0U2l6ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgdHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgdXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB2YWx1ZUFzU3RyaW5nKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBGWF9CT09MIGFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIEZYX0JPT0wgYm9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJ1dHRvbkFsaWduWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgYnV0dG9uQWxpZ25ZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBidXR0b25GaXRCb3VuZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBidXR0b25TY2FsZUhvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIEZYX0JPT0wgYnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjYWxjT3JkZXJJbmRleChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgY2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgY3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIEZYX0JPT0wgZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGRvTm90U2Nyb2xsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBkaXNwbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgRlhfQk9PTCBkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGZpbGVTZWxlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGZpbGxDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgaGlkZGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgRlhfQk9PTCBoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGxpbmVXaWR0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBtdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBGWF9CT09MIHBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBwcmludChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgcmFkaW9zSW5Vbmlzb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCByZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgRlhfQk9PTCByZXF1aXJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgcmljaFRleHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgcm90YXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHN0cm9rZUNvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgdGV4dENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB0ZXh0Rm9udChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgdGV4dFNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHVzZXJOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgdmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlib29sIGJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgYnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJ1dHRvblNldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgY2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgY2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBkZWxldGVJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGdldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBpbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBpc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHNpZ25hdHVyZVNpZ24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzaWduYXR1cmVWYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgYnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJ1dHRvblNldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgY2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgY2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBkZWxldGVJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGdldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBpbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBpc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHNpZ25hdHVyZVNpZ24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzaWduYXR1cmVWYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHVibGljOgogCXN0YXRpYyB2b2lkIFNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwpAQCAtMjI1LDkgKzIyNSw5IEBACiAJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSwgY29uc3QgQ1BERl9SZWN0JiByY0Nvb3Jkcyk7CiBwdWJsaWM6CiAJc3RhdGljIHZvaWQJCQkJCQkJVXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0JCQkJCQkJCQkJCWJvb2wgYkNoYW5nZU1hcmssIGJvb2wgYlJlc2V0QVAsIGJvb2wgYlJlZnJlc2gpOworCQkJCQkJCQkJCQlGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQlVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLQkJCQkJCQkJCQkJYm9vbCBiQ2hhbmdlTWFyaywgYm9vbCBiUmVzZXRBUCwgYm9vbCBiUmVmcmVzaCk7CisJCQkJCQkJCQkJCUZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpOwogCiAJc3RhdGljIENQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQlHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkc0FycmF5KTsKQEAgLTIzNSwxNCArMjM1LDE0IEBACiAJc3RhdGljIHZvaWQJCQkJCQkJRG9EZWxheShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENKU19EZWxheURhdGEqIHBEYXRhKTsKIAogcHVibGljOgotCWJvb2wJCQkJCQkJCUF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Ci0Jdm9pZAkJCQkJCQkJU2V0RGVsYXkoYm9vbCBiRGVsYXkpOworCUZYX0JPT0wJCQkJCQkJCUF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CisJdm9pZAkJCQkJCQkJU2V0RGVsYXkoRlhfQk9PTCBiRGVsYXkpOwogCXZvaWQJCQkJCQkJCVNldElzb2xhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIHttX2lzb2xhdGUgPSBpc29sYXRlO30KIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJCQlQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZVBhcnNlZCxzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZSxpbnQgJiBpQ29udHJvbE5vKTsKIAl2b2lkCQkJCQkJCQlHZXRGb3JtRmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7CiAJQ1BERl9Gb3JtQ29udHJvbCogCQkJCQlHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7Ci0JYm9vbAkJCQkJCQkJVmFsdWVJc09jY3VyKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKTsKKwlGWF9CT09MCQkJCQkJCQlWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpOwogCiAJdm9pZAkJCQkJCQkJQWRkRGVsYXlfSW50KGVudW0gRklFTERfUFJPUCBwcm9wLCBpbnQzMl90IG4pOwogCXZvaWQJCQkJCQkJCUFkZERlbGF5X0Jvb2woZW51bSBGSUVMRF9QUk9QIHByb3AsYm9vbCBiKTsKQEAgLTI1OSw5ICsyNTksOSBAQAogCUNQREZTREtfRG9jdW1lbnQqCQkJCQltX3BEb2N1bWVudDsKIAlDRlhfV2lkZVN0cmluZwkJCQkJCW1fRmllbGROYW1lOwogCWludAkJCQkJCQkJCW1fbkZvcm1Db250cm9sSW5kZXg7Ci0JYm9vbAkJCQkJCQkJbV9iQ2FuU2V0OworCUZYX0JPT0wJCQkJCQkJCW1fYkNhblNldDsKIAotCWJvb2wJCQkJCQkJCW1fYkRlbGF5OworCUZYX0JPT0wJCQkJCQkJCW1fYkRlbGF5OwogCXY4OjpJc29sYXRlKgkJCQkJCQltX2lzb2xhdGU7CiB9OwogCkBAIC0yNzEsNyArMjcxLDcgQEAKIAlDSlNfRmllbGQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0ZpZWxkKHZvaWQpe307CiAKLQl2aXJ0dWFsIGJvb2wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKKwl2aXJ0dWFsIEZYX0JPT0wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKIAogCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0ZpZWxkKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKaW5kZXggMzdlMTJkYy4uNzgzYjI0OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCkBAIC0xOSw4ICsxOSw4IEBACiB7CiBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfklGWEpTX0NvbnRleHQoKSB7IH0KLQl2aXJ0dWFsIGJvb2wJCQkJQ29tcGlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykgPSAwOwotCXZpcnR1YWwgYm9vbAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJQ29tcGlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkFwcF9Jbml0KCkgPSAwOwogCkBAIC0zNiwzMiArMzYsMzIgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJYm9vbCBLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBib29sIGJTaGlmdCwKLQkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQsCi0JCQkJCQkJCQlib29sIGJGaWVsZEZ1bGwsIGJvb2wgJmJSYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwKLQkJCQkJCQkJCWJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKSA9IDA7CisJCQkJCQkJCQlGWF9CT09MIEtleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAorCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJCUZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCAmYlJjKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAorCQkJCQkJCQkJRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKQEAgLTcxLDcgKzcxLDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Db25zb2xlX0V4ZWMoKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uRXh0ZXJuYWxfRXhlYygpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KGJvb2wgYkVuYWJsZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkgPSAwOwogfTsKIAogY2xhc3MgSUZYSlNfUnVudGltZQpAQCAtOTQsNyArOTQsNyBAQAogY2xhc3MgQ0pTX1J1bnRpbWVGYWN0b3J5CiB7CiBwdWJsaWM6Ci0JQ0pTX1J1bnRpbWVGYWN0b3J5KCk6bV9iSW5pdChmYWxzZSksbV9uUmVmKDApLG1fcEdsb2JhbERhdGEoTlVMTCksbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9CisJQ0pTX1J1bnRpbWVGYWN0b3J5KCk6bV9iSW5pdChGQUxTRSksbV9uUmVmKDApLG1fcEdsb2JhbERhdGEoTlVMTCksbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9CiAJfkNKU19SdW50aW1lRmFjdG9yeSgpOwogCUlGWEpTX1J1bnRpbWUqCQkJCQlOZXdKU1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CiAJdm9pZAkJCQkJCQlEZWxldGVKU1J1bnRpbWUoSUZYSlNfUnVudGltZSogcFJ1bnRpbWUpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJQ0pTX0dsb2JhbERhdGEqCQkJCQlOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwogCXZvaWQJCQkJCQkJUmVsZWFzZUdsb2JhbERhdGEoKTsKIHByaXZhdGU6Ci0JYm9vbCBtX2JJbml0OworCUZYX0JPT0wgbV9iSW5pdDsKIAlpbnQgbV9uUmVmOwogCUNKU19HbG9iYWxEYXRhKgkJCQkJbV9wR2xvYmFsRGF0YTsKIAlpbnQzMl90CQkJCQkJbV9uR2xvYmFsRGF0YUNvdW50OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oCmluZGV4IDM2N2RiN2IuLjAyOTgwMDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgKQEAgLTE0LDcgKzE0LDcgQEAKIHB1YmxpYzoKIAlJY29uKENKU19PYmplY3QqIHBKU09iamVjdCk7CiAJdmlydHVhbCB+SWNvbigpOwotCWJvb2wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCXZvaWQJCQkJU2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSk7CiAJQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKTsKIAl2b2lkCQkJCVNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCmluZGV4IDc5ZDAxYTAuLjJlMmNmMzcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKQEAgLTIxLDggKzIxLDggQEAKIAl2aXJ0dWFsIH5DSlNfQ29udGV4dCgpOwogCiBwdWJsaWM6Ci0JdmlydHVhbCBib29sCQkJCUNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOwotCXZpcnR1YWwgYm9vbAkJCQlSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOworCXZpcnR1YWwgRlhfQk9PTAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKIAogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPbkFwcF9Jbml0KCk7CkBAIC0zOSwzMiArMzksMzIgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgYm9vbCBiU2hpZnQsCi0JCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sIGJXaWxsQ29tbWl0LAotCQkJCQkJCQkJYm9vbCBiRmllbGRGdWxsLCBib29sICZiUmMpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwKLQkJCQkJCQkJCWJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKTsKKwkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAorCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJCUZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCAmYlJjKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCisJCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwogCiAJdmlydHVhbCB2b2lkCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOwogCXZpcnR1YWwgdm9pZAkJCQlPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKQEAgLTc0LDE0ICs3NCwxNCBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbkNvbnNvbGVfRXhlYygpOwogCXZpcnR1YWwgdm9pZAkJCQlPbkV4dGVybmFsX0V4ZWMoKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KGJvb2wgYkVuYWJsZSkge21fYk1zZ0JveEVuYWJsZSA9IGJFbmFibGU7fQotCWJvb2wJCQkJCQlJc01zZ0JveEVuYWJsZWQoKSBjb25zdCB7cmV0dXJuIG1fYk1zZ0JveEVuYWJsZTt9CisJdmlydHVhbCB2b2lkCQkJCUVuYWJsZU1lc3NhZ2VCb3goRlhfQk9PTCBiRW5hYmxlKSB7bV9iTXNnQm94RW5hYmxlID0gYkVuYWJsZTt9CisJRlhfQk9PTAkJCQkJCUlzTXNnQm94RW5hYmxlZCgpIGNvbnN0IHtyZXR1cm4gbV9iTXNnQm94RW5hYmxlO30KIAogcHVibGljOgogCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJR2V0UmVhZGVyQXBwKCk7CiAJQ0pTX1J1bnRpbWUqCQkJCUdldEpTUnVudGltZSgpe3JldHVybiBtX3BSdW50aW1lO30KIAotCWJvb2wJCQkJCQlEb0pvYihpbnQgbk1vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKwlGWF9CT09MCQkJCQkJRG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CiAKIAlDSlNfRXZlbnRIYW5kbGVyKgkJCUdldEV2ZW50SGFuZGxlcigpe3JldHVybiBtX3BFdmVudEhhbmRsZXI7fTsKIAlDUERGU0RLX0RvY3VtZW50KgkJCUdldFJlYWRlckRvY3VtZW50KCk7CkBAIC05MCw4ICs5MCw4IEBACiAJQ0pTX1J1bnRpbWUqCQkJCW1fcFJ1bnRpbWU7CiAJQ0pTX0V2ZW50SGFuZGxlcioJCQltX3BFdmVudEhhbmRsZXI7CiAKLQlib29sCQkJCQkJbV9iQnVzeTsKLQlib29sCQkJCQkJbV9iTXNnQm94RW5hYmxlOworCUZYX0JPT0wJCQkJCQltX2JCdXN5OworCUZYX0JPT0wJCQkJCQltX2JNc2dCb3hFbmFibGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKaW5kZXggMDg3ZjQ4OS4uZjFiMzZiZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQUk9QIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLXRlbXBsYXRlIDxjbGFzcyBDLCBib29sIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KK3RlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KIHZvaWQgSlNQcm9wR2V0dGVyKGNvbnN0IGNoYXIqIHByb3BfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKQEAgLTc0LDcgKzc0LDcgQEAKICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgodjg6OkxvY2FsPHY4OjpWYWx1ZT4pdmFsdWUpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywgRlhfQk9PTCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+CiB2b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVUSE9EIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotdGVtcGxhdGUgPGNsYXNzIEMsIGJvb2wgKEM6OipNKShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KK3RlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+CiB2b2lkIEpTTWV0aG9kKGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpOwogICBDSlNfT2JqZWN0KiBwSlNPYmogPSByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKICAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICBib29sIGJSZXQgPSBwT2JqLT5RdWVyeVByb3BlcnR5KHByb3BuYW1lLmNfc3RyKCkpOworICBGWF9CT09MIGJSZXQgPSBwT2JqLT5RdWVyeVByb3BlcnR5KHByb3BuYW1lLmNfc3RyKCkpOwogICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGJSZXQgPyA0IDogMCk7CiB9CiAKQEAgLTM4Miw3ICszODIsNyBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLXRlbXBsYXRlIDxib29sICgqRikoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8RlhfQk9PTCAoKkYpKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgogdm9pZCBKU0dsb2JhbEZ1bmMoY29uc3QgY2hhciAqZnVuY19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CiAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCmluZGV4IDk5Nzc0NjIuLjYyYWZiODIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCkBAIC03OSwzMiArNzksMzIgQEAKIAl2b2lkCQkJCQlPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCXZvaWQJCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCi0Jdm9pZAkJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCk7CisJdm9pZAkJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CisJdm9pZAkJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCk7CiAJdm9pZAkJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQlib29sIEtleURvd24sIGJvb2wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIGJvb2wgYlNoaWZ0LAotCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sIGJXaWxsQ29tbWl0LAotCQkJCQkJCQlib29sIGJGaWVsZEZ1bGwsIGJvb2wgJmJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sCi0JCQkJCQkJCWJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKTsKKwkJCQkJCQkJRlhfQk9PTCBLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBGWF9CT09MIGJTaGlmdCwKKwkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKKwkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpOworCXZvaWQJCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAorCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CiAKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCXZvaWQJCQkJCU9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZvaWQJCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworCXZvaWQJCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKIAotCXZvaWQJCQkJCU9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwogCiAJdm9pZAkJCQkJT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyayk7CiAJdm9pZAkJCQkJT25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CkBAIC0xMTcsMjUgKzExNywyNSBAQAogcHVibGljOgogICAgIHZvaWQJCQkJCUluaXRpYWwoSlNfRVZFTlRfVCB0eXBlKTsKIAl2b2lkCQkJCQlEZXN0cm95KCk7Ci0JYm9vbAkJCQkJSXNWYWxpZCgpOworCUZYX0JPT0wJCQkJCUlzVmFsaWQoKTsKIAogCiAJQ0ZYX1dpZGVTdHJpbmcmCQkJQ2hhbmdlKCk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQlDaGFuZ2VFeCgpOwogCWludAkJCQkJCUNvbW1pdEtleSgpOwotCWJvb2wJCQkJCUZpZWxkRnVsbCgpOwotCWJvb2wJCQkJCUtleURvd24oKTsKLQlib29sCQkJCQlNb2RpZmllcigpOworCUZYX0JPT0wJCQkJCUZpZWxkRnVsbCgpOworCUZYX0JPT0wJCQkJCUtleURvd24oKTsKKwlGWF9CT09MCQkJCQlNb2RpZmllcigpOwogCWNvbnN0IEZYX1dDSEFSKgkJCQlOYW1lKCk7CiAJY29uc3QgRlhfV0NIQVIqCQkJCVR5cGUoKTsKLQlib29sJgkJCQlSYygpOworCUZYX0JPT0wmCQkJCVJjKCk7CiAJaW50JgkJCQkJU2VsRW5kKCk7CiAJaW50JgkJCQkJU2VsU3RhcnQoKTsKLQlib29sCQkJCQlTaGlmdCgpOworCUZYX0JPT0wJCQkJCVNoaWZ0KCk7CiAJRmllbGQqCQkJCQlTb3VyY2UoKTsKIAlGaWVsZCoJCQkJCVRhcmdldF9GaWVsZCgpOwogCUNGWF9XaWRlU3RyaW5nJgkJCVZhbHVlKCk7Ci0JYm9vbAkJCQkJV2lsbENvbW1pdCgpOworCUZYX0JPT0wJCQkJCVdpbGxDb21taXQoKTsKIAlDRlhfV2lkZVN0cmluZwkJCVRhcmdldE5hbWUoKTsKIAogCUpTX0VWRU5UX1QJCQkJRXZlbnRUeXBlKCkge3JldHVybiBtX2VFdmVudFR5cGU7fTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogcHVibGljOgogCUNKU19Db250ZXh0KgkJCW1fcEpTQ29udGV4dDsKIAlKU19FVkVOVF9UCQkJCW1fZUV2ZW50VHlwZTsKLQlib29sCQkJCQltX2JWYWxpZDsKKwlGWF9CT09MCQkJCQltX2JWYWxpZDsKIAogCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJUYXJnZXROYW1lOwogCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJTb3VyY2VOYW1lOwpAQCAtMTUxLDE4ICsxNTEsMTggQEAKIAlDRlhfV2lkZVN0cmluZwkJCW1fV2lkZVN0ckNoYW5nZUR1OwogCUNGWF9XaWRlU3RyaW5nCQkJbV9XaWRlU3RyQ2hhbmdlRXg7CiAJaW50CQkJCQkJbV9uQ29tbWl0S2V5OwotCWJvb2wJCQkJCW1fYktleURvd247Ci0JYm9vbAkJCQkJbV9iTW9kaWZpZXI7Ci0JYm9vbAkJCQkJbV9iU2hpZnQ7CisJRlhfQk9PTAkJCQkJbV9iS2V5RG93bjsKKwlGWF9CT09MCQkJCQltX2JNb2RpZmllcjsKKwlGWF9CT09MCQkJCQltX2JTaGlmdDsKIAlpbnQqCQkJCQltX3BJU2VsRW5kOwogCWludAkJCQkJCW1fblNlbEVuZER1OwogCWludCoJCQkJCW1fcElTZWxTdGFydDsKIAlpbnQJCQkJCQltX25TZWxTdGFydER1OwotCWJvb2wJCQkJCW1fYldpbGxDb21taXQ7CisJRlhfQk9PTAkJCQkJbV9iV2lsbENvbW1pdDsKIAlDRlhfV2lkZVN0cmluZyoJCQltX3BWYWx1ZTsKLQlib29sCQkJCQltX2JGaWVsZEZ1bGw7Ci0JYm9vbCoJCQkJbV9wYlJjOwotCWJvb2wJCQkJCW1fYlJjRHU7CisJRlhfQk9PTAkJCQkJbV9iRmllbGRGdWxsOworCUZYX0JPT0wqCQkJCW1fcGJSYzsKKwlGWF9CT09MCQkJCQltX2JSY0R1OwogCiAJQ1BERlNES19Eb2N1bWVudCoJCW1fcFNvdXJjZURvYzsKIAlDUERGX0Jvb2ttYXJrKgkJCW1fcFRhcmdldEJvb2tNYXJrOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oCmluZGV4IDk4N2RlOTUuLmIzNjM3YjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKQEAgLTU2LDcgKzU2LDcgQEAKIAl2aXJ0dWFsIH5DSlNfR2xvYmFsRGF0YV9FbGVtZW50KCl7fQogCiAJQ0pTX0tleVZhbHVlCQkJZGF0YTsKLQlib29sCQkJCQliUGVyc2lzdGVudDsKKwlGWF9CT09MCQkJCQliUGVyc2lzdGVudDsKIH07CiAKIGNsYXNzIENKU19HbG9iYWxEYXRhCkBAIC03Miw4ICs3Miw4IEBACiAJdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVPYmplY3QoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CiAJdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKIAotCWJvb2wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiUGVyc2lzdGVudCk7Ci0JYm9vbAkJCQkJCQkJRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworCUZYX0JPT0wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCk7CisJRlhfQk9PTAkJCQkJCQkJRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOwogCiAJaW50MzJfdAkJCQkJCQlHZXRTaXplKCkgY29uc3Q7CiAJQ0pTX0dsb2JhbERhdGFfRWxlbWVudCoJCQkJR2V0QXQoaW50IGluZGV4KSBjb25zdDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKaW5kZXggZjhlYzkwZS4uMzg5OGQxOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKQEAgLTQ4LDExICs0OCwxMSBAQAogCXZvaWQJCQkJCQlNYWtlV2VhaygpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NlKCk7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJSXNUeXBlKGNvbnN0IEZYX0NIQVIqIHNDbGFzc05hbWUpe3JldHVybiB0cnVlO307CisJdmlydHVhbCBGWF9CT09MCQkJCUlzVHlwZShjb25zdCBGWF9DSEFSKiBzQ2xhc3NOYW1lKXtyZXR1cm4gVFJVRTt9OwogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpe3JldHVybiAiIjt9OwogCi0JdmlydHVhbCBib29sCQkJCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyl7cmV0dXJuIHRydWU7fTsKLQl2aXJ0dWFsIGJvb2wJCQkJRXhpdEluc3RhbmNlKCl7cmV0dXJuIHRydWU7fTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKXtyZXR1cm4gVFJVRTt9OworCXZpcnR1YWwgRlhfQk9PTAkJCQlFeGl0SW5zdGFuY2UoKXtyZXR1cm4gVFJVRTt9OwogCiAJb3BlcmF0b3IJCQkJCUpTRlhPYmplY3QgKCkge3JldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhtX3BJc29sYXRlLCBtX3BPYmplY3QpO30KIAlvcGVyYXRvcgkJCQkJQ0pTX0VtYmVkT2JqKiAoKXtyZXR1cm4gbV9wRW1iZWRPYmo7fTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCUNKU19UaW1lcihDSlNfRW1iZWRPYmogKiBwT2JqLENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOgogCQltX25UaW1lcklEKDApLAogCQltX3BFbWJlZE9iaihwT2JqKSwKLQkJbV9iUHJvY2Vzc2luZyhmYWxzZSksCisJCW1fYlByb2Nlc3NpbmcoRkFMU0UpLAogCQltX2R3U3RhcnRUaW1lKDApLAogCQltX2R3VGltZU91dCgwKSwKIAkJbV9kd0VsYXBzZSgwKSwKQEAgLTI2NSw5ICsyNjUsOSBAQAogCQl7CiAJCQlpZiAoIXBUaW1lci0+bV9iUHJvY2Vzc2luZykKIAkJCXsKLQkJCQlwVGltZXItPm1fYlByb2Nlc3NpbmcgPSB0cnVlOworCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IFRSVUU7CiAJCQkJaWYgKHBUaW1lci0+bV9wRW1iZWRPYmopIHBUaW1lci0+bV9wRW1iZWRPYmotPlRpbWVyUHJvYyhwVGltZXIpOwotCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IGZhbHNlOworCQkJCXBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IEZBTFNFOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtMjc5LDcgKzI3OSw3IEBACiBwcml2YXRlOgogCUZYX1VJTlQJCQkJCQkJbV9uVGltZXJJRDsKIAlDSlNfRW1iZWRPYmoqCQkJCQltX3BFbWJlZE9iajsKLQlib29sCQkJCQkJCW1fYlByb2Nlc3Npbmc7CisJRlhfQk9PTAkJCQkJCQltX2JQcm9jZXNzaW5nOwogCiAJLy9kYXRhCiAJRlhfRFdPUkQJCQkJCQkJbV9kd1N0YXJ0VGltZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaAppbmRleCBiOWFkNmVmLi44ZmRmYThiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCkBAIC00NCwxNSArNDQsMTUgQEAKIAogCUNQREZEb2NfRW52aXJvbm1lbnQgKgkJCQkJCQlHZXRSZWFkZXJBcHAoKXtyZXR1cm4gbV9wQXBwO30KIAotCWJvb2wJCQkJCQkJCQlJbml0SlNPYmplY3RzKCk7CisJRlhfQk9PTAkJCQkJCQkJCUluaXRKU09iamVjdHMoKTsKIAotCWJvb2wJCQkJCQkJCQlBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSk7CisJRlhfQk9PTAkJCQkJCQkJCUFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKTsKIAl2b2lkCQkJCQkJCQkJUmVtb3ZlRXZlbnRJbkxvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLCBKU19FVkVOVF9UIGVFdmVudFR5cGUpOwogCXZvaWQJCQkJCQkJCQlSZW1vdmVFdmVudHNJbkxvb3AoQ0pTX0ZpZWxkRXZlbnQqIHBTdGFydCk7CiAKLQl2b2lkCQkJCQkJCQkJQmVnaW5CbG9jaygpe21fYkJsb2NraW5nID0gdHJ1ZTt9Ci0Jdm9pZAkJCQkJCQkJCUVuZEJsb2NrKCl7bV9iQmxvY2tpbmcgPSBmYWxzZTt9Ci0JYm9vbAkJCQkJCQkJCUlzQmxvY2tpbmcoKXtyZXR1cm4gbV9iQmxvY2tpbmc7fQorCXZvaWQJCQkJCQkJCQlCZWdpbkJsb2NrKCl7bV9iQmxvY2tpbmcgPSBUUlVFO30KKwl2b2lkCQkJCQkJCQkJRW5kQmxvY2soKXttX2JCbG9ja2luZyA9IEZBTFNFO30KKwlGWF9CT09MCQkJCQkJCQkJSXNCbG9ja2luZygpe3JldHVybiBtX2JCbG9ja2luZzt9CiAKIAlvcGVyYXRvcgkJCQkJCQkJSUpTX1J1bnRpbWUqKCkge3JldHVybiAoSUpTX1J1bnRpbWUqKW1faXNvbGF0ZTt9CiAJdjg6Oklzb2xhdGUqCQkJCQkJCQlHZXRJc29sYXRlKCl7cmV0dXJuIG1faXNvbGF0ZTt9OwpAQCAtNjMsNyArNjMsNyBAQAogCUNGWF9BcnJheVRlbXBsYXRlPENKU19Db250ZXh0Kj4JCW1fQ29udGV4dEFycmF5OwogCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJCQkJCW1fcEFwcDsKIAlDUERGU0RLX0RvY3VtZW50KgkJCQkJCW1fcERvY3VtZW50OwotCWJvb2wJCQkJCQkJCQltX2JCbG9ja2luZzsKKwlGWF9CT09MCQkJCQkJCQkJbV9iQmxvY2tpbmc7CiAJQ0pTX0ZpZWxkRXZlbnQqCQkJCQkJCW1fcEZpZWxkRXZlbnRQYXRoOwogCiAJdjg6Oklzb2xhdGUqIG1faXNvbGF0ZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oCmluZGV4IDAzNWNlZjAuLjYxODY4MTcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaApAQCAtNjMsMTIgKzYzLDEyIEBACiAJdm9pZCBvcGVyYXRvciA9IChjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAl2b2lkIG9wZXJhdG9yID0gKENKU19WYWx1ZSB2YWx1ZSk7CiAKLQlib29sIElzQXJyYXlPYmplY3QoKSBjb25zdDsKLQlib29sCUlzRGF0ZU9iamVjdCgpIGNvbnN0OworCUZYX0JPT0wgSXNBcnJheU9iamVjdCgpIGNvbnN0OworCUZYX0JPT0wJSXNEYXRlT2JqZWN0KCkgY29uc3Q7CiAJRlhKU1ZBTFVFVFlQRSBHZXRUeXBlKCkgY29uc3Q7CiAKLQlib29sIENvbnZlcnRUb0FycmF5KENKU19BcnJheSAmKSBjb25zdDsKLQlib29sIENvbnZlcnRUb0RhdGUoQ0pTX0RhdGUgJikgY29uc3Q7CisJRlhfQk9PTCBDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJikgY29uc3Q7CisJRlhfQk9PTCBDb252ZXJ0VG9EYXRlKENKU19EYXRlICYpIGNvbnN0OwogCiAJdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7cmV0dXJuIG1faXNvbGF0ZTt9CiBwcm90ZWN0ZWQ6CkBAIC05NSw4ICs5NSw4IEBACiAJQ0pTX1Byb3BWYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7CiAJfkNKU19Qcm9wVmFsdWUoKTsKIHB1YmxpYzoKLQlib29sIElzU2V0dGluZygpOwotCWJvb2wgSXNHZXR0aW5nKCk7CisJRlhfQk9PTCBJc1NldHRpbmcoKTsKKwlGWF9CT09MIElzR2V0dGluZygpOwogCXZvaWQgb3BlcmF0b3I8PChpbnQpOwogCXZvaWQgb3BlcmF0b3I+PihpbnQmKSBjb25zdDsKIAl2b2lkIG9wZXJhdG9yPDwoYm9vbCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAl2b2lkIFN0YXJ0U2V0dGluZygpOwogCXZvaWQgU3RhcnRHZXR0aW5nKCk7CiBwcml2YXRlOgotCWJvb2wgbV9iSXNTZXR0aW5nOworCUZYX0JPT0wgbV9iSXNTZXR0aW5nOwogfTsKIAogY2xhc3MgQ0pTX0FycmF5CkBAIC0xMzUsNyArMTM1LDcgQEAKIAl2b2lkIEdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSk7CiAJdm9pZCBTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSB2YWx1ZSk7CiAgICAgaW50IEdldExlbmd0aCgpOwotCWJvb2wgSXNBdHRhY2hlZCgpOworCUZYX0JPT0wgSXNBdHRhY2hlZCgpOwogCW9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CiAKIAl2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHtyZXR1cm4gbV9pc29sYXRlO30KQEAgLTE3OSw3ICsxNzksNyBAQAogCiAJc3RhdGljIGRvdWJsZQlNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IG1kYXksaW50IGhvdXIsIGludCBtaW4sIGludCBzZWMsaW50IG1zKTsKIAotCWJvb2wJSXNWYWxpZERhdGUoKTsKKwlGWF9CT09MCUlzVmFsaWREYXRlKCk7CiAKIHByb3RlY3RlZDoKIAl2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3BEYXRlOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oCmluZGV4IDdmY2EzNjMuLmNmZjllMTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKQEAgLTE2LDI4ICsxNiwyOCBAQAogCXZpcnR1YWwgfkNKU19QdWJsaWNNZXRob2RzKHZvaWQpe307CiAKIHB1YmxpYzoKLQlzdGF0aWMgYm9vbCBBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgYm9vbCBBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgYm9vbCBBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7IC8vCi0Jc3RhdGljIGJvb2wgQUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgYm9vbCBBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOy8vCi0Jc3RhdGljIGJvb2wgQUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgYm9vbCBBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBib29sIEFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIGJvb2wgQUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgYm9vbCBBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRlBlcmNlbnRfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsgLy8KKwlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZUaW1lX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ly8KKwlzdGF0aWMgRlhfQk9PTCBBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGUmFuZ2VfVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIEZYX0JPT0wgQUZNZXJnZUNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgRlhfQk9PTCBBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBGWF9CT09MIEFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9Gb3JtYXQpOwpAQCAtNjgsMTMgKzY4LDEzIEBACiBwdWJsaWM6CiAJc3RhdGljIGludAkJCQlQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJpbmcsaW50IG5TdGFydCxpbnQgJiBuU2tpcCwgaW50IG5NYXhTdGVwKTsKIAlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJUGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCk7Ci0Jc3RhdGljIGRvdWJsZQkJCU1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBib29sJiBiV3JvbmdGb3JtYXQpOworCXN0YXRpYyBkb3VibGUJCQlNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSxjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KTsKIAlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJTWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KTsKLQlzdGF0aWMgYm9vbAkJCUNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIGJvb2wgJiBiRG90KTsKKwlzdGF0aWMgRlhfQk9PTAkJCUNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KTsKIAlzdGF0aWMgZG91YmxlCQkJUGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgYm9vbCYgYldyb25nRm9ybWF0KTsKKwlzdGF0aWMgZG91YmxlCQkJUGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCk7CiAJc3RhdGljIGRvdWJsZSAgICAgICAgICAgTWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSk7Ci0Jc3RhdGljIGRvdWJsZQkJCVBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgYm9vbCYgYkFsbERpZ2l0cywgYm9vbCYgYkRvdCwgYm9vbCYgYlNpZ24sIGJvb2wmIGJLWEpTKTsKKwlzdGF0aWMgZG91YmxlCQkJUGFyc2VOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpOwogCiBwdWJsaWM6CiAJc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKTsKQEAgLTg1LDE2ICs4NSwxNiBAQAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwlTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJU3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKIAotCXN0YXRpYyBib29sCQkJSXNOdW1iZXIoY29uc3QgRlhfQ0hBUiogc3RyaW5nKTsKLQlzdGF0aWMgYm9vbAkJCUlzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOworCXN0YXRpYyBGWF9CT09MCQkJSXNOdW1iZXIoY29uc3QgRlhfQ0hBUiogc3RyaW5nKTsKKwlzdGF0aWMgRlhfQk9PTAkJCUlzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOwogCi0Jc3RhdGljIGJvb2wJCQlJc0RpZ2l0KGNoYXIgY2gpOwotCXN0YXRpYyBib29sCQkJSXNEaWdpdCh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgYm9vbAkJCUlzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgYm9vbAkJCUlzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpOworCXN0YXRpYyBGWF9CT09MCQkJSXNEaWdpdChjaGFyIGNoKTsKKwlzdGF0aWMgRlhfQk9PTAkJCUlzRGlnaXQod2NoYXJfdCBjaCk7CisJc3RhdGljIEZYX0JPT0wJCQlJc0FscGhhYmV0aWMod2NoYXJfdCBjaCk7CisJc3RhdGljIEZYX0JPT0wJCQlJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKTsKIAotCXN0YXRpYyBib29sCQkJbWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKTsKLQlzdGF0aWMgYm9vbAkJCWlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKTsKKwlzdGF0aWMgRlhfQk9PTAkJCW1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzayk7CisJc3RhdGljIEZYX0JPT0wJCQlpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7CiAKIAlzdGF0aWMgZG91YmxlCQkJQUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKTsKIAlzdGF0aWMgQ0pTX0FycmF5CQlBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCmluZGV4IGZmZDdlZGIuLmFjOTBlNjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oCkBAIC0xMTAsNDEgKzExMCw0MSBAQAogCXZpcnR1YWwgfmFwcCgpOwogCiBwdWJsaWM6Ci0JYm9vbAkJCQkJCWFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJY2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCWZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCWxhbmd1YWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCW1lZGlhKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCXBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCXJ1bnRpbWVIaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJdmlld2VyVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQl2aWV3ZXJWYXJpYXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJdmlld2VyVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlhY3RpdmVEb2NzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJZnVsbHNjcmVlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQltZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCXZpZXdlclR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJdmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCXZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogCi0JYm9vbAkJCQkJCWFsZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQliZWVwKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlicm93c2VGb3JEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCWNsZWFySW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCWNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJZXhlY01lbnVJdGVtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCWdvRm9yd2FyZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJbGF1bmNoVVJMKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQltYWlsTXNnKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQluZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCW5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJb3BlbkRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJb3BlbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJcG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCXBvcFVwTWVudShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sCQkJCQkJcmVzcG9uc2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCXNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wJCQkJCQlzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlhbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJYmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJYnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQljbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQljbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCWV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCWV4ZWNNZW51SXRlbShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJZ29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCWxhdW5jaFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJbWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJbmV3RkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQluZXdEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCW9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCW9wZW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCXBvcFVwTWVudUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTAkJCQkJCXJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJc2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHJpdmF0ZToKIC8vCUZYX0RXT1JECQkJCQlBcHBHZXRUaWNrQ291bnQoKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oCmluZGV4IGFiN2JiYWUuLmRmODYzYjUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaApAQCAtMTYsMjEgKzE2LDIxIEBACiAJY29sb3IoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKIAl2aXJ0dWFsIH5jb2xvcih2b2lkKTsKIAotCWJvb2wgYmxhY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGN5YW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGRrR3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZ3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGx0R3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB0cmFuc3BhcmVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgd2hpdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHllbGxvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgYmxhY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGN5YW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGRrR3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZ3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGx0R3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB0cmFuc3BhcmVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgd2hpdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHllbGxvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0JYm9vbCBjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZXF1YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgZXF1YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlzdGF0aWMgdm9pZAkJQ29udmVydFBXTENvbG9yVG9BcnJheShjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgQ0pTX0FycmF5JiBhcnJheSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmgKaW5kZXggNDI0ZjBlMi4uMGNiYzI5MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaApAQCAtMTYsMTAgKzE2LDEwIEBACiAJdmlydHVhbCB+Y29uc29sZSh2b2lkKTsKIAogcHVibGljOgotCWJvb2wgY2xlYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjbGVhcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGhpZGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBwcmludGxuKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIH07CiAKIGNsYXNzIENKU19Db25zb2xlIDogcHVibGljIENKU19PYmplY3QKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oCmluZGV4IGU5ODBhOTYuLjkxYTM4YmEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaApAQCAtMTYsMjYgKzE2LDI2IEBACiAJdmlydHVhbCB+ZXZlbnQodm9pZCk7CiAKIHB1YmxpYzoKLQlib29sIGNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgY2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBrZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBtb2RpZmllcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcmMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHJpY2hDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHJpY2hDaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgcmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHNlbFN0YXJ0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCWJvb2wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCB3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGNoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wga2V5RG93bihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgbW9kaWZpZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCByaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCByaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2VsRW5kKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgc2hpZnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgdGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB0YXJnZXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCUZYX0JPT0wgd2lsbENvbW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCiB9OwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCmluZGV4IDRjNmNjZDkuLjgzZTA3ZjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oCkBAIC0xOSwxMCArMTksMTAgQEAKIAl7CiAJCW5UeXBlID0gMDsKIAkJZERhdGEgPSAwOwotCQliRGF0YSA9IGZhbHNlOworCQliRGF0YSA9IEZBTFNFOwogCQlzRGF0YSA9ICIiOwotCQliUGVyc2lzdGVudCA9IGZhbHNlOwotCQliRGVsZXRlZCA9IGZhbHNlOworCQliUGVyc2lzdGVudCA9IEZBTFNFOworCQliRGVsZXRlZCA9IEZBTFNFOwogCX0KIAogCX5qc19nbG9iYWxfZGF0YSgpCkBAIC00NSwxMiArNDUsMTIgQEAKIAl2aXJ0dWFsIH5nbG9iYWxfYWx0ZXJuYXRlKCk7CiAKIHB1YmxpYzoKLQlib29sCQkJCQkJc2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJc2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHVibGljOgotCWJvb2wJCQkJCQlRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSk7Ci0JYm9vbAkJCQkJCURvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSAmIHZwLCBDRlhfV2lkZVN0cmluZyAmIHNFcnJvcik7Ci0JYm9vbAkJCQkJCURlbFByb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKKwlGWF9CT09MCQkJCQkJUXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpOworCUZYX0JPT0wJCQkJCQlEb1Byb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENKU19Qcm9wVmFsdWUgJiB2cCwgQ0ZYX1dpZGVTdHJpbmcgJiBzRXJyb3IpOworCUZYX0JPT0wJCQkJCQlEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyAmIHNFcnJvcik7CiAKIAl2b2lkCQkJCQkJSW5pdGlhbChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKIApAQCAtNTgsNyArNTgsNyBAQAogCXZvaWQJCQkJCQlVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CiAJdm9pZAkJCQkJCUNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CiAJdm9pZAkJCQkJCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCWJvb2wJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGludCBuVHlwZSwKKwlGWF9CT09MCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBpbnQgblR5cGUsCiAJCQkJCQkJCQlkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KTsKIAogCXZvaWQJCQkJCQlPYmplY3RUb0FycmF5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOwpAQCAtNzgsNyArNzgsNyBAQAogCUNKU19HbG9iYWwoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307CiAJdmlydHVhbCB+Q0pTX0dsb2JhbCh2b2lkKXt9OwogCi0JdmlydHVhbCBib29sCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CisJdmlydHVhbCBGWF9CT09MCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CiAKIAlERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKaW5kZXggZTU0NTgzMy4uNTZmNzQyYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgKQEAgLTE2LDggKzE2LDggQEAKIAl2aXJ0dWFsIH5SZXBvcnQoKTsKIAogcHVibGljOgotCWJvb2wgc2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIHdyaXRlVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIHNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCB3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiB9OwogCiBjbGFzcyBDSlNfUmVwb3J0IDogcHVibGljIENKU19PYmplY3QKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaAppbmRleCBhMmQ2NzQ5Li5jYTRkYjM0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oCkBAIC0xOCwxMSArMTgsMTEgQEAKIAl2aXJ0dWFsIH51dGlsKHZvaWQpOwogCiBwdWJsaWM6Ci0JYm9vbCBwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JYm9vbCBzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlib29sIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJRlhfQk9PTCBzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlGWF9CT09MIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlzdGF0aWMgdm9pZAkJcHJpbnRkKGNvbnN0IHN0ZDo6d3N0cmluZyAmY0Zvcm1hdCxDSlNfRGF0ZSBEYXRlLGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaAppbmRleCAzMjJiOWQ0Li4yYmYyZWVhIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaApAQCAtMTcsMTEgKzE3LDExIEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKIAl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIHByb3RlY3RlZDoKLQlib29sCQkJCQkJbV9iTW91c2VEb3duOworCUZYX0JPT0wJCQkJCQltX2JNb3VzZURvd247CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgKaW5kZXggNDI3NDM2NS4uNjgzOGJjNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oCkBAIC0xMiwxMSArMTIsMTEgQEAKIHN0cnVjdCBQV0xfQ0FSRVRfSU5GTwogewogcHVibGljOgotCVBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShmYWxzZSksIHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKQorCVBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShGQUxTRSksIHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKQogCXsKIAl9CiAKLQlib29sCQkJCQkJYlZpc2libGU7CisJRlhfQk9PTAkJCQkJCWJWaXNpYmxlOwogCUNQREZfUG9pbnQJCQkJCXB0SGVhZDsKIAlDUERGX1BvaW50CQkJCQlwdEZvb3Q7CiB9OwpAQCAtMzIsOSArMzIsOSBAQAogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCXZpcnR1YWwgdm9pZAkJCQlJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCA9IE5VTEwpOwotCXZpcnR1YWwgdm9pZAkJCQlTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpIHt9CisJdmlydHVhbCB2b2lkCQkJCVNldFZpc2libGUoRlhfQk9PTCBiVmlzaWJsZSkge30KIAl2aXJ0dWFsCXZvaWQJCQkJVGltZXJQcm9jKCk7Ci0Jdm9pZAkJCQkJCVNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpOworCXZvaWQJCQkJCQlTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKIAlDRlhfQnl0ZVN0cmluZwkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KTsKIAl2b2lkCQkJCQkJU2V0SW52YWxpZFJlY3QoQ1BERl9SZWN0IHJjKSB7bV9yY0ludmFsaWQgPSByYzt9CiAKQEAgLTQyLDcgKzQyLDcgQEAKIAl2b2lkCQkJCQkJR2V0Q2FyZXRBcHAoQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSxjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpOwogCUNQREZfUmVjdAkJCQkJR2V0Q2FyZXRSZWN0KCkgY29uc3Q7CiAKLQlib29sCQkJCQkJbV9iRmxhc2g7CisJRlhfQk9PTAkJCQkJCW1fYkZsYXNoOwogCUNQREZfUG9pbnQJCQkJCW1fcHRIZWFkOwogCUNQREZfUG9pbnQJCQkJCW1fcHRGb290OwogCUZYX0ZMT0FUCQkJCQltX2ZXaWR0aDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCmluZGV4IDIxZDRlNGEuLjNmODYwNGYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaApAQCAtMjUsMTAgKzI1LDEwIEBACiAJdmlydHVhbCB+Q1BXTF9DQkxpc3RCb3goKXt9OwogCiBwdWJsaWM6Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCWJvb2wJCQkJT25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgYm9vbCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0JYm9vbAkJCQlPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwlGWF9CT09MCQkJCU9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCUZYX0JPT0wJCQkJT25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CiB9OwogCiAjZGVmaW5lIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEgJCTEzCkBAIC00Myw4ICs0Myw4IEBACiAJdmlydHVhbCB2b2lkCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwogCXZpcnR1YWwgdm9pZAkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiB9OwogCkBAIC01OCw4ICs1OCw4IEBACiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAotCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdmlydHVhbCB2b2lkCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwogCkBAIC03MSw3ICs3MSw3IEBACiAJdmlydHVhbCB2b2lkCQkJCVNldEZvY3VzKCk7CiAJdmlydHVhbCB2b2lkCQkJCUtpbGxGb2N1cygpOwogCi0JYm9vbAkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwogCiBwdWJsaWM6CiAJdm9pZAkJCQkJCVNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpOwpAQCAtODcsNyArODcsNyBAQAogCXZvaWQJCQkJCQlHZXRFZGl0U2VsKGludDMyX3QgJiBuU3RhcnRDaGFyLCBpbnQzMl90ICYgbkVuZENoYXIgKSBjb25zdDsKIAl2b2lkCQkJCQkJQ2xlYXIoKTsKIAl2b2lkCQkJCQkJU2VsZWN0QWxsKCk7Ci0JYm9vbAkJCQkJCUlzUG9wdXAoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJSXNQb3B1cCgpIGNvbnN0OwogCiAJdm9pZAkJCQkJCVNldFNlbGVjdFRleHQoKTsKIApAQCAtOTYsMTQgKzk2LDE0IEBACiAJdm9pZAkJCQkJCUNyZWF0ZUJ1dHRvbihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdm9pZAkJCQkJCUNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCi0Jdm9pZAkJCQkJCVNldFBvcHVwKGJvb2wgYlBvcHVwKTsKKwl2b2lkCQkJCQkJU2V0UG9wdXAoRlhfQk9PTCBiUG9wdXApOwogCiBwcml2YXRlOgogCUNQV0xfQ0JFZGl0KgkJCQltX3BFZGl0OwogCUNQV0xfQ0JCdXR0b24qCQkJCW1fcEJ1dHRvbjsKIAlDUFdMX0NCTGlzdEJveCoJCQkJbV9wTGlzdDsKIAotCWJvb2wJCQkJCQltX2JQb3B1cDsKKwlGWF9CT09MCQkJCQkJbV9iUG9wdXA7CiAJQ1BERl9SZWN0CQkJCQltX3JjT2xkV2luZG93OwogCWludDMyX3QJCQkJCW1fblBvcHVwV2hlcmU7CiAJaW50MzJfdAkJCQkJbV9uU2VsZWN0SXRlbTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaAppbmRleCA1MGUxZWJlLi45NzE0N2E5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCkBAIC0yMSwxMSArMjEsMTEgQEAKICAgICAgICAgdmlydHVhbCB+SVBXTF9GaWxsZXJfTm90aWZ5KCkgeyB9CiAJdmlydHVhbCB2b2lkCQkJCQlRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLCBGWF9GTE9BVCBmUG9wdXBNaW4sRlhfRkxPQVQgZlBvcHVwTWF4LAogCQkJCQkJCQkJCWludDMyX3QgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCkgPSAwOyAvL25SZXQ6ICgwOmJvdHRvbSAxOnRvcCkKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKGJvb2wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKKwl2aXJ0dWFsIHZvaWQJCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKIAkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAogCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCWJvb2wgYktleURvd24sIGJvb2wgJiBiUkMsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJSQywgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJT25BZnRlcktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCwgcHVibGljIElGWF9FZGl0X09wck5vdGlmeQpAQCAtNDQsMzUgKzQ0LDM1IEBACiAJdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwogCiBwdWJsaWM6Ci0Jdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0ID0gUEVBSF9MRUZULCBib29sIGJQYWludCA9IHRydWUpOwkvLzA6bGVmdCAxOnJpZ2h0IDI6bWlkZGxlCi0Jdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdFYoUFdMX0VESVRfQUxJR05GT1JNQVRfViBuRm9ybWF0ID0gUEVBVl9UT1AsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CS8vMDp0b3AgMTpib3R0b20gMjpjZW50ZXIKKwl2b2lkCQkJCQkJCVNldEFsaWduRm9ybWF0SChQV0xfRURJVF9BTElHTkZPUk1BVF9IIG5Gb3JtYXQgPSBQRUFIX0xFRlQsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CS8vMDpsZWZ0IDE6cmlnaHQgMjptaWRkbGUKKwl2b2lkCQkJCQkJCVNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQgPSBQRUFWX1RPUCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJLy8wOnRvcCAxOmJvdHRvbSAyOmNlbnRlcgogCiAJdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KTsKIAl2b2lkCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpOwogCi0Jdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBib29sIGJQYWludCA9IHRydWUpOwotCXZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CiAKLQl2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKIAotCXZvaWQJCQkJCQkJRW5hYmxlU3BlbGxDaGVjayhib29sIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCk7CiAKLQlib29sCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKLQlib29sCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKLQlib29sCQkJCQkJCUNhbkN1dCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUNhbkN1dCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJQ29weVRleHQoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVBhc3RlVGV4dCgpOwpAQCAtODUsNyArODUsNyBAQAogCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdDsKIAlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OwogCi0JYm9vbAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CiAKIAlzdGF0aWMgRlhfRkxPQVQJCQkJCUdldENoYXJBcnJheUF1dG9Gb250U2l6ZShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDUERGX1JlY3QmIHJjUGxhdGUsIGludDMyX3QgbkNoYXJBcnJheSk7CiAKQEAgLTExMiw4ICsxMTIsOCBAQAogCiBwcml2YXRlOgogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpOwotCWJvb2wJCQkJCQkJSXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0OworCXZpcnR1YWwgdm9pZAkJCQkJU2hvd1ZTY3JvbGxCYXIoRlhfQk9PTCBiU2hvdyk7CisJRlhfQk9PTAkJCQkJCQlJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlTZXRQYXJhbUJ5RmxhZygpOwogCiAJRlhfRkxPQVQJCQkJCQlHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoaW50MzJfdCBuQ2hhckFycmF5KTsKQEAgLTEyMywxNSArMTIzLDE1IEBACiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldExhdGluV29yZHNSYW5nZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7CiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGJvb2wgYkxhdGluLCBib29sIGJBcmFiaWMpIGNvbnN0OworCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9CT09MIGJMYXRpbiwgRlhfQk9PTCBiQXJhYmljKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJQWp1c3RBcmFiaWNXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOwogcHVibGljOgotCWJvb2wJCQkJCQkJSXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpOworCUZYX0JPT0wJCQkJCQkJSXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpOwogcHJpdmF0ZToKIAlJUFdMX0ZpbGxlcl9Ob3RpZnkqCQkJCW1fcEZpbGxlck5vdGlmeTsKIAlJUFdMX1NwZWxsQ2hlY2sqCQkJCW1fcFNwZWxsQ2hlY2s7Ci0JYm9vbAkJCQkJCQltX2JGb2N1czsKKwlGWF9CT09MCQkJCQkJCW1fYkZvY3VzOwogCUNQREZfUmVjdAkJCQkJCW1fcmNPbGRXaW5kb3c7CiBwdWJsaWM6CiAJdm9pZAkJCQkJCQlBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7bV9wRm9ybUZpbGxlciA9IHBEYXRhO30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCmluZGV4IGU1MTIzZmQuLjliMDg4YjEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaApAQCAtNjgsMTEgKzY4LDExIEBACiAJdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKIAotCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAJdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAogCXZpcnR1YWwgdm9pZAkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwpAQCAtODksNyArODksNyBAQAogCiAJQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKIAl2b2lkCQkJCQkJCUdldENhcmV0UG9zKGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwogCiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKIAl2b2lkCQkJCQkJCVNldFNlbChpbnQzMl90IG5TdGFydENoYXIsaW50MzJfdCBuRW5kQ2hhcik7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCXZvaWQJCQkJCQkJUGFpbnQoKTsKIAotCXZvaWQJCQkJCQkJRW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCk7CiAJQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0OwogCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIApAQCAtMTIwLDMwICsxMjAsMzAgQEAKIAlDUERGX0ZvbnQgKgkJCQkJCUdldENhcmV0Rm9udCgpIGNvbnN0OwogCUZYX0ZMT0FUCQkJCQkJR2V0Q2FyZXRGb250U2l6ZSgpIGNvbnN0OwogCi0JYm9vbAkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlSZWRvKCk7CiAJdm9pZAkJCQkJCQlVbmRvKCk7CiAKIAl2b2lkCQkJCQkJCVNldFJlYWR5VG9JbnB1dCgpOwogcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJU2hvd1ZTY3JvbGxCYXIoYm9vbCBiU2hvdyk7CisJdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKIAogCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOwogCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0UmV0dXJuKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOwogCiAJdmlydHVhbCB2b2lkCQkJCQlTZXRDdXJzb3IoKTsKLQlib29sCQkJCQkJCUlzV25kSG9yVigpOworCUZYX0JPT0wJCQkJCQkJSXNXbmRIb3JWKCk7CiAKIAl2b2lkCQkJCQkJCURlbGV0ZSgpOwogCXZvaWQJCQkJCQkJQmFja3NwYWNlKCk7CiAKIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJCUdldENhcmV0SW5mbyhDUERGX1BvaW50ICYgcHRIZWFkLCBDUERGX1BvaW50ICYgcHRGb290KSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpOworCXZvaWQJCQkJCQkJU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCk7CiAKLQl2b2lkCQkJCQkJCVNldEVkaXRDYXJldChib29sIGJWaXNpYmxlKTsKKwl2b2lkCQkJCQkJCVNldEVkaXRDYXJldChGWF9CT09MIGJWaXNpYmxlKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpe30KIAl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisJdmlydHVhbCB2b2lkCQkJCQlJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpOwogCXZpcnR1YWwgdm9pZAkJCQkJSU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIHByb3RlY3RlZDoKIAlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwogCUNQV0xfQ2FyZXQqCQkJCQkJbV9wRWRpdENhcmV0OwotCWJvb2wJCQkJCQkJbV9iTW91c2VEb3duOworCUZYX0JPT0wJCQkJCQkJbV9iTW91c2VEb3duOwogCUlQV0xfRWRpdF9Ob3RpZnkqCQkJCW1fcEVkaXROb3RpZnk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgKaW5kZXggZTRiYmJmMi4uZDMyY2M5MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaApAQCAtODUsNyArODUsNyBAQAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJCUdldERlZmF1bHRGb250QnlDaGFyc2V0KGludDMyX3QgbkNoYXJzZXQpOwogCiAJQ1BERl9Gb250KgkJCQkJCQkJCUFkZEZvbnRUb0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIHVpbnQ4X3QgbkNoYXJzZXQpOwotCXN0YXRpYyBib29sCQkJCQkJCQlJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKwlzdGF0aWMgRlhfQk9PTAkJCQkJCQkJSXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CiAJQ1BERl9Gb250KgkJCQkJCQkJCUFkZFN0YW5kYXJkRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKIAlDUERGX0ZvbnQqCQkJCQkJCQkJQWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAogCQkJCQkJCQkJCQkJCXVpbnQ4X3QgbkNoYXJzZXQpOwpAQCAtOTMsMTIgKzkzLDEyIEBACiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCBDUERGX0ZvbnQqCQkJCQkJCUZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIGludDMyX3QgbkNoYXJzZXQpOwogCXZpcnR1YWwgdm9pZAkJCQkJCQkJQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKLQlib29sCQkJCQkJCQkJCUtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKTsKKwlGWF9CT09MCQkJCQkJCQkJCUtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKTsKIAogCXZpcnR1YWwgQ1BERl9Eb2N1bWVudCoJCQkJCQlHZXREb2N1bWVudCgpOwogCiAJdm9pZAkJCQkJCQkJCQlFbXB0eSgpOwotCWludDMyX3QJCQkJCQkJCQlHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgYm9vbCBiRmluZCk7CisJaW50MzJfdAkJCQkJCQkJCUdldEZvbnRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBpbnQzMl90IG5DaGFyc2V0LCBGWF9CT09MIGJGaW5kKTsKIAlpbnQzMl90CQkJCQkJCQkJR2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCk7CiAJaW50MzJfdAkJCQkJCQkJCUFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBpbnQzMl90IG5DaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oCmluZGV4IGI2MzMxYjYuLjQ0YTVjMGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgKQEAgLTQ2LDkgKzQ2LDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCUdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUICYgeCxGWF9GTE9BVCAmIHkpOwogCiAJaW50MzJfdAkJCQkJCUdldFNjYWxlTWV0aG9kKCk7Ci0JYm9vbAkJCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CisJRlhfQk9PTAkJCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAJdm9pZAkJCQkJCQlHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQgJiBmTGVmdCwgRlhfRkxPQVQgJiBmQm90dG9tKTsKLQlib29sCQkJCQkJCUdldEZpdHRpbmdCb3VuZHMoKTsKKwlGWF9CT09MCQkJCQkJCUdldEZpdHRpbmdCb3VuZHMoKTsKIAogCXZvaWQJCQkJCQkJU2V0SWNvbkZpdChDUERGX0ljb25GaXQgKiBwSWNvbkZpdCl7bV9wSWNvbkZpdCA9IHBJY29uRml0O307CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oCmluZGV4IDNjNzFlNTcuLjJmNmIzMjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuaApAQCAtMzQsOCArMzQsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CiAKLQl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoYm9vbCBiU2VsZWN0ZWQpOwotCWJvb2wJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpOworCUZYX0JPT0wJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKIAl2b2lkCQkJCQkJCQlTZXREYXRhKHZvaWQqIHBEYXRhKTsKIAl2b2lkCQkJCQkJCQlTZXRJY29uKGludDMyX3Qgbkljb25JbmRleCk7CiAJdm9pZAkJCQkJCQkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKQEAgLTUyLDcgKzUyLDcgQEAKIHByaXZhdGU6CiAJaW50MzJfdAkJCQkJCQltX25JY29uSW5kZXg7CiAJdm9pZCoJCQkJCQkJCW1fcERhdGE7Ci0JYm9vbAkJCQkJCQkJbV9iU2VsZWN0ZWQ7CisJRlhfQk9PTAkJCQkJCQkJbV9iU2VsZWN0ZWQ7CiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wVGV4dDsKIAlDUFdMX0NvbG9yCQkJCQkJCW1fY3JJY29uOwogfTsKQEAgLTY2LDcgKzY2LDcgQEAKIAl2b2lkCQkJCQkJCQlTZXRTZWxlY3QoaW50MzJfdCBuSW5kZXgpOwogCWludDMyX3QJCQkJCQkJR2V0U2VsZWN0KCkgY29uc3Q7CiAJdm9pZAkJCQkJCQkJU2V0Tm90aWZ5KElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKIAl2b2lkCQkJCQkJCQlTZXRMaXN0RGF0YShpbnQzMl90IG5JdGVtSW5kZXgsIHZvaWQqIHBEYXRhKTsKIAl2b2lkCQkJCQkJCQlTZXRMaXN0SWNvbihpbnQzMl90IG5JdGVtSW5kZXgsIGludDMyX3Qgbkljb25JbmRleCk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwpAQCAtNzcsMjAgKzc3LDIwIEBACiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJpdmF0ZToKIAlDUFdMX0ljb25MaXN0X0l0ZW0qCQkJCQlHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3QpOworCXZvaWQJCQkJCQkJCVNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOwogCWludDMyX3QJCQkJCQkJRmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQlib29sCQkJCQkJCQltX25TZWxlY3RJbmRleDsKKwlGWF9CT09MCQkJCQkJCQltX25TZWxlY3RJbmRleDsKIAlJUFdMX0ljb25MaXN0X05vdGlmeSoJCQkJbV9wTm90aWZ5OwotCWJvb2wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKLQlib29sCQkJCQkJCQltX2JNb3VzZURvd247CisJRlhfQk9PTAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OworCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKIAlpbnQzMl90CQkJCQkJCW1fbkxpc3RDb3VudDsKIH07CiAKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJQ1BXTF9JY29uTGlzdChpbnQzMl90IG5MaXN0Q291bnQpOwogCXZpcnR1YWwgfkNQV0xfSWNvbkxpc3QoKTsKIAotCXZpcnR1YWwgYm9vbAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdm9pZAkJCQkJCQkJU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKIAl2b2lkCQkJCQkJCQlTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKIAlpbnQzMl90CQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwogCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpOwogCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAppbmRleCA0M2Q2MGEyLi45N2E0NTI5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCkBAIC0yOSw3ICsyOSw3IEBACiAJCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCk7CiAJdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KXt9CiAJdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLQl2b2lkCQkJCQkJCUlPblNldENhcmV0KGJvb2wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworCXZvaWQJCQkJCQkJSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CiAJdm9pZAkJCQkJCQlJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzICYgc2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgd29yZFByb3BzKTsKIAl2b2lkCQkJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KTsKIApAQCAtNDksMTIgKzQ5LDEyIEBACiAJdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgdm9pZAkJCQkJS2lsbEZvY3VzKCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwpAQCAtNjQsNyArNjQsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCU9uTm90aWZ5U2VsQ2hhbmdlZChib29sIGJLZXlEb3duLCBib29sICYgYkV4aXQgLCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCQlPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJFeGl0ICwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdm9pZAkJCQkJCQlBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CiAJdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50MzJfdCBuSXRlbUluZGV4KTsKQEAgLTczLDEzICs3MywxMyBAQAogCXZvaWQJCQkJCQkJUmVzZXQoKTsKIAl2b2lkCQkJCQkJCVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKGJvb2wgYkhvdmVyU2VsKTsKKwl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKTsKIAogCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDYXJldEluZGV4KCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEN1clNlbCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7CiAJQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKQEAgLTkxLDggKzkxLDggQEAKIHByb3RlY3RlZDoKIAlJRlhfTGlzdCoJCQkJCQltX3BMaXN0OwogCUNQV0xfTGlzdF9Ob3RpZnkqCQkJCW1fcExpc3ROb3RpZnk7Ci0JYm9vbAkJCQkJCQltX2JNb3VzZURvd247Ci0JYm9vbAkJCQkJCQltX2JIb3ZlclNlbDsKKwlGWF9CT09MCQkJCQkJCW1fYk1vdXNlRG93bjsKKwlGWF9CT09MCQkJCQkJCW1fYkhvdmVyU2VsOwogCUlQV0xfRmlsbGVyX05vdGlmeSoJCQkJbV9wRmlsbGVyTm90aWZ5OwogcHVibGljOgogCXZvaWQJCQkJCQkJQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkge21fcEZvcm1GaWxsZXIgPSBwRGF0YTt9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaAppbmRleCAzYmVlZTE5Li5jMTA3YTBjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCiBwcml2YXRlOgotCXZvaWQJCQkJCQkJCVJlc2V0QWxsKGJvb2wgYk1vdmUsaW50MzJfdCBuU3RhcnQpOworCXZvaWQJCQkJCQkJCVJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsaW50MzJfdCBuU3RhcnQpOwogCiAJQ1BERl9SZWN0CQkJCQkJCW1fcmNDb250ZW50OwogCUNQREZfUG9pbnQJCQkJCQkJbV9wdFNjcm9sbDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaAppbmRleCBiMWU2MWM0Li5hNjBlYmEzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oCkBAIC0zMyw4ICszMyw4IEBACiBwdWJsaWM6CiAJdmlydHVhbCB+SVBXTF9Ob3RlTm90aWZ5KCkgeyB9CiAJdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RlTW92ZShjb25zdCBGWF9SRUNUJiBydFdpbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZVNob3coYm9vbCBiU2hvdykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUFjdGl2YXRlKGJvb2wgYkFjdGl2ZSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZVNob3coRlhfQk9PTCBiU2hvdykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUFjdGl2YXRlKEZYX0JPT0wgYkFjdGl2ZSkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUNsb3NlKCkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbUNyZWF0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbURlbGV0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwpAQCAtMTA3LDExICsxMDcsMTEgQEAKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIHByaXZhdGU6Ci0JYm9vbAkJCQkJCQkJbV9iTW91c2VEb3duOworCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKIH07CiAKIGNsYXNzIENQV0xfTm90ZV9MQkJveCA6IHB1YmxpYyBDUFdMX1duZApAQCAtMTQwLDcgKzE0MCw3IEBACiAJQ1BXTF9Ob3RlX0VkaXQoKTsKIAl2aXJ0dWFsIH5DUFdMX05vdGVfRWRpdCgpOwogCi0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYkVuYWJsZSkge21fYkVuYWJsZU5vdGlmeSA9IGJFbmFibGU7fQorCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGUpIHttX2JFbmFibGVOb3RpZnkgPSBiRW5hYmxlO30KIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQlHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKIAlGWF9GTE9BVAkJCQkJCQlHZXRJdGVtTGVmdE1hcmdpbigpOwogCUZYX0ZMT0FUCQkJCQkJCUdldEl0ZW1SaWdodE1hcmdpbigpOwpAQCAtMTU0LDkgKzE1NCw5IEBACiAJdmlydHVhbCB2b2lkCQkJCQkJT25LaWxsRm9jdXMoKTsKIAogcHJpdmF0ZToKLQlib29sCQkJCQkJCQltX2JFbmFibGVOb3RpZnk7CisJRlhfQk9PTAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OwogCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZEl0ZW1IZWlnaHQ7Ci0JYm9vbAkJCQkJCQkJbV9iU2l6ZUNoYW5nZWQ7CisJRlhfQk9PTAkJCQkJCQkJbV9iU2l6ZUNoYW5nZWQ7CiAJRlhfRkxPQVQJCQkJCQkJbV9mT2xkTWluOwogCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZE1heDsKIH07CkBAIC0xODgsOSArMTg4LDkgQEAKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7Ci0JdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQkJCVNldEVkaXRGb2N1cyhib29sIGJMYXN0KTsKKwl2b2lkCQkJCQkJCQlTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCk7CiAJQ1BXTF9FZGl0KgkJCQkJCQlHZXRFZGl0KCkgY29uc3Q7CiAKIHB1YmxpYzoKQEAgLTIwMyw4ICsyMDMsOCBAQAogCUlQV0xfTm90ZUl0ZW0qCQkJCQkJR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAKIAl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShib29sIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCXZpcnR1YWwgaW50MzJfdAkJCQkJQ291bnRTdWJJdGVtcygpIGNvbnN0OwogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCQkJRGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEZvY3VzKCl7U2V0Tm90ZUZvY3VzKGZhbHNlKTt9CisJdmlydHVhbCB2b2lkCQkJCQkJU2V0Rm9jdXMoKXtTZXROb3RlRm9jdXMoRkFMU0UpO30KIAogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0UGFyZW50SXRlbSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZCoJCQkJCQlHZXRQcml2YXRlRGF0YSgpIGNvbnN0OwpAQCAtMjQwLDE5ICsyNDAsMTkgQEAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldENvbnRlbnRzKCkgY29uc3Q7CiAJdmlydHVhbCBGWF9TWVNURU1USU1FCQkJCUdldERhdGVUaW1lKCkgY29uc3Q7CiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRTdWJqZWN0TmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgYm9vbAkJCQkJCUlzVG9wSXRlbSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlO30KKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7IHJldHVybiBGQUxTRTt9CiAJdmlydHVhbCBDUFdMX0VkaXQqCQkJCQlHZXRFZGl0KCkgY29uc3Q7CiAKIHB1YmxpYzoKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAJdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRGb2N1c2VkTm90ZUl0ZW0oKSBjb25zdDsKIAogCXZpcnR1YWwgdm9pZAkJCQkJCVJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShib29sIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCUNQV0xfTm90ZUl0ZW0qCQkJCQkJQ3JlYXRlTm90ZUl0ZW0oKTsKIAlDUFdMX05vdGVJdGVtKgkJCQkJCUdldFBhcmVudE5vdGVJdGVtKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQlTZXROb3RlRm9jdXMoYm9vbCBiTGFzdCk7CisJdm9pZAkJCQkJCQkJU2V0Tm90ZUZvY3VzKEZYX0JPT0wgYkxhc3QpOwogCXZvaWQJCQkJCQkJCU9uQ29udGVudHNWYWxpZGF0ZSgpOwogCiAJdm9pZAkJCQkJCQkJT25DcmVhdGVOb3RlSXRlbSgpOwpAQCAtMjg5LDggKzI4OSw4IEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX3NBdXRob3I7CiAKIAlGWF9GTE9BVAkJCQkJCQltX2ZPbGRJdGVtSGVpZ2h0OwotCWJvb2wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOwotCWJvb2wJCQkJCQkJCW1fYkFsbG93TW9kaWZ5OworCUZYX0JPT0wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOworCUZYX0JPT0wJCQkJCQkJCW1fYkFsbG93TW9kaWZ5OwogfTsKIAogY2xhc3MgUFdMX0NMQVNTIENQV0xfTm90ZSA6IHB1YmxpYyBDUFdMX05vdGVJdGVtCkBAIC0zMDUsMTcgKzMwNSwxNyBAQAogCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0QXV0aG9yTmFtZSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZAkJCQkJCVNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwogCXZpcnR1YWwgdm9pZAkJCQkJCVJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KXt9Ci0JdmlydHVhbCBib29sCQkJCQkJSXNUb3BJdGVtKCkgY29uc3Qge3JldHVybiB0cnVlO30KKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7cmV0dXJuIFRSVUU7fQogCXZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKgkJCUdldE5vdGUoKSBjb25zdDsKIAl2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSoJCQlHZXROb3RlTm90aWZ5KCkgY29uc3Q7CiAKIHB1YmxpYzoKIAlJUFdMX05vdGVJdGVtKgkJCQkJCVJlcGx5KCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAl2b2lkCQkJCQkJCQlTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKTsKIAl2b2lkCQkJCQkJCQlTZXRPcHRpb25zVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCk7CisJdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpOwogCiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRSZXBseVN0cmluZygpIGNvbnN0OwogCXZvaWQJCQkJCQkJCVNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOwpAQCAtMzI2LDkgKzMyNiw5IEBACiAJSVBvcHVwX05vdGUqCQkJCQkJR2V0UG9wdXBOb3RlKCkgY29uc3Qge3JldHVybiBtX3BQb3B1cE5vdGU7fQogCiBwdWJsaWM6Ci0JdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwpAQCAtMzM2LDkgKzMzNiw5IEBACiAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAotCWJvb2wJCQkJCQkJCVJlc2V0U2Nyb2xsQmFyKCk7CisJRlhfQk9PTAkJCQkJCQkJUmVzZXRTY3JvbGxCYXIoKTsKIAl2b2lkCQkJCQkJCQlSZVBvc05vdGVDaGlsZHJlbigpOwotCWJvb2wJCQkJCQkJCVNjcm9sbEJhclNob3VsZFZpc2libGUoKTsKKwlGWF9CT09MCQkJCQkJCQlTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCk7CiAKIHByaXZhdGU6CiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wQXV0aG9yOwpAQCAtMzQ5LDEwICszNDksMTAgQEAKIAlDUFdMX1Njcm9sbEJhcioJCQkJCQltX3BDb250ZW50c0JhcjsKIAlDUFdMX05vdGVfT3B0aW9ucyoJCQkJCW1fcE9wdGlvbnM7CiAJSVBXTF9Ob3RlTm90aWZ5KgkJCQkJbV9wTm90ZU5vdGlmeTsKLQlib29sCQkJCQkJCQltX2JSZXNpemluZzsKKwlGWF9CT09MCQkJCQkJCQltX2JSZXNpemluZzsKIAlQV0xfU0NST0xMX0lORk8JCQkJCQltX09sZFNjcm9sbEluZm87CiAJQ1BERl9SZWN0CQkJCQkJCW1fcmNDYXB0aW9uOwotCWJvb2wJCQkJCQkJCW1fYkVuYWxibGVOb3RpZnk7CisJRlhfQk9PTAkJCQkJCQkJbV9iRW5hbGJsZU5vdGlmeTsKIAlJUG9wdXBfTm90ZSoJCQkJCQltX3BQb3B1cE5vdGU7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX3NSZXBseVN0cmluZzsKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCmluZGV4IDQ3MzU5MjIuLjAzOTAyMjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCkBAIC00OSwxNSArNDksMTUgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJvdGVjdGVkOgogCVBXTF9TQ1JPTExCQVJfVFlQRQkJCW1fZVNjcm9sbEJhclR5cGU7CiAJUFdMX1NCQlVUVE9OX1RZUEUJCQltX2VTQkJ1dHRvblR5cGU7CiAKLQlib29sCQkJCQkJbV9iTW91c2VEb3duOworCUZYX0JPT0wJCQkJCQltX2JNb3VzZURvd247CiB9OwogCiBzdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UKQEAgLTY3LDcgKzY3LDcgQEAKIAlQV0xfRkxPQVRSQU5HRShGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KTsKIAl2b2lkIERlZmF1bHQoKTsKIAl2b2lkIFNldChGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KTsKLQlib29sCUluKEZYX0ZMT0FUIHgpIGNvbnN0OworCUZYX0JPT0wJSW4oRlhfRkxPQVQgeCkgY29uc3Q7CiAJRlhfRkxPQVQgR2V0V2lkdGgoKSBjb25zdDsKIAogCUZYX0ZMT0FUIGZNaW4sZk1heDsKQEAgLTgzLDcgKzgzLDcgQEAKIAl2b2lkIFNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKTsKIAl2b2lkIFNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKTsKIAl2b2lkIFNldEJpZ1N0ZXAoRlhfRkxPQVQgc3RlcCk7Ci0JYm9vbCBTZXRQb3MoRlhfRkxPQVQgcG9zKTsKKwlGWF9CT09MIFNldFBvcyhGWF9GTE9BVCBwb3MpOwogCiAJdm9pZCBBZGRTbWFsbCgpOwogCXZvaWQgU3ViU21hbGwoKTsKQEAgLTExMCw4ICsxMTAsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwpAQCAtMTE5LDEyICsxMTksMTIgQEAKIAlGWF9GTE9BVAkJCQkJR2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdDsKIAlQV0xfU0NST0xMQkFSX1RZUEUJCQlHZXRTY3JvbGxCYXJUeXBlKCkgY29uc3Qge3JldHVybiBtX3NiVHlwZTt9OwogCi0Jdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoYm9vbCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9CisJdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoRlhfQk9PTCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9CiAKIHByb3RlY3RlZDoKIAl2b2lkCQkJCQkJU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgZk1pbixGWF9GTE9BVCBmTWF4LEZYX0ZMT0FUIGZDbGllbnRXaWR0aCk7CiAJdm9pZAkJCQkJCVNldFNjcm9sbFBvcyhGWF9GTE9BVCBmUG9zKTsKLQl2b2lkCQkJCQkJTW92ZVBvc0J1dHRvbihib29sIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJTW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKTsKIAl2b2lkCQkJCQkJU2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKTsKIAl2b2lkCQkJCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJQ1BERl9SZWN0CQkJCQlHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CkBAIC0xNTYsOSArMTU2LDkgQEAKIAlDUFdMX1NCQnV0dG9uKgkJCQltX3BNYXhCdXR0b247CiAJQ1BXTF9TQkJ1dHRvbioJCQkJbV9wUG9zQnV0dG9uOwogCVBXTF9TQ1JPTExfUFJJVkFURURBVEEJCW1fc0RhdGE7Ci0JYm9vbAkJCQkJCW1fYk1vdXNlRG93bjsKLQlib29sCQkJCQkJbV9iTWluT3JNYXg7Ci0JYm9vbAkJCQkJCW1fYk5vdGlmeUZvcmV2ZXI7CisJRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKwlGWF9CT09MCQkJCQkJbV9iTWluT3JNYXg7CisJRlhfQk9PTAkJCQkJCW1fYk5vdGlmeUZvcmV2ZXI7CiAJRlhfRkxPQVQJCQkJCW1fbk9sZFBvczsKIAlGWF9GTE9BVAkJCQkJbV9mT2xkUG9zQnV0dG9uOwogfTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKaW5kZXggYzU1NTdkNi4uYzk0NTI3NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKQEAgLTQzLDkgKzQzLDkgQEAKIAl2b2lkCQkJCQkJCQlTZXRJbWFnZShDRlhfRElCU291cmNlKiBwSW1hZ2UpOwogCXZvaWQJCQkJCQkJCVNldEltYWdlU3RyZWFtKENQREZfU3RyZWFtICogcFN0cmVhbSwgY29uc3QgRlhfQ0hBUiogc0ltYWdlQWxpYXMpOwogCi0Jdm9pZAkJCQkJCQkJU2V0VGV4dEZsYWcoYm9vbCBiVGV4dEV4aXN0KTsKLQl2b2lkCQkJCQkJCQlTZXRJbWFnZUZsYWcoYm9vbCBiSW1hZ2VFeGlzdCk7Ci0Jdm9pZAkJCQkJCQkJU2V0Rm94aXRGbGFnKGJvb2wgYkZsYWdFeGlzdCk7CisJdm9pZAkJCQkJCQkJU2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KTsKKwl2b2lkCQkJCQkJCQlTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCk7CisJdm9pZAkJCQkJCQkJU2V0Rm94aXRGbGFnKEZYX0JPT0wgYkZsYWdFeGlzdCk7CiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CkBAIC01OSw5ICs1OSw5IEBACiAJQ1BXTF9MYWJlbCoJCQkJCQkJbV9wRGVzY3JpcHRpb247CiAJQ1BXTF9TaWduYXR1cmVfSW1hZ2UqCQkJCW1fcEltYWdlOwogCi0JYm9vbAkJCQkJCQkJbV9iVGV4dEV4aXN0OwotCWJvb2wJCQkJCQkJCW1fYkltYWdlRXhpc3Q7Ci0JYm9vbAkJCQkJCQkJbV9iRmxhZ0V4aXN0OworCUZYX0JPT0wJCQkJCQkJCW1fYlRleHRFeGlzdDsKKwlGWF9CT09MCQkJCQkJCQltX2JJbWFnZUV4aXN0OworCUZYX0JPT0wJCQkJCQkJCW1fYkZsYWdFeGlzdDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU0lHTkFUVVJFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKaW5kZXggMTRlNTc2ZC4uZjY2NTlkZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaApAQCAtMjYsMTQgKzI2LDE0IEBACiAJdmlydHVhbCB+Q1BXTF9DaGVja0JveCgpOwogCiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQlTZXRDaGVjayhib29sIGJDaGVjayk7Ci0JYm9vbAkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OworCXZvaWQJCQkJCQlTZXRDaGVjayhGWF9CT09MIGJDaGVjayk7CisJRlhfQk9PTAkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OwogCiBwcml2YXRlOgotCWJvb2wJCQkJCQltX2JDaGVja2VkOworCUZYX0JPT0wJCQkJCQltX2JDaGVja2VkOwogfTsKIAogY2xhc3MgUFdMX0NMQVNTIENQV0xfUmFkaW9CdXR0b24gOiBwdWJsaWMgQ1BXTF9CdXR0b24KQEAgLTQzLDE0ICs0MywxNCBAQAogCXZpcnR1YWwgfkNQV0xfUmFkaW9CdXR0b24oKTsKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soYm9vbCBiQ2hlY2spOwotCWJvb2wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOworCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKIAogcHJpdmF0ZToKLQlib29sCQkJCQkJbV9iQ2hlY2tlZDsKKwlGWF9CT09MCQkJCQkJbV9iQ2hlY2tlZDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU1BFQ0lBTEJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKaW5kZXggZjFlMzRjOS4uMmRhMGY0MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oCkBAIC0xMDksOCArMTA5LDggQEAKIHB1YmxpYzoKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKLQlzdGF0aWMgYm9vbAkJCQkJCQlJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOwotCXN0YXRpYyBib29sCQkJCQkJCUNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LCBjb25zdCBDUERGX1JlY3QmIHJjQ2hpbGQpOworCXN0YXRpYyBGWF9CT09MCQkJCQkJCUludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0Mik7CisJc3RhdGljIEZYX0JPT0wJCQkJCQkJQ29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCk7CiAJc3RhdGljIENQREZfUmVjdAkJCQkJCVNjYWxlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCxGWF9GTE9BVCBmU2NhbGUpOwogCXN0YXRpYyBDUFZUX1dvcmRSYW5nZQkJCQkJT3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJR2V0Q2VudGVyU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwpAQCAtMTIwLDEwICsxMjAsMTAgQEAKIAlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJT2Zmc2V0UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7CiAJc3RhdGljIENQREZfUG9pbnQJCQkJCQlPZmZzZXRQb2ludChjb25zdCAgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7CiAJc3RhdGljIEZYX0NPTE9SUkVGCQkJCQkJUFdMQ29sb3JUb0ZYQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIGludDMyX3QgblRyYW5zcGFyYW5jeSA9IDI1NSk7Ci0Jc3RhdGljIGJvb2wJCQkJCQkJSXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworCXN0YXRpYyBGWF9CT09MCQkJCQkJCUlzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKIAlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCUdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSA9IHRydWUpOworCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0Q29sb3JBcHBTdHJlYW0oY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLGNvbnN0IEZYX0JPT0wgJiBiRmlsbE9yU3Ryb2tlID0gVFJVRSk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRCb3JkZXJBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfRkxPQVQgZldpZHRoLAogCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLCBjb25zdCBDUFdMX0NvbG9yICYgY3JMZWZ0VG9wLCBjb25zdCBDUFdMX0NvbG9yICYgY3JSaWdodEJvdHRvbSwKIAkJCQkJCQkJCQkJCWludDMyX3QgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoKTsKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKIAogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0RWRpdEFwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgPSBOVUxMLAotCQkJCQkJCQkJCQkJCQlib29sIGJDb250aW51b3VzID0gdHJ1ZSwgRlhfV09SRCBTdWJXb3JkID0gMCk7CisJCQkJCQkJCQkJCQkJCUZYX0JPT0wgYkNvbnRpbnVvdXMgPSBUUlVFLCBGWF9XT1JEIFN1YldvcmQgPSAwKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRTZWxBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCiAJCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlID0gTlVMTCk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRTcGVsbENoZWNrQXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgSVBXTF9TcGVsbENoZWNrKiBwU3BlbGxDaGVjaywKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSA9IE5VTEwpOwogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0VGV4dEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLAogCQkJCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyAmIHNUZXh0LCBpbnQzMl90IG5BbGlnbm1lbnRILCBpbnQzMl90IG5BbGlnbm1lbnRWLAotCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYk11bHRpTGluZSwgYm9vbCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7CisJCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiTXVsdGlMaW5lLCBGWF9CT09MIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94KTsKIAogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LApAQCAtMTc1LDcgKzE3NSw3IEBACiAJc3RhdGljIHZvaWQJCQkJCQkJCURyYXdGaWxsQXJlYShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50KiBwUHRzLCBpbnQzMl90IG5Db3VudCwgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yKTsKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJCQlib29sIGJWZXJ0aWNhbCwgYm9vbCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCisJCQkJCQkJCQkJCQkJCUZYX0JPT0wgYlZlcnRpY2FsLCBGWF9CT09MIGJIb3Jpem9udGFsLCBDUERGX1JlY3QgcmVjdCwKIAkJCQkJCQkJCQkJCQkJaW50MzJfdCBuVHJhbnNwYXJhbmN5LCBpbnQzMl90IG5TdGFydEdyYXksIGludDMyX3QgbkVuZEdyYXkpOwogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LAogCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCmluZGV4IDNiMWQyOTkuLmM1YjZjYTQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlGWF9GTE9BVAkJCQkJZkNvbG9yMSxmQ29sb3IyLGZDb2xvcjMsZkNvbG9yNDsKIH07CiAKLWlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCitpbmxpbmUgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQogewogCXJldHVybiBjMS5uQ29sb3JUeXBlID09IGMyLm5Db2xvclR5cGUgJiYKIAkJYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPCAwLjAwMDEgJiYgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPCAwLjAwMDEgJiYgYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPiAtMC4wMDAxOwogfQogCi1pbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQoraW5saW5lIEZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQV0xfQ29sb3IgJmMxLCBjb25zdCBDUFdMX0NvbG9yICZjMikKIHsKIAlyZXR1cm4gIW9wZXJhdG9yID09IChjMSwgYzIpOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiB7CiBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfklQV0xfU3BlbGxDaGVjaygpIHsgfQotCXZpcnR1YWwgYm9vbAkJCQkJCQlDaGVja1dvcmQoY29uc3QgRlhfQ0hBUiogc1dvcmQpID0gMDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2hlY2tXb3JkKGNvbnN0IEZYX0NIQVIqIHNXb3JkKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCQkJCVN1Z2dlc3RXb3Jkcyhjb25zdCBGWF9DSEFSKiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmIHNTdWdnZXN0KSA9IDA7CiB9OwogCkBAIC0yOTgsMjUgKzI5OCwyNSBAQAogCXZvaWQJCQkJCQkJQ3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlEZXN0cm95KCk7Ci0Jdm9pZAkJCQkJCQlNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LGJvb2wgYlJlc2V0LGJvb2wgYlJlZnJlc2gpOworCXZvaWQJCQkJCQkJTW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldyxGWF9CT09MIGJSZXNldCxGWF9CT09MIGJSZWZyZXNoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QgPSBOVUxMKTsKIAogCXZvaWQJCQkJCQkJR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyAmIHNBcHBTdHJlYW0pOwogCXZvaWQJCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbktleVVwKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbk1CdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbk1CdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25NQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPblJCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgYm9vbAkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBib29sCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5VXAoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPbk1CdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvY3VzKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlLaWxsRm9jdXMoKTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAJdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRTdHJva2VDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0VmlzaWJsZShib29sIGJWaXNpYmxlKTsKKwl2aXJ0dWFsIHZvaWQJCQkJCVNldFZpc2libGUoRlhfQk9PTCBiVmlzaWJsZSk7CiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRGb2N1c1JlY3QoKSBjb25zdDsKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyTGVmdFRvcENvbG9yKGludDMyX3QgbkJvcmRlclN0eWxlKSBjb25zdDsKIAl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3Q7CiAKLQl2aXJ0dWFsIGJvb2wJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCB7cmV0dXJuIGZhbHNlO30KKwl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCB7cmV0dXJuIEZBTFNFO30KIAogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKIApAQCAtMzU2LDggKzM1Niw4IEBACiAJQ1BERl9SZWN0CQkJCQkJR2V0Q2xpZW50Q2VudGVyU3F1YXJlKCkgY29uc3Q7CiAJQ1BERl9SZWN0CQkJCQkJR2V0V2luZG93Q2VudGVyU3F1YXJlKCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEJvcmRlcldpZHRoKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc1Zpc2libGUoKSBjb25zdCB7cmV0dXJuIG1fYlZpc2libGU7fQotCWJvb2wJCQkJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0IHtyZXR1cm4gbV9iVmlzaWJsZTt9CisJRlhfQk9PTAkJCQkJCQlIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0OwogCXZvaWQJCQkJCQkJQWRkRmxhZyhGWF9EV09SRCBkd0ZsYWdzKTsKIAl2b2lkCQkJCQkJCVJlbW92ZUZsYWcoRlhfRFdPUkQgZHdGbGFncyk7CiAJQ1BERl9SZWN0CQkJCQkJR2V0Q2xpcFJlY3QoKSBjb25zdDsKQEAgLTM2NiwxMyArMzY2LDEzIEBACiAJQ1BXTF9EYXNoCQkJCQkJR2V0Qm9yZGVyRGFzaCgpIGNvbnN0OwogCXZvaWQqCQkJCQkJCUdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwogCi0JYm9vbAkJCQkJCQlXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc0NhcHR1cmVNb3VzZSgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJV25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJQ2xpZW50SGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNDYXB0dXJlTW91c2UoKSBjb25zdDsKIAogCWNvbnN0IENQV0xfV25kKgkJCQkJR2V0Rm9jdXNlZCgpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNGb2N1c2VkKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc1JlYWRPbmx5KCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc0ZvY3VzZWQoKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzUmVhZE9ubHkoKSBjb25zdDsKIAlDUFdMX1Njcm9sbEJhcioJCQkJCUdldFZTY3JvbGxCYXIoKSBjb25zdDsKIAogCUlGWF9FZGl0X0ZvbnRNYXAqCQkJCUdldEZvbnRNYXAoKSBjb25zdDsKQEAgLTM5OCw4ICszOTgsOCBAQAogCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0SXRlbUxlZnRNYXJnaW4oKSB7cmV0dXJuIDA7fQogCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0SXRlbVJpZ2h0TWFyZ2luKCkge3JldHVybiAwO30KIAotCXZvaWQJCQkJCQkJRW5hYmxlV2luZG93KGJvb2wgYkVuYWJsZSk7Ci0JYm9vbAkJCQkJCQlJc0VuYWJsZWQoKTsKKwl2b2lkCQkJCQkJCUVuYWJsZVdpbmRvdyhGWF9CT09MIGJFbmFibGUpOworCUZYX0JPT0wJCQkJCQkJSXNFbmFibGVkKCk7CiAJdmlydHVhbCB2b2lkCQkJCQlTZXRDdXJzb3IoKTsKIAogcHJvdGVjdGVkOgpAQCAtNDIyLDExICs0MjIsMTEgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uRW5hYmxlZCgpOwogCXZpcnR1YWwgdm9pZAkJCQkJT25EaXNhYmxlZCgpOwogCi0Jdm9pZAkJCQkJCQlTZXROb3RpZnlGbGFnKGJvb2wgYk5vdGlmeWluZyA9IHRydWUpe21fYk5vdGlmeWluZyA9IGJOb3RpZnlpbmc7fTsKKwl2b2lkCQkJCQkJCVNldE5vdGlmeUZsYWcoRlhfQk9PTCBiTm90aWZ5aW5nID0gVFJVRSl7bV9iTm90aWZ5aW5nID0gYk5vdGlmeWluZzt9OwogCi0JYm9vbAkJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7CiAJUFdMX0NSRUFURVBBUkFNCQkJCQlHZXRDcmVhdGlvblBhcmFtKCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9iTm90aWZ5aW5nO30KKwlGWF9CT09MCQkJCQkJCUlzTm90aWZ5aW5nKCkgY29uc3Qge3JldHVybiBtX2JOb3RpZnlpbmc7fQogCiAJdm9pZAkJCQkJCQlJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNPbGQsIGNvbnN0IENQREZfUmVjdCAmIHJjTmV3KTsKIApAQCAtNDM0LDE0ICs0MzQsMTQgQEAKIAlGWF9SRUNUCQkJCQkJCVBXTHRvV25kKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OwogCUZYX0hXTkQJCQkJCQkJR2V0QXR0YWNoZWRIV25kKCkgY29uc3Q7CiAKLQlib29sCQkJCQkJCUlzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7Ci0JYm9vbAkJCQkJCQlJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7CiAJY29uc3QgQ1BXTF9XbmQqCQkJCQlHZXRSb290V25kKCkgY29uc3Q7CiAKLQlib29sCQkJCQkJCUlzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwotCWJvb2wJCQkJCQkJSXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlib29sCQkJCQkJCUlzSU5TRVJUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzU0hJRlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJRlhfQk9PTAkJCQkJCQlJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwogCiBwcml2YXRlOgogCXZvaWQJCQkJCQkJQWRkQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKTsKQEAgLTQ2NywxMCArNDY3LDEwIEBACiAJQ1BERl9SZWN0CQkJCQkJbV9yY1dpbmRvdzsKIAlDUERGX1JlY3QJCQkJCQltX3JjQ2xpcDsKIAotCWJvb2wJCQkJCQkJbV9iQ3JlYXRlZDsKLQlib29sCQkJCQkJCW1fYlZpc2libGU7Ci0JYm9vbAkJCQkJCQltX2JOb3RpZnlpbmc7Ci0JYm9vbAkJCQkJCQltX2JFbmFibGVkOworCUZYX0JPT0wJCQkJCQkJbV9iQ3JlYXRlZDsKKwlGWF9CT09MCQkJCQkJCW1fYlZpc2libGU7CisJRlhfQk9PTAkJCQkJCQltX2JOb3RpZnlpbmc7CisJRlhfQk9PTAkJCQkJCQltX2JFbmFibGVkOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9XTkRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcAppbmRleCA2NTcwYjNlLi42OTlhN2U0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwCkBAIC0yMzAsNyArMjMwLDcgQEAKIAogCUNQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtRGljdCA9IE5VTEw7CiAKLQlib29sIGJXaWRnZXQgPSAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0Iik7CisJRlhfQk9PTCBiV2lkZ2V0ID0gKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpOwogCiAJaWYgKGJXaWRnZXQpCiAJewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwCmluZGV4IDcyZmY1NzUuLjU1ZDJkNDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAKQEAgLTMxLDE4ICszMSwxOCBAQAogCXJldHVybiBwV25kOwogfQogCi1ib29sCUNGRkxfQ2hlY2tCb3g6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKIHsKIAlzd2l0Y2ggKG5LZXlDb2RlKQogCXsKIAljYXNlIEZXTF9WS0VZX1JldHVybjoKIAljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CiAJfQogfQotYm9vbAlDRkZMX0NoZWNrQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK0ZYX0JPT0wJQ0ZGTF9DaGVja0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAJc3dpdGNoIChuQ2hhcikKIAl7CkBAIC01NSw1NyArNTUsNTcgQEAKIAkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKIAkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLQkJCWJvb2wgYlJlc2V0ID0gZmFsc2U7Ci0JCQlib29sIGJFeGl0ID0gZmFsc2U7CisJCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOworCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogCiAJCQlwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsbkZsYWdzKTsKIAotCQkJaWYgKGJSZXNldCkgcmV0dXJuIHRydWU7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiB0cnVlOworCQkJaWYgKGJSZXNldCkgcmV0dXJuIFRSVUU7CisJCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwogCiAJCQlDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogCi0JCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCisJCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCiAJCQkJcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKIAogCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAl9CiB9CiAKLWJvb2wgQ0ZGTF9DaGVja0JveDo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9DaGVja0JveDo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7Ci0JCWlmIChDUFdMX0NoZWNrQm94ICogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKwkJaWYgKENQV0xfQ2hlY2tCb3ggKiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQogCQl7CiAJCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogCQkJcFduZC0+U2V0Q2hlY2soIXBXaWRnZXQtPklzQ2hlY2tlZCgpKTsKIAkJLy8JcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKIAkJfQogCi0JCWlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkgcmV0dXJuIEZBTFNFOwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sCUNGRkxfQ2hlY2tCb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKIAogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisJaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogCXsKIAkJcmV0dXJuIHBXbmQtPklzQ2hlY2tlZCgpICE9IG1fcFdpZGdldC0+SXNDaGVja2VkKCk7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDRkZMX0NoZWNrQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCkBAIC0xMTMsMTAgKzExMywxMCBAQAogCiAJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKwlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCi0JCWJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKwkJRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwogCiAKIAkJaWYgKGJOZXdDaGVja2VkKQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCQl9CiAJCX0KIAotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CisJCW1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIEZBTFNFKTsKIAkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCQlTZXRDaGFuZ2VNYXJrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCmluZGV4IGQ2ZDRkM2QuLjg0MWI0NWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKQEAgLTc4LDE2ICs3OCwxNiBAQAogfQogCiAKLWJvb2wgQ0ZGTF9Db21ib0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitGWF9CT09MIENGRkxfQ29tYm9Cb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1ib29sIENGRkxfQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLSAgICBDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgICBDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKICAgICBpZiAoIXBXbmQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaW50MzJfdCBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CiAgICAgaWYgKCEobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCkpCkBAIC0xMDMsMjggKzEwMywyOCBAQAogewogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9Db21ib0JveCogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgIHsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFduZC0+R2V0VGV4dCgpOwogICAgICAgICBpbnQzMl90IG5DdXJTZWwgPSBwV25kLT5HZXRTZWxlY3QoKTsKIAogICAgICAgICAvL21hbnRpczowMDA0MTU3Ci0gICAgICAgIGJvb2wgYlNldFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgRlhfQk9PTCBiU2V0VmFsdWUgPSBUUlVFOwogCiAgICAgICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobkN1clNlbCA+PSAwKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChzd1RleHQgIT0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKSkKLSAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gVFJVRTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgYlNldFZhbHVlID0gZmFsc2U7CisgICAgICAgICAgICBiU2V0VmFsdWUgPSBGQUxTRTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWU7CiAKQEAgLTEzMiwxNSArMTMyLDE1IEBACiAgICAgICAgIGlmIChiU2V0VmFsdWUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHNPbGRWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLSAgICAgICAgICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc3dUZXh0LCBmYWxzZSk7CisgICAgICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHN3VGV4dCwgRkFMU0UpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgVFJVRSwgRkFMU0UpOwogICAgICAgICB9CiAKLSAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKKyAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKICAgICAgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogICAgICAgICBTZXRDaGFuZ2VNYXJrKCk7CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgIHN3aXRjaCAodHlwZSkKICAgICB7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLSAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCiAgICAgICAgICAgICB7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6Ci0gICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQogICAgICAgICAgICAgewpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgc3dpdGNoICh0eXBlKQogICAgIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKICAgICAgICAgICAgIHsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgIH0KIH0KIAotYm9vbCBDRkZMX0NvbWJvQm94OjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKK0ZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewogICAgIHN3aXRjaCAodHlwZSkKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9Db21ib0JveDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgewogICAgICAgICBtX1N0YXRlLm5JbmRleCA9IHBDb21ib0JveC0+R2V0U2VsZWN0KCk7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogewogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQorICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCiAgICAgewogICAgICAgICBpZiAobV9TdGF0ZS5uSW5kZXggPj0gMCkKICAgICAgICAgICAgIHBDb21ib0JveC0+U2V0U2VsZWN0KG1fU3RhdGUubkluZGV4KTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKQorQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQogewogICAgIGlmIChiUmVzdG9yZVZhbHVlKQogICAgICAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKQEAgLTI3OSwxNyArMjc5LDE3IEBACiAgICAgaWYgKGJSZXN0b3JlVmFsdWUpCiAgICAgewogICAgICAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSk7CisgICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKTsKIAogICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKIAogICAgIHJldHVybiBwUmV0OwogfQogCi12b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCit2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIApAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgICAgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0gICAgICAgICAgICAgICAgbV9iVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX2JWYWxpZCA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7CiAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLSAgICAgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIHRydWUpOworICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgVFJVRSk7CiAKICAgICAgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7CiAgICAgfQpAQCAtMzM5LDI1ICszMzksMjUgQEAKICAgICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOwogfQogCi1ib29sIENGRkxfQ29tYm9Cb3g6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKICAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX0NvbWJvQm94OjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfQ29tYm9Cb3g6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KQpAQCAtMzcxLDcgKzM3MSw3IEBACiAKICAgICBpbnQgbkV4cG9ydCA9IC0xOwogICAgIENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgaWYgKENQV0xfQ29tYm9Cb3ggKiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgIGlmIChDUFdMX0NvbWJvQm94ICogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIG5FeHBvcnQgPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKaW5kZXggMzRhYTE3Yy4uMTgxMWNiMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIENGRkxfRm9ybUZpbGxlcjo6Q0ZGTF9Gb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKICAgICA6IG1fcEFwcChwQXBwKSwKICAgICAgIG1fcEFubm90KHBBbm5vdCksCi0gICAgICBtX2JWYWxpZChmYWxzZSksCisgICAgICBtX2JWYWxpZChGQUxTRSksCiAgICAgICBtX3B0T2xkUG9zKDAsMCkKIHsKICAgICBtX3BXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKSBwQW5ub3Q7CkBAIC00MCwxNSArNDAsMTUgQEAKIAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KQogewotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgewotICAgICAgICBwV25kLT5Nb3ZlKENQREZfUmVjdChyY1dpbmRvdyksIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcFduZC0+TW92ZShDUERGX1JlY3QocmNXaW5kb3cpLCBUUlVFLCBGQUxTRSk7CiAgICAgfQogfQogCiBDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKICAgICB9CkBAIC02Myw3ICs2Myw3IEBACiAKICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IG1fcFdpZGdldC0+R2V0UmVjdCgpOwogCi0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKICAgICAgICAgcmNBbm5vdCA9IFBXTHRvRkZMKHJjV2luZG93KTsKQEAgLTg2LDcgKzg2LDcgQEAKIHsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgIHsKICAgICAgICAgQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKICAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwpAQCAtMTMxLDE1MyArMTMxLDE1MyBAQAogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCiAgICAgewotICAgICAgICBtX2JWYWxpZCA9IHRydWU7CisgICAgICAgIG1fYlZhbGlkID0gVFJVRTsKICAgICAgICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKIAogICAgICAgICBpZighcmVjdC5Db250YWlucygoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgcmV0dXJuIHBXbmQtPk9uTEJ1dHRvbkRvd24oV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIEZYX1JFQ1QgcmNGRkwgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KHJjRkZMLmxlZnQsIHJjRkZMLnRvcCwgcmNGRkwucmlnaHQsIHJjRkZMLmJvdHRvbSk7CiAgICAgICAgIHBXbmQtPk9uTEJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7Ci0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgIHsKICAgICAgICAgcFduZC0+T25MQnV0dG9uRGJsQ2xrKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIGlmICgobV9wdE9sZFBvcy54ICE9IHBvaW50LngpIHx8IChtX3B0T2xkUG9zLnkgIT0gcG9pbnQueSkpCiAgICAgewogICAgICAgICBtX3B0T2xkUG9zID0gcG9pbnQ7CiAgICAgfQogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgIHsKICAgICAgICAgcFduZC0+T25Nb3VzZU1vdmUoV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7Ci0gICAgaWYgKCFJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUlzVmFsaWQoKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQorICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kLT5Pbk1vdXNlV2hlZWwoekRlbHRhLCBXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCiAgICAgewogICAgICAgICBwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIHBXbmQtPk9uUkJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAgICAgaWYgKElzVmFsaWQoKSkKICAgICB7CiAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHBXbmQtPk9uS2V5RG93bihuS2V5Q29kZSxuRmxhZ3MpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewogICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwV25kLT5PbkNoYXIobkNoYXIsbkZsYWdzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKIHsKICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRG9jLT5HZXRQYWdlVmlldyhwUGFnZSk7Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCiAgICAgICAgIHBXbmQtPlNldEZvY3VzKCk7CiAKLSAgICBtX2JWYWxpZCA9IHRydWU7CisgICAgbV9iVmFsaWQgPSBUUlVFOwogICAgIEZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQogewogICAgIGlmICghSXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogICAgIENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZyk7CiAKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgICAgICBwV25kLT5LaWxsRm9jdXMoKTsKIAogICAgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSkKQEAgLTI4NSwxNiArMjg1LDE2IEBACiAgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLSAgICAgICAgRXNjYXBlRmlsbGVyKHBQYWdlVmlldywgdHJ1ZSk7CisgICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIFRSVUUpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBmYWxzZSk7CisgICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIEZBTFNFKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYlZhbGlkOwogfQpAQCAtMzcwLDcgKzM3MCw3IEBACiAgICAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJOZXcpCitDUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKQEAgLTQ5OSw3ICs0OTksNyBAQAogCiBDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIENQREZfUmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOwogICAgICAgICBDUERGX1JlY3QgcmNQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCk7CkBAIC01NjEsNDQgKzU2MSw0NCBAQAogICAgIHJldHVybiByZWN0OwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6Q29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgaWYgKElzRGF0YUNoYW5nZWQocFBhZ2VWaWV3KSkKICAgICB7Ci0gICAgICAgIGJvb2wgYlJDID0gdHJ1ZTsKLSAgICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKICAgICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOwogICAgICAgICBwSUZvcm1GaWxsZXItPk9uS2V5U3Ryb2tlQ29tbWl0KG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7CiAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIGlmICghYlJDKQogICAgICAgICB7Ci0gICAgICAgICAgICBSZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogCiAgICAgICAgIHBJRm9ybUZpbGxlci0+T25WYWxpZGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOwogICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBpZiAoIWJSQykKICAgICAgICAgewotICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KIAogICAgICAgICBTYXZlRGF0YShwUGFnZVZpZXcpOwogICAgICAgICBwSUZvcm1GaWxsZXItPk9uQ2FsY3VsYXRlKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiRXhpdCxuRmxhZyk7CiAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICAgICAgcElGb3JtRmlsbGVyLT5PbkZvcm1hdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsbkZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCkBAIC02MjEsMTAgKzYyMSwxMCBAQAogewogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQpAQCAtNjM1LDkgKzYzNSw5IEBACiB7CiB9CiAKLUNQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSkKK0NQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKIHsKLSAgICByZXR1cm4gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOworICAgIHJldHVybiBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpUaW1lclByb2MoKQpAQCAtNjUwLDEzICs2NTAsMTMgQEAKICAgICByZXR1cm4gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleVN0cm9rZShib29sIGJLZXlEb3duKQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24pCiB7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJEZXN0cm95UERGV2luZG93KQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkVzY2FwZUZpbGxlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYkRlc3Ryb3lQREZXaW5kb3cpCiB7Ci0gICAgbV9iVmFsaWQgPSBmYWxzZTsKKyAgICBtX2JWYWxpZCA9IEZBTFNFOwogCiAgICAgRlhfUkVDVCByY1JlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7CkBAIC02NjUsMTkgKzY2NSwxOSBAQAogICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQpAQCAtNzAyLDggKzcwMiw4IEBACiAKIENGRkxfQnV0dG9uOjpDRkZMX0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KSA6CiAgICAgQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLAotICAgIG1fYk1vdXNlSW4oZmFsc2UpLAotICAgIG1fYk1vdXNlRG93bihmYWxzZSkKKyAgICBtX2JNb3VzZUluKEZBTFNFKSwKKyAgICBtX2JNb3VzZURvd24oRkFMU0UpCiB7CiB9CiAKQEAgLTcxMywxNCArNzEzLDE0IEBACiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBtX2JNb3VzZUluID0gdHJ1ZTsKKyAgICBtX2JNb3VzZUluID0gVFJVRTsKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiB9CiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewotICAgIG1fYk1vdXNlSW4gPSBmYWxzZTsKKyAgICBtX2JNb3VzZUluID0gRkFMU0U7CiAKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CkBAIC03MjgsMzkgKzcyOCwzOSBAQAogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiB9CiAKLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOwogICAgIGlmKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIG1fYk1vdXNlRG93biA9IHRydWU7Ci0gICAgbV9iVmFsaWQgPSB0cnVlOworICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgbV9iVmFsaWQgPSBUUlVFOwogICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7CiAgICAgaWYoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgbV9iTW91c2VEb3duID0gZmFsc2U7CisgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CiAgICAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAKIAogICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfQnV0dG9uOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDRkZMX0J1dHRvbjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCmluZGV4IDkyMmQ4YzAuLjdjZTgxMWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIAogQ0ZGTF9JRm9ybUZpbGxlcjo6Q0ZGTF9JRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSA6CiAgICAgbV9wQXBwKHBBcHApLAotICAgIG1fYk5vdGlmeWluZyhmYWxzZSkKKyAgICBtX2JOb3RpZnlpbmcoRkFMU0UpCiB7CiB9CiAKQEAgLTMzLDE3ICszMywxNyBAQAogICAgIG1fTWFwcy5jbGVhcigpOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6OkFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6QW5ub3RfSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsQ1BERlNES19Bbm5vdCogcEFubm90LCBDUERGX1BvaW50IHBvaW50KQogewogICAgIENQREZfUmVjdCByYyA9IHBBbm5vdC0+R2V0UmVjdCgpOwogICAgIGlmKHJjLkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogRlhfUkVDVCBDRkZMX0lGb3JtRmlsbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKIAogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CkBAIC02NSw3ICs2NSw3IEBACiAKICAgICBpZiAoSXNWaXNpYmxlKHBXaWRnZXQpKQogICAgIHsKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQorICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwRm9ybUZpbGxlci0+SXNWYWxpZCgpKQogICAgICAgICAgICAgewpAQCAtOTgsNyArOTgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQorICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCiAgICAgICAgICAgICBwRm9ybUZpbGxlci0+T25EcmF3RGVhY3RpdmUocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKQEAgLTExMCw3ICsxMTAsNyBAQAogCiB2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7CiAgICAgfQpAQCAtMTE4LDcgKzExOCw3IEBACiAKIHZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uTG9hZChwQW5ub3QpOwogICAgIH0KQEAgLTEyNiw3ICsxMjYsNyBAQAogCiB2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uRGVsZXRlKHBBbm5vdCk7CiAgICAgfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKIAogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKQEAgLTE1OCwxMyArMTU4LDEzIEBACiAgICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyLCBmYSwgcFBhZ2VWaWV3ICk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCiAgICAgICAgICAgICAvL2lmICggIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkgKSByZXR1cm47CiAKICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBuVmFsdWVBZ2UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCiAgICAgewogICAgICAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90KTsKICAgICB9CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0KSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKICAgICAgICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKQEAgLTIwMiwxMyArMjAyLDEzIEBACiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKIAogICAgICAgICAgICAgLy9pZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkpIHJldHVybjsKIAogICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKQorICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjE2LDEzICsyMTYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCiAgICAgewogICAgICAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QpOwogICAgIH0KIH0KIAotYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgaWYgKEFubm90X0hpdFRlc3QocFBhZ2VWaWV3LCBwQW5ub3QsIHBvaW50KSAmJiBwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uRG93bikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwogICAgICAgICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CkBAIC0yNDUsMTMgKzI0NSwxMyBAQAogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZ3MpOwogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWdzKTsKICAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24sIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKIAotICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkgcmV0dXJuIFRSVUU7CiAKICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1OSwxNSArMjU5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwpAQCAtMjg2LDI0ICsyODYsMjQgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgYm9vbCBiUmV0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgYlJldCA9IHBGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCiAgICAgaWYgKHBEb2N1bWVudC0+R2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkKICAgICB7Ci0gICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBiUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgICBGWF9CT09MIGJSZXNldCA9IEZBTFNFOwogICAgICAgICBPbkJ1dHRvblVwKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCxuRmxhZ3MpOwotICAgICAgICBpZiAoYkV4aXQpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYkV4aXQpIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSZXNldCwgYm9vbCYgYkV4aXQsRlhfVUlOVCBuRmxhZykKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIHsKICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwogICAgICAgICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIApAQCAtMzI2LDEyMiArMzI2LDEyMiBAQAogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCiAgICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGJSZXNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYlJlc2V0ID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCiAgICAgLy9jaGFuZ2UgY3Vyc29yCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSwgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogICAgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9UYWIpCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgaWYgKCFwQW5ub3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIApAQCAtNDUwLDcgKzQ1MCw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKICAgICAgICAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKIAogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CkBAIC00NjMsMTUgKzQ2MywxNSBAQAogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKLSAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIHRydWUpOwotICAgICAgICAgICAgaWYoIXBGb3JtRmlsbGVyKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBUUlVFKTsKKyAgICAgICAgICAgIGlmKCFwRm9ybUZpbGxlcikgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCiAgICAgICAgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCisgICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzksMTggKzQ3OSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgdHJ1ZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25TZXRGb2N1cyhwQW5ub3QsIG5GbGFnKTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKIHsKLSAgICBpZighcEFubm90KSByZXR1cm4gZmFsc2U7CisgICAgaWYoIXBBbm5vdCkgcmV0dXJuIEZBTFNFOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQogICAgIHsKICAgICAgICAgaWYgKHBGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKSkKICAgICAgICAgewpAQCAtNDk5LDcgKzQ5OSw3IEBACiAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246Okxvc2VGb2N1cykpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKQEAgLTUxMiwyNCArNTEyLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhKTsKIAogICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIHJldHVybiBwV2lkZ2V0LT5Jc1Zpc2libGUoKTsKIH0KIAotYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCkBAIC01MzgsMTIgKzUzOCwxMiBAQAogICAgIHJldHVybiAobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWTsKIH0KIAotYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCiAgICAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKQEAgLTU1NywxMCArNTU3LDEwIEBACiAgICAgICAgICAgICAgICAgKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKICAgICAgICAgICAgIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX01PRElGWSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1DRkZMX0Zvcm1GaWxsZXIqIENGRkxfSUZvcm1GaWxsZXI6OkdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBib29sIGJSZWdpc3RlcikKK0NGRkxfRm9ybUZpbGxlciogQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKQogewogICAgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOwogICAgIGlmIChpdCAhPSBtX01hcHMuZW5kKCkpCkBAIC02NjYsNyArNjY2LDcgQEAKICAgICB9CiAKICAgICBGWF9GTE9BVCBmRmFjdEhlaWdodCA9IDA7Ci0gICAgYm9vbCBiQm90dG9tID0gdHJ1ZTsKKyAgICBGWF9CT09MIGJCb3R0b20gPSBUUlVFOwogICAgIEZYX0ZMT0FUIGZNYXhMaXN0Qm94SGVpZ2h0ID0gMDsKICAgICBpZiAoZlBvcHVwTWF4ID4gRkZMX01BWExJU1RCT1hIRUlHSFQpCiAgICAgewpAQCAtNjg1LDI2ICs2ODUsMjYgQEAKICAgICBpZiAoZkJvdHRvbSA+IGZNYXhMaXN0Qm94SGVpZ2h0KQogICAgIHsKICAgICAgICAgZkZhY3RIZWlnaHQgPSBmTWF4TGlzdEJveEhlaWdodDsKLSAgICAgICAgYkJvdHRvbSA9IHRydWU7CisgICAgICAgIGJCb3R0b20gPSBUUlVFOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBpZiAoZlRvcCA+IGZNYXhMaXN0Qm94SGVpZ2h0KQogICAgICAgICB7CiAgICAgICAgICAgICBmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OwotICAgICAgICAgICAgYkJvdHRvbSA9IGZhbHNlOworICAgICAgICAgICAgYkJvdHRvbSA9IEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGZUb3AgPiBmQm90dG9tKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZlRvcDsKLSAgICAgICAgICAgICAgICBiQm90dG9tID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYkJvdHRvbSA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZkJvdHRvbTsKLSAgICAgICAgICAgICAgICBiQm90dG9tID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiQm90dG9tID0gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTcxMywxNCArNzEzLDE0IEBACiAgICAgZlBvcHVwUmV0ID0gZkZhY3RIZWlnaHQ7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJDLCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKICAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CkBAIC03MjgsMTEgKzcyOCwxMSBAQAogICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICBmYS5iV2lsbENvbW1pdCA9IHRydWU7Ci0gICAgICAgICAgICBmYS5iS2V5RG93biA9IHRydWU7Ci0gICAgICAgICAgICBmYS5iUkMgPSB0cnVlOworICAgICAgICAgICAgZmEuYldpbGxDb21taXQgPSBUUlVFOworICAgICAgICAgICAgZmEuYktleURvd24gPSBUUlVFOworICAgICAgICAgICAgZmEuYlJDID0gVFJVRTsKIAotICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpOworICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpOwogICAgICAgICAgICAgQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwogCiAgICAgICAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7CkBAIC03NDQsMTkgKzc0NCwxOSBAQAogICAgICAgICAgICAgYlJDID0gZmEuYlJDOwogLy8gICAgICAgICAgYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIAotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wmIGJSQywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKICAgICAgICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKIAogICAgICAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKQEAgLTc2OCwxMCArNzY4LDEwIEBACiAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CiAgICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJLZXlEb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIGZhLmJSQyA9IHRydWU7CisgICAgICAgICAgICBmYS5iS2V5RG93biA9IFRSVUU7CisgICAgICAgICAgICBmYS5iUkMgPSBUUlVFOwogCi0gICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSk7CisgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSk7CiAgICAgICAgICAgICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgZmEpOwpAQCAtNzgzLDEyICs3ODMsMTIgQEAKICAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKIC8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7CiAKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DYWxjdWxhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX2JOb3RpZnlpbmcpCiAgICAgewpAQCAtODA2LDExICs4MDYsMTEgQEAKIAogLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwogCi0gICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX2JOb3RpZnlpbmcpCiAgICAgewpAQCAtODI0LDcgKzgyNCw3IEBACiAgICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKIAotICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwSW50ZXJGb3JtLT5PbkZvcm1hdChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgYkZvcm1hdGVkKTsKIAogLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwpAQCAtODMzLDE1ICs4MzMsMTUgQEAKIAogICAgICAgICBpZiAoYkZvcm1hdGVkKQogICAgICAgICB7Ci0gICAgICAgICAgICBwSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgc1ZhbHVlLmNfc3RyKCksIHRydWUpOworICAgICAgICAgICAgcEludGVyRm9ybS0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKICAgICAgICAgICAgIHBJbnRlckZvcm0tPlVwZGF0ZUZpZWxkKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICB9CiB9CiAKLWJvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwpAQCAtODUwLDI2ICs4NTAsMjYgQEAKICAgICBpZihwUGFnZVZpZXcpCiAgICAgICAgIHJldHVybiBwUGFnZVZpZXctPklzVmFsaWRBbm5vdChwQW5ub3QtPkdldFBERkFubm90KCkpOwogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLAordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLCBib29sICYgYlJDLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKICAgICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CiAgICAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIGZhbHNlKTsKKyAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwogICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKICAgICAgICAgaWYgKHBEYXRhLT5wV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CiAgICAgICAgICAgICBpbnQgbkFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAgICAgICAgICAgICBpbnQgblZhbHVlQWdlID0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKQEAgLTg4Miw4ICs4ODIsOCBAQAogICAgICAgICAgICAgZmEuc0NoYW5nZSA9IHN0ckNoYW5nZTsKICAgICAgICAgICAgIGZhLnNDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwogICAgICAgICAgICAgZmEuYktleURvd24gPSBiS2V5RG93bjsKLSAgICAgICAgICAgIGZhLmJXaWxsQ29tbWl0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmYS5iUkMgPSB0cnVlOworICAgICAgICAgICAgZmEuYldpbGxDb21taXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGZhLmJSQyA9IFRSVUU7CiAgICAgICAgICAgICBmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7CiAgICAgICAgICAgICBmYS5uU2VsRW5kID0gblNlbEVuZDsKIApAQCAtODk1LDggKzg5NSw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocERhdGEtPnBQYWdlVmlldywgcERhdGEtPnBXaWRnZXQpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTA0LDQ4ICs5MDQsNDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENQV0xfV25kKiBwV25kID0gcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBEYXRhLT5wUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwRGF0YS0+cFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CiAgICAgICAgICAgICAgICAgICAgIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBXbmQtPkdldEF0dGFjaGVkRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZmEuYlJDKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgYlJDID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJSQyA9IEZBTFNFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzdG9yZVN0YXRlKHBEYXRhLT5wUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgICAgICBiUkMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYlJDID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHBEb2N1bWVudC0+R2V0Rm9jdXNBbm5vdCgpICE9IHBEYXRhLT5wV2lkZ2V0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPkNvbW1pdERhdGEocERhdGEtPnBQYWdlVmlldyxuRmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkICAgIENGRkxfSUZvcm1GaWxsZXI6Ok9uQWZ0ZXJLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBib29sICYgYkV4aXQsRlhfRFdPUkQgbkZsYWcpCit2b2lkICAgIENGRkxfSUZvcm1GaWxsZXI6Ok9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKICAgICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CiAgICAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIGZhbHNlKTsKKyAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwogICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAogICAgIGlmICghYkVkaXRPckxpc3QpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCmluZGV4IGVmMTEzZGEuLmMxMDVjZmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCkBAIC03Myw3ICs3Myw3IEBACiAJewogCQltX09yaWdpblNlbGVjdGlvbnMuY2xlYXIoKTsKIAotCQlib29sIGJTZXRDYXJldCA9IGZhbHNlOworCQlGWF9CT09MIGJTZXRDYXJldCA9IEZBTFNFOwogCQlmb3IgKGludDMyX3QgaT0wLHN6PW1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGk8c3o7IGkrKykKIAkJewogCQkJaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkKQEAgLTgxLDcgKzgxLDcgQEAKIAkJCQlpZiAoIWJTZXRDYXJldCkKIAkJCQl7CiAJCQkJCXBXbmQtPlNldENhcmV0KGkpOwotCQkJCQliU2V0Q2FyZXQgPSB0cnVlOworCQkJCQliU2V0Q2FyZXQgPSBUUlVFOwogCQkJCX0KIAkJCQlwV25kLT5TZWxlY3QoaSk7CiAJCQkJbV9PcmlnaW5TZWxlY3Rpb25zLmluc2VydChpKTsKQEAgLTEwNiwyMyArMTA2LDIzIEBACiB9CiAKIAotYm9vbAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorRlhfQk9PTAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1ib29sIENGRkxfTGlzdEJveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitGWF9CT09MIENGRkxfTGlzdEJveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgICBDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOwogICAgIGlmICghcExpc3RCb3gpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKSB7CiAgICAgICAgIGludCBuU2VsQ291bnQgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcExpc3RCb3gtPkdldENvdW50KCk7IGkgPCBzejsgKytpKSB7CiAgICAgICAgICAgICBpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1fT3JpZ2luU2VsZWN0aW9ucy5jb3VudChpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICAgICAgICAgICAgICBuU2VsQ291bnQrKzsKICAgICAgICAgICAgIH0KQEAgLTEzNyw3ICsxMzcsNyBAQAogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKwlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKIAl7CiAJCUNGWF9JbnRBcnJheSBhT2xkU2VsZWN0LCBhTmV3U2VsZWN0OwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAogCQlpbnQzMl90IG5OZXdUb3BJbmRleCA9IHBMaXN0Qm94LT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKIAotCQltX3BXaWRnZXQtPkNsZWFyU2VsZWN0aW9uKGZhbHNlKTsKKwkJbV9wV2lkZ2V0LT5DbGVhclNlbGVjdGlvbihGQUxTRSk7CiAKIAkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKQogCQl7CkBAIC0xNjIsMTkgKzE2MiwxOSBAQAogCQkJewogCQkJCWlmIChwTGlzdEJveC0+SXNJdGVtU2VsZWN0ZWQoaSkpCiAJCQkJewotCQkJCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihpLCB0cnVlLCBmYWxzZSk7CisJCQkJCW1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKGksIFRSVUUsIEZBTFNFKTsKIAkJCQkJYU5ld1NlbGVjdC5BZGQoaSk7CiAJCQkJfQogCQkJfQogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24ocExpc3RCb3gtPkdldEN1clNlbCgpLCB0cnVlLCBmYWxzZSk7CisJCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihwTGlzdEJveC0+R2V0Q3VyU2VsKCksIFRSVUUsIEZBTFNFKTsKIAkJCWFOZXdTZWxlY3QuQWRkKHBMaXN0Qm94LT5HZXRDdXJTZWwoKSk7CiAJCX0KIAogCQltX3BXaWRnZXQtPlNldFRvcFZpc2libGVJbmRleChuTmV3VG9wSW5kZXgpOwotCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHRydWUpOworCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOwogCQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAJCVNldENoYW5nZU1hcmsoKTsKIAl9CkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorCQkJaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJCQl7CiAJCQkJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAkJCQlpbnQzMl90IG5DdXJTZWwgPSBwTGlzdEJveC0+R2V0Q3VyU2VsKCk7CkBAIC0yMzAsNyArMjMwLDcgQEAKIHsKIAlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisJaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCQlmb3IgKGludDMyX3QgaT0wLHN6PXBMaXN0Qm94LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCiAJCXsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAKIHZvaWQgQ0ZGTF9MaXN0Qm94OjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogCXsKIAkJZm9yIChpbnQgaT0wLHN6PW1fU3RhdGUuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAJCQlwTGlzdEJveC0+U2VsZWN0KG1fU3RhdGVbaV0pOwogCX0KIH0KIAotQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXN0b3JlVmFsdWUpCitDUFdMX1duZCogQ0ZGTF9MaXN0Qm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKIHsKIAlpZiAoYlJlc3RvcmVWYWx1ZSkKIAkJU2F2ZVN0YXRlKHBQYWdlVmlldyk7CkBAIC0yNjMsMTcgKzI2MywxNyBAQAogCWlmIChiUmVzdG9yZVZhbHVlKQogCXsKIAkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisJCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CiAJfQogCWVsc2UKLQkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpOworCQlwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CiAKIAltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAKIAlyZXR1cm4gcFJldDsKIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKQogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKQEAgLTI4OSw3ICsyODksNyBAQAogCQkJaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZykpCiAJCQl7CiAJCQkJRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotCQkJCW1fYlZhbGlkID0gZmFsc2U7CisJCQkJbV9iVmFsaWQgPSBGQUxTRTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCmluZGV4IGZkYzRiY2YuLjU4YTIyMDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcApAQCAtMTUsNyArMTUsNyBAQAogLy8jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDgwMCkKIAogQ0ZGTF9Ob3RpZnk6OkNGRkxfTm90aWZ5KENGRkxfRm9ybUZpbGxlciAqIHBGb3JtRmlsbGVyKSA6Ci0JbV9iRG9BY3Rpb25pbmcoZmFsc2UpLAorCW1fYkRvQWN0aW9uaW5nKEZBTFNFKSwKIAltX25Ob3RpZnlGbGFnKDApCiB7CiAJQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwpAQCAtMzYsMTE2ICszNiwxMTYgQEAKIAltX25Ob3RpZnlGbGFnIC0tOwogfQogCi1ib29sIENGRkxfTm90aWZ5OjpPbk1vdXNlVXAoYm9vbCAmIGJFeGl0KQorRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZVVwKEZYX0JPT0wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25VcCwgYkV4aXQpOworCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkJ1dHRvblVwLCBiRXhpdCk7CiAJQWZ0ZXJOb3RpZnkoKTsKIAlyZXR1cm4gYlJldDsKIH0KIAotYm9vbCBDRkZMX05vdGlmeTo6T25Nb3VzZURvd24oYm9vbCAmIGJFeGl0KQorRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZURvd24oRlhfQk9PTCAmIGJFeGl0KQogewogCUJlZm9yZU5vdGlmeSgpOwotCWJvb2wgYlJldCA9IGZhbHNlOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkJ1dHRvbkRvd24sIGJFeGl0KTsKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25Eb3duLCBiRXhpdCk7CiAJQWZ0ZXJOb3RpZnkoKTsKIAlyZXR1cm4gYlJldDsKIH0KIAotYm9vbCBDRkZMX05vdGlmeTo6T25Nb3VzZUVudGVyKGJvb2wgJiBiRXhpdCkKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFbnRlcihGWF9CT09MICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRW50ZXIsIGJFeGl0KTsKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpDdXJzb3JFbnRlciwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLWJvb2wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFeGl0KGJvb2wgJiBiRXhpdCkKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFeGl0KEZYX0JPT0wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpDdXJzb3JFeGl0LCBiRXhpdCk7CisJRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRXhpdCwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLWJvb2wgQ0ZGTF9Ob3RpZnk6Ok9uU2V0Rm9jdXMoYm9vbCAmIGJFeGl0KQorRlhfQk9PTCBDRkZMX05vdGlmeTo6T25TZXRGb2N1cyhGWF9CT09MICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6R2V0Rm9jdXMsIGJFeGl0KTsKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpHZXRGb2N1cywgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLWJvb2wgQ0ZGTF9Ob3RpZnk6Ok9uS2lsbEZvY3VzKGJvb2wgJiBiRXhpdCkKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2lsbEZvY3VzKEZYX0JPT0wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpMb3NlRm9jdXMsIGJFeGl0KTsKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpMb3NlRm9jdXMsIGJFeGl0KTsKIAlBZnRlck5vdGlmeSgpOwogCXJldHVybiBiUmV0OwogfQogCi1ib29sIENGRkxfTm90aWZ5OjpPbkNhbGN1bGF0ZSgpCitGWF9CT09MIENGRkxfTm90aWZ5OjpPbkNhbGN1bGF0ZSgpCiB7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0ZGTF9Ob3RpZnk6Ok9uRm9ybWF0KGludCBpQ29tbWl0S2V5KQorRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Gb3JtYXQoaW50IGlDb21taXRLZXkpCiB7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0ZGTF9Ob3RpZnk6Ok9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsCi0JCQkJCQkJICAgYm9vbCBiU2hpZnQsIGJvb2wgYldpbGxDb21taXQsIGJvb2wgYkZpZWxkRnVsbCwKLQkJCQkJCQkgICBpbnQmIG5TZWxTdGFydCwgaW50JiBuU2VsRW5kLCBib29sJiBiUkMpCitGWF9CT09MIENGRkxfTm90aWZ5OjpPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKwkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLAorCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsCisJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgRlhfQk9PTCYgYlJDKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENGRkxfTm90aWZ5OjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLAotCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwKLQkJCQkJCQkJCSAgIGJvb2wgYlNoaWZ0LCBib29sICYgYlJDKQorRlhfQk9PTCBDRkZMX05vdGlmeTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKKwkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCisJCQkJCQkJCQkgICBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCAmIGJSQykKIHsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgYm9vbCAmIGJFeGl0KQorRlhfQk9PTAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KQogewogICAgIGlmIChtX2JEb0FjdGlvbmluZykKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0FjdGlvbiBhY3Rpb247CiAgICAgaWYgKCFGaW5kQUFjdGlvbihlQUFULCBhY3Rpb24pKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIG1fYkRvQWN0aW9uaW5nID0gdHJ1ZTsKKyAgICBtX2JEb0FjdGlvbmluZyA9IFRSVUU7CiAgICAgRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxhY3Rpb24sYkV4aXQpOwotICAgIG1fYkRvQWN0aW9uaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgbV9iRG9BY3Rpb25pbmcgPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbAlDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLCBib29sJiBiRXhpdCkKK0ZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbiwgRlhfQk9PTCYgYkV4aXQpCiB7Ci0JaWYgKCFFeGVjdXRlQWN0aW9uKGVBQVQsYWN0aW9uLGJFeGl0KSkgcmV0dXJuIGZhbHNlOwotCWlmIChiRXhpdCkgcmV0dXJuIHRydWU7CisJaWYgKCFFeGVjdXRlQWN0aW9uKGVBQVQsYWN0aW9uLGJFeGl0KSkgcmV0dXJuIEZBTFNFOworCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CiAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlQWN0aW9uVHJlZShlQUFULHN1YmFjdGlvbixiRXhpdCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFFeGVjdXRlQWN0aW9uVHJlZShlQUFULHN1YmFjdGlvbixiRXhpdCkpIHJldHVybiBGQUxTRTsKIAkJaWYgKGJFeGl0KSBicmVhazsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sCUNGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pCitGWF9CT09MCUNGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pCiB7Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQorRlhfQk9PTCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQogewogCUNQREZfQWN0aW9uIE15QWN0aW9uOwogCkBAIC0xNTQsMjAgKzE1NCwyMCBAQAogCQlNeUFjdGlvbiA9IGFhY3Rpb24uR2V0QWN0aW9uKGVBQVQpOwogCX0KIAllbHNlCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCiAKIAlpZiAoTXlBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpVbmtub3duKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWFjdGlvbiA9IE15QWN0aW9uOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLGJvb2wmIGJFeGl0KQorRlhfQk9PTAlDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sRlhfQk9PTCYgYkV4aXQpCiB7Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIC8vI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6IDQ4MDApCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKaW5kZXggNDRlNGVkMC4uYTVkZjQ4OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIH0KIAogCi1ib29sCUNGRkxfUHVzaEJ1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitGWF9CT09MCUNGRkxfUHVzaEJ1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAKaW5kZXggZTdiMzM0OC4uMWY3M2U4YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcApAQCAtMzEsMTkgKzMxLDE5IEBACiAJcmV0dXJuIHBXbmQ7CiB9CiAKLWJvb2wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCitGWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQogewogCXN3aXRjaCAobktleUNvZGUpCiAJewogCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgogCWNhc2UgRldMX1ZLRVlfU3BhY2U6Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKIAl9CiB9CiAKLWJvb2wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitGWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXN3aXRjaCAobkNoYXIpCiAJewpAQCAtNTYsNjEgKzU2LDYxIEBACiAJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CiAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JCQlib29sIGJSZXNldCA9IGZhbHNlOwotCQkJYm9vbCBiRXhpdCA9IGZhbHNlOworCQkJRlhfQk9PTCBiUmVzZXQgPSBGQUxTRTsKKwkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKIAogCQkJcElGb3JtRmlsbGVyLT5PbkJ1dHRvblVwKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7CiAKLQkJCWlmIChiUmVzZXQpIHJldHVybiB0cnVlOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gdHJ1ZTsKKwkJCWlmIChiUmVzZXQpIHJldHVybiBUUlVFOworCQkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKIAogCQkJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAotCQkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQotCQkJCXBXbmQtPlNldENoZWNrKHRydWUpOworCQkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorCQkJCXBXbmQtPlNldENoZWNrKFRSVUUpOwogCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAl9CiB9CiAKLWJvb2wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7Ci0JCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKLQkJCXBXbmQtPlNldENoZWNrKHRydWUpOworCQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiAqIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisJCQlwV25kLT5TZXRDaGVjayhUUlVFKTsKIAotCQlpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncykpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldyxuRmxhZ3MpKSByZXR1cm4gRkFMU0U7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ0ZGTF9SYWRpb0J1dHRvbjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitGWF9CT09MCUNGRkxfUmFkaW9CdXR0b246OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisJaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogCXsKIAkJcmV0dXJuIHBXbmQtPklzQ2hlY2tlZCgpICE9IG1fcFdpZGdldC0+SXNDaGVja2VkKCk7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDRkZMX1JhZGlvQnV0dG9uOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKwlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCi0JCWJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKwkJRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwogCiAJCWlmIChiTmV3Q2hlY2tlZCkKIAkJewpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQl9CiAJCX0KIAotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CisJCW1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIEZBTFNFKTsKIAkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCQlTZXRDaGFuZ2VNYXJrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKaW5kZXggYTg2OTVmNC4uYTRiODcyNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCkBAIC0xMjksNyArMTI5LDcgQEAKIH0KIAogCi1ib29sIENGRkxfVGV4dEZpZWxkOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK0ZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIHN3aXRjaCAobkNoYXIpCiAgICAgewpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgICAgICAgICAgIGlmIChtX2JWYWxpZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKyAgICAgICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKICAgICAgICAgICAgICAgICAgICAgcFduZC0+U2V0Rm9jdXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTE1Miw5ICsxNTIsOSBAQAogICAgICAgICAgICAgICAgIGlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTYyLDM1ICsxNjIsMzUgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKICAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gICAgICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LFRSVUUpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAotYm9vbCBDRkZMX1RleHRGaWVsZDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICAgICAgcmV0dXJuIHBFZGl0LT5HZXRUZXh0KCkgIT0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQorICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgewogICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNOZXdWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKIAotICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHNOZXdWYWx1ZSwgZmFsc2UpOwotICAgICAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHRydWUpOworICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHNOZXdWYWx1ZSwgRkFMU0UpOworICAgICAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOwogICAgICAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAgICAgICAgIFNldENoYW5nZU1hcmsoKTsKICAgICB9CkBAIC0yMDIsNyArMjAyLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpCiAgICAgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhLmJGaWVsZEZ1bGwgPSBwV25kLT5Jc1RleHRGdWxsKCk7CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLSAgICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICAgICAgewogICAgICAgICAgICAgZmEuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwogICAgICAgICB9CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpCiAgICAgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICAgICAgaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQogICAgICAgICB7CiAgICAgICAgICAgICBwRWRpdC0+U2V0Rm9jdXMoKTsKICAgICAgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogfQogCiAKLWJvb2wgQ0ZGTF9UZXh0RmllbGQ6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQogewogICAgIHN3aXRjaCAodHlwZSkKQEAgLTI2MiwxNCArMjYyLDE0IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCisgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKICAgICB7CiAgICAgICAgIHBXbmQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKICAgICAgICAgbV9TdGF0ZS5zVmFsdWUgPSBwV25kLT5HZXRUZXh0KCk7CkBAIC0yODAsMTQgKzI4MCwxNCBAQAogewogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCisgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQogICAgIHsKICAgICAgICAgcFduZC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZS5jX3N0cigpKTsKICAgICAgICAgcFduZC0+U2V0U2VsKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOwogICAgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfVGV4dEZpZWxkOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSkKK0NQV0xfV25kKiBDRkZMX1RleHRGaWVsZDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpCiB7CiAgICAgaWYgKGJSZXN0b3JlVmFsdWUpCiAgICAgICAgIFNhdmVTdGF0ZShwUGFnZVZpZXcpOwpAQCAtMjk5LDEwICsyOTksMTAgQEAKICAgICBpZiAoYlJlc3RvcmVWYWx1ZSkKICAgICB7CiAgICAgICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOwotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOworICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKTsKKyAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOwogCiAgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHBCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKWJzVVRGVGV4dC5jX3N0cigpOwotICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgdHJ1ZSk7CisgICAgICAgIG1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCBUUlVFKTsKIAogICAgICAgICBwRWRpdC0+U2V0RWRpdE5vdGlmeSh0aGlzKTsKICAgICAgICAgLy9wVW5kby0+QmVnaW5FZGl0KHBEb2N1bWVudCk7CkBAIC0zMzgsMTkgKzMzOCwxOSBAQAogCiB9CiAKLWJvb2wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX1RleHRGaWVsZDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRkZMX1RleHRGaWVsZDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwCmluZGV4IDBlNTAyMmMuLjhkMmQ3NmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9VdGlscy5jcHAKQEAgLTQxLDkgKzQxLDkgQEAKIAlyZXR1cm4gY3JOZXc7CiB9CiAKLWJvb2wgQ0ZGTF9VdGlsczo6VHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopCitGWF9CT09MIENGRkxfVXRpbHM6OlRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKQogewotCWlmICghcE9iaikgcmV0dXJuIGZhbHNlOworCWlmICghcE9iaikgcmV0dXJuIEZBTFNFOwogCiAJRlhfRFdPUkQJZHdPYmpOdW0gPSBwT2JqLT5HZXRPYmpOdW0oKTsKIAlzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkKQEAgLTcxLDcgKzcxLDcgQEAKICAJCQkJLy9UUkFDRShjc0tleSArICJcbiIpOwogCQkJCWlmICghcEVsZW1lbnQpIGJyZWFrOwogCQkJCVRyYWNlT2JqZWN0KHBFbGVtZW50KTsKLQkJCX13aGlsZSAodHJ1ZSk7CisJCQl9d2hpbGUgKFRSVUUpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMDcsOCArMTA3LDggQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JaWYgKGR3T2JqTnVtID09IDApIHJldHVybiBmYWxzZTsKKwlpZiAoZHdPYmpOdW0gPT0gMCkgcmV0dXJuIEZBTFNFOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcAppbmRleCA4NWViYTU1Li5iMjZkMmFmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAJCW1fcGZpbGVBdmFpbCA9IHBmaWxlQXZhaWw7CiAJfQogCi0JdmlydHVhbCBib29sCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkKKwl2aXJ0dWFsIEZYX0JPT0wJCQlJc0RhdGFBdmFpbCggRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKQogCXsKIAkJcmV0dXJuIG1fcGZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9wZmlsZUF2YWlsLCBvZmZzZXQsIHNpemUpOwogCX0KQEAgLTQ4LDcgKzQ4LDcgQEAKIAkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsKIAl9CiAKLQl2aXJ0dWFsIGJvb2wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQorCXZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiAJewogCQlyZXR1cm4gbV9wRmlsZUFjY2Vzcy0+bV9HZXRCbG9jayhtX3BGaWxlQWNjZXNzLT5tX1BhcmFtLCBvZmZzZXQsICh1aW50OF90KilidWZmZXIsIHNpemUpOwogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcAppbmRleCA3NDEzNDc0Li4wZDhkYjQxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiB7CiBwdWJsaWM6CiAgICAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8peyBtX3Vuc3BfaW5mbyA9IHVuc3BfaW5mbzt9Ci0vLyAgYm9vbCBOZWVkVG9QYXVzZU5vdygpOworLy8gIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKTsKICAgICB2b2lkIFJlcG9ydEVycm9yKGludCBuRXJyb3JUeXBlKTsKIAogcHJpdmF0ZToKQEAgLTM1LDI1ICszNSwyNSBAQAogICAgIGRlbGV0ZSBwQWRhcHRlcjsKIH0KIAotYm9vbCBGUERGX1VuU3VwcG9ydEVycm9yKGludCBuRXJyb3IpCitGWF9CT09MIEZQREZfVW5TdXBwb3J0RXJyb3IoaW50IG5FcnJvcikKIHsKICAgICBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgKiBwQWRhcHRlciA9IChDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgKilDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFByaXZhdGVEYXRhKCh2b2lkICopRlBERlNES19VTlNVUFBPUlRfQ0FMTCk7CiAKICAgICBpZighcEFkYXB0ZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIHBBZGFwdGVyLT5SZXBvcnRFcnJvcihuRXJyb3IpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbykKIHsKICAgICBpZiAoIXVuc3BfaW5mbyB8fCB1bnNwX2luZm8tPnZlcnNpb24hPTEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gbmV3IENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcih1bnNwX2luZm8pOwogCiAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5TZXRQcml2YXRlRGF0YSgodm9pZCAqKUZQREZTREtfVU5TVVBQT1JUX0NBTEwscEFkYXB0ZXIsICZGcmVlVW5zdXBwb3J0SW5mbyk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0Fubm90KiBwUERGQW5ub3QpCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogfQogCi1ib29sIENoZWNrU2hhcmVkRm9ybShDWE1MX0VsZW1lbnQgKiBwRWxlbWVudCwgQ0ZYX0J5dGVTdHJpbmcgY2JOYW1lKQorRlhfQk9PTCBDaGVja1NoYXJlZEZvcm0oQ1hNTF9FbGVtZW50ICogcEVsZW1lbnQsIENGWF9CeXRlU3RyaW5nIGNiTmFtZSkKIHsKICAgICBpbnQgY291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRycygpOwogICAgIGludCBpPTA7CkBAIC0xNDMsMTAgKzE0MywxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDWE1MX0VsZW1lbnQgKiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChpKTsKICAgICAgICAgICAgIGlmKENoZWNrU2hhcmVkRm9ybShwQ2hpbGQsIGNiTmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSkKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICBDaGVja1NoYXJlZEZvcm0ocEVsZW1lbnQsICJ3b3JrZmxvd1R5cGUiKTsKIAogICAgIC8vIFhGQSBGb3JtcwotICAgIENQREZfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShwRG9jLGZhbHNlKTsKKyAgICBDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocERvYyxGQUxTRSk7CiAgICAgaWYgKHBJbnRlckZvcm0tPkhhc1hGQUZvcm0oKSkKICAgICB7CiAgICAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19YRkFGT1JNKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCmluZGV4IDNkYmIwYTEuLjk4OGQ3ZjQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcApAQCAtMTMsMTcgKzEzLDE3IEBACiBlbnVtIEZQREZfVFlQRSB7IE1BWCwgTUlOIH07CiBlbnVtIEZQREZfVkFMVUUgeyBUT1AsIExFRlQsIFJJR0hULCBCT1RUT00gfTsKIAotYm9vbCBJc1ZhbGlhYmxlUmVjdChDUERGX1JlY3QgcmVjdCwgQ1BERl9SZWN0IHJjUGFnZSkKK0ZYX0JPT0wgSXNWYWxpYWJsZVJlY3QoQ1BERl9SZWN0IHJlY3QsIENQREZfUmVjdCByY1BhZ2UpCiB7CiAJaWYgKCByZWN0LmxlZnQgLSByZWN0LnJpZ2h0ID4gMC4wMDAwMDFmIHx8CiAJCSByZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gMC4wMDAwMDFmKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWlmIChyZWN0LmxlZnQgPT0gMC4wZiAmJgogCQlyZWN0LnRvcCA9PSAwLjBmICYmCiAJCXJlY3QucmlnaHQgPT0gMC4wZiAmJgogCQlyZWN0LmJvdHRvbSA9PSAwLjBmKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWlmICghcmNQYWdlLklzRW1wdHkoKSkKIAl7CkBAIC0zMSwxNyArMzEsMTcgQEAKIAkJCXJlY3QucmlnaHQgLSByY1BhZ2UucmlnaHQgPiAxMC4wMDAwMDFmIHx8CiAJCQlyZWN0LnRvcCAtIHJjUGFnZS50b3AgPiAxMC4wMDAwMDFmIHx8CiAJCQlyZWN0LmJvdHRvbSAtIHJjUGFnZS5ib3R0b20gPCAtMTAuMDAwMDAxZikKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sIEdldENvbnRlbnRzUmVjdCggQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCitGWF9CT09MIEdldENvbnRlbnRzUmVjdCggQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCiB7CiAJQ1BERl9QYWdlKiBwUERGUGFnZSA9IG5ldyBDUERGX1BhZ2U7Ci0JcFBERlBhZ2UtPkxvYWQoIHBEb2MsIHBEaWN0LCBmYWxzZSApOworCXBQREZQYWdlLT5Mb2FkKCBwRG9jLCBwRGljdCwgRkFMU0UgKTsKIAlwUERGUGFnZS0+UGFyc2VDb250ZW50KCk7CiAKIAlGWF9QT1NJVElPTiBwb3MgPSBwUERGUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwpAQCAtNjQsNyArNjQsNyBAQAogCX0KIAogCWRlbGV0ZSBwUERGUGFnZTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKIAkJCXNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOwotCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOworCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJCUNGWF9CeXRlU3RyaW5nIHNTdHJlYW0gPSAicVxuIjsKIAkJCUNGWF9CeXRlU3RyaW5nIHNCb2R5ID0gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwogCQkJc1N0cmVhbSA9IHNTdHJlYW0gKyBzQm9keSArICJcblEiOwotCQkJcENvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOworCQkJcENvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwogCQkJcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCQlDRlhfQnl0ZVN0cmluZyBzU3RyZWFtOwogCQlzU3RyZWFtLkZvcm1hdCgicSAxIDAgMCAxIDAgMCBjbSAvJXMgRG8gUSIsIGtleS5jX3N0cigpKTsKLQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOworCQlwTmV3Q29udGVudHMtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CiAJfQogfQogCkBAIC01MzgsNyArNTM4LDcgQEAKIAkJc1RlbXAuRm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsIG0uZSwgbS5mLCBzRm9ybU5hbWUuY19zdHIoKSk7CiAJCXNTdHJlYW0gKz0gc1RlbXA7CiAKLQkJcE5ld1hPYmplY3QtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CisJCXBOZXdYT2JqZWN0LT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwogCX0KIAlwUGFnZURpY3QtPlJlbW92ZUF0KCAiQW5ub3RzIiApOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCmluZGV4IDBjNDlkZjYuLjRlYzczYWMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCkBAIC0yOSwyMCArMjksMjAgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7CiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CisgICAgICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZWxzZQogICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7CiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CisgICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZW5kaWYKICAgICBJRlNES19QQVVTRV9BZGFwdGVyIElQYXVzZUFkYXB0ZXIocGF1c2UpOwogCiAgICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLGZhbHNlLCAmSVBhdXNlQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLEZBTFNFLCAmSVBhdXNlQWRhcHRlcik7CiAKICAgICBpZiAocENvbnRleHQtPm1fcFJlbmRlcmVyKQogICAgICAgICByZXR1cm4gQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpUb0ZQREZTdGF0dXMocENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCmluZGV4IDY5MTcxMDcuLmNmMGNkZDkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwCkBAIC0yMCwxNiArMjAsMTYgQEAKIAkJZGVsZXRlIHRoaXM7CiAJfQogCi0JdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlCisJdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlCiAJewogCQlpZiAobV9wSW5mby0+RW51bUZvbnRzKSB7CiAJCQltX3BJbmZvLT5FbnVtRm9udHMobV9wSW5mbywgcE1hcHBlcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBUUlVFOwogCQl9Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAotCXZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgIG92ZXJyaWRlCisJdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KSAgb3ZlcnJpZGUKIAl7CiAJCWlmIChtX3BJbmZvLT5NYXBGb250KQogCQkJcmV0dXJuIG1fcEluZm8tPk1hcEZvbnQobV9wSW5mbywgd2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGZhbWlseSwgJmlFeGFjdCk7CkBAIC01MCwyNSArNTAsMjUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JdmlydHVhbCBib29sCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpICBvdmVycmlkZQorCXZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSAgb3ZlcnJpZGUKIAl7Ci0JCWlmIChtX3BJbmZvLT5HZXRGYWNlTmFtZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisJCWlmIChtX3BJbmZvLT5HZXRGYWNlTmFtZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAJCUZYX0RXT1JEIHNpemUgPSBtX3BJbmZvLT5HZXRGYWNlTmFtZShtX3BJbmZvLCBoRm9udCwgTlVMTCwgMCk7Ci0JCWlmIChzaXplID09IDApIHJldHVybiBmYWxzZTsKKwkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIEZBTFNFOwogCQljaGFyKiBidWZmZXIgPSBGWF9BbGxvYyhjaGFyLCBzaXplKTsKIAkJc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOwogCQluYW1lID0gQ0ZYX0J5dGVTdHJpbmcoYnVmZmVyLCBzaXplKTsKIAkJRlhfRnJlZShidWZmZXIpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JdmlydHVhbCBib29sCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSAgb3ZlcnJpZGUKKwl2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpICBvdmVycmlkZQogCXsKIAkJaWYgKG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KSB7CiAJCQljaGFyc2V0ID0gbV9wSW5mby0+R2V0Rm9udENoYXJzZXQobV9wSW5mbywgaEZvbnQpOwotCQkJcmV0dXJuIHRydWU7CisJCQlyZXR1cm4gVFJVRTsKIAkJfQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKIAl2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpICBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKaW5kZXggY2YxN2YyMC4uYTI5ZGI1YSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCkBAIC00Miw3ICs0Miw3IEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApCiB7CiAJaWYoIXBhZ2UpCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwogCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCUNQREZfQXJyYXkqIHBBcnJheSA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIk1lZGlhQm94Iik7CkBAIC01MiwxNSArNTIsMTUgQEAKIAkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CiAJCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CiAJCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKQogewogCWlmKCFwYWdlKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKIAlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJDcm9wQm94Iik7CkBAIC03MCwxNSArNzAsMTUgQEAKIAkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CiAJCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CiAJCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCkKIHsKIAlpZighcGFnZSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKIAl0ZXh0QnVmPDwicSAiOwpAQCAtOTksMTkgKzk5LDE5IEBACiAJaWYoIXBDb250ZW50T2JqKQogCQlwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5KCJDb250ZW50cyIpIDogTlVMTDsKIAlpZighcENvbnRlbnRPYmopCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbmV3IENQREZfRGljdGlvbmFyeTsKIAlDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLDAsIHBEaWMpOwotCXBTdHJlYW0tPlNldERhdGEodGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRTaXplKCksIGZhbHNlLCBmYWxzZSk7CisJcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKIAlDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwogCWlmKCFwRG9jKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKIAogCXBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogCUNQREZfU3RyZWFtKiBwRW5kU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsMCwgcERpYyk7Ci0JcEVuZFN0cmVhbS0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopIiBRIiwgMiwgZmFsc2UsIGZhbHNlKTsKKwlwRW5kU3RyZWFtLT5TZXREYXRhKChjb25zdCB1aW50OF90KikiIFEiLCAyLCBGQUxTRSwgRkFMU0UpOwogCXBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBFbmRTdHJlYW0pOwogCiAJQ1BERl9BcnJheSogcENvbnRlbnRBcnJheSA9IE5VTEw7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkJfQogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlT2JqX1RyYW5zZm9ybUNsaXBQYXRoKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCxkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQpAQCAtMjA1LDcgKzIwNSw3IEBACiAJQ1BERl9QYXRoIFBhdGg7CiAJUGF0aC5HZXRNb2RpZnkoKTsKIAlQYXRoLkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLQlwTmV3Q2xpcFBhdGgtPkFwcGVuZFBhdGgoUGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgZmFsc2UpOworCXBOZXdDbGlwUGF0aC0+QXBwZW5kUGF0aChQYXRoLCBGWEZJTExfQUxURVJOQVRFLCBGQUxTRSk7CiAJcmV0dXJuIHBOZXdDbGlwUGF0aDsKIH0KIApAQCAtMjgyLDcgKzI4Miw3IEBACiAJfQogCUNQREZfRGljdGlvbmFyeSogcERpYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CiAJQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwwLCBwRGljKTsKLQlwU3RyZWFtLT5TZXREYXRhKHN0ckNsaXAuR2V0QnVmZmVyKCksIHN0ckNsaXAuR2V0U2l6ZSgpLCBmYWxzZSwgZmFsc2UpOworCXBTdHJlYW0tPlNldERhdGEoc3RyQ2xpcC5HZXRCdWZmZXIoKSwgc3RyQ2xpcC5HZXRTaXplKCksIEZBTFNFLCBGQUxTRSk7CiAJQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKIAlpZighcERvYykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcAppbmRleCBlMjY0MDY5Li5mNzUxOTdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcApAQCAtMjA4LDEzICsyMDgsMTMgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsIGludCogc3RhcnRQb3MsIEZQREZfTElOSyogbGlua0Fubm90KQogewogICAgIGlmKCFwYWdlIHx8ICFzdGFydFBvcyB8fCAhbGlua0Fubm90KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKICAgICBpZighcFBhZ2UtPm1fcEZvcm1EaWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CiAgICAgaWYoIXBBbm5vdHMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIGZvciAoaW50IGkgPSAqc3RhcnRQb3M7IGkgPCAoaW50KXBBbm5vdHMtPkdldENvdW50KCk7IGkrKykgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwogICAgICAgICBpZiAoIXBEaWN0IHx8IHBEaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpCkBAIC0yMjIsMjMgKzIyMiwyMyBAQAogICAgICAgICBpZihwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpLkVxdWFsKEZYX0JTVFJDKCJMaW5rIikpKSB7CiAgICAgICAgICAgICAqc3RhcnRQb3MgPSBpICsgMTsKICAgICAgICAgICAgICpsaW5rQW5ub3QgPSAoRlBERl9MSU5LKXBEaWN0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsIEZTX1JFQ1RGKiByZWN0KQogewogICAgIGlmKCFsaW5rQW5ub3QgfHwgIXJlY3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKICAgICBDUERGX1JlY3QgcnQgPSBwQW5ub3REaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJSZWN0IikpOwogICAgIHJlY3QtPmxlZnQgPSBydC5sZWZ0OwogICAgIHJlY3QtPmJvdHRvbSA9IHJ0LmJvdHRvbTsKICAgICByZWN0LT5yaWdodCA9IHJ0LnJpZ2h0OwogICAgIHJlY3QtPnRvcCA9IHJ0LnRvcDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KQpAQCAtMjU1LDEyICsyNTUsMTIgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsIGludCBxdWFkSW5kZXgsIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKQogewogICAgIGlmKCFsaW5rQW5ub3QgfHwgIXF1YWRQb2ludHMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwQW5ub3REaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUXVhZFBvaW50cyIpKTsKICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgIGlmIChxdWFkSW5kZXggPCAwIHx8IHF1YWRJbmRleCA+PSAoaW50KXBBcnJheS0+R2V0Q291bnQoKS84IHx8ICgocXVhZEluZGV4KjgrNykgPj0gKGludClwQXJyYXktPkdldENvdW50KCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICBxdWFkUG9pbnRzLT54MSA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KTsKICAgICAgICAgcXVhZFBvaW50cy0+eTEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCsxKTsKICAgICAgICAgcXVhZFBvaW50cy0+eDIgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCsyKTsKQEAgLTI2OSw5ICsyNjksOSBAQAogICAgICAgICBxdWFkUG9pbnRzLT55MyA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzUpOwogICAgICAgICBxdWFkUG9pbnRzLT54NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzYpOwogICAgICAgICBxdWFkUG9pbnRzLT55NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCo4KzcpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIERMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywgRlBERl9CWVRFU1RSSU5HIHRhZywKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcAppbmRleCBjZWMzZTIyLi45NmNmYmE0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZShGUERGX1BBR0UqIHBhZ2VzLCBpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcykKIHsKIAlpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcykKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlJRlhfRmlsZVJlYWQqIHBGaWxlID0gbmV3IENQREZfQ3VzdG9tQWNjZXNzKGZpbGVBY2Nlc3MpOwogCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwpAQCAtMzMsNyArMzMsNyBAQAogCX0KIAlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SnBlZ0ltYWdlKHBGaWxlKTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiAKQEAgLTQxLDcgKzQxLDcgQEAKIAkJCQkJCQkJCQkJCSBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQogewogCWlmICghaW1hZ2Vfb2JqZWN0KQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAlDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKIAlwSW1nT2JqLT5tX01hdHJpeC5hID0gKEZYX0ZMT0FUKWE7CiAJcEltZ09iai0+bV9NYXRyaXguYiA9IChGWF9GTE9BVCliOwpAQCAtNTAsMTMgKzUwLDEzIEBACiAJcEltZ09iai0+bV9NYXRyaXguZSA9IChGWF9GTE9BVCllOwogCXBJbWdPYmotPm1fTWF0cml4LmYgPSAoRlhfRkxPQVQpZjsKIAlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gIHRydWU7CisJcmV0dXJuICBUUlVFOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCxGUERGX0JJVE1BUCBiaXRtYXApCiB7CiAJaWYgKCFpbWFnZV9vYmplY3QgfHwgIWJpdG1hcCkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJQ0ZYX0RJQml0bWFwKiBwQm1wID0gTlVMTDsKIAlwQm1wID0gKENGWF9ESUJpdG1hcCopYml0bWFwOwogCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwpAQCAtNjYsOCArNjYsOCBAQAogCQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZXNbaW5kZXhdOwogCQlwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSxOVUxMKTsKIAl9Ci0JcEltZ09iai0+bV9wSW1hZ2UtPlNldEltYWdlKHBCbXAsZmFsc2UpOworCXBJbWdPYmotPm1fcEltYWdlLT5TZXRJbWFnZShwQm1wLEZBTFNFKTsKIAlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKaW5kZXggODIzNmNiMi4uMTJjMmNjZTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcApAQCAtMjE1LDcgKzIxNSw3IEBACiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpCiB7Ci0JaWYoIXBhZ2UpIHJldHVybiBmYWxzZTsKKwlpZighcGFnZSkgcmV0dXJuIEZBTFNFOwogCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwogCiAJcmV0dXJuIHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKQEAgLTIyMywzNCArMjIzLDM0IEBACiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZU9ial9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFT0JKRUNUIHBhZ2VPYmplY3QpCiB7Ci0JaWYoIXBhZ2VPYmplY3QpIHJldHVybiBmYWxzZTsKKwlpZighcGFnZU9iamVjdCkgcmV0dXJuIEZBTFNFOwogCUNQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlT2JqZWN0OwogCiAJY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlOwogCWludCBibGVuZF90eXBlID0gcEdlbmVyYWxTdGF0ZSA/IHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOwotCWlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgcmV0dXJuIHRydWU7CisJaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSByZXR1cm4gVFJVRTsKIAogCUNQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7Ci0JaWYocFNNYXNrRGljdCkgcmV0dXJuIHRydWU7CisJaWYocFNNYXNrRGljdCkgcmV0dXJuIFRSVUU7CiAKIAlpZihwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhICE9IDEuMGYpCi0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAogCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKQogCXsKIAkJaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhICE9IDEuMGYpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBUUlVFOwogCX0KIAogCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKQogCXsKIAkJQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqOwogCQlpZihwRm9ybU9iai0+bV9wRm9ybSAmJiAocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpKQotCQkJcmV0dXJuIHRydWU7CisJCQlyZXR1cm4gVFJVRTsKIAkJaWYocEZvcm1PYmotPm1fcEZvcm0gJiYgKCEocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpICYmIChwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCkpKQotCQkJcmV0dXJuIHRydWU7CisJCQlyZXR1cm4gVFJVRTsKIAl9Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSkKQEAgLTI1OSwxMiArMjU5LDEyIEBACiAJaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKQogCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKIAl7Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAlDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUgQ0cocFBhZ2UpOwogCUNHLkdlbmVyYXRlQ29udGVudCgpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCmluZGV4IDIxYTQ0MWMuLmQyMWQ1ZDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcApAQCAtMjgsNyArMjgsNyBAQAogQ1BERlNES19QYWdlVmlldyogRm9ybUhhbmRsZVRvUGFnZVZpZXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlKQogewogICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7Ci0gICAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldygoQ1BERl9QYWdlKilwYWdlLCB0cnVlKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldygoQ1BERl9QYWdlKilwYWdlLCBUUlVFKSA6IG51bGxwdHI7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQpAQCAtNDEsNyArNDEsNyBAQAogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKikgcGFnZTsKIAogICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDUERGX0ludGVyRm9ybT4gcEludGVyRm9ybSgKLSAgICAgICAgbmV3IENQREZfSW50ZXJGb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgZmFsc2UpKTsKKyAgICAgICAgbmV3IENQREZfSW50ZXJGb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgRkFMU0UpKTsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwSW50ZXJGb3JtLT5HZXRDb250cm9sQXRQb2ludCgKICAgICAgICAgcFBhZ2UsIChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIGlmICghcEZvcm1DdHJsKQpAQCAtODQsNyArODQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25Nb3VzZU1vdmUocHQsIG1vZGlmaWVyKTsKQEAgLTk0LDcgKzk0LDcgQEAKIHsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvbkRvd24ocHQsIG1vZGlmaWVyKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKQEAgLTExNCw3ICsxMTQsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5RG93bihuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiB7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25LZXlVcChuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQpAQCAtMTMyLDcgKzEzMiw3IEBACiB7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgcmV0dXJuIHBQYWdlVmlldy0+T25DaGFyKG5DaGFyLCBtb2RpZmllcik7CiB9CkBAIC0xNDEsNyArMTQxLDcgQEAKIHsKICAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOwogICAgIGlmICghcFNES0RvYykKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICByZXR1cm4gcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QoMCk7CiB9CkBAIC0yMTYsNyArMjE2LDcgQEAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQogewogICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKSkKLSAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChUUlVFKTsKIH0KIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLCBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKQEAgLTIyOSwxMCArMjI5LDEwIEBACiAgICAgICAgIHJldHVybjsKIAogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIEZBTFNFKTsKICAgICBpZiAocFBhZ2VWaWV3KQogICAgIHsKLSAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChmYWxzZSk7CisgICAgICAgIHBQYWdlVmlldy0+U2V0VmFsaWQoRkFMU0UpOwogICAgICAgICAvLyBSZU1vdmVQYWdlVmlldygpIHRha2VzIGNhcmUgb2YgdGhlIGRlbGV0ZSBmb3IgdXMuCiAgICAgICAgIHBTREtEb2MtPlJlTW92ZVBhZ2VWaWV3KHBQYWdlKTsKICAgICB9CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRTREtEb2N1bWVudCgpOwogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIEZBTFNFKTsKICAgICBpZihwUGFnZVZpZXcpCiAgICAgewogICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50ICpwRW52ID0gcFNES0RvYy0+R2V0RW52KCk7CkBAIC0yOTMsOCArMjkzLDggQEAKIAogICAgICAgICBDUERGX0FBY3Rpb24gYWEgPSBwUGFnZURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwogCi0gICAgICAgIGJvb2wgYkV4aXN0T0FBY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgYm9vbCBiRXhpc3RDQUFjdGlvbiA9IGZhbHNlOworICAgICAgICBGWF9CT09MIGJFeGlzdE9BQWN0aW9uID0gRkFMU0U7CisgICAgICAgIEZYX0JPT0wgYkV4aXN0Q0FBY3Rpb24gPSBGQUxTRTsKICAgICAgICAgaWYgKEZQREZQQUdFX0FBQ1RJT05fT1BFTiA9PSBhYVR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJFeGlzdE9BQWN0aW9uID0gYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCmluZGV4IDFlZjY5YmYuLjQwZDU2YjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCkBAIC0xNSwxNCArMTUsMTQgQEAKICAgICBDUERGX1BhZ2VPcmdhbml6ZXIoKTsKICAgICB+Q1BERl9QYWdlT3JnYW5pemVyKCk7CiAKLSAgICBib29sIFBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsIENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MpOwotICAgIGJvb2wgRXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAorICAgIEZYX0JPT0wgUERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYyk7CisgICAgRlhfQk9PTCBFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Xb3JkQXJyYXkqIG5QYWdlTnVtLAogICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCk7CiAgICAgQ1BERl9PYmplY3QqIFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuU3JjdGFnKTsKLSAgICBib29sIFVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKKyAgICBGWF9CT09MIFVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE51bWJlck1hcCogcE9iak51bWJlck1hcCk7CiAgICAgRlhfRFdPUkQgR2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKQEAgLTM5LDIxICszOSwyMSBAQAogewogfQogCi1ib29sIENQREZfUGFnZU9yZ2FuaXplcjo6UERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKK0ZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpQREZEb2NJbml0KENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYykKIHsKICAgICBpZiAoIXBEZXN0UERGRG9jIHx8ICFwU3JjUERGRG9jKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcE5ld1Jvb3QgPSBwRGVzdFBERkRvYy0+R2V0Um9vdCgpOwogICAgIGlmICghcE5ld1Jvb3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgLy9TZXQgdGhlIGRvY3VtZW50IGluZm9ybWF0aW9uLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIENQREZfRGljdGlvbmFyeSogREluZm9EaWN0ID0gcERlc3RQREZEb2MtPkdldEluZm8oKTsKICAgICBpZiAoIURJbmZvRGljdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDRlhfQnl0ZVN0cmluZyBwcm9kdWNlcnN0cjsKICAgICBwcm9kdWNlcnN0ci5Gb3JtYXQoIlBERml1bSIpOwpAQCAtODksMTAgKzg5LDEwIEBACiAgICAgICAgIHBOZXdQYWdlcy0+U2V0QXQoIkNvdW50IiwgbmV3IENQREZfTnVtYmVyKDApKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUERGX1BhZ2VPcmdhbml6ZXI6OkV4cG9ydFBhZ2UoQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYywKK0ZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCkKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNQYWdlRGljdCA9CiAgICAgICAgICAgICBwU3JjUERGRG9jLT5HZXRQYWdlKG5QYWdlTnVtLT5HZXRBdChpKSAtIDEpOwogICAgICAgICBpZiAoIXBTcmNQYWdlRGljdCB8fCAhcEN1clBhZ2VEaWN0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIC8vIENsb25lIHRoZSBwYWdlIGRpY3Rpb25hcnkvLy8vLy8vLy8vLwogICAgICAgICBGWF9QT1NJVElPTiBTcmNQb3MgPSBwU3JjUGFnZURpY3QtPkdldFN0YXJ0UG9zKCk7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgaWYgKCFwQ3VyUGFnZURpY3QtPktleUV4aXN0KCJSZXNvdXJjZXMiKSkgewogICAgICAgICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJSZXNvdXJjZXMiKTsKICAgICAgICAgICAgIGlmICghcEluaGVyaXRhYmxlKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOwogICAgICAgICB9CiAgICAgICAgIC8vMyBDcm9wQm94ICAvL09wdGlvbmFsCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgKytjdXJwYWdlOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBDUERGX09iamVjdCogQ1BERl9QYWdlT3JnYW5pemVyOjpQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKApAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLWJvb2wgQ1BERl9QYWdlT3JnYW5pemVyOjpVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosCitGWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6VXBkYXRlUmVmZXJlbmNlKENQREZfT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROdW1iZXJNYXAqIHBPYmpOdW1iZXJNYXApCiB7CkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gKENQREZfUmVmZXJlbmNlKilwT2JqOwogICAgICAgICAgICAgRlhfRFdPUkQgbmV3b2JqbnVtID0gR2V0TmV3T2JqSWQocERvYywgcE9iak51bWJlck1hcCwgcFJlZmVyZW5jZSk7CiAgICAgICAgICAgICBpZiAobmV3b2JqbnVtID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIHBSZWZlcmVuY2UtPlNldFJlZihwRG9jLCBuZXdvYmpudW0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwTmV4dE9iaiwgcERvYywgcE9iak51bWJlck1hcCkpCiAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KGtleSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTI2MCw5ICsyNjAsOSBAQAogICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE5leHRPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKCFwTmV4dE9iaikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgaWYgKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBPYmpOdW1iZXJNYXApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNzEsOSArMjcxLDkgQEAKICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CiAgICAgICAgICAgICBpZiAocERpY3QpIHsKICAgICAgICAgICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwRGljdCwgcERvYywgcE9iak51bWJlck1hcCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIEZYX0RXT1JEIENQREZfUGFnZU9yZ2FuaXplcjo6R2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7ICsraSkgewogICAgICAgICAgICAgaWYgKGNiQ29tcGFyZVN0cmluZy5GaW5kKHJhbmdzdHJpbmdbaV0pID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JNaWRSYW5nZTsKICAgICAgICAgaW50IG5TdHJpbmdGcm9tID0gMDsKQEAgLTM1NSwyMyArMzU1LDIzIEBACiAgICAgICAgICAgICBpZiAobk1pZCA9PSAtMSkgewogICAgICAgICAgICAgICAgIGxvbmcgbFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UpOwogICAgICAgICAgICAgICAgIGlmIChsUGFnZU51bSA8PSAwIHx8IGxQYWdlTnVtID4gbkNvdW50KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICBwYWdlQXJyYXktPkFkZCgoRlhfV09SRClsUGFnZU51bSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludCBuU3RhcnRQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLk1pZCgwLCBuTWlkKSk7CiAgICAgICAgICAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgICAgICAgICArK25NaWQ7CiAgICAgICAgICAgICAgICAgaW50IG5FbmQgPSBjYk1pZFJhbmdlLkdldExlbmd0aCgpIC0gbk1pZDsKICAgICAgICAgICAgICAgICBpZiAobkVuZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgICAgIGludCBuRW5kUGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZS5NaWQobk1pZCwgbkVuZCkpOwogICAgICAgICAgICAgICAgIGlmIChuU3RhcnRQYWdlTnVtIDwgMCB8fAogICAgICAgICAgICAgICAgICAgICBuU3RhcnRQYWdlTnVtID5uRW5kUGFnZU51bSB8fAogICAgICAgICAgICAgICAgICAgICBuRW5kUGFnZU51bSA+IG5Db3VudCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5TdGFydFBhZ2VOdW07IGkgPD0gbkVuZFBhZ2VOdW07ICsraSkgewogICAgICAgICAgICAgICAgICAgICBwYWdlQXJyYXktPkFkZChpKTsKQEAgLTM4MCw3ICszODAsNyBAQAogICAgICAgICAgICAgblN0cmluZ0Zyb20gPSBuU3RyaW5nVG8gKyAxOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLApAQCAtMzg5LDE0ICszODksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKIHsKICAgICBpZiAoIWRlc3RfZG9jIHx8ICFzcmNfZG9jKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENGWF9Xb3JkQXJyYXkgcGFnZUFycmF5OwogICAgIENQREZfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERl9Eb2N1bWVudCopc3JjX2RvYzsKICAgICBpbnQgbkNvdW50ID0gcFNyY0RvYy0+R2V0UGFnZUNvdW50KCk7CiAgICAgaWYgKHBhZ2VyYW5nZSkgewogICAgICAgICBpZiAoIVBhcnNlclBhZ2VSYW5nZVN0cmluZyhwYWdlcmFuZ2UsJnBhZ2VBcnJheSxuQ291bnQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG5Db3VudDsgKytpKSB7CiAgICAgICAgICAgICBwYWdlQXJyYXkuQWRkKGkpOwpAQCAtNDIxLDEyICs0MjEsMTIgQEAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNEaWN0ID0gcFNyY0RvYy0+R2V0Um9vdCgpOwogICAgIHBTcmNEaWN0ID0gcFNyY0RpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOzsKICAgICBpZiAoIXBTcmNEaWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRG9jdW1lbnQqIHBEc3REb2MgPSAoQ1BERl9Eb2N1bWVudCopZGVzdF9kb2M7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRHN0RGljdCA9IHBEc3REb2MtPkdldFJvb3QoKTsKICAgICBpZiAoIXBEc3REaWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcERzdERpY3QtPlNldEF0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpLCBwU3JjRGljdC0+Q2xvbmUodHJ1ZSkpOwotICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgcERzdERpY3QtPlNldEF0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpLCBwU3JjRGljdC0+Q2xvbmUoVFJVRSkpOworICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCmluZGV4IDhlNWU0NzYuLmRkZDZmNmUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKQEAgLTE5LDggKzE5LDggQEAKIAogcHVibGljOgogICAgIENGWF9JRmlsZVdyaXRlKCk7Ci0gICAgYm9vbCAgICAgICAgICAgICBJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBGWF9CT09MICAgICAgICAgICAgIEluaXQoIEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZVN0cnVjdCApOworICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgUmVsZWFzZSgpIG92ZXJyaWRlIHt9CiAKIHByb3RlY3RlZDoKQEAgLTMyLDIyICszMiwyMiBAQAogICAgIG1fcEZpbGVXcml0ZVN0cnVjdCA9IE5VTEw7CiB9CiAKLWJvb2wgQ0ZYX0lGaWxlV3JpdGU6OkluaXQoIEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZVN0cnVjdCApCitGWF9CT09MIENGWF9JRmlsZVdyaXRlOjpJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKQogewogICAgIGlmICghcEZpbGVXcml0ZVN0cnVjdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBwRmlsZVdyaXRlU3RydWN0OwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKK0ZYX0JPT0wgQ0ZYX0lGaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQogewogICAgIGlmICghbV9wRmlsZVdyaXRlU3RydWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIG1fcEZpbGVXcml0ZVN0cnVjdC0+V3JpdGVCbG9jayggbV9wRmlsZVdyaXRlU3RydWN0LCBwRGF0YSwgc2l6ZSApOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBGUERGX0JPT0wgX0ZQREZfRG9jX1NhdmUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGUsRlBERl9EV09SRCBmbGFncywgRlBERl9CT09MIGJTZXRWZXJzaW9uLApAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBGaWxlTWFrZXIuUmVtb3ZlU2VjdXJpdHkoKTsKICAgICB9CiAgICAgQ0ZYX0lGaWxlV3JpdGUqIHBTdHJlYW1Xcml0ZSA9IE5VTEw7Ci0gICAgYm9vbCBiUmV0OworICAgIEZYX0JPT0wgYlJldDsKICAgICBwU3RyZWFtV3JpdGUgPSBuZXcgQ0ZYX0lGaWxlV3JpdGU7CiAgICAgcFN0cmVhbVdyaXRlLT5Jbml0KCBwRmlsZVdyaXRlICk7CiAgICAgYlJldCA9IEZpbGVNYWtlci5DcmVhdGUocFN0cmVhbVdyaXRlLCBmbGFncyk7CkBAIC04MiwxMiArODIsMTIgQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncyApCiB7Ci0gICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgZmFsc2UgLCAwKTsKKyAgICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCBGQUxTRSAsIDApOwogfQogCiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVXaXRoVmVyc2lvbiggICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKICAgICBGUERGX0RXT1JEIGZsYWdzLCBpbnQgZmlsZVZlcnNpb24pCiB7Ci0gICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgdHJ1ZSAsIGZpbGVWZXJzaW9uKTsKKyAgICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCBUUlVFICwgZmlsZVZlcnNpb24pOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCmluZGV4IDRmZWNlZjQuLjRhNjU3MTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKQEAgLTE1NCwxMyArMTU0LDEzIEBACiB9CiBETExFWFBPUlQgRlBERl9CT09MCVNURENBTEwgRlBERlRleHRfRmluZE5leHQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQogewotCWlmICghaGFuZGxlKSByZXR1cm4gZmFsc2U7CisJaWYgKCFoYW5kbGUpIHJldHVybiBGQUxTRTsKIAlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwogCXJldHVybgl0ZXh0cGFnZUZpbmQtPkZpbmROZXh0KCk7CiB9CiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZFByZXYoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQogewotCWlmICghaGFuZGxlKSByZXR1cm4gZmFsc2U7CisJaWYgKCFoYW5kbGUpIHJldHVybiBGQUxTRTsKIAlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwogCXJldHVybgl0ZXh0cGFnZUZpbmQtPkZpbmRQcmV2KCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKaW5kZXggNWE3MmU4Zi4uOWVkZDVkOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcApAQCAtMjEsMTUgKzIxLDE1IEBACiAgICAgICAgIG1fRmlsZUFjY2VzcyA9ICpwRmlsZUFjY2VzczsKIH0KIAotYm9vbCBDUERGX0N1c3RvbUFjY2Vzczo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK0ZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiB7CiAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX1NBRkVfRklMRVNJWkUgbmV3UG9zID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRklMRVNJWkUsIHNpemVfdD4oc2l6ZSk7CiAgICAgbmV3UG9zICs9IG9mZnNldDsKICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBtX0ZpbGVBY2Nlc3MubV9HZXRCbG9jayhtX0ZpbGVBY2Nlc3MubV9QYXJhbSwgb2Zmc2V0LCh1aW50OF90KikgYnVmZmVyLCBzaXplKTsKIH0KQEAgLTU5LDkgKzU5LDkgQEAKICAgICBzd2l0Y2gocG9saWN5KQogICAgIHsKICAgICBjYXNlIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUzoKLSAgICAgICAgcmV0dXJuIChmb3hpdF9zYW5kYm94X3BvbGljeSAmIDB4MDEpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICByZXR1cm4gKGZveGl0X3NhbmRib3hfcG9saWN5ICYgMHgwMSkgPyBUUlVFIDogRkFMU0U7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogfQogCkBAIC04MSwxMSArODEsMTEgQEAKICAgICB2aXJ0dWFsIEZUX0ZhY2UgRmluZFN1YnN0Rm9udCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLCAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBQREYgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCAgICAvLyBbSU5dIE9yaWdpbmFsIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcnVlVHlwZSwgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRydWVUeXBlIG9yIFR5cGUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUcnVlVHlwZSBvciBUeXBlMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLCAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gUERGIGZvbnQgZmxhZ3MgKHNlZSBQREYgUmVmZXJlbmNlIHNlY3Rpb24gNS43LjEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfd2VpZ2h0LCAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBvcmlnaW5hbCBmb250IHdlaWdodC4gMCBmb3Igbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gY29kZSBwYWdlIGZvciBjaGFyc2V0IChzZWUgV2luMzIgR2V0QUNQKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgICAgICAgICAgLy8gW09VVF0gU3Vic3QgZm9udCBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICApOwogCkBAIC0xOTEsMTggKzE5MSwxOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgUmVsZWFzZSgpIHtkZWxldGUgdGhpczt9CiAgICAgdmlydHVhbCBGWF9GSUxFU0laRSAgICAgR2V0U2l6ZSgpIHtyZXR1cm4gbV9zaXplO30KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgewogICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBuZXdQb3MgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9GSUxFU0laRSwgc2l6ZV90PihzaXplKTsKICAgICAgICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgICAgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IChGWF9EV09SRCltX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX3BCdWYrb2Zmc2V0LCBzaXplKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIHByaXZhdGU6CiAgICAgdWludDhfdCogbV9wQnVmOwpAQCAtMjQ0LDE0ICsyNDQsMTQgQEAKIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pCiB7Ci0gICAgaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gZmFsc2U7CisgICAgaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gRkFMU0U7CiAgICAgKmZpbGVWZXJzaW9uID0gMDsKICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvYzsKICAgICBDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+R2V0UGFyc2VyKCk7CiAgICAgaWYoIXBQYXJzZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICpmaWxlVmVyc2lvbiA9IHBQYXJzZXItPkdldEZpbGVWZXJzaW9uKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vIGphYmRlbG1hbGVrOiBjaGFuZ2VkIHJldHVybiB0eXBlIGZyb20gRlhfRFdPUkQgdG8gYnVpbGQgb24gTGludXggKGFuZCBtYXRjaCBoZWFkZXIpLgpAQCAtMzMyLDcgKzMzMiw3IEBACiAKICNpZm5kZWYgX1dJTjMyX1dDRQogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IE5VTEw7Ci0gICAgYm9vbCBiQmFja2dyb3VuZEFscGhhTmVlZGVkPWZhbHNlOworICAgIEZYX0JPT0wgYkJhY2tncm91bmRBbHBoYU5lZWRlZD1GQUxTRTsKICAgICBiQmFja2dyb3VuZEFscGhhTmVlZGVkID0gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOwogICAgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKQogICAgIHsKQEAgLTM1Miw3ICszNTIsNyBAQAogICAgICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9XaW5kb3dzRGV2aWNlKGRjKTsKIAogICAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgdHJ1ZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCBUUlVFLCBOVUxMKTsKIAogICAgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKQogICAgIHsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAgICAgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CiAgICAgICAgICAgICAgICAgcERzdC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9SZ2IzMik7CiAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBEc3QtPkdldEJ1ZmZlcigpLCAtMSwgcGl0Y2gqc2l6ZV95KTsKLSAgICAgICAgICAgICAgICBwRHN0LT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgc2l6ZV94LCBzaXplX3ksIHBCaXRtYXAsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsIE5VTEwpOworICAgICAgICAgICAgICAgIHBEc3QtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBzaXplX3gsIHNpemVfeSwgcEJpdG1hcCwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgV2luREMuU3RyZXRjaERJQml0cyhwRHN0LDAsMCxzaXplX3gsc2l6ZV95KTsKICAgICAgICAgICAgICAgICBkZWxldGUgcERzdDsKICAgICAgICAgICAgIH0KQEAgLTQ5MiwyMCArNDkyLDIwIEBACiAgICAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfU2tpYURldmljZTsKIAogICAgIGlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLHRydWUpOworICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOwogICAgIGVsc2UKICAgICAgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwogI2Vsc2UKICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOwogCiAgICAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0gICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsdHJ1ZSk7CisgICAgICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7CiAgICAgZWxzZQogICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CiAjZW5kaWYKIAogICAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgdHJ1ZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCBUUlVFLCBOVUxMKTsKIAogICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOwpAQCAtNjUzLDcgKzY1Myw3IEBACiB9CiAKIHZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLGJvb2wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCiB7CiAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAgICAgaWYgKHBQYWdlID09IE5VTEwpIHJldHVybjsKQEAgLTcwNSw4ICs3MDUsOCBAQAogCiAgICAgaWYgKGZsYWdzICYgRlBERl9BTk5PVCkgewogICAgICAgICBwQ29udGV4dC0+bV9wQW5ub3RzID0gbmV3IENQREZfQW5ub3RMaXN0KHBQYWdlKTsKLSAgICAgICAgYm9vbCBiUHJpbnRpbmcgPSBwQ29udGV4dC0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKLSAgICAgICAgcENvbnRleHQtPm1fcEFubm90cy0+RGlzcGxheUFubm90cyhwUGFnZSwgcENvbnRleHQtPm1fcENvbnRleHQsIGJQcmludGluZywgJm1hdHJpeCwgdHJ1ZSwgTlVMTCk7CisgICAgICAgIEZYX0JPT0wgYlByaW50aW5nID0gcENvbnRleHQtPm1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVk7CisgICAgICAgIHBDb250ZXh0LT5tX3BBbm5vdHMtPkRpc3BsYXlBbm5vdHMocFBhZ2UsIHBDb250ZXh0LT5tX3BDb250ZXh0LCBiUHJpbnRpbmcsICZtYXRyaXgsIFRSVUUsIE5VTEwpOwogICAgIH0KIAogICAgIHBDb250ZXh0LT5tX3BSZW5kZXJlciA9IG5ldyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoCkBAIC03MjAsMjMgKzcyMCwyMyBAQAogewogICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CiAgICAgaWYocERvYyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jLCBwRGljdCk7CiAgICAgKndpZHRoID0gcGFnZS5HZXRQYWdlV2lkdGgoKTsKICAgICAqaGVpZ2h0ID0gcGFnZS5HZXRQYWdlSGVpZ2h0KCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQogewogICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIXBEb2MpIHJldHVybiBUUlVFOwogICAgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKICAgICByZXR1cm4gdmlld1JlZi5QcmludFNjYWxpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCmluZGV4IDdiYTIyN2YuLjE0NTU1OWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcApAQCAtMjQsMTQgKzI0LDE0IEBACiB9CiAKIC8vZG9jdW1lbnQgb3BlbgotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCiAvL2RvY3VtZW50IG9wZW4KLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKK0ZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKIAkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJaWYgKEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKQEAgLTQwLDE0ICs0MCwxNCBAQAogCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQogCQl7CiAJCQlSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KHBEb2N1bWVudCwgY3NKU05hbWUsIHN3SlMpOwotCQkJcmV0dXJuIHRydWU7CisJCQlyZXR1cm4gVFJVRTsKIAkJfQogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitGWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKIAkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkKIHsKQEAgLTU5LDQ4ICs1OSw0OCBAQAogCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQogCQl7CiAJCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAogCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCitGWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jdW1lbnQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAogCQkJCQkJCQkJCQkgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oYWN0aW9uLCBlVHlwZSwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsgKnBCb29rTWFyaywgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsgKnBCb29rTWFyaywgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlQm9va01hcmsoYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rTWFyaywgbGlzdCk7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVTY3JlZW5BY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpOwogfQogCi1ib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQ0ZYX1B0ckxpc3QgbGlzdDsKIAlyZXR1cm4gRXhlY3V0ZUxpbmtBY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCi1ib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAJCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkKIHsKQEAgLTEwOCwxMiArMTA4LDEyIEBACiAJcmV0dXJuIEV4ZWN1dGVGaWVsZEFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCk7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKK0ZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwogCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWxpc3QuQWRkVGFpbChwRGljdCk7CiAKQEAgLTEzOCwyMCArMTM4LDIwIEBACiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKHN1YmFjdGlvbiwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIEZBTFNFOwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKIAkJCQkJCQkJCQkJCSAgQ0ZYX1B0ckxpc3QmIGxpc3QpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAogCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwogCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWxpc3QuQWRkVGFpbChwRGljdCk7CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCQkJCXBDb250ZXh0LT5PbkxpbmtfTW91c2VVcChwRG9jdW1lbnQpOwogCiAJCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCWJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKKwkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CiAJCQkJaWYgKCFiUmV0KQogCQkJCXsKIAkJCQkJLy8gRklYTUU6IHJldHVybiBlcnJvci4KQEAgLTE5MywyMCArMTkzLDIwIEBACiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUxpbmtBY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gZmFsc2U7CisJCWlmICghRXhlY3V0ZUxpbmtBY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK0ZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQkJCSBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0yMjksMTggKzIyOSwxOCBAQAogCX0KIAogCWlmICghSXNWYWxpZERvY1ZpZXcocERvY3VtZW50KSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIGZhbHNlOworCQlpZiAoIUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCitGWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KQogewogICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogICBBU1NFUlQocEZpZWxkRGljdCAhPSBOVUxMKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICByZXR1cm4gcFBERkludGVyRm9ybS0+R2V0RmllbGRCeURpY3QocEZpZWxkRGljdCkgIT0gTlVMTDsKIH0KIAotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitGWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUZpZWxkQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQkgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCiAJCQkJCQkJCQkJICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJCXsKIAkJCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKIAkJCQlpZiAoIUlzVmFsaWRGaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldEZpZWxkRGljdCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlyZXR1cm4gRkFMU0U7CiAJCQl9CiAJCX0KIAl9CkBAIC0yODksMjAgKzI4OSwyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVGaWVsZEFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFFeGVjdXRlRmllbGRBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpKSByZXR1cm4gRkFMU0U7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4sIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0zNTYsMTIgKzM1NiwxMiBAQAogCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fT3V0VmlldyhJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwogCS8vIAkJCQlicmVhazsKIAkvLyAJCQlkZWZhdWx0OgotCS8vIAkJCQlBU1NFUlQoZmFsc2UpOworCS8vIAkJCQlBU1NFUlQoRkFMU0UpOwogCS8vIAkJCQlicmVhazsKIAkvLyAJCQl9CiAKIAkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOworCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKIAkJCQlpZiAoIWJSZXQpCiAJCQkJewogCQkJCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7CkBAIC0zNzksMjAgKzM3OSwyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKSByZXR1cm4gZmFsc2U7CisJCWlmICghRXhlY3V0ZVNjcmVlbkFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcFNjcmVlbiwgbGlzdCkpIHJldHVybiBGQUxTRTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCitGWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKIAkJCQkJCQkJCQkgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAJaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCiAJbGlzdC5BZGRUYWlsKHBEaWN0KTsKIApAQCAtNDE2LDcgKzQxNiw3IEBACiAJCQkJcENvbnRleHQtPk9uQm9va21hcmtfTW91c2VVcChwQm9va21hcmspOwogCiAJCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCWJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKKwkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CiAJCQkJaWYgKCFiUmV0KQogCQkJCXsKIAkJCQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNDM0LDEwICs0MzQsMTAgQEAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlQm9va01hcmsoc3ViYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rbWFyaywgbGlzdCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKCFFeGVjdXRlQm9va01hcmsoc3ViYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rbWFyaywgbGlzdCkpIHJldHVybiBGQUxTRTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05vSnMoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQpAQCAtNTAyLDcgKzUwMiw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdDoKLQkJQVNTRVJUKGZhbHNlKTsKKwkJQVNTRVJUKEZBTFNFKTsKIAkJYnJlYWs7CiAJY2FzZSBDUERGX0FjdGlvbjo6U2V0T0NHU3RhdGU6CiAJCURvQWN0aW9uX1NldE9DR1N0YXRlKHBEb2N1bWVudCwgIGFjdGlvbik7CkBAIC01MjIsMTAgKzUyMiwxMCBAQAogCX0KIH0KIAotYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OklzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LApAQCAtNjM5LDEyICs2MzksMTIgQEAKIAkJCWRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLCBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlBU1NFUlQoZmFsc2UpOworCQlBU1NFUlQoRkFMU0UpOwogCQlicmVhazsKIAl9CiAKIAlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CisJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CiAJaWYgKCFiUmV0KQogCXsKIAkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJcENvbnRleHQtPk9uRG9jX09wZW4ocERvY3VtZW50LCBzU2NyaXB0TmFtZSk7CiAKIAlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CisJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CiAJaWYgKCFiUmV0KQogCXsKIAkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNzE5LDEyICs3MTksMTIgQEAKIAkJcENvbnRleHQtPk9uUGFnZV9PdXRWaWV3KHBEb2N1bWVudCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUFTU0VSVChmYWxzZSk7CisJCUFTU0VSVChGQUxTRSk7CiAJCWJyZWFrOwogCX0KIAogCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQlib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKKwlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKIAlpZiAoIWJSZXQpCiAJewogCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7CkBAIC03MzQsNyArNzM0LDcgQEAKIH0KIAogCi1ib29sCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03NDQsMTMgKzc0NCwxMyBAQAogCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbikpCiAJewogCQlwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitGWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTc2MCw3ICs3NjAsNyBAQAogCXJldHVybiBwSW50ZXJGb3JtLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbik7CiB9CiAKLWJvb2wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03NjksMTMgKzc2OSwxMyBAQAogCiAJaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX1Jlc2V0Rm9ybShhY3Rpb24pKQogCXsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitGWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTc4NSwyMyArNzg1LDIzIEBACiAJaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0ltcG9ydERhdGEoYWN0aW9uKSkKIAl7CiAJCXBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1JlbmRpdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorRlhfQk9PTAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK0ZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwIGIvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCmluZGV4IDY2OTVmZTAuLjliMDA4Y2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKQEAgLTE0NCw3ICsxNDQsNyBAQAogfQogCiAKLWJvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMTUyLDkgKzE1Miw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiAgewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTE2Miw5ICsxNjIsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKICB9Ci1ib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xNzIsOSArMTcyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xOTIsOSArMTkyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsbkZsYWdzLHpEZWx0YSwgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0yMDIsOSArMjAyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KLWJvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQpAQCAtMjM3LDE4ICsyMzcsMTggQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpCitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQogewogCiAgICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25DaGFyKHBBbm5vdCxuQ2hhciwgbkZsYWdzKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIAogfQogCi1ib29sICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQorRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKIAogICAgIGlmICghbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZykgJiYgIW1fcEFwcC0+RkZJX0lzQUxUS2V5RG93bihuRmxhZykpCkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+R2V0U0RLRG9jdW1lbnQoKTsKICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocE5leHQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjcyLDE0ICsyNzIsMTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9Ci1ib29sICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK0ZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMjg5LDE5ICsyODksMTkgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CiAgICAgICAgICAgICBwUGFnZS0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwQW5ub3QpOwogICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25LaWxsRm9jdXMocEFubm90LCBuRmxhZyk7CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBDUERGX1JlY3QgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgIHJldHVybiBwQW5ub3QtPkdldFJlY3QoKTsKIH0KIAotYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCk7CiAgICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCkBAIC0zMjEsMzEgKzMyMSwzMSBAQAogICAgICAgICBpZiAocEFubm90SGFuZGxlci0+Q2FuQW5zd2VyKHBBbm5vdCkpCiAgICAgICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+SGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsYm9vbCBiTmV4dCkKK0NQREZTREtfQW5ub3QqICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6R2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCxGWF9CT09MIGJOZXh0KQogewogICAgIENCQV9Bbm5vdEl0ZXJhdG9yIGFpKHBTREtBbm5vdC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKTsKICAgICByZXR1cm4gYk5leHQgPyBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IGFpLkdldFByZXZBbm5vdChwU0RLQW5ub3QpOwogfQogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiKTsKICAgICBpZiAocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICBpZiAoIXBXaWRnZXQtPklzVmlzaWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaW50IG5GaWVsZEZsYWdzID0gcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwogICAgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgcEludGVyRm9ybS0+QWRkTWFwKHBDdHJsLCBwV2lkZ2V0KTsKICAgICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgIGlmIChwUERGSW50ZXJGb3JtICYmIHBQREZJbnRlckZvcm0tPk5lZWRDb25zdHJ1Y3RBUCgpKQotICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgZmFsc2UpOworICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgRkFMU0UpOwogCiAgICAgcmV0dXJuIHBXaWRnZXQ7CiB9CkBAIC00MzksNyArNDM5LDcgQEAKICAgICB9CiAKIH0KLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC00NTMsMTAgKzQ1MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTQ3MCwxMCArNDcwLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNDg3LDEwICs0ODcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTUwNCwxMiArNTA0LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiAKIH0KIAogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01MjMsMTAgKzUyMywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VXaGVlbChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCB6RGVsdGEscG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01NDAsOSArNTQwLDkgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQotYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNTU2LDEwICs1NTYsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTU3MywxMCArNTczLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25DaGFyKHBBbm5vdCxuQ2hhciwgbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01OTAsMTMgKzU5MCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uS2V5RG93bihwQW5ub3QsbktleUNvZGUsIG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIHZvaWQgICAgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQogewpAQCAtNjI2LDE2ICs2MjYsMTYgQEAKICAgICB7CiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmICghcFdpZGdldC0+SXNBcHBlYXJhbmNlVmFsaWQoKSkKLSAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBmYWxzZSk7CisgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOwogCiAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CiAgICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQgfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYkZvcm1hdGVkID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOwogICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdGVkKTsKICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQgJiYgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjQ0LDcgKzY0NCw3IEBACiAgICAgfQogfQogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTY1OCw5ICs2NTgsOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uU2V0Rm9jdXMocEFubm90LG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC02NzQsNyArNjc0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsbkZsYWcpOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBDUERGX1JlY3QgQ1BERlNES19CRkFubm90SGFuZGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCkBAIC02OTUsNyArNjk1LDcgQEAKICAgICByZXR1cm4gQ1BERl9SZWN0KDAsMCwwLDApOwogfQogCi1ib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKICAgICBBU1NFUlQocEFubm90KTsKQEAgLTcwNiw5ICs3MDYsOSBAQAogCiAvL0NSZWFkZXJfQW5ub3RJdGVyYXRvckV4CiAKLUNQREZTREtfQW5ub3RJdGVyYXRvcjo6Q1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsYm9vbCBiUmV2ZXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJZ25vcmVUb3Btb3N0Lyo9ZmFsc2UqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaXJjbGUvKj1mYWxzZSovLAorQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxGWF9CT09MIGJSZXZlcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklnbm9yZVRvcG1vc3QvKj1GQUxTRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNpcmNsZS8qPUZBTFNFKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5ICpwTGlzdC8qPU5VTEwqLykKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1ib29sIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkgKiBwQW5ub3RMaXN0KQorRlhfQk9PTCBDUERGU0RLX0Fubm90SXRlcmF0b3I6OkluaXRJdGVyYXRvckFubm90TGlzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5ICogcEFubm90TGlzdCkKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKIApAQCAtODU5LDcgKzg1OSw3IEBACiAgICAgfQogCiAgICAgbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQWxsKCk7Ci0gICAgaWYoIXBBbm5vdExpc3QpIHJldHVybiBmYWxzZTsKKyAgICBpZighcEFubm90TGlzdCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERlNES19Bbm5vdCAqIHBUb3BNb3N0QW5ub3Q9IChtX2JJZ25vcmVUb3Btb3N0KSA/IE5VTEwgOiBwUGFnZVZpZXctPkdldEZvY3VzQW5ub3QoKTsKIApAQCAtODg4LDUgKzg4OCw1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcAppbmRleCBiYmRmYzE5Li5kMGRjNGVmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCkBAIC0xNywxNCArMTcsMTQgQEAKICAgICByZXR1cm4gKGludCl0emhvdXIgKiAzNjAwICsgKGludCl0em1pbnV0ZSAqICh0emhvdXIgPj0gMCA/IDYwIDogLTYwKTsKIH0KIAotYm9vbCBfZ0FmeElzTGVhcFllYXIoaW50MTZfdCB5ZWFyKQorRlhfQk9PTCBfZ0FmeElzTGVhcFllYXIoaW50MTZfdCB5ZWFyKQogewogICAgIHJldHVybiAoKHllYXIgJSA0MDAgPT0gMCkgfHwgKCh5ZWFyICUgNCA9PSAwKSAmJiAoeWVhciAlIDEwMCAhPSAwKSkpOwogfQogCiBGWF9XT1JEIF9nQWZ4R2V0WWVhckRheXMoaW50MTZfdCB5ZWFyKQogewotICAgIHJldHVybiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IHRydWUgPyAzNjYgOiAzNjUpOworICAgIHJldHVybiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IFRSVUUgPyAzNjYgOiAzNjUpOwogfQogCiB1aW50OF90IF9nQWZ4R2V0TW9udGhEYXlzKGludDE2X3QgeWVhciwgdWludDhfdCBtb250aCkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDI6Ci0gICAgICAgIGlmIChfZ0FmeElzTGVhcFllYXIoeWVhcikgPT0gdHJ1ZSkKKyAgICAgICAgaWYgKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFKQogICAgICAgICAgICAgbURheXMgPSAyOTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgbURheXMgPSAyODsKQEAgLTEyOCwxNyArMTI4LDE3IEBACiAgICAgcmV0dXJuICp0aGlzOwogfQogCi1ib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID09IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKK0ZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQogewogICAgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwKTsKIH0KIAotYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yICE9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICByZXR1cm4gKEZYU1lTX21lbWNtcCgmZHQsICZkYXRldGltZS5kdCwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMCk7CiB9CiAKLWJvb2wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPiAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQogewogICAgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CkBAIC0xNDcsMTIgKzE0NywxMiBAQAogICAgIGludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CiAgICAgaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CiAKLSAgICBpZiAoZDEgPiBkMykgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGQyID4gZDQpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZDEgPiBkMykgcmV0dXJuIFRSVUU7CisgICAgaWYgKGQyID4gZDQpIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwpAQCAtMTYxLDEyICsxNjEsMTIgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxID49IGQzKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoZDIgPj0gZDQpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZDEgPj0gZDMpIHJldHVybiBUUlVFOworICAgIGlmIChkMiA+PSBkNCkgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIDwgKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwpAQCAtMTc1LDEyICsxNzUsMTIgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxIDwgZDMpIHJldHVybiB0cnVlOwotICAgIGlmIChkMiA8IGQ0KSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGQxIDwgZDMpIHJldHVybiBUUlVFOworICAgIGlmIChkMiA8IGQ0KSByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCiB7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwogICAgIENQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKQEAgLTE4OSw5ICsxODksOSBAQAogICAgIGludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CiAgICAgaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CiAKLSAgICBpZiAoZDEgPD0gZDMpIHJldHVybiB0cnVlOwotICAgIGlmIChkMiA8PSBkNCkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChkMSA8PSBkMykgcmV0dXJuIFRSVUU7CisgICAgaWYgKGQyIDw9IGQ0KSByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIHRpbWVfdCgpCkBAIC01MDYsNyArNTA2LDcgQEAKIENQREZTREtfQW5ub3Q6OkNQREZTREtfQW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIDoKIG1fcEFubm90KHBBbm5vdCksCiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLAotbV9iU2VsZWN0ZWQoZmFsc2UpLAorbV9iU2VsZWN0ZWQoRkFMU0UpLAogbV9uVGFiT3JkZXIoLTEpCiB7CiB9CkBAIC01MzksMTIgKzUzOSwxMiBAQAogICAgIHJldHVybiBtX3BQYWdlVmlldzsKIH0KIAotYm9vbCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNTZWxlY3RlZCgpCiB7CiAgICAgcmV0dXJuIG1fYlNlbGVjdGVkOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldFNlbGVjdGVkKGJvb2wgYlNlbGVjdGVkKQordm9pZCBDUERGU0RLX0Fubm90OjpTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCkKIHsKICAgICBtX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KQEAgLTYwNiwxNSArNjA2LDE1IEBACiAgICAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbW9kZSwgcE9wdGlvbnMpOwogfQogCi1ib29sIENQREZTREtfQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKCkKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKQogewogICAgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIikgIT0gTlVMTDsKIH0KIAotYm9vbCBDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQorRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCiAgICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKICAgICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKQEAgLTYyNyw5ICs2MjcsOSBAQAogCiAgICAgLy8gR2V0IHRoZSBBUCBzdHJlYW0gb3Igc3ViZGlyZWN0b3J5CiAgICAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0gICAgaWYgKHBzdWIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChwc3ViID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIENQREZTREtfQW5ub3Q6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKQEAgLTg3NSw3ICs4NzUsNyBAQAogICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkMiKTsKIH0KIAotYm9vbCBDUERGU0RLX0Fubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CitGWF9CT09MIENQREZTREtfQW5ub3Q6OkdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKIHsKICAgICBpZiAoQ1BERl9BcnJheSogcEVudHJ5ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQyIpKQogICAgIHsKQEAgLTg4Niw3ICs4ODYsNyBAQAogCiAgICAgICAgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KWcsIChpbnQpZywgKGludClnKTsKIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChuQ291bnQgPT0gMykKICAgICAgICAgewpAQCAtODk2LDcgKzg5Niw3IEBACiAKICAgICAgICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOwogCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKG5Db3VudCA9PSA0KQogICAgICAgICB7CkBAIC05MTEsMTEgKzkxMSwxMSBAQAogCiAgICAgICAgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtOTc2LDcgKzk3Niw3IEBACiAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOwogICAgIH0KIAotICAgIHBTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNDb250ZW50cy5jX3N0cigpLCBzQ29udGVudHMuR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CisgICAgcFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0NvbnRlbnRzLmNfc3RyKCksIHNDb250ZW50cy5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKIH0KIAogI2RlZmluZSBCQV9BTk5PVF9NSU5XSURUSCAgICAgICAgICAgMQpAQCAtOTkyLDExICs5OTIsMTEgQEAKICAgICByZXR1cm4gQkFfQU5OT1RfTUlOSEVJR0hUOwogfQogCi1ib29sIENQREZTREtfQW5ub3Q6OkNyZWF0ZUZvcm1GaWxsZXIoKQorRlhfQk9PTCBDUERGU0RLX0Fubm90OjpDcmVhdGVGb3JtRmlsbGVyKCkKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KLWJvb2wgQ1BERlNES19Bbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKIHsKICAgICBpbnQgbkZsYWdzID0gR2V0RmxhZ3MoKTsKICAgICByZXR1cm4gISgobkZsYWdzICYgQU5OT1RGTEFHX0lOVklTSUJMRSkgfHwgKG5GbGFncyAmIEFOTk9URkxBR19ISURERU4pIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfTk9WSUVXKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCmluZGV4IDQ5MzNhMDUuLmVlMTYyMTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCkBAIC0zNywxMCArMzcsMTAgQEAKIAogfQogCi1ib29sICAgICBDUERGU0RLX1dpZGdldDo6SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKK0ZYX0JPT0wgICAgIENQREZTREtfV2lkZ2V0OjpJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCiAgICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKICAgICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKQEAgLTUzLDcgKzUzLDcgQEAKIAogICAgIC8vIEdldCB0aGUgQVAgc3RyZWFtIG9yIHN1YmRpcmVjdG9yeQogICAgIENQREZfT2JqZWN0KiBwc3ViID0gcEFQLT5HZXRFbGVtZW50VmFsdWUoYXBfZW50cnkpOwotICAgIGlmIChwc3ViID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICBpZiAocHN1YiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKICAgICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOwogICAgIHN3aXRjaCAobkZpZWxkVHlwZSkKQEAgLTcwLDEwICs3MCwxMCBAQAogICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBzdWI7CiAgICAgICAgICAgICByZXR1cm4gcFN1YkRpY3QtPkdldFN0cmVhbShHZXRBcHBTdGF0ZSgpKSAhPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBpbnQgQ1BERlNES19XaWRnZXQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICByZXR1cm4gcEN0cmwtPkdldFJvdGF0aW9uKCkgJSAzNjA7CiB9CiAKLWJvb2wgQ1BERlNES19XaWRnZXQ6OkdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIH0KIAotYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAorRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIH0KIAotYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldFRleHRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBGWF9GTE9BVCBDUERGU0RLX1dpZGdldDo6R2V0Rm9udFNpemUoKSBjb25zdApAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogfQogCi1ib29sIENQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0CitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKIH0KIAotYm9vbCBDUERGU0RLX1dpZGdldDo6SXNDaGVja2VkKCkgY29uc3QKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzQ2hlY2tlZCgpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldE1heExlbigpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRDaGVjayhib29sIGJDaGVja2VkLCBib29sIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRDaGVjayhGWF9CT09MIGJDaGVja2VkLCBGWF9CT09MIGJOb3RpZnkpCiB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwgYk5vdGlmeSk7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIGJvb2wgYk5vdGlmeSkKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB2b2lkIENQREZTREtfV2lkZ2V0OjpTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSkKIHsKIH0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGluZGV4LCBiU2VsZWN0ZWQsIGJOb3RpZnkpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpCiB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTMxOSwyMCArMzE5LDIwIEBACiAKIHZvaWQgQ1BERlNES19XaWRnZXQ6OlNldEFwcE1vZGlmaWVkKCkKIHsKLSAgICBtX2JBcHBNb2RpZmllZCA9IHRydWU7CisgICAgbV9iQXBwTW9kaWZpZWQgPSBUUlVFOwogfQogCiB2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhckFwcE1vZGlmaWVkKCkKIHsKLSAgICBtX2JBcHBNb2RpZmllZCA9IGZhbHNlOworICAgIG1fYkFwcE1vZGlmaWVkID0gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19XaWRnZXQ6OklzQXBwTW9kaWZpZWQoKSBjb25zdAorRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNBcHBNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYkFwcE1vZGlmaWVkOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2UoY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgYm9vbCBiVmFsdWVDaGFuZ2VkKQordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKIHsKICAgICBTZXRBcHBNb2RpZmllZCgpOwogCkBAIC0zNzAsMTQgKzM3MCwxNCBAQAogICAgIG1fcEFubm90LT5DbGVhckNhY2hlZEFQKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpPbkZvcm1hdChib29sJiBiRm9ybWF0ZWQpCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6T25Gb3JtYXQoRlhfQk9PTCYgYkZvcm1hdGVkKQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAgICAgcmV0dXJuIG1fcEludGVyRm9ybS0+T25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoYm9vbCBiVmFsdWVDaGFuZ2VkKQordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogCiAgICAgaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQogICAgIHsKLSAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOworICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7CiAKICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogCiAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CiAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKKyAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCiAgICAgaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQogICAgIHsKLSAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOworICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7CiAKICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CkBAIC0xMTIzLDEyICsxMTIzLDEyIEBACiAKICAgICAgICAgZm9yIChpbnQzMl90IGk9blRvcDsgaTxuQ291bnQ7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgYm9vbCBiU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludDMyX3Qgaj0wOyBqPG5TZWxDb3VudDsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaikgPT0gaSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTExNDEsMTYgKzExNDEsMTYgQEAKICAgICAgICAgICAgIGlmIChiU2VsZWN0ZWQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjSXRlbSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LGZ5LWZJdGVtSGVpZ2h0LHJjQ2xpZW50LnJpZ2h0LGZ5KTsKLSAgICAgICAgICAgICAgICBzTGlzdCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMCw1MS4wZi8yNTUuMGYsMTEzLjBmLzI1NS4wZiksdHJ1ZSkKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMCw1MS4wZi8yNTUuMGYsMTEzLjBmLzI1NS4wZiksVFJVRSkKICAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwogCi0gICAgICAgICAgICAgICAgc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSksdHJ1ZSkgPDwKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKSxUUlVFKSA8PAogICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZixmeSkpIDw8ICJFVFxuIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUFdMX0NvbG9yIGNyVGV4dCA9IEdldFRleHRQV0xDb2xvcigpOwotICAgICAgICAgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsdHJ1ZSkgPDwKKyAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8CiAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsZnkpKSA8PCAiRVRcbiI7CiAgICAgICAgICAgICB9CiAKQEAgLTExODMsNyArMTE4Myw3IEBACiAKICAgICBpZiAoSUZYX0VkaXQgKiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpCiAgICAgewotICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChmYWxzZSk7CisgICAgICAgIHBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKIAogICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwogICAgICAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKQEAgLTExOTgsMTIgKzExOTgsMTIgQEAKICAgICAgICAgcEVkaXQtPlNldEFsaWdubWVudEgocENvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSk7CiAKICAgICAgICAgRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgIGJvb2wgYk11bHRpTGluZSA9IChkd0ZpZWxkRmxhZ3MgPj4gMTIpICYgMTsKKyAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gKGR3RmllbGRGbGFncyA+PiAxMikgJiAxOwogCiAgICAgICAgIGlmIChiTXVsdGlMaW5lKQogICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKHRydWUpOwotICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4odHJ1ZSk7CisgICAgICAgICAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKFRSVUUpOworICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4oVFJVRSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IG5NYXhMZW4gPSBwRmllbGQtPkdldE1heExlbigpOwotICAgICAgICBib29sIGJDaGFyQXJyYXkgPSAoZHdGaWVsZEZsYWdzID4+IDI0KSAmIDE7CisgICAgICAgIEZYX0JPT0wgYkNoYXJBcnJheSA9IChkd0ZpZWxkRmxhZ3MgPj4gMjQpICYgMTsKICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKIAogICAgICAgICBpZiAobk1heExlbiA+IDApCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0gICAgICAgICAgICBwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUpOworICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKQEAgLTEyNzYsMTEgKzEyNzYsMTEgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgQkJTX1NPTElEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxmYWxzZSkgPDwgIiAyIEogMCBqXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpIDw8ICIgMiBKIDAgalxuIjsKIAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGk9MTtpPG5NYXhMZW47aSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTI5NiwxMyArMTI5NiwxMyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBCQlNfREFTSDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfRGFzaCBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJbIiA8PCBkc0JvcmRlci5uRGFzaCA8PCAiICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkc0JvcmRlci5uR2FwIDw8ICJdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkc0JvcmRlci5uUGhhc2UgPDwgIiBkXG4iOwpAQCAtMTU0OSw3ICsxNTQ5LDcgQEAKICAgICB9CiB9CiAKLWJvb2wgQ1BERlNES19XaWRnZXQ6Ok9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gR2V0QUFjdGlvbih0eXBlKTsKIApAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKICAgICAgICAgcmV0dXJuIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZChhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgR2V0Rm9ybUZpZWxkKCksIGRhdGEpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIENQREZfQWN0aW9uIENQREZTREtfV2lkZ2V0OjpHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCkKQEAgLTE2MjQsMzcgKzE2MjQsMzcgQEAKIH0KIAogCi1ib29sIENQREZTREtfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQogewogICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IEdldFBERkFubm90KCk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7CiAgICAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7CiAgICAgaWYoYW5ub3RSZWN0LkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCiAgICAgewotICAgICAgICBpZiAoIUlzVmlzaWJsZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghSXNWaXNpYmxlKCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpbnQgbkZpZWxkRmxhZ3MgPSBHZXRGaWVsZEZsYWdzKCk7CiAgICAgICAgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIENQREZTREtfSW50ZXJGb3JtOjpDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiAgICAgOm1fcERvY3VtZW50KHBEb2N1bWVudCksCiAgICAgbV9wSW50ZXJGb3JtKE5VTEwpLAotICAgIG1fYkNhbGN1bGF0ZSh0cnVlKSwKLSAgICBtX2JCdXN5KGZhbHNlKQorICAgIG1fYkNhbGN1bGF0ZShUUlVFKSwKKyAgICBtX2JCdXN5KEZBTFNFKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBtX3BJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0obV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCksIGZhbHNlKTsKKyAgICBtX3BJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0obV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCksIEZBTFNFKTsKICAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwogICAgIG1fcEludGVyRm9ybS0+U2V0Rm9ybU5vdGlmeSh0aGlzKTsKIAogICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKLSAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBmYWxzZTsKKyAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBGQUxTRTsKICAgICBtX2lIaWdobGlnaHRBbHBoYSA9IDA7CiB9CiAKQEAgLTE2NjUsMTIgKzE2NjUsMTIgQEAKICAgICBtX01hcC5jbGVhcigpOwogfQogCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkhpZ2hsaWdodFdpZGdldHMoKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTmV4dCkgY29uc3QKK0NQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiTmV4dCkgY29uc3QKIHsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0JBX0Fubm90SXRlcmF0b3I+IHBJdGVyYXRvcigKICAgICAgICAgbmV3IENCQV9Bbm5vdEl0ZXJhdG9yKHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIikpOwpAQCAtMTc4MiwxMiArMTc4MiwxMiBAQAogICAgIG1fTWFwLmVyYXNlKHBDb250cm9sKTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKGJvb2wgYkVuYWJsZWQpCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCkKIHsKICAgICBtX2JDYWxjdWxhdGUgPSBiRW5hYmxlZDsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6SXNDYWxjdWxhdGVFbmFibGVkKCkgY29uc3QKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYkNhbGN1bGF0ZTsKIH0KQEAgLTE4MDcsNyArMTgwNyw3IEBACiAgICAgICAgIGludCBuSGVpZ2h0ID0gcEJtcC0+R2V0SGVpZ2h0KCk7CiAKICAgICAgICAgQ1BERl9JbWFnZSBJbWFnZShwRG9jdW1lbnQpOwotICAgICAgICBJbWFnZS5TZXRJbWFnZShwQm1wLCBmYWxzZSk7CisgICAgICAgIEltYWdlLlNldEltYWdlKHBCbXAsIEZBTFNFKTsKICAgICAgICAgQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSA9IEltYWdlLkdldFN0cmVhbSgpOwogICAgICAgICBpZiAocEltYWdlU3RyZWFtKQogICAgICAgICB7CkBAIC0xODY3LDcgKzE4NjcsNyBAQAogCiAgICAgaWYgKG1fYkJ1c3kpIHJldHVybjsKIAotICAgIG1fYkJ1c3kgPSB0cnVlOworICAgIG1fYkJ1c3kgPSBUUlVFOwogCiAgICAgaWYgKElzQ2FsY3VsYXRlRW5hYmxlZCgpKQogICAgIHsKQEAgLTE4OTksMTEgKzE4OTksMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBwRmllbGQtPkdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHNPbGRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUkMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0NhbGN1bGF0ZShwRm9ybUZpZWxkLCBwRmllbGQsIHNWYWx1ZSwgYlJDKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChjc0pTLCBzSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoY3NKUywgc0luZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KQpAQCAtMTkxMSw3ICsxOTExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiUkMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNWYWx1ZS5Db21wYXJlKHNPbGRWYWx1ZSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xOTI0LDEwICsxOTI0LDEwIEBACiAKICAgICB9CiAKLSAgICBtX2JCdXN5ID0gZmFsc2U7CisgICAgbV9iQnVzeSA9IEZBTFNFOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGJvb2wmIGJGb3JtYXRlZCkKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCYgYkZvcm1hdGVkKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAgICAgQVNTRVJUKHBFbnYpOwogICAgIGlmKCFwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCiAgICAgewotICAgICAgICBiRm9ybWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgYkZvcm1hdGVkID0gRkFMU0U7CiAgICAgICAgIHJldHVybiBzVmFsdWU7CiAgICAgfQogCkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgYkZvcm1hdGVkID0gZmFsc2U7CisgICAgYkZvcm1hdGVkID0gRkFMU0U7CiAKICAgICBDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKICAgICBpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpGb3JtYXQpKQpAQCAtMTk3MiwxNiArMTk3MiwxNiBAQAogICAgICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9Gb3JtYXQocEZvcm1GaWVsZCwgVmFsdWUsIHRydWUpOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0Zvcm1hdChwRm9ybUZpZWxkLCBWYWx1ZSwgVFJVRSk7CiAKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzSW5mbzsKLSAgICAgICAgICAgICAgICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgc0luZm8pOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBzSW5mbyk7CiAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGlmIChiUmV0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc1ZhbHVlID0gVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJGb3JtYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJGb3JtYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTkwLDcgKzE5OTAsNyBAQAogICAgIHJldHVybiBzVmFsdWU7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBib29sIGJWYWx1ZUNoYW5nZWQpCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQogewogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogICAgICAgICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gcEVudi0+R2V0SUZvcm1GaWxsZXIoKTsKIAogICAgICAgICAgICAgQ1BERl9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLGZhbHNlKTsKKyAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UsRkFMU0UpOwogCiAgICAgICAgICAgICBGWF9SRUNUIHJjQkJveCA9IHBJRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIApAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgYm9vbCYgYlJDKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBGWF9CT09MJiBiUkMpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKQEAgLTIwNTgsNyArMjA1OCw3IEBACiAgICAgfQogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgYm9vbCYgYlJDKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQykKIHsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIApAQCAtMjA4OSw3ICsyMDg5LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKICAgICBBU1NFUlQoYWN0aW9uKTsKIApAQCAtMjEwMCw5ICsyMTAwLDkgQEAKICAgICBDRlhfUHRyQXJyYXkgZmllbGRzOwogICAgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwogCi0gICAgYm9vbCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7CisgICAgRlhfQk9PTCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7CiAKLSAgICBib29sIGJDaGFuZ2VkID0gZmFsc2U7CisgICAgRlhfQk9PTCBiQ2hhbmdlZCA9IEZBTFNFOwogCiAgICAgZm9yIChpbnQgaT0wLCBzej1maWVsZHMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgewpAQCAtMjEzNyw3ICsyMTM3LDcgQEAKIAogICAgICAgICAgICAgICAgIHBQYWdlVmlldy0+VXBkYXRlVmlldyhwV2lkZ2V0KTsKIAotICAgICAgICAgICAgICAgIGJDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTQ1LDEyICsyMTQ1LDEyIEBACiAgICAgcmV0dXJuIGJDaGFuZ2VkOwogfQogCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCiB7CiAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKICAgICBDRlhfV2lkZVN0cmluZyBzRGVzdGluYXRpb24gPSBhY3Rpb24uR2V0RmlsZVBhdGgoKTsKICAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKICAgICBpZiAocEFjdGlvbkRpY3QtPktleUV4aXN0KCJGaWVsZHMiKSkKQEAgLTIxNjQsMjEgKzIxNjQsMjEgQEAKICAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7CiAgICAgICAgIGlmIChmaWVsZHMuR2V0U2l6ZSgpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUgPSAhKGR3RmxhZ3MgJiAweDAxKTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSAhKGR3RmxhZ3MgJiAweDAxKTsKICAgICAgICAgICAgIGlmIChtX3BJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICAgICAgICAgIHJldHVybiBTdWJtaXRGaWVsZHMoc0Rlc3RpbmF0aW9uLCBmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gU3VibWl0RmllbGRzKHNEZXN0aW5hdGlvbiwgZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSwgRkFMU0UpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIGZhbHNlKTsKKyAgICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6U3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYlVybEVuY29kZWQpCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRGVzdGluYXRpb24sIGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgRlhfQk9PTCBiVXJsRW5jb2RlZCkKIHsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOwpAQCAtMjE5MiwxMiArMjE5MiwxMiBAQAogICAgIGlmIChiVXJsRW5jb2RlZCkKICAgICB7CiAgICAgICAgIGlmKCFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBjc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ1BERlNES19JbnRlckZvcm06OkRvRkRGQnVmZmVyKENGWF9CeXRlU3RyaW5nIHNCdWZmZXIpCkBAIC0yMjM2LDIyICsyMjM2LDIyIEBACiAgICAgc0J1ZmZlci5SZWxlYXNlQnVmZmVyKCk7CiB9CiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKHVpbnQ4X3QqJiBwQnVmLCBGWF9TVFJTSVpFJiBuQnVmU2l6ZSkKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKQogewogICAgIENGREZfRG9jdW1lbnQqIHBGREYgPSBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShwQnVmLCBuQnVmU2l6ZSk7CiAgICAgaWYgKHBGREYpCiAgICAgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBGREYtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7Ci0gICAgICAgIGlmIChwTWFpbkRpY3QgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgICAgICAvLyBHZXQgZmllbGRzCiAgICAgICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGZkZkVuY29kZWREYXRhOwogCkBAIC0yMjc5LDE3ICsyMjc5LDE3IEBACiAgICAgICAgIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBuQnVmU2l6ZSk7CiAgICAgICAgIEZYU1lTX21lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5HZXRCdWZmZXIoKSwgbkJ1ZlNpemUpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CiAKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERihtX3BEb2N1bWVudC0+R2V0UGF0aCgpLChDRlhfUHRyQXJyYXkmKWZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpOwotICAgIGlmICghcEZERikgcmV0dXJuIGZhbHNlOwotICAgIGJvb2wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOyAvLyA9IGZhbHNlOy8vCisgICAgaWYgKCFwRkRGKSByZXR1cm4gRkFMU0U7CisgICAgRlhfQk9PTCBiUmV0ID0gcEZERi0+V3JpdGVCdWYodGV4dEJ1Zik7IC8vID0gRkFMU0U7Ly8KICAgICBkZWxldGUgcEZERjsKIAogICAgIHJldHVybiBiUmV0OwpAQCAtMjMwMSwyNCArMjMwMSwyNCBAQAogICAgIHJldHVybiBMIiI7CiB9CiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgYm9vbCBiVXJsRW5jb2RlZCkKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgRlhfQk9PTCBiVXJsRW5jb2RlZCkKIHsKLSAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOwogCi0gICAgaWYoTlVMTCA9PSBtX3BEb2N1bWVudCkgcmV0dXJuIGZhbHNlOworICAgIGlmKE5VTEwgPT0gbV9wRG9jdW1lbnQpIHJldHVybiBGQUxTRTsKICAgICBDRlhfV2lkZVN0cmluZyB3c1BERkZpbGVQYXRoID0gbV9wRG9jdW1lbnQtPkdldFBhdGgoKTsKIAotICAgIGlmKE5VTEwgPT0gbV9wSW50ZXJGb3JtKSByZXR1cm4gZmFsc2U7CisgICAgaWYoTlVMTCA9PSBtX3BJbnRlckZvcm0pIHJldHVybiBGQUxTRTsKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGRG9jID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERih3c1BERkZpbGVQYXRoKTsKLSAgICBpZiAoTlVMTCA9PSBwRkRGRG9jKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKE5VTEwgPT0gcEZERkRvYykgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX0J5dGVUZXh0QnVmIEZkZkJ1ZmZlcjsKLSAgICBib29sIGJSZXQgPSBwRkRGRG9jLT5Xcml0ZUJ1ZihGZGZCdWZmZXIpOworICAgIEZYX0JPT0wgYlJldCA9IHBGREZEb2MtPldyaXRlQnVmKEZkZkJ1ZmZlcik7CiAgICAgZGVsZXRlIHBGREZEb2M7Ci0gICAgaWYgKCFiUmV0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFiUmV0KSByZXR1cm4gRkFMU0U7CiAKICAgICB1aW50OF90KiBwQnVmZmVyID0gRmRmQnVmZmVyLkdldEJ1ZmZlcigpOwogICAgIEZYX1NUUlNJWkUgbkJ1ZlNpemUgPSBGZGZCdWZmZXIuR2V0TGVuZ3RoKCk7CkBAIC0yMzI2LDcgKzIzMjYsNyBAQAogICAgIGlmIChiVXJsRW5jb2RlZCkKICAgICB7CiAgICAgICAgIGlmKCFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBzRGVzdGluYXRpb24uY19zdHIoKSk7CkBAIC0yMzM3LDI2ICsyMzM3LDI2IEBACiAgICAgICAgIHBCdWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKQogewogCiAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERihtX3BEb2N1bWVudC0+R2V0UGF0aCgpKTsKLSAgICBpZiAoIXBGREYpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXBGREYpIHJldHVybiBGQUxTRTsKIAotICAgIGJvb2wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOworICAgIEZYX0JPT0wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOwogICAgIGRlbGV0ZSBwRkRGOwogCiAgICAgcmV0dXJuIGJSZXQ7CiB9CiAKIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKICAgICBBU1NFUlQoYWN0aW9uKTsKIApAQCAtMjM3MCwxNSArMjM3MCwxNSBAQAogICAgICAgICBhZi5HZXRBbGxGaWVsZHMoZmllbGRPYmplY3RzKTsKICAgICAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKICAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7Ci0gICAgICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShmaWVsZHMsICEoZHdGbGFncyAmIDB4MDEpLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1fcEludGVyRm9ybS0+UmVzZXRGb3JtKGZpZWxkcywgIShkd0ZsYWdzICYgMHgwMSksIFRSVUUpOwogICAgIH0KIAotICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybSh0cnVlKTsKKyAgICByZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0oVFJVRSk7CiB9CiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRGaWVsZEZyb21PYmplY3RzKGNvbnN0IENGWF9QdHJBcnJheSYgb2JqZWN0cywgQ0ZYX1B0ckFycmF5JiBmaWVsZHMpCkBAIC0yNDE1LDcgKzI0MTUsNyBAQAogICAgIGludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwogICAgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICB7Ci0gICAgICAgIGJvb2wgYlJDID0gdHJ1ZTsKKyAgICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOwogICAgICAgICBPbktleVN0cm9rZUNvbW1pdChwRm9ybUZpZWxkLCBjc1ZhbHVlLCBiUkMpOwogICAgICAgICBpZiAoYlJDKQogICAgICAgICB7CkBAIC0yNDM0LDEyICsyNDM0LDEyIEBACiAgICAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQogICAgIHsKICAgICAgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7Ci0gICAgICAgIGJvb2wgYkZvcm1hdGVkID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IE9uRm9ybWF0KHBGb3JtRmllbGQsIGJGb3JtYXRlZCk7CiAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgdHJ1ZSk7CisgICAgICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIHRydWUpOworICAgICAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CiAgICAgICAgIFVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTI0NTEsNyArMjQ1MSw3IEBACiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGJvb2wgYlJDID0gdHJ1ZTsKKyAgICBGWF9CT09MIGJSQyA9IFRSVUU7CiAgICAgT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKICAgICBpZiAoIWJSQykKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjQ2OSw3ICsyNDY5LDcgQEAKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpCiAgICAgewogICAgICAgICBPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKLSAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgdHJ1ZSk7CisgICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIFRSVUUpOwogICAgICAgICBVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNTA5LDE2ICsyNTA5LDE2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OklzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSkKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSkKIHsKICAgICBpZihuRmllbGRUeXBlIDwxIHx8IG5GaWVsZFR5cGUgPiA2KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICByZXR1cm4gbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZS0xXTsKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlQWxsSGlnaExpZ2h0KCkKIHsKLSAgICBtZW1zZXQoKHZvaWQqKW1fYk5lZWRIaWdodGxpZ2h0LCAwLCA2KnNpemVvZihib29sKSk7CisgICAgbWVtc2V0KCh2b2lkKiltX2JOZWVkSGlnaHRsaWdodCwgMCwgNipzaXplb2YoRlhfQk9PTCkpOwogfQogdm9pZCAgIENQREZTREtfSW50ZXJGb3JtOjpTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKQogewpAQCAtMjUzMCwxNCArMjUzMCwxNCBAQAogICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW2ldID0gY2xyOwotICAgICAgICAgICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW25GaWVsZFR5cGUtMV0gPSBjbHI7Ci0gICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W25GaWVsZFR5cGUtMV0gPSBUUlVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzgzLDcgKzI3ODMsNyBAQAogCiAgICAgICAgICAgICBpZiAoc2EuR2V0U2l6ZSgpID4gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AsIEZBTFNFKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgd2hpbGUgKHNhLkdldFNpemUoKSA+IDApCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKaW5kZXggZGE0MDVjZC4uMDVjMWEzZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcApAQCAtMjYsMTAgKzI2LDEwIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIEludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIE91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KTsKIAotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CisgICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKTsKIAogICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgICAgICBHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCl7cmV0dXJuIEwiIjt9Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgIFNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpIHtyZXR1cm4gZmFsc2U7fQorICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIEZBTFNFO30KIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBDbGllbnRUb1NjcmVlbihGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIFNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkge30KQEAgLTQ1LDIzICs0NSwyMyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSk7CiAKICAgICB2aXJ0dWFsIEZYX0hNRU5VICAgICAgICAgICAgQ3JlYXRlUG9wdXBNZW51KCkge3JldHVybiBOVUxMO30KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklETmV3SXRlbSwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIGZhbHNlO30KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgYm9vbCBiRW5hYmxlZCkge3JldHVybiBmYWxzZTt9CisgICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIEFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBGQUxTRTt9CisgICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JREl0ZW0sIEZYX0JPT0wgYkVuYWJsZWQpIHtyZXR1cm4gRkFMU0U7fQogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIFRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfSFdORCBoUGFyZW50KSB7cmV0dXJuIC0xO30KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgRGVzdHJveU1lbnUoRlhfSE1FTlUgaE1lbnUpIHt9CiAKICAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nICAgICAgR2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOworICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOwogICAgIHZpcnR1YWwgQ1BERl9Gb250KiAgICAgICAgICBBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLCB1aW50OF90IG5DaGFyc2V0KTsKIAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIFNldFRpbWVyKGludDMyX3QgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBLaWxsVGltZXIoaW50MzJfdCBuSUQpIDsKIAogCi0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTt9Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7fQotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNBTFRLZXlEb3duKG5GbGFnKTt9Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0lOU0VSVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNTSElGVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTt9CisgICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpO30KKyAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzSU5TRVJUS2V5RG93bihuRmxhZyk7fQogCiAgICAgdmlydHVhbCBGWF9TWVNURU1USU1FICAgICAgIEdldExvY2FsVGltZSgpOwogCkBAIC0xMjIsMTUgKzEyMiwxNSBAQAogCiB9CiAKLWJvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKQorRlhfQk9PTCBDRlhfU3lzdGVtSGFuZGxlcjo6SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpCiB7CiAgICAgaWYobV9wRW52KQogICAgIHsKICAgICAgICAgRlBERl9GT1JNRklMTElORk8qIHBJbmZvID0gbV9wRW52LT5HZXRGb3JtRmlsbEluZm8oKTsKICAgICAgICAgaWYocEluZm8gJiYgcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDRlhfU3lzdGVtSGFuZGxlcjo6R2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICByZXR1cm4gIiI7CiB9CiAKLWJvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkKK0ZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkKIHsKICAgICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7CiAgICAgaWYocEZvbnRNZ3IpCkBAIC0xNTYsMTMgKzE1NiwxMyBAQAogICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8blNpemU7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZihwRm9udE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldLkNvbXBhcmUoc0ZvbnRGYWNlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KQpAQCAtMTgzLDggKzE4Myw4IEBACiAgICAgaWYocERvYykKICAgICB7CiAgICAgICAgIENGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250KCk7Ci0gICAgICAgIHBGWEZvbnQtPkxvYWRTdWJzdChzRm9udEZhY2VOYW1lLHRydWUsMCwwLDAsQ2hhclNldDJDUChuQ2hhcnNldCksZmFsc2UpOwotICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gcERvYy0+QWRkRm9udChwRlhGb250LG5DaGFyc2V0LGZhbHNlKTsKKyAgICAgICAgcEZYRm9udC0+TG9hZFN1YnN0KHNGb250RmFjZU5hbWUsVFJVRSwwLDAsMCxDaGFyU2V0MkNQKG5DaGFyc2V0KSxGQUxTRSk7CisgICAgICAgIENQREZfRm9udCogcEZvbnQgPSBwRG9jLT5BZGRGb250KHBGWEZvbnQsbkNoYXJzZXQsRkFMU0UpOwogICAgICAgICBkZWxldGUgcEZYRm9udDsKICAgICAgICAgcmV0dXJuIHBGb250OwogICAgIH0KQEAgLTQwOSw3ICs0MDksNyBAQAogICAgIG1fcEZvY3VzQW5ub3QobnVsbHB0ciksCiAgICAgbV9wRW52KHBFbnYpLAogICAgIG1fcE9jY29udGVudChudWxscHRyKSwKLSAgICBtX2JDaGFuZ2VNYXNrKGZhbHNlKQorICAgIG1fYkNoYW5nZU1hc2soRkFMU0UpCiB7CiB9CiAKQEAgLTQyNiw3ICs0MjYsNyBAQAogICAgIG1fcE9jY29udGVudCA9IG51bGxwdHI7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIGJvb2wgUmVOZXcpCitDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBGWF9CT09MIFJlTmV3KQogewogICAgIGF1dG8gaXQgPSBtX3BhZ2VNYXAuZmluZChwUERGUGFnZSk7CiAgICAgaWYgKGl0ICE9IG1fcGFnZU1hcC5lbmQoKSkKQEAgLTQ0NSw3ICs0NDUsNyBAQAogQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0Q3VycmVudFZpZXcoKQogewogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKiltX3BFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2MpOwotICAgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCB0cnVlKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHBQYWdlID8gR2V0UGFnZVZpZXcocFBhZ2UsIFRSVUUpIDogbnVsbHB0cjsKIH0KIAogQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoaW50IG5JbmRleCkKQEAgLTQ3NCwyNCArNDc0LDI0IEBACiAKIH0KIAotYm9vbCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpCitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OlByb2NPcGVuQWN0aW9uKCkKIHsKICAgICBpZighbV9wRG9jKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKICAgICBpZiAoIXBSb290KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfT2JqZWN0KiBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXREaWN0KCJPcGVuQWN0aW9uIik7CiAgICAgaWYoIXBPcGVuQWN0aW9uKQogICAgICAgICBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXRBcnJheSgiT3BlbkFjdGlvbiIpOwogCiAgICAgaWYoIXBPcGVuQWN0aW9uKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGlmKHBPcGVuQWN0aW9uLT5HZXRUeXBlKCk9PVBERk9CSl9BUlJBWSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogCiAgICAgaWYocE9wZW5BY3Rpb24tPkdldFR5cGUoKT09UERGT0JKX0RJQ1RJT05BUlkpCiAgICAgewpAQCAtNDk5LDkgKzQ5OSw5IEBACiAgICAgICAgIENQREZfQWN0aW9uIGFjdGlvbihwRGljdCk7CiAgICAgICAgIGlmKG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCkpCiAgICAgICAgICAgICBtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9Eb2NPcGVuKGFjdGlvbiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogQ1BERl9PQ0NvbnRleHQqIENQREZTREtfRG9jdW1lbnQ6OkdldE9DQ29udGV4dCgpCkBAIC01NTUsMTQgKzU1NSwxNCBAQAogICAgIHJldHVybiBtX3BGb2N1c0Fubm90OwogfQogCi1ib29sIENQREZTREtfRG9jdW1lbnQ6OlNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OlNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCiB7CiAKLSAgICBpZihtX3BGb2N1c0Fubm90PT1wQW5ub3QpIHJldHVybiB0cnVlOworICAgIGlmKG1fcEZvY3VzQW5ub3Q9PXBBbm5vdCkgcmV0dXJuIFRSVUU7CiAKICAgICBpZihtX3BGb2N1c0Fubm90KQogICAgIHsKLSAgICAgICAgaWYoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICAgIGlmKHBBbm5vdCAmJiBwUGFnZVZpZXctPklzVmFsaWQoKSkKQEAgLTU3MiwxOCArNTcyLDE4IEBACiAgICAgICAgIGlmKHBBbm5vdEhhbmRsZXImJiFtX3BGb2N1c0Fubm90KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uU2V0Rm9jdXMocEFubm90LG5GbGFnKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgaWYoIW1fcEZvY3VzQW5ub3QpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbV9wRm9jdXNBbm5vdD1wQW5ub3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQorRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQogewogICAgIGlmKG1fcEZvY3VzQW5ub3QpCiAgICAgewpAQCAtNjAwLDExICs2MDAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBGb2N1c0Fubm90OwogICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICBpZihGSUVMRFRZUEVfVEVYVEZJRUxEID09IG5GaWVsZFR5cGUgfHwgRklFTERUWVBFX0NPTUJPQk9YID09IG5GaWVsZFR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BFbnYtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhOVUxMLCBOVUxMLCAwLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BFbnYtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhOVUxMLCBOVUxMLCAwLCBGQUxTRSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYoIW1fcEZvY3VzQW5ub3QpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTYxMiw3ICs2MTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ1BERlNES19Eb2N1bWVudDo6T25DbG9zZURvY3VtZW50KCkKQEAgLTYyMCw3ICs2MjAsNyBAQAogICAgIEtpbGxGb2N1c0Fubm90KCk7CiB9CiAKLWJvb2wgQ1BERlNES19Eb2N1bWVudDo6R2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKQorRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpCiB7CiAgICAgRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0VXNlclBlcm1pc3Npb25zKCk7CiAgICAgcmV0dXJuIGR3UGVybWlzc2lvbnMmbkZsYWc7CkBAIC02NTAsMTMgKzY1MCwxMyBAQAogICAgICAgICBtX3BhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKiltX3BhZ2UsICh2b2lkKil0aGlzLCBOVUxMKTsKICAgICBtX2Z4QW5ub3RBcnJheS5SZW1vdmVBbGwoKTsKIAotICAgIG1fYkVudGVyV2lkZ2V0ID0gZmFsc2U7Ci0gICAgbV9iRXhpdFdpZGdldCA9IGZhbHNlOwotICAgIG1fYk9uV2lkZ2V0ID0gZmFsc2U7CisgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgICBtX2JFeGl0V2lkZ2V0ID0gRkFMU0U7CisgICAgbV9iT25XaWRnZXQgPSBGQUxTRTsKICAgICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwotICAgIG1fYlZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG1fYkxvY2tlZCA9IGZhbHNlOwotICAgICAgICBtX2JUYWtlT3ZlclBhZ2UgPSBmYWxzZTsKKyAgICBtX2JWYWxpZCA9IEZBTFNFOworICAgICAgICBtX2JMb2NrZWQgPSBGQUxTRTsKKyAgICAgICAgbV9iVGFrZU92ZXJQYWdlID0gRkFMU0U7CiB9CiAKIENQREZTREtfUGFnZVZpZXc6On5DUERGU0RLX1BhZ2VWaWV3KCkKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgIG1fY3VyTWF0cml4ID0gKnBVc2VyMkRldmljZTsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIHRydWUpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIFRSVUUpOwogICAgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IG51bGxwdHI7CiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgd2hpbGUgKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkgewpAQCAtNzM3LDcgKzczNyw3IEBACiBDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWEFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCiB7CiAKLSAgICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBmYWxzZSk7CisgICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOwogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKICAgICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOwpAQCAtNzU1LDcgKzc1NSw3IEBACiBDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWFdpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQogewogCi0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgZmFsc2UpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIEZBTFNFKTsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAgICAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gTlVMTDsKQEAgLTc3NSwxMiArNzc1LDEyIEBACiB9CiAKIAotYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpBbm5vdF9IYXNBcHBlYXJhbmNlKENQREZfQW5ub3QqIHBBbm5vdCkKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6QW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWMgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOwogICAgIGlmKHBBbm5vdERpYykKICAgICAgICAgcmV0dXJuICBwQW5ub3REaWMtPktleUV4aXN0KCJBUyIpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIENQREZTREtfQW5ub3QqICBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0Fubm90ICogcFBERkFubm90KQpAQCAtODE5LDkgKzgxOSw5IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKK0ZYX0JPT0wgIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBDUERGX0RvY3VtZW50KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZEb2N1bWVudCgpCkBAIC04NjEsNyArODYxLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CiAgICAgQVNTRVJUKHBFbnYpOwpAQCAtODc1LDE4ICs4NzUsMTggQEAKICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKICAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwogCi0gICAgICAgIGJvb2wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25MQnV0dG9uRG93bih0aGlzLCBwRlhBbm5vdCwgbkZsYWcscG9pbnQpOwogICAgICAgICBpZihiUmV0KQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KHBGWEFubm90KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYlJldDsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogCi1ib29sIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKQogewogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52KTsKQEAgLTg5NCw3ICs4OTQsNyBAQAogICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKICAgICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKICAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IEdldEZvY3VzQW5ub3QoKTsKLSAgICBib29sIGJSZXQgID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUmV0ICA9IEZBTFNFOwogICAgIGlmKHBGb2N1c0Fubm90ICYmIHBGb2N1c0Fubm90ICE9IHBGWEFubm90KQogICAgIHsKICAgICAgICAgLy9MYXN0IGZvY3VzIEFubm90IGdldHMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBldmVudC4KQEAgLTkwOCw3ICs5MDgsNyBAQAogICAgIHJldHVybiBiUmV0OwogfQogCi1ib29sIENQREZTREtfUGFnZVZpZXc6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgaW50IG5GbGFnKQorRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZykKIHsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwpAQCAtOTE4LDM2ICs5MTgsMzYgQEAKICAgICB7CiAgICAgICAgIGlmKG1fQ2FwdHVyZVdpZGdldCAmJiBtX0NhcHR1cmVXaWRnZXQgIT0gcEZYQW5ub3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSB0cnVlOwotICAgICAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBUUlVFOworICAgICAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKICAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFeGl0KHRoaXMsIG1fQ2FwdHVyZVdpZGdldCwgbkZsYWcpOwogICAgICAgICB9CiAgICAgICAgIG1fQ2FwdHVyZVdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEZYQW5ub3Q7Ci0gICAgICAgIG1fYk9uV2lkZ2V0ID0gdHJ1ZTsKKyAgICAgICAgbV9iT25XaWRnZXQgPSBUUlVFOwogICAgICAgICBpZighbV9iRW50ZXJXaWRnZXQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gVFJVRTsKKyAgICAgICAgICAgIG1fYkV4aXRXaWRnZXQgPSBGQUxTRTsKICAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFbnRlcih0aGlzLCBwRlhBbm5vdCxuRmxhZyk7CiAgICAgICAgIH0KICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZU1vdmUodGhpcywgcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYobV9iT25XaWRnZXQpCiAgICAgewotICAgICAgICBtX2JPbldpZGdldCA9IGZhbHNlOwotICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gdHJ1ZTsKLSAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBmYWxzZTsKKyAgICAgICAgbV9iT25XaWRnZXQgPSBGQUxTRTsKKyAgICAgICAgbV9iRXhpdFdpZGdldCA9IFRSVUU7CisgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7CiAgICAgICAgIGlmKG1fQ2FwdHVyZVdpZGdldCkKICAgICAgICAgewogICAgICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUV4aXQodGhpcywgbV9DYXB0dXJlV2lkZ2V0LCBuRmxhZyk7CiAgICAgICAgICAgICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZykKIHsKICAgICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSkpCiAgICAgewpAQCAtOTU2LDExICs5NTYsMTEgQEAKICAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZVdoZWVsKHRoaXMsIHBBbm5vdCwgbkZsYWcsIChpbnQpZGVsdGFZLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiAKIH0KIAotYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKQorRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKQogewogICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKICAgICB7CkBAIC05NzAsMTAgKzk3MCwxMCBAQAogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZykKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewogICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKICAgICB7CkBAIC05ODIsMTcgKzk4MiwxNyBAQAogICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCiB7CiAvLyAgaWYoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKQogLy8gIHsKIC8vICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gZ19wRm9ybUZpbGxBcHAtPkdldElGb3JtRmlsbGVyKCk7CiAvLyAgICAgIHJldHVybiBwSUZvcm1GaWxsZXItPk9uS2V5VXAocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwogLy8gIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0Fubm90KiBwUERGQW5ub3QpOwpAQCAtMTAwMSwxMyArMTAwMSwxMyBAQAogewogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogCi0gICAgYm9vbCBlbmFibGVBUFVwZGF0ZSA9IENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpOworICAgIEZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKICAgICAvL0Rpc2FibGUgdGhlIGRlZmF1bHQgQVAgY29uc3RydWN0aW9uLgotICAgIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChmYWxzZSk7CisgICAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZBTFNFKTsKICAgICBtX3BBbm5vdExpc3QgPSBuZXcgQ1BERl9Bbm5vdExpc3QobV9wYWdlKTsKICAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoZW5hYmxlQVBVcGRhdGUpOwogICAgIGludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0gICAgICAgIFNldExvY2sodHJ1ZSk7CisgICAgICAgIFNldExvY2soVFJVRSk7CiAgICAgZm9yKGludCBpPTA7IGk8bkNvdW50OyBpKyspCiAgICAgewogICAgICAgICBDUERGX0Fubm90KiBwUERGQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKICAgICAgICAgfQogCiAgICAgfQotICAgICAgICBTZXRMb2NrKGZhbHNlKTsKKyAgICAgICAgU2V0TG9jayhGQUxTRSk7CiB9CiAKIHZvaWQgICAgQ1BERlNES19QYWdlVmlldzo6VXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpCkBAIC0xMDY0LDE2ICsxMDY0LDE2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1ib29sIENQREZTREtfUGFnZVZpZXc6OklzVmFsaWRBbm5vdCh2b2lkKiBwKQorRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpJc1ZhbGlkQW5ub3Qodm9pZCogcCkKIHsKLSAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogICAgIGludCBpQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykKICAgICB7CiAgICAgICAgIGlmIChtX3BBbm5vdExpc3QtPkdldEF0KGkpID09IHApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCmluZGV4IDJiYzNlYTguLmY5NmRiOTQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcApAQCAtMzgsMTAgKzM4LDEwIEBACiAgICAgbV9JUGF1c2UgPSBJUGF1c2U7CiB9CiAKLWJvb2wgSUZTREtfUEFVU0VfQWRhcHRlcjo6TmVlZFRvUGF1c2VOb3coKQorRlhfQk9PTCBJRlNES19QQVVTRV9BZGFwdGVyOjpOZWVkVG9QYXVzZU5vdygpCiB7CiAgICAgaWYgKG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdykgewogICAgICAgICByZXR1cm4gbV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93KG1fSVBhdXNlKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcCBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcAppbmRleCA3ZjI4NDNjLi4zMDlhOThmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwCkBAIC02Niw3ICs2Niw3IEBACiB9CiAKIENGWF9CeXRlU3RyaW5nIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJCQkJCSBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKiA9IE5VTEwqLywgYm9vbCBiQ29udGludW91cy8qID0gdHJ1ZSovLCBGWF9XT1JEIFN1YldvcmQvKiA9IDAqLykKKwkJCQkJCQkJCQkJCSBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKiA9IE5VTEwqLywgRlhfQk9PTCBiQ29udGludW91cy8qID0gVFJVRSovLCBGWF9XT1JEIFN1YldvcmQvKiA9IDAqLykKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNXb3JkczsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAppbmRleCBiMWFkNTlkLi42MzExNWMyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcApAQCAtMjEsNzAgKzIxLDcwIEBACiB7CiB9CiAKLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dFdvcmQoKTsKIH0KIAotYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKQorRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0TGluZSgpOwogfQogCi1ib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRTZWN0aW9uKCk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKIH0KIAotYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKQorRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2TGluZSgpOwogfQogCi1ib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZTZWN0aW9uKCk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKICAgICB7CiAgICAgICAgIHdvcmQucHRXb3JkID0gbV9wRWRpdC0+VlRUb0VkaXQod29yZC5wdFdvcmQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKICAgICB7CiAgICAgICAgIGxpbmUucHRMaW5lID0gbV9wRWRpdC0+VlRUb0VkaXQobGluZS5wdExpbmUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKIHsKICAgICBBU1NFUlQobV9wRWRpdCk7CiAKICAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkKICAgICB7CiAgICAgICAgIHNlY3Rpb24ucmNTZWN0aW9uID0gbV9wRWRpdC0+VlRUb0VkaXQoc2VjdGlvbi5yY1NlY3Rpb24pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGludDMyX3QgbldvcmRJbmRleCkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1ib29sIENGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCitGWF9CT09MIENGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCiB7CiAgICAgcmV0dXJuIEZYX0VESVRfSVNMQVRJTldPUkQod29yZCk7CiB9CkBAIC0yMTAsNyArMjEwLDcgQEAKIAogdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpBbmFseXNlKGludDMyX3QgbkFsaWdubWVudCkKIHsKLSAgICBib29sIGJMaW5lVG9wQ2hhbmdlZCA9IGZhbHNlOworICAgIEZYX0JPT0wgYkxpbmVUb3BDaGFuZ2VkID0gRkFMU0U7CiAgICAgQ1BERl9SZWN0IHJjUmVzdWx0OwogICAgIEZYX0ZMT0FUIGZXaWR0aERpZmY7CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBOZXdSZWN0LT5Jc1NhbWVUb3AoKnBPbGRSZWN0KSB8fCAhcE5ld1JlY3QtPklzU2FtZUhlaWdodCgqcE9sZFJlY3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMaW5lVG9wQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmVUb3BDaGFuZ2VkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMzI0LDkgKzMyNCw5IEBACiAKIENGWF9FZGl0X1VuZG86OkNGWF9FZGl0X1VuZG8oaW50MzJfdCBuQnVmc2l6ZSkgOiBtX25DdXJVbmRvUG9zKDApLAogICAgIG1fbkJ1ZlNpemUobkJ1ZnNpemUpLAotICAgIG1fYk1vZGlmaWVkKGZhbHNlKSwKLSAgICBtX2JWaXJnaW4odHJ1ZSksCi0gICAgbV9iV29ya2luZyhmYWxzZSkKKyAgICBtX2JNb2RpZmllZChGQUxTRSksCisgICAgbV9iVmlyZ2luKFRSVUUpLAorICAgIG1fYldvcmtpbmcoRkFMU0UpCiB7CiB9CiAKQEAgLTMzNSwxNCArMzM1LDE0IEBACiAgICAgUmVzZXQoKTsKIH0KIAotYm9vbCBDRlhfRWRpdF9VbmRvOjpDYW5VbmRvKCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuVW5kbygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPiAwOwogfQogCiB2b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKQogewotICAgIG1fYldvcmtpbmcgPSB0cnVlOworICAgIG1fYldvcmtpbmcgPSBUUlVFOwogCiAgICAgaWYgKG1fbkN1clVuZG9Qb3MgPiAwKQogICAgIHsKQEAgLTM1NSwxNyArMzU1LDE3IEBACiAgICAgICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CiAgICAgfQogCi0gICAgbV9iV29ya2luZyA9IGZhbHNlOworICAgIG1fYldvcmtpbmcgPSBGQUxTRTsKIH0KIAotYm9vbCBDRlhfRWRpdF9VbmRvOjpDYW5SZWRvKCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuUmVkbygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPCBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwogfQogCiB2b2lkIENGWF9FZGl0X1VuZG86OlJlZG8oKQogewotICAgIG1fYldvcmtpbmcgPSB0cnVlOworICAgIG1fYldvcmtpbmcgPSBUUlVFOwogCiAgICAgaW50MzJfdCBuU3RhY2tTaXplID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKIApAQCAtMzgwLDEwICszODAsMTAgQEAKICAgICAgICAgbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsKICAgICB9CiAKLSAgICBtX2JXb3JraW5nID0gZmFsc2U7CisgICAgbV9iV29ya2luZyA9IEZBTFNFOwogfQogCi1ib29sIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0CitGWF9CT09MIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYldvcmtpbmc7CiB9CkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBpZiAobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+PSBtX25CdWZTaXplKQogICAgIHsKICAgICAgICAgUmVtb3ZlSGVhZHMoKTsKLSAgICAgICAgbV9iVmlyZ2luID0gZmFsc2U7CisgICAgICAgIG1fYlZpcmdpbiA9IEZBTFNFOwogICAgIH0KIAogICAgIG1fVW5kb0l0ZW1TdGFjay5BZGQocEl0ZW0pOwpAQCAtNDA5LDkgKzQwOSw5IEBACiAgICAgbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsKIH0KIAotYm9vbCBDRlhfRWRpdF9VbmRvOjpJc01vZGlmaWVkKCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6SXNNb2RpZmllZCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fYlZpcmdpbiA/IG1fYk1vZGlmaWVkIDogdHJ1ZTsKKyAgICByZXR1cm4gbV9iVmlyZ2luID8gbV9iTW9kaWZpZWQgOiBUUlVFOwogfQogCiBJRlhfRWRpdF9VbmRvSXRlbSogQ0ZYX0VkaXRfVW5kbzo6R2V0SXRlbShpbnQzMl90IG5JbmRleCkKQEAgLTQ2OSw4ICs0NjksOCBAQAogewogICAgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7CiAKLSAgICBwVW5kb0l0ZW0tPlNldEZpcnN0KGZhbHNlKTsKLSAgICBwVW5kb0l0ZW0tPlNldExhc3QoZmFsc2UpOworICAgIHBVbmRvSXRlbS0+U2V0Rmlyc3QoRkFMU0UpOworICAgIHBVbmRvSXRlbS0+U2V0TGFzdChGQUxTRSk7CiAKICAgICBtX0l0ZW1zLkFkZChwVW5kb0l0ZW0pOwogCkBAIC00ODQsMTEgKzQ4NCwxMSBAQAogICAgIHsKICAgICAgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBGaXJzdEl0ZW0gPSBtX0l0ZW1zWzBdOwogICAgICAgICBBU1NFUlQocEZpcnN0SXRlbSAhPSBOVUxMKTsKLSAgICAgICAgcEZpcnN0SXRlbS0+U2V0Rmlyc3QodHJ1ZSk7CisgICAgICAgIHBGaXJzdEl0ZW0tPlNldEZpcnN0KFRSVUUpOwogCiAgICAgICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwTGFzdEl0ZW0gPSBtX0l0ZW1zW21fSXRlbXMuR2V0U2l6ZSgpIC0gMV07CiAgICAgICAgIEFTU0VSVChwTGFzdEl0ZW0gIT0gTlVMTCk7Ci0gICAgICAgIHBMYXN0SXRlbS0+U2V0TGFzdCh0cnVlKTsKKyAgICAgICAgcExhc3RJdGVtLT5TZXRMYXN0KFRSVUUpOwogICAgIH0KIH0KIApAQCAtNTM5LDcgKzUzOSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CiAgICAgfQogfQogCkBAIC01NDksNyArNTQ5LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSx0cnVlKTsKKyAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLFRSVUUpOwogICAgIH0KIH0KIApAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLGZhbHNlLHRydWUpOworICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwogICAgIH0KIH0KIApAQCAtNTg5LDcgKzU4OSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoZmFsc2UsdHJ1ZSk7CisgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKICAgICB9CiB9CiAKQEAgLTYxOSw3ICs2MTksNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKGZhbHNlLHRydWUpOworICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsVFJVRSk7CiAgICAgfQogfQogCkBAIC02MzEsMTEgKzYzMSwxMSBAQAogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKICAgICAgICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTY0NSw3ICs2NDUsNyBAQAogCiBDRlhFVV9EZWxldGU6OkNGWEVVX0RlbGV0ZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBib29sIGJTZWNFbmQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBGWF9CT09MIGJTZWNFbmQpIDoKICAgICAgICAgICAgIG1fcEVkaXQocEVkaXQpLAogICAgICAgICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKICAgICAgICAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCkBAIC02NjcsNyArNjY3LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkRlbGV0ZShmYWxzZSx0cnVlKTsKKyAgICAgICAgbV9wRWRpdC0+RGVsZXRlKEZBTFNFLFRSVUUpOwogICAgIH0KIH0KIApAQCAtNjc5LDExICs2NzksMTEgQEAKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CiAgICAgICAgIGlmIChtX2JTZWNFbmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTcwOCw3ICs3MDgsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKGZhbHNlLHRydWUpOworICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKICAgICB9CiB9CiAKQEAgLTcxOCw3ICs3MTgsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dyU2VsLkJlZ2luUG9zKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwogICAgIH0KIH0KQEAgLTc1MCw3ICs3NTAsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKGZhbHNlLHRydWUpOworICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKICAgICB9CiB9CiAKQEAgLTc2MiwxMSArNzYyLDExIEBACiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwogICAgICAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxmYWxzZSxmYWxzZSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLEZBTFNFKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLGZhbHNlLGZhbHNlKTsKKyAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLEZBTFNFKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChJc0ZpcnN0KCkpCkBAIC04MDYsNyArODA2LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgbV9uQ2hhcnNldCwgJm1fU2VjUHJvcHMsICZtX1dvcmRQcm9wcywgZmFsc2UsIHRydWUpOworICAgICAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LmNfc3RyKCksIG1fbkNoYXJzZXQsICZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKICAgICB9CiB9CiAKQEAgLTgxNiw3ICs4MTYsNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93cE9sZCxtX3dwTmV3KTsKLSAgICAgICAgbV9wRWRpdC0+Q2xlYXIoZmFsc2UsdHJ1ZSk7CisgICAgICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOwogICAgIH0KIH0KIApAQCAtODQ0LDcgKzg0NCw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRTZWNQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3U2VjUHJvcHMsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxmYWxzZSk7CisgICAgICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9OZXdTZWNQcm9wcywmbV9OZXdXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKICAgICAgICAgaWYgKElzTGFzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC04NTgsNyArODU4LDcgQEAKIHsKICAgICBpZiAobV9wRWRpdCkKICAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRTZWNQcm9wcywmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLGZhbHNlKTsKKyAgICAgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFNlY1Byb3BzLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOwogICAgICAgICBpZiAoSXNGaXJzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC04ODksNyArODg5LDcgQEAKIHsKICAgICBpZiAobV9wRWRpdCkKICAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxmYWxzZSk7CisgICAgICAgIG1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7CiAgICAgICAgIGlmIChJc0xhc3QoKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwpAQCAtOTAzLDcgKzkwMyw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsZmFsc2UpOworICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX09sZFdvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOwogICAgICAgICBpZiAoSXNGaXJzdCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CkBAIC05MjUsMTggKzkyNSwxOCBAQAogICAgIG1fU2VsU3RhdGUoKSwKICAgICBtX3B0U2Nyb2xsUG9zKDAsMCksCiAgICAgbV9wdFJlZnJlc2hTY3JvbGxQb3MoMCwwKSwKLSAgICBtX2JFbmFibGVTY3JvbGwoZmFsc2UpLAorICAgIG1fYkVuYWJsZVNjcm9sbChGQUxTRSksCiAgICAgbV9wSXRlcmF0b3IoTlVMTCksCiAgICAgbV9wdENhcmV0KDAuMGYsMC4wZiksCiAgICAgbV9VbmRvKEZYX0VESVRfVU5ET19NQVhJVEVNKSwKICAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgbV9iTm90aWZ5RmxhZyhmYWxzZSksCi0gICAgbV9iRW5hYmxlT3ZlcmZsb3coZmFsc2UpLAotICAgIG1fYkVuYWJsZVJlZnJlc2godHJ1ZSksCisgICAgbV9iTm90aWZ5RmxhZyhGQUxTRSksCisgICAgbV9iRW5hYmxlT3ZlcmZsb3coRkFMU0UpLAorICAgIG1fYkVuYWJsZVJlZnJlc2goVFJVRSksCiAgICAgbV9yY09sZENvbnRlbnQoMC4wZiwwLjBmLDAuMGYsMC4wZiksCi0gICAgbV9iRW5hYmxlVW5kbyh0cnVlKSwKLSAgICBtX2JOb3RpZnkodHJ1ZSksCi0gICAgbV9iT3ByTm90aWZ5KGZhbHNlKSwKKyAgICBtX2JFbmFibGVVbmRvKFRSVUUpLAorICAgIG1fYk5vdGlmeShUUlVFKSwKKyAgICBtX2JPcHJOb3RpZnkoRkFMU0UpLAogICAgIG1fcEdyb3VwVW5kb0l0ZW0oTlVMTCkKIHsKICAgICBBU1NFUlQocFZUICE9IE5VTEwpOwpAQCAtMTAwMiw5MiArMTAwMiw5MiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogICAgIG1fcFZULT5TZXRQbGF0ZVJlY3QocmVjdCk7CiAgICAgbV9wdFNjcm9sbFBvcyA9IENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0LyogPTAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCit2b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogICAgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQvKiA9JyonICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQvKiA9JyonICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogICAgIG1fcFZULT5TZXRQYXNzd29yZENoYXIod1N1YldvcmQpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX3BWVC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX3BWVC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLyogPTAuMGYgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCit2b2lkIENGWF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZS8qID0wLjBmICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogICAgIG1fcFZULT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZS8qID0xMDAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCit2b2lkIENGWF9FZGl0OjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLyogPTEwMCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX3BWVC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUvKiA9dHJ1ZSAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX3BWVC0+U2V0TXVsdGlMaW5lKGJNdWx0aUxpbmUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9SZXR1cm4oYm9vbCBiQXV0by8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAgICAgbV9wVlQtPlNldEF1dG9SZXR1cm4oYkF1dG8pOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZy8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAgICAgbV9wVlQtPlNldExpbmVMZWFkaW5nKGZMaW5lTGVhZGluZyk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8vKiA9dHJ1ZSAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAgICAgbV9wVlQtPlNldEF1dG9Gb250U2l6ZShiQXV0byk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogICAgIG1fcFZULT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9TY3JvbGwoYm9vbCBiQXV0by8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDRlhfRWRpdDo6U2V0QXV0b1Njcm9sbChGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAgICAgbV9iRW5hYmxlU2Nyb2xsID0gYkF1dG87CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0VGV4dE92ZXJmbG93KGJvb2wgYkFsbG93ZWQgLyo9IGZhbHNlKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCit2b2lkIENGWF9FZGl0OjpTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCAvKj0gRkFMU0UqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKICAgICBtX2JFbmFibGVPdmVyZmxvdyA9IGJBbGxvd2VkOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CkBAIC0xMTkzLDcgKzExOTMsNyBAQAogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworICAgICAgICAgICAgRlhfQk9PTCBiUmljaCA9IG1fcFZULT5Jc1JpY2hUZXh0KCk7CiAKICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7Ci0gICAgICAgIGJvb2wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworICAgICAgICBGWF9CT09MIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKIAogICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKICAgICAgICAgewpAQCAtMTMzMSw0NiArMTMzMSw0NiBAQAogICAgIHJldHVybiB3clJldDsKIH0KIAotYm9vbCBDRlhfRWRpdDo6SXNSaWNoVGV4dCgpIGNvbnN0CitGWF9CT09MIENGWF9FZGl0OjpJc1JpY2hUZXh0KCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9wVlQtPklzUmljaFRleHQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0UmljaFRleHQoYm9vbCBiUmljaFRleHQvKiA9dHJ1ZSAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0LyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAgICAgbV9wVlQtPlNldFJpY2hUZXh0KGJSaWNoVGV4dCk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6U2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLm5Gb250SW5kZXggPSBuRm9udEluZGV4OwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRJTkRFWCxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLmZGb250U2l6ZSA9IGZGb250U2l6ZTsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9GT05UU0laRSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIFdvcmRQcm9wcy5kd1dvcmRDb2xvciA9IGR3Q29sb3I7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfV09SRENPTE9SLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMublNjcmlwdFR5cGUgPSBuU2NyaXB0VHlwZTsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9TQ1JJUFRUWVBFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Qm9sZChib29sIGJCb2xkKQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIGlmIChiQm9sZCkKQEAgLTEzNzgsNyArMTM3OCw3IEBACiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQk9MRCxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dEl0YWxpYyhib29sIGJJdGFsaWMpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIGlmIChiSXRhbGljKQpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9JVEFMSUMsTlVMTCwmV29yZFByb3BzKTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoYm9vbCBiVW5kZXJsaW5lKQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYlVuZGVybGluZSkKQEAgLTEzOTQsNyArMTM5NCw3IEBACiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfVU5ERVJMSU5FLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q3Jvc3NvdXQoYm9vbCBiQ3Jvc3NvdXQpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0KQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYkNyb3Nzb3V0KQpAQCAtMTQwMiw0NSArMTQwMiw0NSBAQAogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NST1NTT1VULE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMuZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQ0hBUlNQQUNFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSAvKj0gMTAwKi8pCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgLyo9IDEwMCovKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMubkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfSE9SWlNDQUxFLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5mTGluZUxlYWRpbmcgPSBmTGluZUxlYWRpbmc7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfTElORUxFQURJTkcsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5mTGluZUluZGVudCA9IGZMaW5lSW5kZW50OwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0xJTkVJTkRFTlQsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpCiB7CiAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKICAgICBTZWNQcm9wcy5uQWxpZ25tZW50ID0gbkFsaWdubWVudDsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9BTElHTk1FTlQsJlNlY1Byb3BzLE5VTEwpOwogfQogCi1ib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQogewotICAgIGJvb2wgYlNldCA9IGZhbHNlOwotICAgIGJvb2wgYlNldDEsYlNldDI7CisgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiU2V0MSxiU2V0MjsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCkBAIC0xNDUzLDE0ICsxNDUzLDE0IEBACiAKICAgICAgICAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7OwogCi0gICAgICAgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLHdyVGVtcC5CZWdpblBvcyxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsdHJ1ZSk7CisgICAgICAgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLHdyVGVtcC5CZWdpblBvcyxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7CiAKICAgICAgICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAgICAgICAgICAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBiU2V0MSA9IFNldFNlY1Byb3BzKGVQcm9wcyxwbGFjZSxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYlNldDIgPSBTZXRXb3JkUHJvcHMoZVByb3BzLHBsYWNlLHBXb3JkUHJvcHMsd3JUZW1wLHRydWUpOworICAgICAgICAgICAgICAgIGJTZXQxID0gU2V0U2VjUHJvcHMoZVByb3BzLHBsYWNlLHBTZWNQcm9wcyxwV29yZFByb3BzLHdyVGVtcCxUUlVFKTsKKyAgICAgICAgICAgICAgICBiU2V0MiA9IFNldFdvcmRQcm9wcyhlUHJvcHMscGxhY2UscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIWJTZXQpCiAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSAoYlNldDEgfHwgYlNldDIpOwpAQCAtMTUxNiwxNSArMTUxNiwxNSBAQAogICAgIH0KIH0KIAotYm9vbCBDRlhfRWRpdDo6U2V0U2VjUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgRlhfQk9PTCBiQWRkVW5kbykKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBDUFZUX1NlY3Rpb24gc2VjaW5mbzsKICAgICAgICAgICAgIENQVlRfU2VjdGlvbiBPbGRTZWNpbmZvOwogCkBAIC0xNTQ1LDIxICsxNTQ1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyxwU2VjUHJvcHMtPmZMaW5lTGVhZGluZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyA9IHBTZWNQcm9wcy0+ZkxpbmVMZWFkaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9MSU5FSU5ERU5UOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5TZWNQcm9wcy5mTGluZUluZGVudCxwU2VjUHJvcHMtPmZMaW5lSW5kZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBwU2VjUHJvcHMtPmZMaW5lSW5kZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9BTElHTk1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCAhPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTU4Myw0MiArMTU4Myw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ICE9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ID0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfRk9OVFNJWkU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUscFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfV09SRENPTE9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1NDUklQVFRZUEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlICE9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQ0hBUlNQQUNFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSxwV29yZFByb3BzLT5mQ2hhclNwYWNlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9IT1JaU0NBTEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9VTkRFUkxJTkU6CkBAIC0xNjI3LDcgKzE2MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTYzNSw3ICsxNjM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE2NDUsNyArMTY0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY1Myw3ICsxNjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjYzLDcgKzE2NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xNjcxLDcgKzE2NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjgxLDcgKzE2ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY4OSw3ICsxNjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE3MTcsMTcgKzE3MTcsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OlNldFdvcmRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pCitGWF9CT09MIENGWF9FZGl0OjpTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpCiAgICAgewogICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKICAgICAgICAgewotICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIENQVlRfV29yZCB3b3JkaW5mbzsKICAgICAgICAgICAgIENQVlRfV29yZCBPbGRXb3JkaW5mbzsKIApAQCAtMTc0OSw0MiArMTc0OSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Gb250SW5kZXggPSBwRm9udE1hcC0+R2V0V29yZEZvbnRJbmRleCh3b3JkaW5mby5Xb3JkLHdvcmRpbmZvLm5DaGFyc2V0LHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbCh3b3JkaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLHBXb3JkUHJvcHMtPmZGb250U2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgIT0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0NIQVJTUEFDRToKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwod29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UscFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSE9SWlNDQUxFOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgpAQCAtMTc5Myw3ICsxNzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODExLDcgKzE4MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4MTksNyArMTgxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTgyOSw3ICsxODI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTgzNyw3ICsxODM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTg0Nyw3ICsxODQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4NTUsNyArMTg1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODgxLDQ0ICsxODgxLDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENGWF9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgU2V0VGV4dCh0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMsdHJ1ZSx0cnVlKTsKKyAgICBTZXRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOwogfQogCi1ib29sIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgcmV0dXJuIEluc2VydFdvcmQod29yZCxjaGFyc2V0LHBXb3JkUHJvcHMsdHJ1ZSx0cnVlKTsKKyAgICByZXR1cm4gSW5zZXJ0V29yZCh3b3JkLGNoYXJzZXQscFdvcmRQcm9wcyxUUlVFLFRSVUUpOwogfQogCi1ib29sIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQorRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKIHsKLSAgICByZXR1cm4gSW5zZXJ0UmV0dXJuKHBTZWNQcm9wcyxwV29yZFByb3BzLHRydWUsdHJ1ZSk7CisgICAgcmV0dXJuIEluc2VydFJldHVybihwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOwogfQogCi1ib29sIENGWF9FZGl0OjpCYWNrc3BhY2UoKQorRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKCkKIHsKLSAgICByZXR1cm4gQmFja3NwYWNlKHRydWUsdHJ1ZSk7CisgICAgcmV0dXJuIEJhY2tzcGFjZShUUlVFLFRSVUUpOwogfQogCi1ib29sIENGWF9FZGl0OjpEZWxldGUoKQorRlhfQk9PTCBDRlhfRWRpdDo6RGVsZXRlKCkKIHsKLSAgICByZXR1cm4gRGVsZXRlKHRydWUsdHJ1ZSk7CisgICAgcmV0dXJuIERlbGV0ZShUUlVFLFRSVUUpOwogfQogCi1ib29sIENGWF9FZGl0OjpDbGVhcigpCitGWF9CT09MIENGWF9FZGl0OjpDbGVhcigpCiB7Ci0gICAgcmV0dXJuIENsZWFyKHRydWUsdHJ1ZSk7CisgICAgcmV0dXJuIENsZWFyKFRSVUUsVFJVRSk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgLyo9IERFRkFVTFRfQ0hBUlNFVCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgcmV0dXJuIEluc2VydFRleHQodGV4dCxjaGFyc2V0LHBTZWNQcm9wcyxwV29yZFByb3BzLHRydWUsdHJ1ZSk7CisgICAgcmV0dXJuIEluc2VydFRleHQodGV4dCxjaGFyc2V0LHBTZWNQcm9wcyxwV29yZFByb3BzLFRSVUUsVFJVRSk7CiB9CiAKIEZYX0ZMT0FUIENGWF9FZGl0OjpHZXRGb250U2l6ZSgpIGNvbnN0CkBAIC0yMDM5LDkgKzIwMzksOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25Db250ZW50Q2hhbmdlKHJjQ29udGVudCk7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fcmNPbGRDb250ZW50ID0gcmNDb250ZW50OwogICAgICAgICB9CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogICAgIH0KIH0KIAotYm9vbCBDRlhfRWRpdDo6SXNTZWxlY3RlZCgpIGNvbnN0CitGWF9CT09MIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7CiB9CkBAIC0yMTUzLDEzICsyMTUzLDEzIEBACiAKICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOwogICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5sZWZ0LCByY0NvbnRlbnQucmlnaHQsIHJjUGxhdGUuV2lkdGgoKSAvIDMsIHJjUGxhdGUuV2lkdGgoKSk7CiAKICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAogICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCByY1BsYXRlLkhlaWdodCgpIC8gMywgcmNQbGF0ZS5IZWlnaHQoKSk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMTc5LDkgKzIxNzksOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NYKGZ4KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMjAzLDkgKzIyMDMsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzczLDEzICsyMzczLDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKICAgICAgICAgICAgICAgICBpZiAoY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5ICogcFJlY3RzID0gbV9SZWZyZXNoLkdldFJlZnJlc2hSZWN0cygpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBSZWN0cy0+R2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QocFJlY3RzLT5HZXRBdChpKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjQ5OSwxMCArMjQ5OSwxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjV29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjUxNywxMCArMjUxNywxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjTGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNTY1LDkgKzI1NjUsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0Q2FyZXQoIW1fU2VsU3RhdGUuSXNFeGlzdCgpLFZUVG9FZGl0KHB0SGVhZCksVlRUb0VkaXQocHRGb290KSwgbV93cENhcmV0KTsKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjYwMyw5ICsyNjAzLDkgQEAKIAogICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CiAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkNhcmV0Q2hhbmdlKFNlY1Byb3BzLFdvcmRQcm9wcyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNjI0LDcgKzI2MjQsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNjM4LDcgKzI2MzgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNjU3LDcgKzI2NTcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19VUChib29sIGJTaGlmdCxib29sIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI2ODgsNyArMjY4OCw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI3MTksNyArMjcxOSw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI3NzMsNyArMjc3Myw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjgyNyw3ICsyODI3LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjg3Niw3ICsyODc2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI5MjYsNyArMjkyNiw3IEBACiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQogewogICAgIEVtcHR5KCk7CiAgICAgRG9JbnNlcnRUZXh0KENQVlRfV29yZFBsYWNlKDAsMCwtMSksIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcyk7CkBAIC0yOTM2LDkgKzI5MzYsOSBAQAogICAgIC8vaWYgKGJBZGRVbmRvKQogfQogCi1ib29sIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQorRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKIHsKLSAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yOTYwLDE3ICsyOTYwLDE3IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0V29yZChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCiB7Ci0gICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjk5OCwxOCArMjk5OCwxOCBAQAogICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFJldHVybihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGWF9FZGl0OjpCYWNrc3BhY2UoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCitGWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewotICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CkBAIC0zMDYyLDE4ICszMDYyLDE4IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uQmFja1NwYWNlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OkRlbGV0ZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkRlbGV0ZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7Ci0gICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CiAgICAgICAgIENQVlRfV29yZCB3b3JkOwpAQCAtMzA4OSw3ICszMDg5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgYm9vbCBiU2VjRW5kID0gKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOworICAgICAgICBGWF9CT09MIGJTZWNFbmQgPSAobV93cENhcmV0ID09IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CiAKICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmQobV93cENhcmV0KSk7CiAgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwpAQCAtMzEyNiwyNiArMzEyNiwyNiBAQAogICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgIG1fcE9wck5vdGlmeS0+T25EZWxldGUobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENGWF9FZGl0OjpFbXB0eSgpCitGWF9CT09MIENGWF9FZGl0OjpFbXB0eSgpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewogICAgICAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7CiAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKIAotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6Q2xlYXIoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCitGWF9CT09MIENGWF9FZGl0OjpDbGVhcihGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0zMTg0LDggKzMxODQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihvbGRwbGFjZSx0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihwbGFjZSx0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihvbGRwbGFjZSxUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihwbGFjZSxUUlVFKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhclJpY2godGhpcyxvbGRwbGFjZSxwbGFjZSxyYW5nZSx3b3JkaW5mby5Xb3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLm5DaGFyc2V0LHNlY2luZm8uU2VjUHJvcHMsd29yZGluZm8uV29yZFByb3BzKSk7CkBAIC0zMjIwLDE3ICszMjIwLDE3IEBACiAgICAgICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uQ2xlYXIobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQorRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQogewotICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKIAogICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKICAgICBTZXRDYXJldChEb0luc2VydFRleHQobV93cENhcmV0LCB0ZXh0LCBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpKTsKQEAgLTMyNDksOSArMzI0OSw5IEBACiAgICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQogICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFRleHQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDRlhfRWRpdDo6UGFpbnRJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXcpCkBAIC0zMjcyLDMyICszMjcyLDMyIEBACiAgICAgfQogfQogCi1ib29sIENGWF9FZGl0OjpSZWRvKCkKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlJlZG8oKQogewogICAgIGlmIChtX2JFbmFibGVVbmRvKQogICAgIHsKICAgICAgICAgaWYgKG1fVW5kby5DYW5SZWRvKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIG1fVW5kby5SZWRvKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6VW5kbygpCitGWF9CT09MIENGWF9FZGl0OjpVbmRvKCkKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIGlmIChtX1VuZG8uQ2FuVW5kbygpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX1VuZG8uVW5kbygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0T3JpZ2luKCkKQEAgLTMzMzksNyArMzMzOSw3IEBACiAgICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKCk7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdAorRlhfQk9PTCBDRlhfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CiB7CiAgICAgaW50MzJfdCBuVG90YWxXb3JkcyA9IG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7CiAgICAgaW50MzJfdCBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOwpAQCAtMzM0OSw3ICszMzQ5LDcgQEAKICAgICAgICAgfHwgKG5DaGFyQXJyYXk+MCAmJiBuVG90YWxXb3JkcyA+PSBuQ2hhckFycmF5KTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6SXNUZXh0T3ZlcmZsb3coKSBjb25zdAorRlhfQk9PTCBDRlhfRWRpdDo6SXNUZXh0T3ZlcmZsb3coKSBjb25zdAogewogICAgIGlmICghbV9iRW5hYmxlU2Nyb2xsICYmICFtX2JFbmFibGVPdmVyZmxvdykKICAgICB7CkBAIC0zMzU4LDEzICszMzU4LDEzIEBACiAKICAgICAgICAgaWYgKG1fcFZULT5Jc011bHRpTGluZSgpICYmIEdldFRvdGFsTGluZXMoKSA+IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gVFJVRTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LldpZHRoKCkscmNQbGF0ZS5XaWR0aCgpKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LldpZHRoKCkscmNQbGF0ZS5XaWR0aCgpKSkgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldExpbmVCZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0CkBAIC0zMzg3LDUyICszMzg3LDUyIEBACiAgICAgcmV0dXJuIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UocGxhY2UpOwogfQogCi1ib29sIENGWF9FZGl0OjpDYW5VbmRvKCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkNhblVuZG8oKSBjb25zdAogewogICAgIGlmIChtX2JFbmFibGVVbmRvKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fVW5kby5DYW5VbmRvKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDRlhfRWRpdDo6Q2FuUmVkbygpIGNvbnN0CitGWF9CT09MIENGWF9FZGl0OjpDYW5SZWRvKCkgY29uc3QKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIHJldHVybiBtX1VuZG8uQ2FuUmVkbygpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ0ZYX0VkaXQ6OklzTW9kaWZpZWQoKSBjb25zdAorRlhfQk9PTCBDRlhfRWRpdDo6SXNNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fYkVuYWJsZVVuZG8pCiAgICAgewogICAgICAgICByZXR1cm4gbV9VbmRvLklzTW9kaWZpZWQoKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVSZWZyZXNoKGJvb2wgYlJlZnJlc2gpCit2b2lkIENGWF9FZGl0OjpFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpCiB7CiAgICAgbV9iRW5hYmxlUmVmcmVzaCA9IGJSZWZyZXNoOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKGJvb2wgYlVuZG8pCit2b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pCiB7CiAgICAgbV9iRW5hYmxlVW5kbyA9IGJVbmRvOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KQordm9pZCBDRlhfRWRpdDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBtX2JOb3RpZnkgPSBiTm90aWZ5OwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVPcHJOb3RpZnkoYm9vbCBiTm90aWZ5KQordm9pZCBDRlhfRWRpdDo6RW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBtX2JPcHJOb3RpZnkgPSBiTm90aWZ5OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAppbmRleCBjODRkYjRkLi5kOTRjYzE2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcApAQCAtMTEsOCArMTEsOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdEl0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBDRlhfTGlzdEl0ZW06OkNGWF9MaXN0SXRlbSgpIDogbV9wRWRpdChOVUxMKSwKLQltX2JTZWxlY3RlZChmYWxzZSksCi0JbV9iQ2FyZXQoZmFsc2UpLAorCW1fYlNlbGVjdGVkKEZBTFNFKSwKKwltX2JDYXJldChGQUxTRSksCiAJbV9yY0xpc3RJdGVtKDAuMGYsMC4wZiwwLjBmLDAuMGYpCiB7CiAJbV9wRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCk7CkBAIC01NiwyMiArNTYsMjIgQEAKIAlyZXR1cm4gbV9yY0xpc3RJdGVtOwogfQogCi1ib29sIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0CitGWF9CT09MIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fYlNlbGVjdGVkOwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKQordm9pZCBDRlhfTGlzdEl0ZW06OlNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCkKIHsKIAltX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KIAotYm9vbCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdAorRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdAogewogCXJldHVybiBtX2JDYXJldDsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KGJvb2wgYkNhcmV0KQordm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KEZYX0JPT0wgYkNhcmV0KQogewogCW1fYkNhcmV0ID0gYkNhcmV0OwogfQpAQCAtMTE5LDcgKzExOSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYX0xpc3Q6OkNGWF9MaXN0KCkgOiBtX2ZGb250U2l6ZSgwLjBmKSwgbV9wRm9udE1hcChOVUxMKSwgbV9iTXVsdGlwbGUoZmFsc2UpCitDRlhfTGlzdDo6Q0ZYX0xpc3QoKSA6IG1fZkZvbnRTaXplKDAuMGYpLCBtX3BGb250TWFwKE5VTEwpLCBtX2JNdWx0aXBsZShGQUxTRSkKIHsKIH0KIApAQCAtMjExLDggKzIxMSw4IEBACiB7CiAJQ1BERl9Qb2ludCBwdCA9IE91dGVyVG9Jbm5lcihwb2ludCk7CiAKLQlib29sIGJGaXJzdCA9IHRydWU7Ci0JYm9vbCBiTGFzdCA9IHRydWU7CisJRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworCUZYX0JPT0wgYkxhc3QgPSBUUlVFOwogCiAJZm9yIChpbnQzMl90IGk9MCxzej1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAJewpAQCAtMjIyLDEyICsyMjIsMTIgQEAKIAogCQkJaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdC55LCByY0xpc3RJdGVtLnRvcCkpCiAJCQl7Ci0JCQkJYkZpcnN0ID0gZmFsc2U7CisJCQkJYkZpcnN0ID0gRkFMU0U7CiAJCQl9CiAKIAkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHB0LnksIHJjTGlzdEl0ZW0uYm90dG9tKSkKIAkJCXsKLQkJCQliTGFzdCA9IGZhbHNlOworCQkJCWJMYXN0ID0gRkFMU0U7CiAJCQl9CiAKIAkJCWlmIChwdC55ID49IHJjTGlzdEl0ZW0udG9wICYmIHB0LnkgPCByY0xpc3RJdGVtLmJvdHRvbSkKQEAgLTMxOCwxNyArMzE4LDE3IEBACiAJcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi1ib29sIENGWF9MaXN0OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QKK0ZYX0JPT0wgQ0ZYX0xpc3Q6OklzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdAogewogCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkKIAl7CiAJCXJldHVybiBwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGWF9MaXN0OjpTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpCit2b2lkIENGWF9MaXN0OjpTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpCiB7CiAJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkKIAl7CkBAIC0zMzYsNyArMzM2LDcgQEAKIAl9CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYkNhcmV0KQordm9pZCBDRlhfTGlzdDo6U2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpCiB7CiAJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkKIAl7CkBAIC0zNDQsMTcgKzM0NCwxNyBAQAogCX0KIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpCit2b2lkIENGWF9MaXN0OjpTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkKIHsKIAltX2JNdWx0aXBsZSA9IGJNdWx0aXBsZTsKIH0KIAotYm9vbCBDRlhfTGlzdDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CitGWF9CT09MIENGWF9MaXN0OjpJc011bHRpcGxlU2VsKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iTXVsdGlwbGU7CiB9CiAKLWJvb2wgQ0ZYX0xpc3Q6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAorRlhfQk9PTCBDRlhfTGlzdDo6SXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJcmV0dXJuIG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsKIH0KQEAgLTQ0Niw3ICs0NDYsNyBAQAogCXJldHVybiAtMTsKIH0KIAotYm9vbCBDUExTVF9TZWxlY3Q6OklzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAorRlhfQk9PTCBDUExTVF9TZWxlY3Q6OklzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAogewogCXJldHVybiBGaW5kKG5JdGVtSW5kZXgpID49IDA7CiB9CkBAIC01MDcsMTEgKzUwNywxMSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0Q3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKSA6IG1fcE5vdGlmeShOVUxMKSwKLQltX2JOb3RpZnlGbGFnKGZhbHNlKSwKKwltX2JOb3RpZnlGbGFnKEZBTFNFKSwKIAltX3B0U2Nyb2xsUG9zKDAuMGYsMC4wZiksCiAJbV9uU2VsSXRlbSgtMSksCiAJbV9uRm9vdEluZGV4KC0xKSwKLQltX2JDdHJsU2VsKGZhbHNlKSwKKwltX2JDdHJsU2VsKEZBTFNFKSwKIAltX25DYXJldEluZGV4KC0xKQogewogfQpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCxwdExlZnRCb3R0b20ueSxwdFJpZ2h0VG9wLngscHRSaWdodFRvcC55KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIApAQCAtNTY5LDEzICs1NjksMTMgQEAKIAkJCXsKIAkJCQltX2FTZWxJdGVtcy5TdWIobkhpdEluZGV4KTsKIAkJCQlTZWxlY3RJdGVtcygpOwotCQkJCW1fYkN0cmxTZWwgPSBmYWxzZTsKKwkJCQltX2JDdHJsU2VsID0gRkFMU0U7CiAJCQl9CiAJCQllbHNlCiAJCQl7CiAJCQkJbV9hU2VsSXRlbXMuQWRkKG5IaXRJbmRleCk7CiAJCQkJU2VsZWN0SXRlbXMoKTsKLQkJCQltX2JDdHJsU2VsID0gdHJ1ZTsKKwkJCQltX2JDdHJsU2VsID0gVFJVRTsKIAkJCX0KIAogCQkJbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIApAQCAtNjM5LDcgKzYzOSw3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVksoaW50MzJfdCBuSXRlbUluZGV4LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WSyhpbnQzMl90IG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKIHsKIAlpZiAoSXNNdWx0aXBsZVNlbCgpKQogCXsKQEAgLTY3NCwzNyArNjc0LDM3IEBACiAJCVNjcm9sbFRvTGlzdEl0ZW0obkl0ZW1JbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1VQKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewogCU9uVksoSXNNdWx0aXBsZVNlbCgpID8gR2V0Q2FyZXQoKS0xIDogR2V0U2VsZWN0KCktMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKIHsKIAlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkrMSA6IEdldFNlbGVjdCgpKzEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAJT25WSygwLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAJT25WSyhHZXRDb3VudCgpLTEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAJT25WSygwLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKIHsKIAlPblZLKEdldENvdW50KCktMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLWJvb2wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixib29sIGJTaGlmdCxib29sIGJDdHJsKQorRlhfQk9PTAlDRlhfTGlzdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7CiAJaW50MzJfdCBuSW5kZXggPSBHZXRMYXN0U2VsZWN0ZWQoKTsKIAlpbnQzMl90IG5GaW5kSW5kZXggPSBGaW5kTmV4dChuSW5kZXgsbkNoYXIpOwpAQCAtNzEyLDkgKzcxMiw5IEBACiAJaWYgKG5GaW5kSW5kZXggIT0gbkluZGV4KQogCXsKIAkJT25WSyhuRmluZEluZGV4LCBiU2hpZnQsIGJDdHJsKTsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiAvKiAtLS0tLS0tLSBpbm5lciBtZXRob2RzIC0tLS0tLS0gKi8KQEAgLTczOSw3ICs3MzksNyBAQAogCVJlQXJyYW5nZShHZXRDb3VudCgpIC0gMSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKQordm9pZCBDRlhfTGlzdEN0cmw6OlNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpCiB7CiAJaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47CiAKQEAgLTc0NywxMiArNzQ3LDEyIEBACiAJewogCQlpZiAoYlNlbGVjdGVkKQogCQl7Ci0JCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsdHJ1ZSk7CisJCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsVFJVRSk7CiAJCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCxmYWxzZSk7CisJCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsRkFMU0UpOwogCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CiAJCX0KIAl9CkBAIC03NjYsMTEgKzc2NiwxMSBAQAogCXsKIAkJaWYgKG1fblNlbEl0ZW0gPj0gMCkKIAkJewotCQkJU2V0SXRlbVNlbGVjdChtX25TZWxJdGVtLGZhbHNlKTsKKwkJCVNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSxGQUxTRSk7CiAJCQlJbnZhbGlkYXRlSXRlbShtX25TZWxJdGVtKTsKIAkJfQogCi0JCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCx0cnVlKTsKKwkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LFRSVUUpOwogCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKIAkJbV9uU2VsSXRlbSA9IG5JdGVtSW5kZXg7CiAJfQpAQCAtNzg4LDggKzc4OCw4IEBACiAJCXsKIAkJCW1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OwogCi0JCQlTZXRJdGVtQ2FyZXQobk9sZEluZGV4LCBmYWxzZSk7Ci0JCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCx0cnVlKTsKKwkJCVNldEl0ZW1DYXJldChuT2xkSW5kZXgsIEZBTFNFKTsKKwkJCVNldEl0ZW1DYXJldChuSXRlbUluZGV4LFRSVUUpOwogCiAJCQlJbnZhbGlkYXRlSXRlbShuT2xkSW5kZXgpOwogCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CkBAIC04MDUsMTcgKzgwNSwxNyBAQAogCQl7CiAJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CisJCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CiAJCQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldFBsYXRlUmVjdCgpOwogCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKIAkJCX0KIAkJfQogCQllbHNlCiAJCXsKIAkJCWlmICghbV9iTm90aWZ5RmxhZykKIAkJCXsKLQkJCQltX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKwkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKIAkJCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CiAJCQkJcmNSZWZyZXNoLmxlZnQgLT0gMS4wZjsKIAkJCQlyY1JlZnJlc2gucmlnaHQgKz0gMS4wZjsKQEAgLTgyMyw3ICs4MjMsNyBAQAogCQkJCXJjUmVmcmVzaC50b3AgKz0gMS4wZjsKIAogCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKIAkJCX0KIAkJfQogCX0KQEAgLTgzOSwxMCArODM5LDEwIEBACiAJCXN3aXRjaChuU3RhdGUpCiAJCXsKIAkJY2FzZSAxOgotCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgdHJ1ZSk7CisJCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBUUlVFKTsKIAkJCWJyZWFrOwogCQljYXNlIC0xOgotCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgZmFsc2UpOworCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgRkFMU0UpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC04NjMsNyArODYzLDcgQEAKIAkJU2V0U2luZ2xlU2VsZWN0KG5JdGVtSW5kZXgpOwogfQogCi1ib29sCUNGWF9MaXN0Q3RybDo6SXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CitGWF9CT09MCUNGWF9MaXN0Q3RybDo6SXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKIAlDUERGX1JlY3QgcmNJdGVtID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CkBAIC05MDQsMTAgKzkwNCwxMCBAQAogCiAJCWlmICghbV9iTm90aWZ5RmxhZykKIAkJewotCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CisJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKIAkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAogCQkJCQlyY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCBHZXRGaXJzdEhlaWdodCgpLCByY1BsYXRlLkhlaWdodCgpKTsKLQkJCW1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKwkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKIAkJfQogCX0KIH0KQEAgLTk0Nyw5ICs5NDcsOSBAQAogCQl7CiAJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CisJCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CiAJCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKLQkJCQltX2JOb3RpZnlGbGFnID0gZmFsc2U7CisJCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwCmluZGV4IDA0ODA5YTQuLjFjMDI2OWIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAKQEAgLTEzMiw5ICsxMzIsOSBAQAogCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKQogewogCi0JYm9vbCBiQ29udGludW91cyA9IHBFZGl0LT5HZXRDaGFyQXJyYXkoKSA9PSAwOworCUZYX0JPT0wgYkNvbnRpbnVvdXMgPSBwRWRpdC0+R2V0Q2hhckFycmF5KCkgPT0gMDsKIAlpZiAocEVkaXQtPkdldENoYXJTcGFjZSgpID4gMC4wZikKLQkJYkNvbnRpbnVvdXMgPSBmYWxzZTsKKwkJYkNvbnRpbnVvdXMgPSBGQUxTRTsKIAogCUZYX1dPUkQgU3ViV29yZCA9IHBFZGl0LT5HZXRQYXNzd29yZENoYXIoKTsKIAlGWF9GTE9BVCBmRm9udFNpemUgPSBwRWRpdC0+R2V0Rm9udFNpemUoKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCUZYX0NPTE9SUkVGIGNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7CiAJRlhfQ09MT1JSRUYgY3JPbGRGaWxsID0gY3JDdXJGaWxsOwogCi0JYm9vbCBiU2VsZWN0ID0gZmFsc2U7CisJRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKIAljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOwogCkBAIC0yNzgsNyArMjc4LDcgQEAKIAogCUZYX0NPTE9SUkVGIGNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LCAwLDAsMCk7CiAJRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7Ci0JYm9vbCBiU2VsZWN0ID0gZmFsc2U7CisJRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKIAljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOwogCkBAIC00MTAsNyArNDEwLDcgQEAKIAlwUGF0aE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSwgcmdiLCAzKTsKIAogCXBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gRlhGSUxMX0FMVEVSTkFURTsKLQlwUGF0aE9iai0+bV9iU3Ryb2tlID0gZmFsc2U7CisJcFBhdGhPYmotPm1fYlN0cm9rZSA9IEZBTFNFOwogCiAJcFBhZ2VPYmpzLT5JbnNlcnRPYmplY3QocFBhZ2VPYmpzLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKSxwUGF0aE9iaik7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCmluZGV4IDY2ODAzMmQuLjU5ODE2ZjAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCkBAIC00NSwxNCArNDUsMTQgQEAKIFByaW50UGFyYW1zT2JqOjpQcmludFBhcmFtc09iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCiA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpCiB7Ci0gICAgYlVJID0gdHJ1ZTsKKyAgICBiVUkgPSBUUlVFOwogICAgIG5TdGFydCA9IDA7CiAgICAgbkVuZCA9IDA7Ci0gICAgYlNpbGVudCA9IGZhbHNlOwotICAgIGJTaHJpbmtUb0ZpdCA9IGZhbHNlOwotICAgIGJQcmludEFzSW1hZ2UgPSBmYWxzZTsKLSAgICBiUmV2ZXJzZSA9IGZhbHNlOwotICAgIGJBbm5vdGF0aW9ucyA9IHRydWU7CisgICAgYlNpbGVudCA9IEZBTFNFOworICAgIGJTaHJpbmtUb0ZpdCA9IEZBTFNFOworICAgIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKKyAgICBiUmV2ZXJzZSA9IEZBTFNFOworICAgIGJBbm5vdGF0aW9ucyA9IFRSVUU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG9jdW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTQyLDcgKzE0Miw3IEBACiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRG9jdW1lbnQsIERvY3VtZW50KQogCi1ib29sIENKU19Eb2N1bWVudDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQorRlhfQk9PTCBDSlNfRG9jdW1lbnQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAgICAgcERvYy0+QXR0YWNoRG9jKHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKICAgICBwRG9jLT5TZXRJc29sYXRlKHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb2N1bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgIG1fcEljb25UcmVlKE5VTEwpLAogICAgIG1fcERvY3VtZW50KE5VTEwpLAogICAgIG1fY3dCYXNlVVJMKEwiIiksCi0gICAgbV9iRGVsYXkoZmFsc2UpCisgICAgbV9iRGVsYXkoRkFMU0UpCiB7CiB9CiAKQEAgLTE5MCwyMCArMTkwLDIwIEBACiB9CiAKIC8vdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlZHMgaW4gZG9jdW1lbnQuCi1ib29sIERvY3VtZW50OjpudW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6bnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ1BERlNES19JbnRlckZvcm0gKnBJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQ1BERl9JbnRlckZvcm0gKnBQREZGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CiAgICAgdnAgPDwgKGludClwUERGRm9ybS0+Q291bnRGaWVsZHMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6ZGlydHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZGlydHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjI2LDEwICsyMjYsMTAgQEAKICAgICAgICAgICAgIG1fcERvY3VtZW50LT5DbGVhckNoYW5nZU1hcmsoKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6QURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpBREJFKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTI0MSwxMCArMjQxLDEwIEBACiAgICAgewogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjc2LDU1ICsyNzYsNTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpQYXJzZXJQYXJhbXMoSlNPYmplY3QqIHBPYmosQ0pTX0Fubm90T2JqJiBhbm5vdG9iaikKK0ZYX0JPT0wgRG9jdW1lbnQ6OlBhcnNlclBhcmFtcyhKU09iamVjdCogcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjphZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjphZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvL01hcHMgYSBmaWVsZCBvYmplY3QgaW4gUERGIGRvY3VtZW50IHRvIGEgSmF2YVNjcmlwdCB2YXJpYWJsZQogLy9jb21tZW50OgogLy9ub3RlOiB0aGUgcGFyZW10ZXIgY05hbWUsIHRoaXMgaXMgY2x1ZSBob3cgdG8gdHJlYXQgaWYgdGhlIGNOYW1lIGlzIG5vdCBhIHZhbGlhYmxlIGZpbGVkIG5hbWUgaW4gdGhpcyBkb2N1bWVudAogCi1ib29sIERvY3VtZW50OjpnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0RmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyB3aWRlTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKQEAgLTMzNCw3ICszMzQsNyBAQAogICAgIGlmIChwUERGRm9ybS0+Q291bnRGaWVsZHMod2lkZU5hbWUpIDw9IDApCiAgICAgewogICAgICAgICB2UmV0LlNldE51bGwoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKQEAgLTM0Niw2NiArMzQ2LDY2IEBACiAgICAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7CiAKICAgICB2UmV0ID0gcEpTRmllbGQ7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAotYm9vbCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXROdGhGaWVsZE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50IG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgIGlmIChuSW5kZXggPCAwKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4KTsKICAgICBpZiAoIXBGaWVsZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICB2UmV0ID0gcEZpZWxkLT5HZXRGdWxsTmFtZSgpLmNfc3RyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmltcG9ydEFuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjppbXBvcnRBblhGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLy9leHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cy4KIC8vY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydHMKIC8vbm90ZToKLS8vaW50IENQREZTREtfRG9jdW1lbnQ6Om1haWxGb3JtKGJvb2wgYlVJLFN0cmluZyBjdG8sc3RyaW5nIGNjYyxzdHJpbmcgY2JjYyxzdHJpbmcgY1N1YmplY3Qsc3RyaW5nIGNtcyk7CisvL2ludCBDUERGU0RLX0RvY3VtZW50OjptYWlsRm9ybShGWF9CT09MIGJVSSxTdHJpbmcgY3RvLHN0cmluZyBjY2Msc3RyaW5nIGNiY2Msc3RyaW5nIGNTdWJqZWN0LHN0cmluZyBjbXMpOwogCi1ib29sIERvY3VtZW50OjptYWlsRm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6bWFpbEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKIAogICAgIGludCBpTGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKIAotICAgIGJvb2wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiB0cnVlOworICAgIEZYX0JPT0wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiBUUlVFOwogICAgIENGWF9XaWRlU3RyaW5nIGNUbyA9IGlMZW5ndGggPiAxID8gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNDYyA9IGlMZW5ndGggPiAyID8gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKQEAgLTQxNyw3ICs0MTcsNyBAQAogCiAgICAgQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7CiAgICAgaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNDI5LDI0ICs0MjksMjQgQEAKICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwogICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0TGVuZ3RoKCksIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CiAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpwcmludChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CiAKLSAgICBib29sIGJVSSA9IHRydWU7CisgICAgRlhfQk9PTCBiVUkgPSBUUlVFOwogICAgIGludCBuU3RhcnQgPSAwOwogICAgIGludCBuRW5kID0gMDsKLSAgICBib29sIGJTaWxlbnQgPSBmYWxzZTsKLSAgICBib29sIGJTaHJpbmtUb0ZpdCA9IGZhbHNlOwotICAgIGJvb2wgYlByaW50QXNJbWFnZSA9IGZhbHNlOwotICAgIGJvb2wgYlJldmVyc2UgPSBmYWxzZTsKLSAgICBib29sIGJBbm5vdGF0aW9ucyA9IGZhbHNlOworICAgIEZYX0JPT0wgYlNpbGVudCA9IEZBTFNFOworICAgIEZYX0JPT0wgYlNocmlua1RvRml0ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiUHJpbnRBc0ltYWdlID0gRkFMU0U7CisgICAgRlhfQk9PTCBiUmV2ZXJzZSA9IEZBTFNFOworICAgIEZYX0JPT0wgYkFubm90YXRpb25zID0gRkFMU0U7CiAKICAgICBpbnQgbmxlbmd0aCA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYobmxlbmd0aCA9PTkpCkBAIC01MDAsMjYgKzUwMCwyNiBAQAogICAgIGlmIChDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpKQogICAgIHsKICAgICAgICAgcEVudi0+SlNfZG9jcHJpbnQoYlVJLCBuU3RhcnQsIG5FbmQsIGJTaWxlbnQsIGJTaHJpbmtUb0ZpdCwgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogLy9yZW1vdmVzIHRoZSBzcGVjaWZpZWQgZmllbGQgZnJvbSB0aGUgZG9jdW1lbnQuCiAvL2NvbW1lbnQ6CiAvL25vdGU6IGlmIHRoZSBmaWxlZCBuYW1lIGlzIG5vdCByZXRpb25hbCwgYWRvYmUgaXMgZHVtYiBmb3IgaXQuCiAKLWJvb2wgRG9jdW1lbnQ6OnJlbW92ZUZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHNGaWVsZE5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CkBAIC01NTgsMjAgKzU1OCwyMCBAQAogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvL3Jlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KIC8vY29tbWVudDoKIC8vbm90ZTogaWYgdGhlIGZpZWxkcyBuYW1lcyByIG5vdCByYXRpb25hbCwgYW9kYmUgaXMgZHVtYiBmb3IgaXQuCiAKLWJvb2wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6cmVzZXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CkBAIC02MTAsNDIgKzYxMCw0MiBAQAogCiAgICAgICAgIGlmIChhRmllbGRzLkdldFNpemUoKSA+IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0oYUZpZWxkcywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKGFGaWVsZHMsIFRSVUUsIFRSVUUpOwogICAgICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKIAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0odHJ1ZSk7CisgICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0oVFJVRSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sIERvY3VtZW50OjpzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OnNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaW50IG5TaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoblNpemUgPCAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHN0clVSTDsKLSAgICBib29sIGJGREYgPSB0cnVlOwotICAgIGJvb2wgYkVtcHR5ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRkRGID0gVFJVRTsKKyAgICBGWF9CT09MIGJFbXB0eSA9IEZBTFNFOwogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAgICAgQ0pTX0FycmF5IGFGaWVsZHMoaXNvbGF0ZSk7CiAKQEAgLTY3NywxNiArNjc3LDE2IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBib29sIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKKyAgICBGWF9CT09MIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKICAgICBpZiAoYkFsbCAmJiBiRW1wdHkpCiAgICAgewogICAgICAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygpKQogICAgICAgICB7CiAgICAgICAgICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgICAgICAgICAgcEludGVyRm9ybS0+U3VibWl0Rm9ybShzdHJVUkwsIGZhbHNlKTsKKyAgICAgICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBGQUxTRSk7CiAgICAgICAgICAgICBwUnVudGltZS0+RW5kQmxvY2soKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKQEAgLTcwNywxMyArNzA3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygmZmllbGRPYmplY3RzLCB0cnVlKSkKKyAgICBpZiAocFBERkludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygmZmllbGRPYmplY3RzLCBUUlVFKSkKICAgICB7CiAgICAgICAgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0gICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgdHJ1ZSwgIWJGREYpOworICAgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGaWVsZHMoc3RyVVJMLCBmaWVsZE9iamVjdHMsIFRSVUUsICFiRkRGKTsKICAgICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03MjgsMjYgKzcyOCwyNiBAQAogICAgIHJldHVybiBtX3BEb2N1bWVudDsKIH0KIAotYm9vbCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQorRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OkV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZvbGRlck5hbWUpCitGWF9CT09MIERvY3VtZW50OjpFeHRyYWN0Rm9sZGVyTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGb2xkZXJOYW1lKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmJvb2ttYXJrUm9vdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50Ojpib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjptYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjptYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgYm9vbCBiVUkgPSB0cnVlOworICAgIEZYX0JPT0wgYlVJID0gVFJVRTsKICAgICBDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CkBAIC04MDMsNDAgKzgwMyw0MCBAQAogICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKE5VTEwsIDAsIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CiAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6YXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmF1dGhvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0gICAgaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewogICAgICAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkF1dGhvciIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzQXV0aG9yOwogICAgICAgICB2cCA+PiBjc0F1dGhvcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJBdXRob3IiLCBQREZfRW5jb2RlVGV4dChjc0F1dGhvcikpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogfQogCi1ib29sIERvY3VtZW50OjppbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmluZm8oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3dBdXRob3IgICAgICAgICA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQXV0aG9yIik7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3dUaXRsZSAgICAgICAgICA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKQEAgLTg4MCwxNCArODgwLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgdnAgPDwgcE9iajsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpjcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTg5NiwyMSArODk2LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0NyZWF0aW9uRGF0ZTsKICAgICAgICAgdnAgPj4gY3NDcmVhdGlvbkRhdGU7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRpb25EYXRlIiwgUERGX0VuY29kZVRleHQoY3NDcmVhdGlvbkRhdGUpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtOTE5LDE3ICs5MTksMTcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzQ3JlYXRvcjsKICAgICAgICAgdnAgPj4gY3NDcmVhdG9yOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkNyZWF0b3IiLCBQREZfRW5jb2RlVGV4dChjc0NyZWF0b3IpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtOTM4LDcgKzkzOCw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICB2cCA+PiBtX2JEZWxheTsKICAgICAgICAgaWYgKG1fYkRlbGF5KQpAQCAtOTY5LDE0ICs5NjksMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTk4NSwyMSArOTg1LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0tleXdvcmRzOwogICAgICAgICB2cCA+PiBjc0tleXdvcmRzOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIktleXdvcmRzIiwgUERGX0VuY29kZVRleHQoY3NLZXl3b3JkcykpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6bW9kRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50Ojptb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKICAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkKICAgICB7CkBAIC0xMDA4LDIxICsxMDA4LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7CiAgICAgICAgIHZwID4+IGNzbW9kRGF0ZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJNb2REYXRlIiwgUERGX0VuY29kZVRleHQoY3Ntb2REYXRlKSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTAzMSwyMSArMTAzMSwyMSBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3Nwcm9kdWNlcjsKICAgICAgICAgdnAgPj4gY3Nwcm9kdWNlcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJQcm9kdWNlciIsIFBERl9FbmNvZGVUZXh0KGNzcHJvZHVjZXIpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OnN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6c3ViamVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA1NCwyNCArMTA1NCwyNCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NzdWJqZWN0OwogICAgICAgICB2cCA+PiBjc3N1YmplY3Q7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiU3ViamVjdCIsIFBERl9FbmNvZGVUZXh0KGNzc3ViamVjdCkpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMIHx8IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA4MCw1OCArMTA4MCw1OCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3N0aXRsZTsKICAgICAgICAgdnAgPj4gY3N0aXRsZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdnAgPDwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy9JbiBDaHJvbWUgY2FzZSxzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkgewogICAgICAgICB2cCA8PCB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICB2cCA8PCAwOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50Ojptb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6bW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6bW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6Om1vdXNlWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6YmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTExNDEsMTAgKzExNDEsMTAgQEAKICAgICB7CiAgICAgICAgIHZwID4+IG1fY3dCYXNlVVJMOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0xMTY2LDE1ICsxMTY2LDE1IEBACiAgICAgICAgIHBJbnRlckZvcm0tPkVuYWJsZUNhbGN1bGF0ZShiQ2FsY3VsYXRlKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6ZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50Ojpkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7CiAgICAgaW50MzJfdCBpID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDE7CkBAIC0xMTg5LDcgKzExODksNyBAQAogICAgIH1lbHNlewogICAgICAgICB2cCA8PCBMIiI7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBDRlhfV2lkZVN0cmluZyBEb2N1bWVudDo6UmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKQpAQCAtMTIzOSw3NCArMTIzOSw3NCBAQAogICAgIHJldHVybiBjYlJldDsKIH0KIAotYm9vbCBEb2N1bWVudDo6cGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgdnAgPDwgYXBwOjpTeXNQYXRoVG9QREZQYXRoKG1fcERvY3VtZW50LT5HZXRQYXRoKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpjbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0LlNldE51bGwoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHZSZXQuU2V0TnVsbCgpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0ID0gVlRfdW5kZWZpbmVkOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiBib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkKQEAgLTEzNzAsMTIgKzEzNzAsMTIgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotYm9vbCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwpAQCAtMTM4NCwxMyArMTM4NCwxMyBAQAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgQ0pTX0VtYmVkT2JqKiBwRW1iZWRPYmogPSBwYXJhbXNbMV0uVG9DSlNPYmplY3QoKS0+R2V0RW1iZWRPYmplY3QoKTsKICAgICBpZiAoIXBFbWJlZE9iaikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1RZUEVFUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIEljb24qIHBJY29uID0gKEljb24qKXBFbWJlZE9iajsKQEAgLTE0MDIsMjEgKzE0MDIsMjEgQEAKICAgICBwTmV3SWNvbi0+TmV4dEljb24gPSBOVUxMOwogICAgIHBOZXdJY29uLT5JY29uU3RyZWFtID0gcEljb247CiAgICAgbV9wSWNvblRyZWUtPkluc2VydEljb25FbGVtZW50KHBOZXdJY29uKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmICghbV9wSWNvblRyZWUpCiAgICAgewogICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICBDSlNfQXJyYXkgSWNvbnMobV9pc29sYXRlKTsKQEAgLTE0MzEsMTMgKzE0MzEsMTMgQEAKICAgICAgICAgcEljb25FbGVtZW50ID0gKCptX3BJY29uVHJlZSlbaV07CiAKICAgICAgICAgSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgICAgIGlmIChwT2JqLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDSlNfSWNvbiAqIHBKU19JY29uID0gKENKU19JY29uICopSlNfR2V0UHJpdmF0ZShwT2JqKTsKLSAgICAgICAgaWYgKCFwSlNfSWNvbikgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgSWNvbiogcEljb24gPSAoSWNvbiopcEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgICAgIGlmICghcEljb24pcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBJY29uKXJldHVybiBGQUxTRTsKIAogICAgICAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uRWxlbWVudC0+SWNvblN0cmVhbS0+R2V0U3RyZWFtKCkpOwogICAgICAgICBwSWNvbi0+U2V0SWNvbk5hbWUocEljb25FbGVtZW50LT5JY29uTmFtZSk7CkBAIC0xNDQ1LDE5ICsxNDQ1LDE5IEBACiAgICAgfQogCiAgICAgdnAgPDwgSWNvbnM7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmKCFtX3BJY29uVHJlZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBpbnQgaUljb25Db3VudHMgPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7CiAKQEAgLTE0NzAsODIgKzE0NzAsODIgQEAKICAgICAgICAgICAgIEljb24qIHBSZXRJY29uID0gKCptX3BJY29uVHJlZSlbaV0tPkljb25TdHJlYW07CiAKICAgICAgICAgICAgIEpTRlhPYmplY3QgIHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOwotICAgICAgICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgQ0pTX0ljb24gKiBwSlNfSWNvbiA9IChDSlNfSWNvbiAqKUpTX0dldFByaXZhdGUocE9iaik7Ci0gICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgICAgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKCFwSWNvbilyZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIXBJY29uKXJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgcEljb24tPlNldEljb25OYW1lKHN3SWNvbk5hbWUpOwogICAgICAgICAgICAgcEljb24tPlNldFN0cmVhbShwUmV0SWNvbi0+R2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgdlJldCA9IHBKU19JY29uOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBpbXBsZW1lbnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAgICAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6Q29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OkNvbGxhYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKICAgICBpbnQgbldvcmRObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAwOwogICAgIGJvb2wgYlN0cmlwID0gcGFyYW1zLkdldFNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKCkgOiB0cnVlOwogCiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFwRG9jdW1lbnQpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXBEb2N1bWVudCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNTg0LDIzICsxNTg0LDIzIEBACiAgICAgfQogCiAgICAgdlJldCA9IHN3UmV0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7CiAKICAgICBpbnQgblBhZ2VObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvSW50KCkgOiAwOwogCkBAIC0xNjExLDExICsxNjExLDExIEBACiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNjQwLDEwICsxNjQwLDEwIEBACiAKICAgICB2UmV0ID0gbldvcmRzOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmdldFByaW50UGFyYW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtMTY1Miw3ICsxNjUyLDcgQEAKICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgogCiAgICAgdlJldCA9IHBSZXRPYmo7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKICNkZWZpbmUgSVNMQVRJTldPUkQodSkgICh1ICE9IDB4MjAgJiYgdSA8PSAweDI4RkYpCkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogICAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICAgIGlmICghcEZvbnQpIHJldHVybiAwOwogCi0gICAgYm9vbCBiSXNMYXRpbiA9IGZhbHNlOworICAgIEZYX0JPT0wgYklzTGF0aW4gPSBGQUxTRTsKIAogICAgIGZvciAoaW50IGk9MCwgc3o9cFRleHRPYmotPkNvdW50Q2hhcnMoKTsgaTxzejsgaSsrKQogICAgIHsKQEAgLTE3MDEsNyArMTcwMSw3IEBACiAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEwiIjsKIAogICAgIGludCBuV29yZHMgPSAwOwotICAgIGJvb2wgYklzTGF0aW4gPSBmYWxzZTsKKyAgICBGWF9CT09MIGJJc0xhdGluID0gRkFMU0U7CiAKICAgICBmb3IgKGludCBpPTAsIHN6PXBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGk8c3o7IGkrKykKICAgICB7CkBAIC0xNzMyLDEwICsxNzMyLDEwIEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1ib29sIERvY3VtZW50Ojp6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6Onpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKgpAQCAtMTc0OCwzOSArMTc0OCwzOSBAQAogKHJlZlcsICBSZWZsb3dXaWR0aCkKICovCiAKLWJvb2wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6ZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm8gc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6ZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjppbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6aW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBEb2N1bWVudDo6cmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCi1ib29sIERvY3VtZW50OjpnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBEb2N1bWVudDo6QWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAppbmRleCBjYTE2YzkwLi42MTQ4NDM0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRmllbGQsIEZpZWxkKQogCi1ib29sIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQorRlhfQk9PTCBDSlNfRmllbGQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTEyMCwxNSArMTIwLDE1IEBACiAKICAgICBwRmllbGQtPlNldElzb2xhdGUocENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCkpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9OwogCiBGaWVsZDo6RmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCiAgICAgbV9wSlNEb2MoTlVMTCksCiAgICAgbV9wRG9jdW1lbnQoTlVMTCksCiAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCgtMSksCi0gICAgbV9iQ2FuU2V0KGZhbHNlKSwKLSAgICBtX2JEZWxheShmYWxzZSksCisgICAgbV9iQ2FuU2V0KEZBTFNFKSwKKyAgICBtX2JEZWxheShGQUxTRSksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CiB9CkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsaVN0YXJ0KTsKIH0KIAotYm9vbCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQorRlhfQk9PTCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgbV9wSlNEb2MgPSBwRG9jdW1lbnQ7CkBAIC0xOTQsMTcgKzE5NCwxNyBAQAogICAgICAgICBzdGQ6OndzdHJpbmcgc3RyRmllbGROYW1lOwogICAgICAgICBpbnQgaUNvbnRyb2xObyA9IC0xOwogICAgICAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKLSAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBtX0ZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZS5jX3N0cigpOwogICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIG1fRmllbGROYW1lID0gc3dGaWVsZE5hbWVUZW1wOwogICAgIG1fbkZvcm1Db250cm9sSW5kZXggPSAtMTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCkBAIC0yMzQsNyArMjM0LDcgQEAKIH0KIAogdm9pZCBGaWVsZDo6VXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhbmdlTWFyaywgYm9vbCBiUmVzZXRBUCwgYm9vbCBiUmVmcmVzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0yNTUsMTIgKzI1NSwxMiBAQAogICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwogICAgICAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgYm9vbCBiRm9ybWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CiAgICAgICAgICAgICAgICAgaWYgKGJGb3JtYXRlZCkKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0cy5HZXRBdChpKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogfQogCiB2b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFuZ2VNYXJrLCBib29sIGJSZXNldEFQLCBib29sIGJSZWZyZXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpCiB7CiAgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwpAQCAtMzEyLDE2ICszMTIsMTYgQEAKICAgICAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wgYkZvcm1hdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIEZBTFNFKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM1MCwxNyArMzUwLDE3IEBACiAgICAgcmV0dXJuIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwogfQogCi1ib29sIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCitGWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBmb3IgKGludCBpPTAsc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspCiAgICAgewogICAgICAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBDUERGX0Zvcm1Db250cm9sKiBGaWVsZDo6R2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpCkBAIC0zNzYsMTMgKzM3NiwxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BlcnR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotYm9vbCBGaWVsZDo6YWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBhbGlnblN0cjsKICAgICAgICAgdnAgPj4gYWxpZ25TdHI7CkBAIC00MDAsMTYgKzQwMCwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIHN3aXRjaCAocEZvcm1Db250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpCiAgICAgICAgIHsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC00MzYsMTMgKzQzNiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9ICIiOwogICAgICAgICB2cCA+PiBzdHJUeXBlOwpAQCAtNDYwLDEzICs0NjAsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIGlmICghcEZvcm1GaWVsZCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChtX3BEb2N1bWVudCwgR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaW50IG5Cb3JkZXJzdHlsZSA9IHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCk7CiAKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJvcmRlclN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTUyNSw3ICs1MjUsNyBAQAogCiAgICAgICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkKICAgICAgICAgewotICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBEb2N1bWVudCwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC01MzMsMTEgKzUzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU1NywxMyArNTU3LDEzIEBACiAgICAgfQogfQogCi1ib29sIEZpZWxkOjpidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6YnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTU4MSwxNiArNTgxLDE2IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKIApAQCAtNjAwLDcgKzYwMCw3IEBACiAgICAgICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtNjA4LDEzICs2MDgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OmJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNjMyLDE2ICs2MzIsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogCkBAIC02NTEsNyArNjUxLDcgQEAKICAgICAgICAgdnAgPDwgIChpbnQzMl90KWZCb3R0b207CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC02NTksMTMgKzY1OSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6YnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtNjgzLDIyICs2ODMsMjIgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogICAgICAgICB2cCA8PCBJY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtNzA2LDEzICs3MDYsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTczMCwyMCArNzMwLDIwIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CiAKICAgICAgICAgdnAgPDwgIHBGb3JtQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25Qb3NpdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC03NTEsMTMgKzc1MSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNzc1LDE2ICs3NzUsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKICAgICAgICAgaWYgKEljb25GaXQuSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQpAQCAtNzkzLDcgKzc5Myw3IEBACiAgICAgICAgICAgICB2cCA8PCAoaW50MzJfdCkxOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC04MDEsMTMgKzgwMSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC04MjUsMTYgKzgyNSwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKSBGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CiAgICAgICAgIGludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7CkBAIC04NTUsNyArODU1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtODYzLDEzICs4NjMsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTg4NywxMyArODg3LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBSREludGVyRm9ybSAhPSBOVUxMKTsKQEAgLTkwNCw3ICs5MDQsNyBAQAogICAgICAgICB2cCA8PCAoaW50MzJfdClwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKQEAgLTkxMiwxMyArOTEyLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjpjaGFyTGltaXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Y2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTkzNiwxNyArOTM2LDE3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENoYXJMaW1pdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC05NTQsMTMgKzk1NCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6Y29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC05NzgsMTMgKzk3OCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTUIpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtOTkyLDcgKzk5Miw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTEwMDAsMTMgKzEwMDAsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMDI0LDEzICsxMDI0LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTA0NiwxMyArMTA0NiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6Y3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9EV29yZEFycmF5IGFycmF5OwogCkBAIC0xMDg5LDEzICsxMDg5LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID09IDEpCiAgICAgICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwpAQCAtMTExMiw3ICsxMTEyLDcgQEAKICAgICAgICAgICAgIHZwIDw8IC0xOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTExMzIsNyArMTEzMiw3IEBACiAgICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgICAgICB7CiAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpZWxkRmxhZ3MgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKFRSVUUpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xMTQzLDIyICsxMTQzLDIyIEBACiAKICAgICAgICAgICAgICAgICBpbnQgaVNlbGVjdGluZyA9IChpbnQzMl90KWFycmF5LkdldEF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChpU2VsZWN0aW5nIDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkgJiYgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlTZWxlY3RpbmcpKQotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIFRSVUUpOwogCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1ib29sIEZpZWxkOjpkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBNUUcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19OT1RTVVBQT1JUKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICA7CiAgICAgfQpAQCAtMTE2Niw3ICsxMTY2LDcgQEAKICAgICB7CiAgICAgICAgIDsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpCkBAIC0xMTc0LDEzICsxMTc0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjpkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdpZGVTdHI7CiAgICAgICAgIHZwID4+IFdpZGVTdHI7CkBAIC0xMTk4LDE4ICsxMTk4LDE4IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fAogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC0xMjE4LDEzICsxMjE4LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTI0MiwxMyArMTI0MiwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0RPTk9UU0NST0xMKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0xMjY0LDEzICsxMjY0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjpkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMjc5LDE0ICsxMjc5LDE0IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCiAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTI5NCwxMCArMTI5NCwxMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldERlbGF5KGJvb2wgYkRlbGF5KQordm9pZCBGaWVsZDo6U2V0RGVsYXkoRlhfQk9PTCBiRGVsYXkpCiB7CiAgICAgbV9iRGVsYXkgPSBiRGVsYXk7CiAKQEAgLTEzMDgsMTEgKzEzMDgsMTEgQEAKICAgICB9CiB9CiAKLWJvb2wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMzIzLDE2ICsxMzIzLDE2IEBACiAgICAgewogICAgICAgICB2cCA8PCBtX2JEZWxheTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTEzNTksNyArMTM1OSw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBGQUxTRTsKIAogICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwogCkBAIC0xMzg3LDcgKzEzODcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7CkBAIC0xNDQ1LDEyICsxNDQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChiU2V0KSBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBGQUxTRSwgVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNDk3LDIxICsxNDk3LDIxIEBACiAgICAgfQogfQogCi1ib29sIEZpZWxkOjpkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAoIXZwLklzR2V0dGluZygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICB2cCA8PCBtX3BKU0RvYy0+R2V0Q0pTRG9jKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTUyMCwxMyArMTUyMCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTUzNCwzMCArMTUzNCwzMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7CiAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7CiAgICAgICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTU3MywzNiArMTU3MywzNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwogICAgICAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgICAgICB2cCA8PCBFeHBvcnRWYWx1c0FycmF5OwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6ZmlsZVNlbGVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKICAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE2MTQsMTAgKzE2MTQsMTAgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTE2MjYsMTUgKzE2MjYsMTUgQEAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewogICAgICAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICB2cCA+PiBjckFycmF5OwogCkBAIC0xNjU2LDcgKzE2NTYsNyBAQAogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwogICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpbnQgaUNvbG9yVHlwZTsKICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7CkBAIC0xNjg0LDEzICsxNjg0LDEzIEBACiAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRGaWxsQ29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE2OTgsMTMgKzE2OTgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OmhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE3MjIsNyArMTcyMiw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMTczMSw3ICsxNzMxLDcgQEAKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CiAKQEAgLTE3NDMsNyArMTc0Myw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkKQEAgLTE3ODcsMTMgKzE3ODcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYlNldCkKLSAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTgyMSw3ICsxODIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE4MjksMTMgKzE4MjksMTMgQEAKICAgICB9CiB9CiAKLWJvb2wgRmllbGQ6OmhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKICAgICAgICAgdnAgPj4gc3RyTW9kZTsKQEAgLTE4NTMsMTYgKzE4NTMsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBlSE0gPSBwRm9ybUNvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKICAgICAgICAgc3dpdGNoIChlSE0pCkBAIC0xODg1LDcgKzE4ODUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEhpZ2hsaWdodChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCkBAIC0xODkzLDEzICsxODkzLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjpsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6bGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBpV2lkdGg7CiAgICAgICAgIHZwID4+IGlXaWR0aDsKQEAgLTE5MTcsMjYgKzE5MTcsMjYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICAgICAgaWYoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7Ci0gICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRMaW5lV2lkdGgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTk1Niw3ICsxOTU2LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopOwpAQCAtMTk2NywxMSArMTk2NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTk4Myw3ICsxOTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTk5MSwxMyArMTk5MSwxMyBAQAogICAgIH0KIH0KIAotYm9vbCBGaWVsZDo6bXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6Om11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjAxNSwxMyArMjAxNSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRNdWx0aWxpbmUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMDM3LDEzICsyMDM3LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1ib29sIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjA2MSwxMyArMjA2MSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMjA4Myw0OSArMjA4Myw0OSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgdnAgPDwgbV9GaWVsZE5hbWU7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKIAogICAgIHZwIDw8IChpbnQzMl90KXBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OnBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6cGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBGQUxTRTsKIAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjE0Niw3ICsyMTQ2LDcgQEAKIAogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKICAgICAgICAgICAgIGlmKCFwUGFnZVZpZXcpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgUGFnZUFycmF5LlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSwoaW50MzJfdClwUGFnZVZpZXctPkdldFBhZ2VJbmRleCgpKSk7CiAgICAgICAgIH0KQEAgLTIxNTgsMTYgKzIxNTgsMTYgQEAKICAgICAgICAgdnAgPDwgKGludDMyX3QpIC0xOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjE4NSwxMyArMjE4NSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1BBU1NXT1JEKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIxOTksNyArMjE5OSw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMjA3LDcgKzIyMDcsNyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjIxNiwxMSArMjIxNiwxMSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjIzMiw3ICsyMjMyLDcgQEAKIAogICAgICAgICAgICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC0yMjQ2LDE3ICsyMjQ2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJTZXQpCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKQEAgLTIyNzAsNyArMjI3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCksIFRSVUUsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIyODMsNyArMjI4Myw3IEBACiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIyOTEsMjAgKzIyOTEsMjAgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yMzE2LDcgKzIzMTYsNyBAQAogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjMyNCwyMCArMjMyNCwyMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTIzNTQsMTcgKzIzNTQsMTcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpyZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnJlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENKU19BcnJheSByY0FycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIHZwID4+IHJjQXJyYXk7CkBAIC0yMzk1LDcgKzIzOTUsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcFdpZGdldC0+R2V0UmVjdCgpOwogICAgICAgICBDSlNfVmFsdWUgVXBwZXJfTGVmdHgobV9pc29sYXRlKSxVcHBlcl9MZWZ0eShtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eChtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eShtX2lzb2xhdGUpOwpAQCAtMjQyMiw3ICsyNDIyLDcgQEAKICAgICAgICAgdnAgIDw8ICByY0FycmF5OwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KQpAQCAtMjQ0Miw3ICsyNDQyLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBmb3IgKGludCBpPTAsIHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CkBAIC0yNDY5LDEzICsyNDY5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yNTAzLDcgKzI1MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjUxMiwxNyArMjUxMiwxNyBAQAogICAgIH0KIH0KIAotYm9vbCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKIAogCiAgICAgICAgIGJvb2wgYlZQOwpAQCAtMjUzNSw3ICsyNTM1LDcgQEAKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU0MywxNiArMjU0MywxNiBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yNTcwLDEzICsyNTcwLDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUklDSFRFWFQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU4NCw3ICsyNTg0LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTI1OTIsMTkgKzI1OTIsMTkgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAgICAgICAgIDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UmljaFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKQEAgLTI2MTIsMTMgKzI2MTIsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI2MzYsMTggKzI2MzYsMTggQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIHZwIDw8IChpbnQzMl90KXBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Um90YXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjY1NSwxNSArMjY1NSwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKICAgICAgICAgdnAgPj4gY3JBcnJheTsKQEAgLTI2ODQsMTMgKzI2ODQsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOwpAQCAtMjcxOSwxNCArMjcxOSwxNCBAQAogICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQpAQCAtMjczNCwxMyArMjczNCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKICAgICAgICAgdnAgPj4gY3NCQ2FwdGlvbjsKQEAgLTI3NTgsMTcgKzI3NTgsMTcgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJgogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKQEAgLTI3OTcsNyArMjc5Nyw3IEBACiAgICAgICAgIHZwIDw8IGNzQkNhcHRpb247CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTI4MDYsMjEgKzI4MDYsMjEgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6c3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OnRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjp0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7CiAgICAgICAgIHZwID4+IGNyQXJyYXk7CiAKICAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKQEAgLTI4MzksMTMgKzI4MzksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBGWF9BUkdCIGNvbG9yOwpAQCAtMjg2Niw3ICsyODY2LDcgQEAKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRUZXh0Q29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTI4NzQsMTcgKzI4NzQsMTcgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CiAgICAgICAgIHZwID4+IGNzRm9udE5hbWU7Ci0gICAgICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3NGb250TmFtZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAobV9iRGVsYXkpCiAgICAgICAgIHsKQEAgLTI4OTksMTMgKzI4OTksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CiAKQEAgLTI5MTUsMTUgKzI5MTUsMTUgQEAKICAgICAgICAgICAgIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICAgICAgewogICAgICAgICAgICAgQ1BERl9Gb250ICogcEZvbnQgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRDb250cm9sRm9udCgpOwotICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgICAgICB2cCA8PCBwRm9udC0+R2V0QmFzZUZvbnQoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykKQEAgLTI5MzEsMTMgKzI5MzEsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI5NTUsMTMgKzI5NTUsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwogCkBAIC0yOTcyLDcgKzI5NzIsNyBAQAogICAgICAgICB2cCA8PCAoaW50KWZGb250U2l6ZTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjk4MCwxNSArMjk4MCwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotYm9vbCBGaWVsZDo6dHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMDI0LDE2ICszMDI0LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dOYW1lOwogICAgICAgICB2cCA+PiBzd05hbWU7CkBAIC0zMDUxLDcgKzMwNTEsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTMwNTksNyArMzA1OSw3IEBACiAgICAgICAgIHZwIDw8IChDRlhfV2lkZVN0cmluZylwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFVzZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKQEAgLTMwNjcsMTMgKzMwNjcsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLWJvb2wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgIENKU19XaWRlU3RyaW5nQXJyYXkgc3RyQXJyYXk7CiAKQEAgLTMxMDksNyArMzEwOSw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzExOSwxNCArMzExOSwxNCBAQAogICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CiAKICAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICBib29sIGJEb3Q7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG90OwogICAgICAgICAgICAgICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKHN3VmFsdWUuY19zdHIoKSwgZFJldCwgYkRvdCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxNjAsNyArMzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICBib29sIGJEb3Q7CisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvdDsKICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJEb3QpCkBAIC0zMTc2LDE0ICszMTc2LDE0IEBACiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sIGJGaW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwICwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRG90OworICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG90OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxOTQsNyArMzE5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMzIxMCw3ICszMjEwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKQEAgLTMyMzgsOCArMzIzOCw4IEBACiAgICAgICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSAhPSBzdHJBcnJheS5HZXRBdCgwKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBXaWRlU3RyaW5nID0gc3RyQXJyYXkuR2V0QXQoMCk7Ci0gICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIHRydWUpOwotICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheS5HZXRBdCgwKSwgVFJVRSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOiAvL21hbnRpczogMDAwNDQ5MwpAQCAtMzI0NywxNCArMzI0NywxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHN0ckFycmF5LkdldEF0KDApLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRTsKIAogICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1zdHJBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICB7CkBAIC0zMjYyLDIxICszMjYyLDIxIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpSW5kZXgpKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGlmaWVkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJNb2RpZmllZCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKHRydWUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PXN0ckFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSwgVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMyODYsMjUgKzMyODYsMjUgQEAKICAgICB9CiB9CiAKLWJvb2wgRmllbGQ6OnZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgewotICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkpCiAgICAgICAgICAgICB2cCA8PCBMIlllcyI7CkBAIC0zMzMxLDE4ICszMzMxLDE4IEBACiAgICAgZWxzZQogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWJvb2wgRmllbGQ6OmJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6YnJvd3NlRm9yRmlsZVRvU3VibWl0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzM1NywxNyArMzM1NywxNyBAQAogICAgICAgICBpZighd3NGaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CiAgICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zMzc4LDE2ICszMzc4LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKG5mYWNlID09IDApCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKS5jX3N0cigpOwpAQCAtMzM5NiwxNCArMzM5NiwxNCBAQAogICAgIGVsc2UgaWYgKG5mYWNlID09IDIpCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpLmNfc3RyKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0ODAwKQogCi1ib29sIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNDE0LDE2ICszNDE0LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNDMyLDcgKzM0MzIsNyBAQAogICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAogICAgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IGZhbHNlKTsKKyAgICBBU1NFUlQocE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwogCiAgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOwogICAgIEFTU0VSVChwSlNfSWNvbiAhPSBOVUxMKTsKQEAgLTM0NDgsMjcgKzM0NDgsMjcgQEAKICAgICBlbHNlIGlmIChuZmFjZSA9PSAyKQogICAgICAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJJY29uKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIHBJY29uLT5TZXRTdHJlYW0ocEljb25TdHJlYW0pOwogICAgIHZSZXQgPSBwSlNfSWNvbjsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OiA0ODAwKQogCi1ib29sIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgMAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIGlmICghcEZvcm1GaWVsZClyZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwRm9ybUZpZWxkKXJldHVybiBGQUxTRTsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CiAgICAgQVNTRVJUKHBFbnYpOwpAQCAtMzQ3Nyw3ICszNDc3LDcgQEAKICAgICBpZiAoc0ljb25GaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICB2UmV0ID0gMTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CkBAIC0zNDg3LDExMCArMzQ4NywxMTAgQEAKICAgICBpZiAoIXBTdHJlYW0pCiAgICAgewogICAgICAgICB2UmV0ID0gLTE7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwogCiAgICAgcEZvcm1Db250cm9sLT5TZXROb3JtYWxJY29uKHBTdHJlYW0pOwotICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOworICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwogCiAgICAgdlJldCA9IDA7CiAjZW5kaWYgLy8gMAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRmllbGQ6OmNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Y2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBib29sIGJDaGVja2l0ID0gdHJ1ZTsKKyAgICBGWF9CT09MIGJDaGVja2l0ID0gVFJVRTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkNoZWNraXQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBpZihuV2lkZ2V0IDwwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIHRydWUpOworICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOwogICAgIGVsc2UKLSAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCB0cnVlKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKIAotICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5XaWRnZXQgPDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCiAgICAgewotICAgICAgICB2UmV0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAKLSAgICAgICAgdlJldCA9IHRydWU7CisgICAgICAgIHZSZXQgPSBUUlVFOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHZSZXQgPSBmYWxzZTsKKyAgICAgICAgdlJldCA9IEZBTFNFOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6ZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIGludCBKU19DT01QQVJFU1RSSU5HKENGWF9XaWRlU3RyaW5nKiBwczEsIENGWF9XaWRlU3RyaW5nKiBwczIpCkBAIC0zNjAyLDEzICszNjAyLDEzIEBACiB9CiAKIAotYm9vbCBGaWVsZDo6Z2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OmdldEFycmF5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICBDR1dfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IHN3U29ydDsKIApAQCAtMzYzMyw3ICszNjMzLDcgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSBzd1NvcnQuR2V0QXQoaik7CiAKICAgICAgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CisgICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CiAKICAgICAgICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUpTX0dldFByaXZhdGUocE9iaik7CiAgICAgICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKQEAgLTM2NTIsMTAgKzM2NTIsMTAgQEAKIAogICAgIHZSZXQgPSBGb3JtRmllbGRBcnJheTsKICAgICBzd1NvcnQuUmVtb3ZlQWxsKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Z2V0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CkBAIC0zNjY0LDEzICszNjY0LDEzIEBACiAgICAgaWYgKGlTaXplID49IDEpCiAgICAgICAgIG5JZHggPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotICAgIGJvb2wgYkV4cG9ydCA9IHRydWU7CisgICAgRlhfQk9PTCBiRXhwb3J0ID0gVFJVRTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzY5MiwyMiArMzY5MiwyMiBAQAogICAgICAgICAgICAgdlJldCA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgRmllbGQ6Omluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6aW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OmlzQm94Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6aXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNzE3LDMyICszNzE3LDMyIEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5JbmRleCA8MCB8fCBuSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQogICAgIHsKLSAgICAgICAgdlJldCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHZSZXQgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9MCApCi0gICAgICAgICAgICB2UmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHZSZXQgPSBUUlVFOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gZmFsc2U7CisgICAgICAgICAgICB2UmV0ID0gRkFMU0U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IGZhbHNlOworICAgICAgICB2UmV0ID0gRkFMU0U7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMzc1Miw0OSArMzc1Miw0OSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpZihuSW5kZXggPDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKICAgICB7Ci0gICAgICAgIHZSZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2UmV0ID0gRkFMU0U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgICAgIHx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pKQogICAgIHsKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2wobkluZGV4KS0+SXNEZWZhdWx0Q2hlY2tlZCgpICE9IDApCi0gICAgICAgICAgICB2UmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHZSZXQgPSBUUlVFOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gZmFsc2U7CisgICAgICAgICAgICB2UmV0ID0gRkFMU0U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IGZhbHNlOworICAgICAgICB2UmV0ID0gRkFMU0U7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6c2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzZXRBY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpbnQzMl90IG5Db3VudCA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsKIAotICAgIGlmIChuQ291bnQgPCAxKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKG5Db3VudCA8IDEpIHJldHVybiBGQUxTRTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CkBAIC0zODEwLDcgKzM4MTAsNyBAQAogICAgICAgICBBU1NFUlQocEVudik7CiAgICAgICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkpOwogICAgICAgICBpZighcFBhZ2UpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wOyBpPG5Db3VudDsgaSsrKQpAQCAtMzgzMiw1NyArMzgzMiw1NyBAQAogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwV2lkZ2V0KTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBGaWVsZDo6c2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnNldEl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBGaWVsZDo6c2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgRmllbGQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKICAgICAgICAgdnAgPDwgKENKU19PYmplY3QqKU5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZGVsYXkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcAppbmRleCAyN2E5NzczLi42YjNlMDJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAKQEAgLTU3LDExICs1NywxMSBAQAogCXJldHVybiBtX3N3SWNvbk5hbWU7CiB9CiAKLWJvb2wgSWNvbjo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIEljb246Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CisJaWYoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKIAogCXZwIDw8IG1fc3dJY29uTmFtZTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKaW5kZXggMGVkYmYwZC4uNzJiZTM0ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAKIENKU19Db250ZXh0OjpDSlNfQ29udGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUpIDoKIAltX3BSdW50aW1lKHBSdW50aW1lKSwKLQltX2JCdXN5KGZhbHNlKSwKLQltX2JNc2dCb3hFbmFibGUodHJ1ZSkKKwltX2JCdXN5KEZBTFNFKSwKKwltX2JNc2dCb3hFbmFibGUoVFJVRSkKIHsKIAltX3BFdmVudEhhbmRsZXIgPSBuZXcgQ0pTX0V2ZW50SGFuZGxlcih0aGlzKTsKIH0KQEAgLTQxLDE1ICs0MSwxNSBAQAogCXJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKIH0KIAotYm9vbCBDSlNfQ29udGV4dDo6RG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKK0ZYX0JPT0wgQ0pTX0NvbnRleHQ6OkRvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCiB7CiAJaWYgKG1fYkJ1c3kpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0JVU1kpOwotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKLQltX2JCdXN5ID0gdHJ1ZTsKKwltX2JCdXN5ID0gVFJVRTsKIAogCUFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CkBAIC01OCw3ICs1OCw3IEBACiAJaWYgKCFtX3BSdW50aW1lLT5BZGRFdmVudFRvTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSkpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0VWRU5UKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJRlhKU0VyciBlcnJvciA9e05VTEwsTlVMTCwgMH07CkBAIC05NSwxMiArOTUsMTIgQEAKIAltX3BSdW50aW1lLT5SZW1vdmVFdmVudEluTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSk7CiAKIAltX3BFdmVudEhhbmRsZXItPkRlc3Ryb3koKTsKLQltX2JCdXN5ID0gZmFsc2U7CisJbV9iQnVzeSA9IEZBTFNFOwogCiAJcmV0dXJuIG5SZXQgPj0gMDsKIH0KIAotYm9vbCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQorRlhfQk9PTCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJcmV0dXJuIERvSm9iKDAsIHNjcmlwdCwgaW5mbyk7CiB9CiAKLWJvb2wgQ0pTX0NvbnRleHQ6OkNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCitGWF9CT09MIENKU19Db250ZXh0OjpDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTg2LDU4ICsxODYsNTggQEAKIAltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PdXRWaWV3KHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRW50ZXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQsIFZhbHVlKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYykKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQ2FsY3VsYXRlKHBTb3VyY2UsIHBUYXJnZXQsIFZhbHVlLCBiUmMpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sIGJXaWxsQ29tbWl0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCkKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfRm9ybWF0KHBUYXJnZXQsIFZhbHVlLCBiV2lsbENvbW1pdCk7CiB9CiAKIAogdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwKLQkJCQkJCQkJCWJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotCQkJCQkJCQkJYm9vbCBiV2lsbENvbW1pdCwgYm9vbCBiRmllbGRGdWxsLCBib29sJiBiUmMpCisJCQkJCQkJCQlGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LAorCQkJCQkJCQkJRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisJCQkJCQkJCQlGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wmIGJSYykKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKAogICAgICAgICBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLCBuU2VsRW5kLCBuU2VsU3RhcnQsCkBAIC0yNDUsNjggKzI0NSw2OCBAQAogfQogCiB2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkgICBib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotCQkJCQkJCQkgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYykKKwkJCQkJCQkJICAgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKwkJCQkJCQkJICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfVmFsaWRhdGUoc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9PcGVuKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9DbG9zZShiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZVVwKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fSW5WaWV3KGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3V0VmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAKaW5kZXggMTA1NmM0NC4uMTc2OWUzMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcApAQCAtMjAsMjEgKzIwLDIxIEBACiBDSlNfRXZlbnRIYW5kbGVyOjpDSlNfRXZlbnRIYW5kbGVyKENKU19Db250ZXh0ICogcENvbnRleHQpICAgOgogICAgIG1fcEpTQ29udGV4dChwQ29udGV4dCksCiAgICAgbV9lRXZlbnRUeXBlKEpFVF9VTktOT1dOKSwKLSAgICBtX2JWYWxpZChmYWxzZSksCisgICAgbV9iVmFsaWQoRkFMU0UpLAogICAgIG1fcFdpZGVTdHJDaGFuZ2UoTlVMTCksCiAgICAgbV9uQ29tbWl0S2V5KC0xKSwKLSAgICBtX2JLZXlEb3duKGZhbHNlKSwKLSAgICBtX2JNb2RpZmllcihmYWxzZSksCi0gICAgbV9iU2hpZnQoZmFsc2UpLAorICAgIG1fYktleURvd24oRkFMU0UpLAorICAgIG1fYk1vZGlmaWVyKEZBTFNFKSwKKyAgICBtX2JTaGlmdChGQUxTRSksCiAgICAgbV9wSVNlbEVuZChOVUxMKSwKICAgICBtX25TZWxFbmREdSgwKSwKICAgICBtX3BJU2VsU3RhcnQoTlVMTCksCiAgICAgbV9uU2VsU3RhcnREdSgwKSwKLSAgICBtX2JXaWxsQ29tbWl0KGZhbHNlKSwKKyAgICBtX2JXaWxsQ29tbWl0KEZBTFNFKSwKICAgICBtX3BWYWx1ZShOVUxMKSwKLSAgICBtX2JGaWVsZEZ1bGwoZmFsc2UpLAorICAgIG1fYkZpZWxkRnVsbChGQUxTRSksCiAgICAgbV9wYlJjKE5VTEwpLAotICAgIG1fYlJjRHUoZmFsc2UpLAorICAgIG1fYlJjRHUoRkFMU0UpLAogICAgIG1fcFNvdXJjZURvYyhOVUxMKSwKICAgICBtX3BUYXJnZXRCb29rTWFyayhOVUxMKSwKICAgICBtX3BUYXJnZXREb2MoTlVMTCksCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRVhJVCk7CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRURPV04pOwogICAgIG1fZUV2ZW50VHlwZSA9IEpFVF9GSUVMRF9NT1VTRURPV047CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRVVQKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfQkxVUik7CkBAIC0xODgsMTEgKzE4OCwxMSBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nICZzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwgaW50JiBuU2VsRW5kLCBpbnQmIG5TZWxTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaWVsZEZ1bGwsIGJvb2wmIGJSYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQmIG5TZWxFbmQsIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7CiAKQEAgLTIxMyw4ICsyMTMsOCBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9WQUxJREFURSk7CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0NBTENVTEFURSk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9STUFUKTsKIApAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0OwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9GT0NVUyk7CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAgICAgSW5pdGlhbChKRVRfU0NSRUVOX0JMVVIpOwogCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9PUEVOKTsKIApAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0Nsb3NlKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRURPV04pOwogCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRVVQKTsKIApAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7CiAKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVYSVQpOwogCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKIApAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7CiAKQEAgLTM5NSwzMyArMzk1LDMzIEBACiAgICAgbV9XaWRlU3RyQ2hhbmdlRHUgPSBMIiI7CiAgICAgbV9XaWRlU3RyQ2hhbmdlRXggPSBMIiI7CiAgICAgbV9uQ29tbWl0S2V5ID0gLTE7Ci0gICAgbV9iS2V5RG93biA9IGZhbHNlOwotICAgIG1fYk1vZGlmaWVyID0gZmFsc2U7Ci0gICAgbV9iU2hpZnQgPSBmYWxzZTsKKyAgICBtX2JLZXlEb3duID0gRkFMU0U7CisgICAgbV9iTW9kaWZpZXIgPSBGQUxTRTsKKyAgICBtX2JTaGlmdCA9IEZBTFNFOwogICAgIG1fcElTZWxFbmQgPSBOVUxMOwogICAgIG1fblNlbEVuZER1ID0gMDsKICAgICBtX3BJU2VsU3RhcnQgPSBOVUxMOwogICAgIG1fblNlbFN0YXJ0RHUgPSAwOwotICAgIG1fYldpbGxDb21taXQgPSBmYWxzZTsKKyAgICBtX2JXaWxsQ29tbWl0ID0gRkFMU0U7CiAgICAgbV9wVmFsdWUgPSBOVUxMOwotICAgIG1fYkZpZWxkRnVsbCA9IGZhbHNlOworICAgIG1fYkZpZWxkRnVsbCA9IEZBTFNFOwogICAgIG1fcGJSYyA9IE5VTEw7Ci0gICAgbV9iUmNEdSA9IGZhbHNlOworICAgIG1fYlJjRHUgPSBGQUxTRTsKIAogICAgIG1fcFNvdXJjZURvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0Qm9va01hcmsgPSBOVUxMOwogICAgIG1fcFRhcmdldERvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBOVUxMOwogCi0gICAgbV9iVmFsaWQgPSB0cnVlOworICAgIG1fYlZhbGlkID0gVFJVRTsKIH0KIAogdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpEZXN0cm95KCkKIHsKLSAgICBtX2JWYWxpZCA9IGZhbHNlOworICAgIG1fYlZhbGlkID0gRkFMU0U7CiB9CiAKLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpCitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6OklzVmFsaWQoKQogewogICAgIHJldHVybiBtX2JWYWxpZDsKIH0KQEAgLTQ0NCwxNyArNDQ0LDE3IEBACiAgICAgcmV0dXJuIG1fbkNvbW1pdEtleTsKIH0KIAotYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQorRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQogewogICAgIHJldHVybiBtX2JGaWVsZEZ1bGw7CiB9CiAKLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpCitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6OktleURvd24oKQogewogICAgIHJldHVybiBtX2JLZXlEb3duOwogfQogCi1ib29sIENKU19FdmVudEhhbmRsZXI6Ok1vZGlmaWVyKCkKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKQogewogICAgIHJldHVybiBtX2JNb2RpZmllcjsKIH0KQEAgLTU1NSw3ICs1NTUsNyBAQAogICAgIHJldHVybiBMIiI7CiB9CiAKLWJvb2wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKK0ZYX0JPT0wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKIHsKICAgICBpZiAobV9wYlJjKSB7CiAgICAgICAgIHJldHVybiAqbV9wYlJjOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgcmV0dXJuIG1fblNlbFN0YXJ0RHU7CiB9CiAKLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6U2hpZnQoKQorRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpCiB7CiAgICAgcmV0dXJuIG1fYlNoaWZ0OwogfQpAQCAtNTkxLDkgKzU5MSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgIHBEb2NPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7Ci0gICAgQVNTRVJUKHBEb2NPYmouSXNFbXB0eSgpID09IGZhbHNlKTsKKyAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwogICAgIEpTRlhPYmplY3QgIHBGaWVsZE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKLSAgICBBU1NFUlQocEZpZWxkT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CisgICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwogCiAgICAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocERvY09iaik7CiAgICAgQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOwpAQCAtNjI1LDkgKzYyNSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgcERvY09iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJEb2N1bWVudCIpKTsKLSAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOworICAgIEFTU0VSVChwRG9jT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CiAgICAgSlNGWE9iamVjdCBwRmllbGRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOworICAgIEFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKIAogICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOwogICAgIEFTU0VSVChwSlNEb2N1bWVudCAhPSBOVUxMKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogICAgIHJldHVybiAqbV9wVmFsdWU7CiB9CiAKLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6V2lsbENvbW1pdCgpCitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6OldpbGxDb21taXQoKQogewogICAgIHJldHVybiBtX2JXaWxsQ29tbWl0OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKaW5kZXggNzFlM2E1MC4uOGM3YmQ3MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICB9CiB9CiAKLWJvb2wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiUGVyc2lzdGVudCkKK0ZYX0JPT0wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMDQsMTggKzMwNCwxOCBAQAogICAgIHNQcm9wTmFtZS5UcmltTGVmdCgpOwogICAgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKIAotICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKICAgICB7CiAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IGJQZXJzaXN0ZW50OwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpCitGWF9CT09MIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKICAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CiAKLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKIAogICAgIGludCBuRmluZCA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOwogCkBAIC0zMzEsMTAgKzMzMSwxMCBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKICAgICAgICAgbV9hcnJheUdsb2JhbERhdGEuUmVtb3ZlQXQobkZpbmQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0CkBAIC00MTcsNyArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CkBAIC00MjUsNyArNDI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdEYXRhID0gKigoRlhfV09SRCopcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKHNFbnRyeSwgKGJvb2wpKHdEYXRhID09IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6CkBAIC00MzcsMTQgKzQzNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKHNFbnRyeSwgQ0ZYX0J5dGVTdHJpbmcocCwgZHdMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdWxsKHNFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcAppbmRleCA3MzMzZTg4Li40ODVjZDI3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPSBwQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIEpTX0luaXRpYWwoZW1iZWRkZXJEYXRhU2xvdCk7Ci0gICAgICAgIG1fYkluaXQgPSB0cnVlOworICAgICAgICBtX2JJbml0ID0gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIG5ldyBDSlNfUnVudGltZShwQXBwKTsKIH0KQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgSlNfUmVsZWFzZSgpOwogICAgICAgICAgICAgUmVsZWFzZUdsb2JhbERhdGEoKTsKLSAgICAgICAgICAgIG1fYkluaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fYkluaXQgPSBGQUxTRTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEwOCw3ICsxMDgsNyBAQAogQ0pTX1J1bnRpbWU6OkNKU19SdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwKSA6CiAJbV9wQXBwKHBBcHApLAogCW1fcERvY3VtZW50KE5VTEwpLAotCW1fYkJsb2NraW5nKGZhbHNlKSwKKwltX2JCbG9ja2luZyhGQUxTRSksCiAJbV9wRmllbGRFdmVudFBhdGgoTlVMTCksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CkBAIC0xNTAsNDYgKzE1MCw0NiBAQAogICAgIG1faXNvbGF0ZS0+RGlzcG9zZSgpOwogfQogCi1ib29sIENKU19SdW50aW1lOjpJbml0SlNPYmplY3RzKCkKK0ZYX0JPT0wgQ0pTX1J1bnRpbWU6OkluaXRKU09iamVjdHMoKQogewogICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoR2V0SXNvbGF0ZSgpKTsKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKICAgICAvLzAgLSA4Ci0gICAgaWYgKENKU19Cb3JkZXI6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENKU19EaXNwbGF5OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChDSlNfRm9udDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX0hpZ2hsaWdodDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX1Bvc2l0aW9uOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChDSlNfU2NhbGVIb3c6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENKU19TY2FsZVdoZW46OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENKU19TdHlsZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX1pvb210eXBlOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfQm9yZGVyOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfRGlzcGxheTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0ZvbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19IaWdobGlnaHQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19Qb3NpdGlvbjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX1NjYWxlSG93OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfU2NhbGVXaGVuOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfU3R5bGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19ab29tdHlwZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKIAogICAgIC8vOSAtIDExCi0gICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAvLzEyIC0gMTQKLSAgICBpZiAoQ0pTX0RvY3VtZW50OjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX0V2ZW50OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChDSlNfRmllbGQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfRG9jdW1lbnQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfRXZlbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19GaWVsZDo6SW5pdCgqdGhpcywgSlNfRFlOQU1JQykgPCAwKSByZXR1cm4gRkFMU0U7CiAKICAgICAvLzE1IC0gMTcKLSAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKIAotICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENKU19HbG9iYWxDb25zdHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChDSlNfR2xvYmFsQXJyYXlzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfR2xvYmFsQ29uc3RzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0dsb2JhbEFycmF5czo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAoQ0pTX1RpbWVyT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICBpZiAoQ0pTX1ByaW50UGFyYW1zT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8MCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfVGltZXJPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfUHJpbnRQYXJhbXNPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwwKSByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogSUZYSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKQpAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgfQogfQogCi1ib29sIENKU19SdW50aW1lOjpBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKK0ZYX0JPT0wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKQogewogICAgIGlmIChtX3BGaWVsZEV2ZW50UGF0aCA9PSBOVUxMKQogICAgIHsKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgICAgICBtX3BGaWVsZEV2ZW50UGF0aC0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7CiAgICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5wTmV4dCA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIC8vdG8gc2VhcmNoCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICB3aGlsZSAocCkKICAgICB7CiAgICAgICAgIGlmIChwLT5lRXZlbnRUeXBlID09IGVFdmVudFR5cGUgJiYgcC0+c1RhcmdldE5hbWUgPT0gc1RhcmdldE5hbWUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgcExhc3QgPSBwOwogICAgICAgICBwID0gcC0+cE5leHQ7CkBAIC0yODcsMTIgKzI4NywxMiBAQAogCiAgICAgcExhc3QtPnBOZXh0ID0gcE5ldzsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIENKU19SdW50aW1lOjpSZW1vdmVFdmVudEluTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKIHsKLSAgICBib29sIGJGaW5kID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwogCiAgICAgQ0pTX0ZpZWxkRXZlbnQqIHAgPSBtX3BGaWVsZEV2ZW50UGF0aDsKICAgICBDSlNfRmllbGRFdmVudCogcExhc3QgPSBOVUxMOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgewogICAgICAgICBpZiAocC0+ZUV2ZW50VHlwZSA9PSBlRXZlbnRUeXBlICYmIHAtPnNUYXJnZXROYW1lID09IHNUYXJnZXROYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBiRmluZCA9IHRydWU7CisgICAgICAgICAgICBiRmluZCA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmluZGV4IDYxMWIxMTEuLjA1OGYyZWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCkBAIC0yNTYsNDUgKzI1Niw0NSBAQAogCXJldHVybiBWVF91bmtub3duOwogfQogCi1ib29sIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0CitGWF9CT09MIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0FycmF5KCk7CiB9CiAKLWJvb2wgQ0pTX1ZhbHVlOjpJc0RhdGVPYmplY3QoKSBjb25zdAorRlhfQk9PTCBDSlNfVmFsdWU6OklzRGF0ZU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0RhdGUoKTsKIH0KIAogLy9DSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCi1ib29sIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5ICZhcnJheSkgY29uc3QKK0ZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJmFycmF5KSBjb25zdAogewogCWlmIChJc0FycmF5T2JqZWN0KCkpCiAJewogCQlhcnJheS5BdHRhY2goSlNfVG9BcnJheShtX2lzb2xhdGUsIG1fcFZhbHVlKSk7Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIENKU19WYWx1ZTo6Q29udmVydFRvRGF0ZShDSlNfRGF0ZSAmZGF0ZSkgY29uc3QKK0ZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlICZkYXRlKSBjb25zdAogewogLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKIC8vIAl7CiAvLyAJCWRhdGUgPSAoZG91YmxlKSgqdGhpcyk7Ci0vLyAJCXJldHVybiB0cnVlOworLy8gCQlyZXR1cm4gVFJVRTsKIC8vIAl9CiAKIAlpZiAoSXNEYXRlT2JqZWN0KCkpCiAJewogCQlkYXRlLkF0dGFjaChtX3BWYWx1ZSk7Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19Qcm9wVmFsdWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzE0LDEyICszMTQsMTIgQEAKIHsKIH0KIAotYm9vbCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQorRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQogewogCXJldHVybiBtX2JJc1NldHRpbmc7CiB9CiAKLWJvb2wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKK0ZYX0JPT0wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKIHsKIAlyZXR1cm4gIW1fYklzU2V0dGluZzsKIH0KQEAgLTQ4MCw5ICs0ODAsOSBAQAogCW1fcEFycmF5ID0gcEFycmF5OwogfQogCi1ib29sIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCitGWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCiB7Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAogdm9pZCBDSlNfQXJyYXk6OkdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSkKQEAgLTU0Myw5ICs1NDMsOSBAQAogewogfQogCi1ib29sCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCitGWF9CT09MCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCiB7Ci0JaWYobV9wRGF0ZS5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKKwlpZihtX3BEYXRlLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOwogCXJldHVybiAhSlNfUG9ydElzTmFuKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcAppbmRleCAwYWEyM2QxLi5kYWVjZGJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKQEAgLTcyLDc2ICs3Miw3NiBAQAogICAgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgogfTsKIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CiAgICAgY29uc3QgRlhfV0NIQVIqIHBUcmltID0gc1RyaW0uY19zdHIoKTsKICAgICBjb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwogCiAKLSAgICBib29sIGJEb3QgPSBmYWxzZTsKLSAgICBib29sIGJLWEpTID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwogCiAgICAgd2NoYXJfdCBjOwogICAgIHdoaWxlICgoYyA9ICpwKSkKICAgICB7CiAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGJEb3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocCAhPSBwVHJpbSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYktYSlMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJLWEpTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiS1hKUyA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHArKzsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQogewogICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpCiB7CiAgICAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKIHsKICAgICBzd2l0Y2ggKGNfTWFzaykKICAgICB7CkBAIC0xNTIsMTMgKzE1MiwxMyBAQAogICAgIGNhc2UgTCdPJzoKICAgICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKICAgICBjYXNlIEwnWCc6Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7CiAgICAgfQogfQogCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQogewogICAgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwogfQpAQCAtMjI2LDEzICsyMjYsMTMgQEAKICAgICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgYm9vbCYgYkFsbERpZ2l0cywgYm9vbCYgYkRvdCwgYm9vbCYgYlNpZ24sIGJvb2wmIGJLWEpTKQorZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUykKIHsKLSAgICBiRG90ID0gZmFsc2U7Ci0gICAgYlNpZ24gPSBmYWxzZTsKLSAgICBiS1hKUyA9IGZhbHNlOworICAgIGJEb3QgPSBGQUxTRTsKKyAgICBiU2lnbiA9IEZBTFNFOworICAgIGJLWEpTID0gRkFMU0U7CiAKLSAgICBib29sIGJEaWdpdEV4aXN0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwogCiAgICAgY29uc3QgRlhfV0NIQVIqIHAgPSBzd1NvdXJjZTsKICAgICB3Y2hhcl90IGM7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAogICAgIGlmICghcFN0YXJ0KQogICAgIHsKLSAgICAgICAgYkFsbERpZ2l0cyA9IGZhbHNlOworICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjY3LDcgKzI2Nyw3IEBACiAKICAgICBkb3VibGUgZFJldCA9IDA7CiAgICAgcCA9IHBTdGFydDsKLSAgICBiQWxsRGlnaXRzID0gdHJ1ZTsKKyAgICBiQWxsRGlnaXRzID0gVFJVRTsKICAgICBDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKIAogICAgIHdoaWxlIChwIDw9IHBFbmQpCkBAIC0yNzcsMTQgKzI3NywxNCBAQAogICAgICAgICBpZiAoSXNEaWdpdChjKSkKICAgICAgICAgewogICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgTCcgJzoKLSAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMJy4nOgogICAgICAgICAgICAgY2FzZSBMJywnOgpAQCAtMjk4LDEwICsyOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBiRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYkRvdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgJ2UnOgpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSAqcDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSAnZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjIsMjEgKzMyMiwyMSBAQAogICAgICAgICAgICAgICAgIGlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgYlNpZ24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKIAogICAgICAgICAgICAgICAgIGlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgIGJEb3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkRvdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzID0gTCIiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3NCwxOSArMzc0LDE5IEBACiAKIGRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpCiB7Ci0gICAgYm9vbCBiQWxsRGlnaXRzID0gZmFsc2U7Ci0gICAgYm9vbCBiRG90ID0gZmFsc2U7Ci0gICAgYm9vbCBiU2lnbiA9IGZhbHNlOwotICAgIGJvb2wgYktYSlMgPSBmYWxzZTsKKyAgICBGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKKyAgICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKKyAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7CisgICAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwogCiAgICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwogfQogCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBib29sICYgYkRvdCkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KQogewotICAgIGJvb2wgYkFsbERpZ2l0cyA9IGZhbHNlOwotICAgIGJvb2wgYlNpZ24gPSBmYWxzZTsKLSAgICBib29sIGJLWEpTID0gZmFsc2U7CisgICAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CisgICAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOworICAgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKIAogICAgIGRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKIApAQCAtNDc3LDcgKzQ3Nyw3IEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBib29sJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCiB7CiAgICAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIApAQCAtNTI1LDcgKzUyNSw3IEBACiAgICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgICAgIH0KIAotICAgICAgICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICAgfQogICAgIGVsc2UgaWYgKG5JbmRleCA9PSAzKQogICAgIHsKQEAgLTU1MiwxMSArNTUyLDExIEBACiAgICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICAgICAgfQogCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IGZhbHNlOworICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgcmV0dXJuIGR0OwogICAgIH0KIApAQCAtNTY1LDcgKzU2NSw3IEBACiAgICAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBib29sJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQogewogICAgIGRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CiAKQEAgLTU4MSw5ICs1ODEsOSBAQAogCiAgICAgaW50IG5ZZWFyU3ViID0gOTk7IC8vblllYXIgLSAyMDAwOwogCi0gICAgYm9vbCBiUG0gPSBmYWxzZTsKLSAgICBib29sIGJFeGl0ID0gZmFsc2U7Ci0gICAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiUG0gPSBGQUxTRTsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAKICAgICBpbnQgaT0wOwogICAgIGludCBqPTA7CkBAIC03MTUsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQpAQCAtNzIzLDcgKzcyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKz1uU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc1Nyw3ICs3NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc01vbnRoLk1ha2VMb3dlcigpOwpAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC03OTUsOCArNzk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgaisrOwpAQCAtODA0LDggKzgwNCw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGogPT0gaikKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTgxMywxMiArODEzLDEyIEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGkrKzsKQEAgLTgzMywxOSArODMzLDE5IEBACiAgICAgICAgIG5ZZWFyICs9IDIwMDA7CiAKICAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKLSAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKIAogICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAKICAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAKICAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQotICAgICAgICBiV3JvbmdGb3JtYXQgPSB0cnVlOworICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogCiAgICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKLSAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKIAogICAgIGRvdWJsZSBkUmV0ID0gMDsKIApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CkBAIC0xMDMzLDIxICsxMDMzLDIxIEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKIAotICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOwogCiAgICAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgICAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwogICAgIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgogICAgIHN0ZDo6d3N0cmluZyB3c3RyQ3VycmVuY3kocGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgIGJvb2wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKKyAgICBGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CiAKICAgICBpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKIApAQCAtMTIyNCwxMSArMTIyNCwxMSBAQAogICAgIH0KICAgICBWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwogI2VuZGlmCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTIzNiwxMyArMTIzNiwxMyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZihwYXJhbXMuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogCiAgICAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgICAgICAgaVNlcFN0eWxlID0gMDsKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKQEAgLTEyNTIsMTggKzEyNTIsMTggQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgICAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgICAgICBzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKICAgICAgICAgaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAorICAgICAgICByZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAogICAgIH0KIAogICAgIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKQEAgLTEyNzEsMTUgKzEyNzEsMTUgQEAKICAgICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICAgICBpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCiAgICAgICAgIHdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7Ci0gICAgYm9vbCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CisgICAgRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CiAgICAgaWYgKGJIYXNTaWduKQogICAgIHsKICAgICAgICAgLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgogICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjk3LDQ5ICsxMjk3LDQ5IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGJvb2wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKKyAgICBGWF9CT09MIGJIYXNTZXAgPSAod19zdHJWYWx1ZTIuZmluZChjU2VwKSAhPSAtMSk7CiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7IGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykKICAgICB7CiAgICAgICAgIGlmICgqaXQgPT0gY1NlcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGJIYXNTZXApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTZXAgPSB0cnVlOworICAgICAgICAgICAgYkhhc1NlcCA9IFRSVUU7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKml0ID09IEwnLScpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChiSGFzU2lnbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOworICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgICAgICBiUmMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTaWduID0gdHJ1ZTsKKyAgICAgICAgICAgIGJIYXNTaWduID0gVFJVRTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFJc0RpZ2l0KCppdCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzUxLDEyICsxMzUxLDEyIEBACiAgICAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICAgICB3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKICAgICB2YWwgPSB3X3N0clZhbHVlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogCiB9CiAKIC8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwpAQCAtMTM2NywxNSArMTM2NywxNSBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgIGlmIChpRGVjIDwgMCkKQEAgLTE0NjEsMTYgKzE0NjEsMTYgQEAKICAgICBzdHJWYWx1ZSArPSAiJSI7CiAgICAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKICNlbmRpZgotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAogLy9mdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ4MCwxOCArMTQ4MCwxOCBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgICBkb3VibGUgZERhdGUgPSAwLjBmOwogCiAgICAgaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQpAQCAtMTUxMCwxMSArMTUxMCwxMSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIHZhbCA9ICBNYWtlRm9ybWF0RGF0ZShkRGF0ZSxzRm9ybWF0KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQpAQCAtMTU3OCw3ICsxNTc4LDcgQEAKIH0KIAogLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTU4OCwzMyArMTU4OCwzMyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKICAgICB7CiAgICAgICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICAgICAgYm9vbCBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgICAgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwogICAgICAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkKICAgICAgICAgewogICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKIApAQCAtMTYyNCw3ICsxNjI0LDcgQEAKICAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKQEAgLTE2NDUsNyArMTY0NSw3IEBACiB9CiAKIC8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xNjU1LDcgKzE2NTUsNyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTY3Niw3ICsxNjc2LDcgQEAKIH0KIAogLy9mdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKQEAgLTE3MTEsNyArMTcxMSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcyOSwxOCArMTcyOSwxOCBAQAogICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwogfQogCiAvL2Z1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CkBAIC0xNzU4LDcgKzE3NTgsNyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkuY19zdHIoKTsKIApAQCAtMTc4OCwxMiArMTc4OCwxMiBAQAogICAgIHN0ZDo6c3RyaW5nIHN0ckRlczsKICAgICB1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKICAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE4MDQsMjMgKzE4MDQsMjMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogCiAgICAgc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CiAKICAgICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCiAgICAgewogICAgICAgICBpZiAod3N0clZhbHVlLmVtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBpbnQgaUluZGV4TWFzayA9IDA7CiAgICAgICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCiAgICAgICAgIHsKQEAgLTE4MzMsMzAgKzE4MzMsMzAgQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkKICAgICAgICAgewogICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgICBzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKICAgICBpZiAod0NoYW5nZS5lbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKIAogICAgIGlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKICAgICB7CiAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLSAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQpAQCAtMTg2NCw4ICsxODY0LDggQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgd2NoYXJfdCB3X01hc2sgPSB3c3RyTWFza1tpSW5kZXhNYXNrXTsKICAgICAgICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKQEAgLTE4NzUsMTkgKzE4NzUsMTkgQEAKICAgICAgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfQ2hhbmdlLHdfTWFzaykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlJbmRleE1hc2srKzsKICAgICB9CiAKICAgICB3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xODk5LDE0ICsxODk5LDE0IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIC8vQ0pTX1ZhbHVlIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CkBAIC0xOTQ2LDcgKzE5NDYsNyBAQAogICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwpAQCAtMTk2Niw3ICsxOTY2LDcgQEAKICAgICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKQogICAgIHsKICAgICAgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHByZWZpeCxwb3N0Zml4OwpAQCAtMTk4MywxMCArMTk4MywxMCBAQAogCiAgICAgdlJldCA9IChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE5OTQsMTMgKzE5OTQsMTMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CiAKLSAgICBib29sIGJXcm9uZ0Zvcm1hdCA9IGZhbHNlOworICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAKICAgICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKQEAgLTIwMDgsMTQgKzIwMDgsMTQgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICAgQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB2UmV0ID0gZERhdGU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpCiAgICAgewpAQCAtMjAyMywxNCArMjAyMywxNCBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewpAQCAtMjAzOCwxMyArMjAzOCwxMyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTIwNTQsNyArMjA1NCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwpAQCAtMjA2Miw3ICsyMDYyLDcgQEAKICAgICBpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKQEAgLTIxNjIsMTMgKzIxNjIsMTMgQEAKICAgICBpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKICAgICAgICAgKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCkpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKICoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwogCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjE3OCwxNyArMjE3OCwxNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKLSAgICBib29sIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKICAgICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7Ci0gICAgYm9vbCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CisgICAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgICAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOwogICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogCkBAIC0yMjE1LDEyICsyMjE1LDEyIEBACiAgICAgaWYgKCFzd01zZy5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKQEAgLTIyMjksNyArMjIyOSw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOwpAQCAtMjI2OSw1ICsyMjY5LDUgQEAKICAgICBlbHNlCiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKaW5kZXggMGYzNTI5Ny4uYWYzMjk2NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcApAQCAtMTM0LDEwICsxMzQsMTAgQEAKIAltX2FUaW1lci5SZW1vdmVBbGwoKTsKIH0KIAotYm9vbCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKQEAgLTE2NiwxMjAgKzE2NiwxMjAgQEAKICAgICBlbHNlCiAgICAgICAgIHZwLlNldE51bGwoKTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIGFwcDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpjYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJCWJvb2wgYlZQOwogCQl2cCA+PiBiVlA7Ci0JCW1fYkNhbGN1bGF0ZSA9IChib29sKWJWUDsKKwkJbV9iQ2FsY3VsYXRlID0gKEZYX0JPT0wpYlZQOwogCiAJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ0pTX0FycmF5IGFEb2NzKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogCQlpZiAoQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldFNES0RvY3VtZW50KCkpCi0JCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChib29sKW1fYkNhbGN1bGF0ZSk7CisJCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChGWF9CT09MKW1fYkNhbGN1bGF0ZSk7CiAJfQogCWVsc2UKIAl7CiAJCXZwIDw8IChib29sKW1fYkNhbGN1bGF0ZTsKIAl9Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OmZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfTlVNX0ZPUk1TVkVSU0lPTjsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBMInVua25vd24iOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBhcHA6OnZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6dmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBKU19TVFJfVklFV0VSVkFSSUFUSU9OOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc0dldHRpbmcoKSkKIAl7CiAJCXZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBhcHA6OnBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX1BMQVRGT1JNOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBhcHA6Omxhbmd1YWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX0xBTkdVQU5HRTsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIC8vY3JlYXRlcyBhIG5ldyBmZGYgb2JqZWN0IHRoYXQgY29udGFpbnMgbm8gZGF0YQogLy9jb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6CiAvL0NGREZfRG9jdW1lbnQgKiBDUERGRG9jX0Vudmlyb25tZW50OjpOZXdGREYoKTsKLWJvb2wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIC8vb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKIC8vY29tbWVudDpuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6IGFzIGRlZmluZWQgaW4ganMgcmVmZXJlbmNlLCB0aGUgcHJvdG8gb2YgdGhpcyBmdW5jdGlvbidzIGZvdXJ0aCBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgogLy9DRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sIGJVc2VyQ29udik7CiAKLWJvb2wgYXBwOjpvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6b3BlbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGFwcDo6YWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjphbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAJaWYgKGlTaXplIDwgMSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd01zZyA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCIiOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJCX0KIAkJZWxzZSBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKQogCQl7Ci0JCQlib29sIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisJCQlGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCQlpZiAoYkdldCkKIAkJCQlzd01zZyA9IEwidHJ1ZSI7CiAJCQllbHNlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAl7CiAJCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Jvb2xlYW4pCiAJCXsKLQkJCWJvb2wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKwkJCUZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKIAkJCWlmIChiR2V0KQogCQkJCXN3TXNnID0gTCJ0cnVlIjsKIAkJCWVsc2UKQEAgLTM4NiwxMSArMzg2LDExIEBACiAJdlJldCA9IE1zZ0JveChwUnVudGltZS0+R2V0UmVhZGVyQXBwKCksIEpTR2V0UGFnZVZpZXcoY2MpLCBzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLCBpSWNvbik7CiAJcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogCi1ib29sIGFwcDo6YmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OmJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAocGFyYW1zLnNpemUoKSA9PSAxKQogCXsKQEAgLTM5OCw0MiArMzk4LDQyIEBACiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CiAJCXBFbnYtPkpTX2FwcEJlZXAocGFyYW1zWzBdLlRvSW50KCkpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCiAJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6ZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGFwcDo6cG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6ZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OnNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zLnNpemUoKSA+IDAgPyAgcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogCWlmIChzY3JpcHQuSXNFbXB0eSgpKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCiAJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtNDYzLDE1ICs0NjMsMTUgQEAKIAogCXZSZXQgPSBwUmV0T2JqOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6c2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmIChwYXJhbXMuc2l6ZSgpID4gMiB8fCBwYXJhbXMuc2l6ZSgpID09IDApCiAJewogCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CkBAIC00ODMsNyArNDgzLDcgQEAKIAlpZiAoc2NyaXB0LklzRW1wdHkoKSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCiAJRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CkBAIC01MTIsMTAgKzUxMiwxMCBAQAogCiAJdlJldCA9IHBSZXRPYmo7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC01NjAsMTAgKzU2MCwxMCBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpjbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6Y2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC02MDgsMTIgKzYwOCwxMiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIGFwcDo6VGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKQpAQCAtNjUxLDI0ICs2NTEsMjQgQEAKIAl9CiB9CiAKLWJvb2wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gTm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCi1ib29sIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBhcHA6Om1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjptYWlsTXNnKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogCi0JYm9vbCBiVUkgPSB0cnVlOworCUZYX0JPT0wgYlVJID0gVFJVRTsKIAlDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CiAJQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwogCUNGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CkBAIC02NzYsNyArNjc2LDcgQEAKIAlDRlhfV2lkZVN0cmluZyBjTXNnID0gTCIiOwogCiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKIAl7CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJY01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCX0gZWxzZSB7CiAJCWlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBGQUxTRTsKIAogCQliVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCWNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKQEAgLTcyNiwxNiArNzI2LDE2IEBACiAJcEFwcC0+SlNfZG9jbWFpbEZvcm0oTlVMTCwgMCwgYlVJLCBjVG8uY19zdHIoKSwgY1N1YmplY3QuY19zdHIoKSwgY0NjLmNfc3RyKCksIGNCY2MuY19zdHIoKSwgY01zZy5jX3N0cigpKTsKIAlwUnVudGltZS0+RW5kQmxvY2soKTsKIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewpAQCAtNzQ2LDI0ICs3NDYsMjQgQEAKIAkJdnA8PG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBGQUxTRTsKIH0KIAogCi1ib29sIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCiBDRlhfV2lkZVN0cmluZyBhcHA6OlN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKQpAQCAtNzkyLDE3ICs3OTIsMTcgQEAKIAlyZXR1cm4gc1JldDsKIH0KIAotYm9vbCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6b3BlbkRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBhcHA6OnJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0ZYX1dpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd0xhYmVsID0gTCIiOwpAQCAtODczLDcgKzg3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlBVVF9CWVRFUyk7CiAgICAgaWYgKG5MZW5ndGhCeXRlcyA8PSAwKSB7CiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbkxlbmd0aEJ5dGVzID0gc3RkOjptaW4obkxlbmd0aEJ5dGVzLCBNQVhfSU5QVVRfQllURVMpOwogCkBAIC04ODEsMTUgKzg4MSwxNSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KilwQnVmZi5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGhCeXRlcyAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwogICAgIHZSZXQgPSByZXRfc3RyaW5nLmNfc3RyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgYXBwOjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6bWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgYXBwOjpleGVjRGlhbG9nKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGFwcDo6ZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAppbmRleCA3YzNjMTM3Li5hMmJiYWRjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcApAQCAtMTU1LDcgKzE1NSw3IEBACiB9CiAKICNkZWZpbmUgSlNfSU1QTEVNRU5UX0NPTE9SUFJPUChwcm9wLCB2YXIpXAotYm9vbCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAorRlhfQk9PTCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAoge1wKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjO1wKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpO1wKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAJZWxzZVwKIAl7XAogCQlDSlNfQXJyYXkgYXJyYXkoaXNvbGF0ZSk7XAotCQlpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgcmV0dXJuIGZhbHNlO1wKKwkJaWYgKCF2cC5Db252ZXJ0VG9BcnJheShhcnJheSkpIHJldHVybiBGQUxTRTtcCiAJCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7XAogCX1cCi0JcmV0dXJuIHRydWU7XAorCXJldHVybiBUUlVFO1wKIH0KIAogSlNfSU1QTEVNRU5UX0NPTE9SUFJPUCh0cmFuc3BhcmVudCwgbV9jclRyYW5zcGFyZW50KQpAQCAtMTg3LDEzICsxODcsMTMgQEAKIEpTX0lNUExFTUVOVF9DT0xPUlBST1AoZ3JheSwgbV9jckdyYXkpCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKGx0R3JheSwgbV9jckxUR3JheSkKIAotYm9vbCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAJaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAyKSByZXR1cm4gZmFsc2U7CisJaWYgKGlTaXplIDwgMikgcmV0dXJuIEZBTFNFOwogCUNKU19BcnJheSBhU291cmNlKGlzb2xhdGUpOwotCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFTb3VyY2UpKSByZXR1cm4gZmFsc2U7CisJaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYVNvdXJjZSkpIHJldHVybiBGQUxTRTsKIAogCUNQV0xfQ29sb3IgY3JTb3VyY2U7CiAJQ29udmVydEFycmF5VG9QV0xDb2xvcihhU291cmNlLCBjclNvdXJjZSk7CkBAIC0yMjQsMTggKzIyNCwxOCBAQAogCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JEZXN0LCBhRGVzdCk7CiAJdlJldCA9IGFEZXN0OwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgY29sb3I6OmVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGNvbG9yOjplcXVhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gZmFsc2U7CisJaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gRkFMU0U7CiAKIAlDSlNfQXJyYXkgYXJyYXkxKGlzb2xhdGUpLCBhcnJheTIoaXNvbGF0ZSk7CiAKLQlpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhcnJheTEpKSByZXR1cm4gZmFsc2U7Ci0JaWYgKCFwYXJhbXNbMV0uQ29udmVydFRvQXJyYXkoYXJyYXkyKSkgcmV0dXJuIGZhbHNlOworCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFycmF5MSkpIHJldHVybiBGQUxTRTsKKwlpZiAoIXBhcmFtc1sxXS5Db252ZXJ0VG9BcnJheShhcnJheTIpKSByZXR1cm4gRkFMU0U7CiAKIAlDUFdMX0NvbG9yIGNvbG9yMTsKIAlDUFdMX0NvbG9yIGNvbG9yMjsKQEAgLTI0Niw2ICsyNDYsNiBAQAogCWNvbG9yMS5Db252ZXJ0Q29sb3JUeXBlKGNvbG9yMi5uQ29sb3JUeXBlKTsKIAogCXZSZXQgPSBjb2xvcjEgPT0gY29sb3IyOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcAppbmRleCA0ZDgwNjcxLi5lZDliMWZiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAKQEAgLTM4LDI4ICszOCwyOCBAQAogewogfQogCi1ib29sIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBjb25zb2xlOjpoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgY29uc29sZTo6cHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBjb25zb2xlOjpwcmludGxuKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQogCXsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGNvbnNvbGU6OnNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgY29uc29sZTo6c2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKaW5kZXggZWU3M2U0Mi4uZjU3YjFmYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKQEAgLTU2LDcgKzU2LDcgQEAKIHsKIH0KIAotYm9vbCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OmNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC03MywxMiArNzMsMTIgQEAKIAl7CiAJCXZwIDw8IHdDaGFuZ2U7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTg2LDEyICs4NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPkNoYW5nZUV4KCk7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6OmNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50Ojpjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC05OSwxMCArOTksMTAgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5Db21taXRLZXkoKTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBldmVudDo6ZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OmZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMTAsMTggKzExMCwxOCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAoIXZwLklzR2V0dGluZygpICYmIHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksTCJLZXlzdHJva2UiKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAogCWlmIChwRXZlbnQtPkZpZWxkRnVsbCgpKQotCQl2cCA8PCB0cnVlOworCQl2cCA8PCBUUlVFOwogCWVsc2UKLQkJdnAgPDwgZmFsc2U7Ci0JcmV0dXJuIHRydWU7CisJCXZwIDw8IEZBTFNFOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50OjprZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OmtleURvd24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMjksMTUgKzEyOSwxNSBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAocEV2ZW50LT5LZXlEb3duKCkpCi0JCXZwIDw8IHRydWU7CisJCXZwIDw8IFRSVUU7CiAJZWxzZQotCQl2cCA8PCBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKKwkJdnAgPDwgRkFMU0U7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ1LDE1ICsxNDUsMTUgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+TW9kaWZpZXIoKSkKLQkJdnAgPDwgdHJ1ZTsKKwkJdnAgPDwgVFJVRTsKIAllbHNlCi0JCXZwIDw8IGZhbHNlOwotCXJldHVybiB0cnVlOworCQl2cCA8PCBGQUxTRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBldmVudDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTYxLDE3ICsxNjEsMTcgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5OYW1lKCk7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKIAkJdnA+PmJSYzsKQEAgLTE4MCwxMiArMTgwLDEyIEBACiAJewogCQl2cDw8YlJjOwogCX0KLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBldmVudDo6cmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpyaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTE5MywxMiArMTkzLDEyIEBACiAJewogCQk7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50OjpyaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBldmVudDo6cmljaENoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTIwNiwxMyArMjA2LDEzIEBACiAJewogCQk7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiAKLWJvb2wgZXZlbnQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJfQpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIAl7CiAJCTsKIAl9Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6OnNlbEVuZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCiAJaW50ICZpU2VsRW5kID0gcEV2ZW50LT5TZWxFbmQoKTsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAJewogCQl2cCA8PCBpU2VsRW5kOwogCX0KLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogCWludCAmaVNlbFN0YXJ0ID0gcEV2ZW50LT5TZWxTdGFydCgpOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKQEAgLTI2NywxMiArMjY3LDEyIEBACiAJewogCQl2cCA8PCBpU2VsU3RhcnQ7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTI4MCwxNSArMjgwLDE1IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmIChwRXZlbnQtPlNoaWZ0KCkpCi0JCXZwIDw8IHRydWU7CisJCXZwIDw8IFRSVUU7CiAJZWxzZQotCQl2cCA8PCBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKKwkJdnAgPDwgRkFMU0U7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGV2ZW50Ojpzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0yOTYsMTIgKzI5NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlNvdXJjZSgpLT5HZXRKU09iamVjdCgpOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50Ojp0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBldmVudDo6dGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzA5LDEyICszMDksMTIgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnA8PHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgZXZlbnQ6OnRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBldmVudDo6dGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCXZwIDw8IHBFdmVudC0+VGFyZ2V0TmFtZSgpOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50Ojp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zMzUsMTAgKzMzNSwxMCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlR5cGUoKTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzQ2LDkgKzM0Niw5IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+VHlwZSgpLEwiRmllbGQiKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKQEAgLTM1OCwxMiArMzU4LDEyIEBACiAJewogCQl2cCA8PCB2YWw7CiAJfQotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIGV2ZW50Ojp3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgZXZlbnQ6OndpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNzEsOSArMzcxLDkgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCQl2cCA8PCB0cnVlOworCQl2cCA8PCBUUlVFOwogCWVsc2UKLQkJdnAgPDwgZmFsc2U7Ci0JcmV0dXJuIHRydWU7CisJCXZwIDw8IEZBTFNFOworCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggOThhM2NkNi4uNjk2NWM4YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcApAQCAtOTYsNyArOTYsNyBAQAogCiBJTVBMRU1FTlRfU1BFQ0lBTF9KU19DTEFTUyhDSlNfR2xvYmFsLCBnbG9iYWxfYWx0ZXJuYXRlLCBnbG9iYWwpOwogCi1ib29sIENKU19HbG9iYWw6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKK0ZYX0JPT0wgQ0pTX0dsb2JhbDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKICAgICBwR2xvYmFsLT5Jbml0aWFsKHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKSk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH07CiAKIGdsb2JhbF9hbHRlcm5hdGU6Omdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KQpAQCAtMTI4LDI2ICsxMjgsMjYgQEAKICAgICBVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CiB9CiAKLWJvb2wgZ2xvYmFsX2FsdGVybmF0ZTo6UXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpCitGWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKQogewogICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKIH0KIAotYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGpzX2dsb2JhbF9kYXRhKiBwRGF0YSA9IE5VTEw7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKIAogICAgIGlmIChtX21hcEdsb2JhbC5Mb29rdXAoc1Byb3BOYW1lLCAodm9pZComKXBEYXRhKSkKICAgICB7Ci0gICAgICAgIHBEYXRhLT5iRGVsZXRlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBwRGF0YS0+YkRlbGV0ZWQgPSBUUlVFOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCi1ib29sIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKQEAgLTE1OCwzNCArMTU4LDM0IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhOwogICAgICAgICAgICAgICAgIHZwID4+IGREYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX2Jvb2xlYW46CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBiRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF9zdHJpbmc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0RhdGE7CiAgICAgICAgICAgICAgICAgdnAgPj4gc0RhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORywgMCwgZmFsc2UsIHNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX29iamVjdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBKU09iamVjdCBwRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBwRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLCBwRGF0YSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNULCAwLCBmYWxzZSwgIiIsIHBEYXRhLCBGQUxTRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgVlRfbnVsbDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF91bmRlZmluZWQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVsUHJvcGVydHkoY2MsIHByb3BuYW1lLCBzRXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTcsNTEgKzE5Nyw1MSBAQAogICAgICAgICBpZiAoIW1fbWFwR2xvYmFsLkxvb2t1cChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpLCBwVm9pZCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZwLlNldE51bGwoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwVm9pZCkKICAgICAgICAgewogICAgICAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSAoanNfZ2xvYmFsX2RhdGEqKXBWb2lkOwogICAgICAgICBpZiAocERhdGEtPmJEZWxldGVkKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgICAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5kRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CiAgICAgICAgICAgICAgICAgdnAgPDwgcERhdGEtPmJEYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5zRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyh2cC5HZXRJc29sYXRlKCkscERhdGEtPnBEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgdnAgPDwgb2JqOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgZ2xvYmFsX2FsdGVybmF0ZTo6c2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIENGWF9CeXRlU3RyaW5nIHNOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYQnl0ZVN0cmluZygpOwpAQCAtMjUyLDEyICsyNTIsMTIgQEAKICAgICAgICAgaWYgKHBEYXRhICYmICFwRGF0YS0+YkRlbGV0ZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU05PR0xPQkFMKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIGdsb2JhbF9hbHRlcm5hdGU6OlVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKQpAQCAtNDgwLDEwICs0ODAsMTAgQEAKIH0KIAogCi1ib29sIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgaW50IG5UeXBlLAorRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGludCBuVHlwZSwKICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KQogewotICAgIGlmIChwcm9wbmFtZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKHByb3BuYW1lID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwVGVtcCA9IE5VTEw7CiAgICAgbV9tYXBHbG9iYWwuTG9va3VwKHByb3BuYW1lLCAodm9pZComKXBUZW1wKTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICAgICAgICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwVGVtcC0+YkRlbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgcFRlbXAtPmJEZWxldGVkID0gRkFMU0U7CiAKICAgICAgICAgc3dpdGNoIChuVHlwZSkKICAgICAgICAgewpAQCAtNTI1LDEwICs1MjUsMTAgQEAKICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwTmV3RGF0YSA9IE5VTEw7CkBAIC01NzUsMTIgKzU3NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIG1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAodm9pZCopcE5ld0RhdGEpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIEZYSlNWQUxVRVRZUEUgR0VUX1ZBTFVFX1RZUEUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcAppbmRleCA4MjBlNzMwLi4xNDc4ZmViIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwCkBAIC0zNiwxNCArMzYsMTQgQEAKIAogfQogCi1ib29sIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBUUlVFOwogfQogCi1ib29sIFJlcG9ydDo6c2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCBSZXBvcnQ6OnNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcAppbmRleCAyMWE3Y2I4Li40MDgzZWQ1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAKQEAgLTk4LDcgKzk4LDcgQEAKIAogaW50IHV0aWw6OlBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KQogewotICAgIGJvb2wgYlBlcmNlbnQgPSBmYWxzZTsKKyAgICBib29sIGJQZXJjZW50ID0gRkFMU0U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRm9ybWF0LT5sZW5ndGgoKTsgKytpKQogICAgIHsKICAgICAgICAgd2NoYXJfdCBjID0gKCpzRm9ybWF0KVtpXTsKQEAgLTEzNiwxMSArMTM2LDExIEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1ib29sIHV0aWw6OnByaW50ZihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorRlhfQk9PTCB1dGlsOjpwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIHN0ZDo6d3N0cmluZyBjX0NvbnZDaGFyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OndzdHJpbmc+IGNfc3RyQ29udmVyczsKICAgICBpbnQgaU9mZnNldCA9IDA7CkBAIC0xOTgsMTYgKzE5OCwxNiBAQAogCiAgICAgY19zdHJSZXN1bHQuZXJhc2UoY19zdHJSZXN1bHQuYmVnaW4oKSk7CiAgICAgdlJldCA9IGNfc3RyUmVzdWx0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgdXRpbDo6cHJpbnRkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIHV0aWw6OnByaW50ZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ0pTX1ZhbHVlIHAxKGlzb2xhdGUpOwogICAgIHAxID0gcGFyYW1zWzBdOwpAQCAtMjE3LDEzICsyMTcsMTMgQEAKICAgICBpZiAoIXAyLkNvbnZlcnRUb0RhdGUoanNEYXRlKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQUklOVDEpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBpZiAoIWpzRGF0ZS5Jc1ZhbGlkRGF0ZSgpKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKQpAQCAtMjYxLDExICsyNjEsMTEgQEAKICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAKICAgICAgICAgdlJldCA9IHN3UmVzdWx0LmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKHAxLkdldFR5cGUoKSA9PSBWVF9zdHJpbmcpCiAgICAgewpAQCAtMjc5LDcgKzI3OSw3IEBACiAKICAgICAgICAgaWYgKGJYRkFQaWN0dXJlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vY3VycmVudGx5LCBpdCBkb2Vzbid0IHN1cHBvcnQgWEZBUGljdHVyZS4KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgLy9jdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgogICAgICAgICB9CiAKICAgICAgICAgaW50IGlJbmRleDsKQEAgLTM1NSw5ICszNTUsOSBAQAogICAgICAgICBzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKICAgICAgICAgY0Zvcm1hdCA9IGJ1ZjsKICAgICAgICAgdlJldCA9IGNGb3JtYXQuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIHV0aWw6OnByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcgJmNGb3JtYXQyLCBDSlNfRGF0ZSBqc0RhdGUsIGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpCkBAIC00NTAsMTEgKzQ1MCwxMSBAQAogICAgIGNQdXJwb3NlID0gY0Zvcm1hdDsKIH0KIAotYm9vbCB1dGlsOjpwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgdXRpbDo6cHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemU8MikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzU291cmNlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc0Zvcm1hdCkuY19zdHIoKTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGNEZXN0OwogICAgIHByaW50eChjRm9ybWF0LGNTb3VyY2UsY0Rlc3QpOwogICAgIHZSZXQgPSBjRGVzdC5jX3N0cigpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkIHV0aWw6OnByaW50eChjb25zdCBzdGQ6OnN0cmluZyAmY0Zvcm1hdCxjb25zdCBzdGQ6OnN0cmluZyAmY1NvdXJjZTIsc3RkOjpzdHJpbmcgJmNQdXJwb3NlKQpAQCAtNTY0LDE5ICs1NjQsMTkgQEAKICAgICB9CiB9CiAKLWJvb2wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK0ZYX0JPT0wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYgKGlTaXplIDwgMikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNEYXRlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIGRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7CiAgICAgaWYgKHNEYXRlLkdldExlbmd0aCgpID4gMCkKICAgICB7Ci0gICAgICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgICAgICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICAgICAgIGREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAgICAgfQogCkBAIC01OTAsNyArNTkwLDcgQEAKICAgICAgICAgdlJldC5TZXROdWxsKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIGludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIgKm5wdHIpCkBAIC02MTgsMTUgKzYxOCwxNSBAQAogICAgICAgICByZXR1cm4gc2lnbiA9PSAnLScgPyAtdG90YWwgOiB0b3RhbDsKIH0KIAotYm9vbCB1dGlsOjpieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitGWF9CT09MIHV0aWw6OmJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBpbnQgbkJ5dGUgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICB1bnNpZ25lZCBjaGFyIGNCeXRlID0gKHVuc2lnbmVkIGNoYXIpbkJ5dGU7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICBjc1ZhbHVlLkZvcm1hdChMIiVjIiwgY0J5dGUpOwogICAgIHZSZXQgPSBjc1ZhbHVlLmNfc3RyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCmluZGV4IGUxMjMyODAuLmM0ODExYmYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCkBAIC00Miw3ICs0Miw3IEBACiB7CiBwdWJsaWM6CiAJQ0pTX09iakRlZmludGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpOgotCSAgb2JqTmFtZShzT2JqTmFtZSksIG9ialR5cGUoZU9ialR5cGUpLCBtX3BDb25zdHJ1Y3RvcihwQ29uc3RydWN0b3IpLCBtX3BEZXN0cnVjdG9yKHBEZXN0cnVjdG9yKSxtX2JTZXRBc0dsb2JhbE9iamVjdChmYWxzZSkKKwkgIG9iak5hbWUoc09iak5hbWUpLCBvYmpUeXBlKGVPYmpUeXBlKSwgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksbV9iU2V0QXNHbG9iYWxPYmplY3QoRkFMU0UpCiAJICB7CiAJCSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAJCSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKQEAgLTU0LDcgKzU0LDcgQEAKIAkJIC8vRG9jdW1lbnQgYXMgdGhlIGdsb2JhbCBvYmplY3QuCiAJCSAgaWYoRlhTWVNfd2NzY21wKHNPYmpOYW1lLCBMIkRvY3VtZW50IikgPT0gMCkKIAkJICB7Ci0JCQkgbV9iU2V0QXNHbG9iYWxPYmplY3QgPSB0cnVlOworCQkJIG1fYlNldEFzR2xvYmFsT2JqZWN0ID0gVFJVRTsKIAkJICB9CiAKIAkgIH0KQEAgLTY4LDcgKzY4LDcgQEAKIAlGWEpTT0JKVFlQRSBvYmpUeXBlOwogCUxQX0NPTlNUUlVDVE9SIG1fcENvbnN0cnVjdG9yOwogCUxQX0RFU1RSVUNUT1IgbV9wRGVzdHJ1Y3RvcjsKLQlib29sCW1fYlNldEFzR2xvYmFsT2JqZWN0OworCUZYX0JPT0wJbV9iU2V0QXNHbG9iYWxPYmplY3Q7CiAKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4gbV9vYmpUZW1wbGF0ZTsKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IG1fU3RhdGljT2JqOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCmluZGV4IDE3MTJiZDIuLjg0OTYyMjggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBDUFdMX0J1dHRvbjo6Q1BXTF9CdXR0b24oKSA6Ci0JbV9iTW91c2VEb3duKGZhbHNlKQorCW1fYk1vdXNlRG93bihGQUxTRSkKIHsKIH0KIApAQCAtMzEsMjMgKzMxLDIzIEBACiAJY3AuZUN1cnNvclR5cGUgPSBGWENUX0hBTkQ7CiB9CiAKLWJvb2wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogCi0JbV9iTW91c2VEb3duID0gdHJ1ZTsKKwltX2JNb3VzZURvd24gPSBUUlVFOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogCVJlbGVhc2VDYXB0dXJlKCk7Ci0JbV9iTW91c2VEb3duID0gZmFsc2U7CisJbV9iTW91c2VEb3duID0gRkFMU0U7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9DYXJldC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAppbmRleCBkZWNjZjA2Li44NGE4YjNkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBDUFdMX0NhcmV0OjpDUFdMX0NhcmV0KCkgOgotCW1fYkZsYXNoKGZhbHNlKSwKKwltX2JGbGFzaChGQUxTRSksCiAJbV9wdEhlYWQoMCwwKSwKIAltX3B0Rm9vdCgwLDApLAogCW1fZldpZHRoKDAuNGYpLApAQCAtMTM1LDcgKzEzNSw3IEBACiAJCQltX3B0SGVhZC55KTsKIH0KIAotdm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQordm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQogewogCWlmIChiVmlzaWJsZSkKIAl7CkBAIC0xNDcsOSArMTQ3LDkgQEAKIAkJCQltX3B0SGVhZCA9IHB0SGVhZDsKIAkJCQltX3B0Rm9vdCA9IHB0Rm9vdDsKIAotCQkJCW1fYkZsYXNoID0gdHJ1ZTsKLQkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksZmFsc2UsdHJ1ZSk7Ci0JCQkJTW92ZShtX3JjSW52YWxpZCwgZmFsc2UsIHRydWUpOworCQkJCW1fYkZsYXNoID0gVFJVRTsKKwkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksRkFMU0UsVFJVRSk7CisJCQkJTW92ZShtX3JjSW52YWxpZCwgRkFMU0UsIFRSVUUpOwogCQkJfQogCQl9CiAJCWVsc2UKQEAgLTE2MCwxMSArMTYwLDExIEBACiAJCQlFbmRUaW1lcigpOwogCQkJQmVnaW5UaW1lcihQV0xfQ0FSRVRfRkxBU0hJTlRFUlZBTCk7CiAKLQkJCUNQV0xfV25kOjpTZXRWaXNpYmxlKHRydWUpOwotCQkJbV9iRmxhc2ggPSB0cnVlOworCQkJQ1BXTF9XbmQ6OlNldFZpc2libGUoVFJVRSk7CisJCQltX2JGbGFzaCA9IFRSVUU7CiAKLQkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxmYWxzZSx0cnVlKTsKLQkJCU1vdmUobV9yY0ludmFsaWQsIGZhbHNlLCB0cnVlKTsKKwkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKKwkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKIAkJfQogCX0KIAllbHNlCkBAIC0xNzIsMTEgKzE3MiwxMSBAQAogCQltX3B0SGVhZCA9IENQREZfUG9pbnQoMCwgMCk7CiAJCW1fcHRGb290ID0gQ1BERl9Qb2ludCgwLCAwKTsKIAotCQltX2JGbGFzaCA9IGZhbHNlOworCQltX2JGbGFzaCA9IEZBTFNFOwogCQlpZiAoSXNWaXNpYmxlKCkpCiAJCXsKIAkJCUVuZFRpbWVyKCk7Ci0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShmYWxzZSk7CisJCQlDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCmluZGV4IDZjNWRkNTUuLmY1YzhhODEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCkBAIC0yMiwxNCArMjIsMTQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NCTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWJvb2wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfQ0JMaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CiAKICAgICBpZiAobV9iTW91c2VEb3duKQogICAgIHsKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gZmFsc2U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogCiAgICAgICAgIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkKICAgICAgICAgewpAQCAtMzgsMjMgKzM4LDIzIEBACiAgICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsUFdMX01BS0VEV09SRChwb2ludC54LHBvaW50LnkpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICAgICAgICAgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgICAgICBpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgICAgICAgICAgIE9uTm90aWZ5U2VsQ2hhbmdlZChGQUxTRSxiRXhpdCwgbkZsYWcpOworICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUFdMX0NCTGlzdEJveDo6T25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgYm9vbCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0gICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CiAKICAgICBzd2l0Y2ggKG5DaGFyKQogICAgIHsKICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBjYXNlIEZXTF9WS0VZX1VwOgogICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKICAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CkBAIC04OCwyNSArODgsMjUgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgT25Ob3RpZnlTZWxDaGFuZ2VkKHRydWUsYkV4aXQsIG5GbGFnKTsKKyAgICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSxiRXhpdCwgbkZsYWcpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BXTF9DQkxpc3RCb3g6Ok9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfQ0JMaXN0Qm94OjpPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSkpIHJldHVybiBGQUxTRTsKIAogICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UGFyZW50V2luZG93KCkpCiAgICAgewogICAgICAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdFRleHQoKTsKICAgICB9CiAKLSAgICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSxiRXhpdCxuRmxhZyk7CisgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsbkZsYWcpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9DQkJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICB9CiB9CiAKLWJvb2wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC0xODgsMTYgKzE4OCwxNiBAQAogICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLFBXTF9NQUtFRFdPUkQocG9pbnQueCxwb2ludC55KSk7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NvbWJvQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIwNSw3ICsyMDUsNyBAQAogQ1BXTF9Db21ib0JveDo6Q1BXTF9Db21ib0JveCgpIDogbV9wRWRpdChOVUxMKSwKICAgICBtX3BCdXR0b24oTlVMTCksCiAgICAgbV9wTGlzdChOVUxMKSwKLSAgICBtX2JQb3B1cChmYWxzZSksCisgICAgbV9iUG9wdXAoRkFMU0UpLAogICAgIG1fblBvcHVwV2hlcmUoMCksCiAgICAgbV9uU2VsZWN0SXRlbSgtMSksCiAgICAgbV9wRmlsbGVyTm90aWZ5KE5VTEwpCkBAIC0yMzEsNyArMjMxLDcgQEAKIAogdm9pZCBDUFdMX0NvbWJvQm94OjpLaWxsRm9jdXMoKQogewotICAgIFNldFBvcHVwKGZhbHNlKTsKKyAgICBTZXRQb3B1cChGQUxTRSk7CiAgICAgQ1BXTF9XbmQ6OktpbGxGb2N1cygpOwogfQogCkBAIC00MzksMTUgKzQzOSwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1fcEJ1dHRvbikKLSAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbix0cnVlLGZhbHNlKTsKKyAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbixUUlVFLEZBTFNFKTsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LHRydWUsZmFsc2UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsVFJVRSxGQUxTRSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCx0cnVlLGZhbHNlKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7CisgICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCxUUlVFLEZBTFNFKTsKICAgICAgICAgICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjEsNyArNDYxLDcgQEAKICAgICAgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0NsaWVudC5sZWZ0OwogCiAgICAgICAgIGlmIChtX3BCdXR0b24pCi0gICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sdHJ1ZSxmYWxzZSk7CisgICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sVFJVRSxGQUxTRSk7CiAKICAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwogICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKQEAgLTQ3MywxMCArNDczLDEwIEBACiAgICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LHRydWUsZmFsc2UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsVFJVRSxGQUxTRSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCi0gICAgICAgICAgICBtX3BMaXN0LT5TZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoRkFMU0UpOwogICAgIH0KIH0KIApAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldFBvcHVwKGJvb2wgYlBvcHVwKQordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRQb3B1cChGWF9CT09MIGJQb3B1cCkKIHsKICAgICBpZiAoIW1fcExpc3QpIHJldHVybjsKICAgICBpZiAoYlBvcHVwID09IG1fYlBvcHVwKSByZXR1cm47CkBAIC01MjgsMjEgKzUyOCwyMSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1fblBvcHVwV2hlcmUgPSBuV2hlcmU7Ci0gICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgbV9iUG9wdXAgPSBiUG9wdXA7Ci0gICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7CiAgICAgfQogfQogCi1ib29sIENQV0xfQ29tYm9Cb3g6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9Db21ib0JveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOwotICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIEZBTFNFOwogCiAgICAgbV9uU2VsZWN0SXRlbSA9IC0xOwogCkBAIC01NTEsNDcgKzU1MSw0NyBAQAogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA+IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKyAgICAgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKICAgICAgICAgICAgIGlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICBjYXNlIEZXTF9WS0VZX0Rvd246CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA8IG1fcExpc3QtPkdldENvdW50KCkgLSAxKQogICAgICAgICB7Ci0gICAgICAgICAgICBib29sIGJFeGl0ID0gZmFsc2U7CisgICAgICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CiAgICAgICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25LZXlEb3duKG5DaGFyLG5GbGFnKTsKIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BXTF9Db21ib0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX3BMaXN0KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGlmICghbV9wRWRpdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBtX25TZWxlY3RJdGVtID0gLTE7CiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25DaGFyKG5DaGFyLG5GbGFnKTsKIAotICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKLSAgICByZXR1cm4gbV9wTGlzdC0+T25DaGFyV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpID8gYkV4aXQgOiBmYWxzZTsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgcmV0dXJuIG1fcExpc3QtPk9uQ2hhcldpdGhFeGl0KG5DaGFyLGJFeGl0LG5GbGFnKSA/IGJFeGl0IDogRkFMU0U7CiB9CiAKIHZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC02MTMsNyArNjEzLDcgQEAKICAgICAgICAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7CiAgICAgICAgICAgICAgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICBTZXRQb3B1cChmYWxzZSk7CisgICAgICAgICAgICAgICAgU2V0UG9wdXAoRkFMU0UpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIyLDcgKzYyMiw3IEBACiAgICAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogfQogCi1ib29sIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdAorRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpJc1BvcHVwKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iUG9wdXA7CiB9CkBAIC02MzcsNyArNjM3LDcgQEAKICAgICBtX25TZWxlY3RJdGVtID0gbV9wTGlzdC0+R2V0Q3VyU2VsKCk7CiB9CiAKLWJvb2wgQ1BXTF9Db21ib0JveDo6SXNNb2RpZmllZCgpIGNvbnN0CitGWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzTW9kaWZpZWQoKSBjb25zdAogewogICAgIHJldHVybiBtX3BFZGl0LT5Jc01vZGlmaWVkKCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcAppbmRleCAzMDNhZTk2Li41OGQ4YTc5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiBDUFdMX0VkaXQ6OkNQV0xfRWRpdCgpIDogbV9wRmlsbGVyTm90aWZ5KE5VTEwpLAogCW1fcFNwZWxsQ2hlY2soTlVMTCksCi0JbV9iRm9jdXMoZmFsc2UpCisJbV9iRm9jdXMoRkFMU0UpCiB7CiAJbV9wRm9ybUZpbGxlciA9IE5VTEw7CiB9CiAKIENQV0xfRWRpdDo6fkNQV0xfRWRpdCgpCiB7Ci0JQVNTRVJUKG1fYkZvY3VzID09IGZhbHNlKTsKKwlBU1NFUlQobV9iRm9jdXMgPT0gRkFMU0UpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC00OSw3ICs0OSw3IEBACiAJCWlmIChDWE1MX0VsZW1lbnQgKiBwWE1MID0gQ1hNTF9FbGVtZW50OjpQYXJzZShzVmFsdWUuY19zdHIoKSwgc1ZhbHVlLkdldExlbmd0aCgpKSkKIAkJewogCQkJaW50MzJfdCBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7Ci0JCQlib29sIGJGaXJzdCA9IHRydWU7CisJCQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7CiAKIAkJCXN3VGV4dC5FbXB0eSgpOwogCkBAIC02Nyw3ICs2Nyw3IEBACiAJCQkJCQkJc3dTZWN0aW9uICs9IHBTdWJFbGVtZW50LT5HZXRDb250ZW50KGopOwogCQkJCQkJfQogCi0JCQkJCQlpZiAoYkZpcnN0KWJGaXJzdCA9IGZhbHNlOworCQkJCQkJaWYgKGJGaXJzdCliRmlyc3QgPSBGQUxTRTsKIAkJCQkJCWVsc2UKIAkJCQkJCQlzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOwogCQkJCQkJc3dUZXh0ICs9IHN3U2VjdGlvbjsKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cucmlnaHQgKyBQV0xfU0NST0xMQkFSX1dJRFRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjV2luZG93LnRvcCk7Ci0gICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCBUUlVFLCBGQUxTRSk7CiAgICAgfQogCiAJaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKQEAgLTExNCwzOSArMTE0LDM5IEBACiAJcmV0dXJuIHJjQ2xpZW50OwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0LCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQogewogCW1fcEVkaXQtPlNldEFsaWdubWVudEgoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCit2b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKIAltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7CiB9CiAKLWJvb2wJQ1BXTF9FZGl0OjpDYW5TZWxlY3RBbGwoKSBjb25zdAorRlhfQk9PTAlDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0CiB7CiAJcmV0dXJuICBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwogfQogCi1ib29sCUNQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdAorRlhfQk9PTAlDUFdMX0VkaXQ6OkNhbkNsZWFyKCkgY29uc3QKIHsKIAlyZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7CiB9CiAKLWJvb2wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKK0ZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKIHsKIAlyZXR1cm4gCSFIYXNGbGFnKFBFU19QQVNTV09SRCkgJiYgIUhhc0ZsYWcoUEVTX05PUkVBRCkgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpOwogfQogCi1ib29sCUNQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QKK0ZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5DdXQoKSBjb25zdAogewogCXJldHVybiAJQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7CiB9CiAKLWJvb2wJQ1BXTF9FZGl0OjpDYW5QYXN0ZSgpIGNvbnN0CitGWF9CT09MCUNQV0xfRWRpdDo6Q2FuUGFzdGUoKSBjb25zdAogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBmYWxzZTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gRkFMU0U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKIAlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKQEAgLTE3NSwxMyArMTc1LDEzIEBACiAKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJYm9vbCBiUkMgPSB0cnVlOwotCQlib29sIGJFeGl0ID0gZmFsc2U7CisJCUZYX0JPT0wgYlJDID0gVFJVRTsKKwkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gMDsKIAkJR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgMCk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgMCk7CiAJCWlmICghYlJDKSByZXR1cm47CiAJCWlmIChiRXhpdCkgcmV0dXJuOwogCX0KQEAgLTE5NCw4ICsxOTQsOCBAQAogCiAJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAl7Ci0JCWJvb2wgYkV4aXQgPSBmYWxzZTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKHRydWUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwwKTsKKwkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LDApOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAl9CiB9CkBAIC0yMjcsNTIgKzIyNyw1MiBAQAogCW1fcmNPbGRXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAKIAltX3BFZGl0LT5TZXRPcHJOb3RpZnkodGhpcyk7Ci0JbV9wRWRpdC0+RW5hYmxlT3ByTm90aWZ5KHRydWUpOworCW1fcEVkaXQtPkVuYWJsZU9wck5vdGlmeShUUlVFKTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6OlNldFBhcmFtQnlGbGFnKCkKIHsKIAlpZiAoSGFzRmxhZyhQRVNfUklHSFQpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgyLCBmYWxzZSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMiwgRkFMU0UpOwogCX0KIAllbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBmYWxzZSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMSwgRkFMU0UpOwogCX0KIAllbHNlCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDAsIGZhbHNlKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBGQUxTRSk7CiAJfQogCiAJaWYgKEhhc0ZsYWcoUEVTX0JPVFRPTSkpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDIsIGZhbHNlKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigyLCBGQUxTRSk7CiAJfQogCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIGZhbHNlKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxLCBGQUxTRSk7CiAJfQogCWVsc2UKIAl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMCwgZmFsc2UpOworCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIEZBTFNFKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJbV9wRWRpdC0+U2V0UGFzc3dvcmRDaGFyKCcqJywgZmFsc2UpOworCQltX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBGQUxTRSk7CiAJfQogCi0JbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIGZhbHNlKTsKLQltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBmYWxzZSk7Ci0JbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIGZhbHNlKTsKLQltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBmYWxzZSk7CisJbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIEZBTFNFKTsKKwltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBGQUxTRSk7CisJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIEZBTFNFKTsKKwltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBGQUxTRSk7CiAJbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7CiAKIAlpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKIAl7CiAJCVNldENsaXBSZWN0KENQREZfUmVjdCgwLjBmLDAuMGYsMC4wZiwwLjBmKSk7Ci0JCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlLCBmYWxzZSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7CiAJfQogCWVsc2UKIAl7CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxmYWxzZSkgPDwgIiAyIEogMCBqXG4iOworCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJDb2xvcigpLEZBTFNFKSA8PCAiIDIgSiAwIGpcbiI7CiAKIAkJCQlmb3IgKGludDMyX3QgaT0xO2k8bkNoYXJBcnJheTtpKyspCiAJCQkJewpAQCAtMzIwLDcgKzMyMCw3IEBACiAJCWNhc2UgUEJTX0RBU0g6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxmYWxzZSkgPDwgIiAyIEogMCBqXG4iCisJCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksRkFMU0UpIDw8ICIgMiBKIDAgalxuIgogCQkJCQk8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIgogCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkubkdhcCA8PCAiXSAiCiAJCQkJCTw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJewogCQlDRlhfQnl0ZVN0cmluZyBzU3BlbGxDaGVjayA9IENQV0xfVXRpbHM6OkdldFNwZWxsQ2hlY2tBcHBTdHJlYW0obV9wRWRpdCwgbV9wU3BlbGxDaGVjaywgcHRPZmZzZXQsICZ3clZpc2libGUpOwogCQlpZiAoc1NwZWxsQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKQotCQkJc1RleHQgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDEsMCwwKSxmYWxzZSkgPDwgc1NwZWxsQ2hlY2s7CisJCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMSwwLDApLEZBTFNFKSA8PCBzU3BlbGxDaGVjazsKIAl9CiAKIAlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJfQogfQogCi1ib29sIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTQ5NiwxNiArNDk2LDE2IEBACiAJCWlmIChtX2JNb3VzZURvd24pCiAJCQlJbnZhbGlkYXRlUmVjdCgpOwogCi0JCW1fYk1vdXNlRG93biA9IHRydWU7CisJCW1fYk1vdXNlRG93biA9IFRSVUU7CiAJCVNldENhcHR1cmUoKTsKIAogCQltX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOwogCkBAIC01MTQsNyArNTE0LDcgQEAKIAkJbV9wRWRpdC0+U2VsZWN0QWxsKCk7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKICNkZWZpbmUgV01fUFdMRURJVF9VTkRPCQkJCQkweDAxCkBAIC01MjYsMTYgKzUyNiwxNiBAQAogI2RlZmluZSBXTV9QV0xFRElUX1NFTEVDVEFMTAkJCTB4MDcKICNkZWZpbmUgV01fUFdMRURJVF9TVUdHRVNUCQkJCTB4MDgKIAotYm9vbCBDUFdMX0VkaXQ6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gZmFsc2U7CisJaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIEZBTFNFOwogCiAJQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gdHJ1ZTsKKwlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gVFJVRTsKIAogCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JaWYgKCFwU0gpIHJldHVybiBmYWxzZTsKKwlpZiAoIXBTSCkgcmV0dXJuIEZBTFNFOwogCiAJU2V0Rm9jdXMoKTsKIApAQCAtNTQzLDcgKzU0Myw3IEBACiAJQ0ZYX1dpZGVTdHJpbmcgc3dMYXRpbiA9IG1fcEVkaXQtPkdldFJhbmdlVGV4dCh3ckxhdGluKTsKIAogCUZYX0hNRU5VIGhQb3B1cCA9IHBTSC0+Q3JlYXRlUG9wdXBNZW51KCk7Ci0JaWYgKCFoUG9wdXApIHJldHVybiBmYWxzZTsKKwlpZiAoIWhQb3B1cCkgcmV0dXJuIEZBTFNFOwogCiAJQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzOwogCUNQREZfUG9pbnQgcHRQb3B1cCA9IHBvaW50OwpAQCAtNTg3LDkgKzU4Nyw5IEBACiAJCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCAwLCBMIiIpOwogCiAJCWlmICghbV9wRWRpdC0+Q2FuVW5kbygpKQotCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgZmFsc2UpOworCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgRkFMU0UpOwogCQlpZiAoIW1fcEVkaXQtPkNhblJlZG8oKSkKLQkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIGZhbHNlKTsKKwkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIEZBTFNFKTsKIAl9CiAKIAlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsCkBAIC02MDMsMzIgKzYwMywzMiBAQAogCiAJQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFNILT5HZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpKTsKIAlpZiAoc3dUZXh0LklzRW1wdHkoKSkKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIGZhbHNlKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKIAogCWlmICghbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBmYWxzZSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIGZhbHNlKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgRkFMU0UpOwogCX0KIAogCWlmIChJc1JlYWRPbmx5KCkpCiAJewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIGZhbHNlKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBmYWxzZSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1BBU1RFLCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIEZBTFNFKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBmYWxzZSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIGZhbHNlKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfTk9SRUFEKSkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CiAJfQogCiAJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CkBAIC02MzcsNyArNjM3LDcgQEAKIAogCWlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsIEZBTFNFKTsKIAl9CiAKIAlpbnQzMl90IHgsIHk7CkBAIC02OTksMTIgKzY5OSwxMiBAQAogCiAJcFNILT5EZXN0cm95TWVudShoUG9wdXApOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQlTZXRFZGl0Q2FyZXQodHJ1ZSk7CisJU2V0RWRpdENhcmV0KFRSVUUpOwogCiAJaWYgKCFJc1JlYWRPbmx5KCkpCiAJewpAQCAtNzEyLDE1ICs3MTIsMTUgQEAKIAkJCXBGb2N1c0hhbmRsZXItPk9uU2V0Rm9jdXModGhpcyk7CiAJfQogCi0JbV9iRm9jdXMgPSB0cnVlOworCW1fYkZvY3VzID0gVFJVRTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlTaG93VlNjcm9sbEJhcihmYWxzZSk7CisJU2hvd1ZTY3JvbGxCYXIoRkFMU0UpOwogCiAJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCVNldENhcmV0KGZhbHNlLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIENQREZfUG9pbnQoMC4wZiwwLjBmKSk7CisJU2V0Q2FyZXQoRkFMU0UsIENQREZfUG9pbnQoMC4wZiwwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKIAogCVNldENoYXJTZXQoMCk7CiAKQEAgLTczMCwyMCArNzMwLDIwIEBACiAJCQlwRm9jdXNIYW5kbGVyLT5PbktpbGxGb2N1cyh0aGlzKTsKIAl9CiAKLQltX2JGb2N1cyA9IGZhbHNlOworCW1fYkZvY3VzID0gRkFMU0U7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQordm9pZCBDUFdMX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAJbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKIHsKIAltX3BFZGl0LT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCiB7CiAJbV9wRWRpdC0+U2V0TGluZUxlYWRpbmcoZkxpbmVMZWFkaW5nLCBiUGFpbnQpOwogfQpAQCAtODEzLDcgKzgxMyw3IEBACiAJcmV0dXJuIHB0OwogfQogCi1ib29sCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CitGWF9CT09MCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fcEVkaXQtPklzVGV4dEZ1bGwoKTsKIH0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWlmIChIYXNGbGFnKFBFU19DSEFSQVJSQVkpICYmIG5DaGFyQXJyYXkgPiAwKQogCXsKIAkJbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3codHJ1ZSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFKTsKIAogCQlpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKIAkJewpAQCAtODQ5LDcgKzg0OSw3IEBACiAJCQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKHBGb250TWFwLT5HZXRQREZGb250KDApLCBHZXRDbGllbnRSZWN0KCksIG5DaGFyQXJyYXkpOwogCQkJCWlmIChmRm9udFNpemUgPiAwLjBmKQogCQkJCXsKLQkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKGZhbHNlKTsKKwkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEZBTFNFKTsKIAkJCQkJbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIAkJCQl9CiAJCQl9CkBAIC04NzMsNyArODczLDcgQEAKIAlyZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTaG93VlNjcm9sbEJhcihib29sIGJTaG93KQordm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpCiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CkBAIC04ODEsMzUgKzg4MSwzNSBAQAogCQl7CiAJCQlpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKQogCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUodHJ1ZSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShUUlVFKTsKIAkJCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAJCQkJbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OwogCQkJCXJjV2luZG93LnJpZ2h0ICs9IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCQkJTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CisJCQkJTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJTW92ZShtX3JjT2xkV2luZG93LCB0cnVlLCB0cnVlKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKEZBTFNFKTsKKwkJCQlNb3ZlKG1fcmNPbGRXaW5kb3csIFRSVUUsIFRSVUUpOwogCQkJfQogCQl9CiAJfQogfQogCi1ib29sCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0CitGWF9CT09MCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0CiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CiAJCXJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfRWRpdDo6RW5hYmxlU3BlbGxDaGVjayhib29sIGJFbmFibGVkKQordm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCkKIHsKIAlpZiAoYkVuYWJsZWQpCiAJCUFkZEZsYWcoUEVTX1NQRUxMQ0hFQ0spOwpAQCAtOTE3LDE2ICs5MTcsMTYgQEAKIAkJUmVtb3ZlRmxhZyhQRVNfU1BFTExDSEVDSyk7CiB9CiAKLWJvb2wgQ1BXTF9FZGl0OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOwogCiAJaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCWJvb2wgYlJDID0gdHJ1ZTsKLQkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKKwkJCUZYX0JPT0wgYlJDID0gVFJVRTsKKwkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwogCkBAIC05MzYsMjcgKzkzNiwyNyBAQAogCiAJCQlpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCiAJCQkJblNlbEVuZCA9IG5TZWxTdGFydCArIDE7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKHRydWUsIEdldEF0dGFjaGVkRGF0YSgpLCBGV0xfVktFWV9EZWxldGUsIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQkJaWYgKCFiUkMpIHJldHVybiBmYWxzZTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgRldMX1ZLRVlfRGVsZXRlLCBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIFRSVUUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCWlmICghYlJDKSByZXR1cm4gRkFMU0U7CisJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKIAkJfQogCX0KIAotCWJvb2wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgIG5GbGFnKTsKKwlGWF9CT09MIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbktleURvd24obkNoYXIsICBuRmxhZyk7CiAKIAlpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAkJewotCQkJYm9vbCBiRXhpdCA9IGZhbHNlOwotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKHRydWUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKKwkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOworCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CiAJCX0KIAl9CiAKIAkvL0luIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogCWlmKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBUUlVFOwogCiAJcmV0dXJuIGJSZXQ7CiB9CkBAIC05NjUsMTEgKzk2NSwxMSBAQAogKkluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2ggaXMgbm90IHRoZSBjb250cm9sIG1lYW5zIHRvIGRvLgogKi8KLWJvb2wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKIHsKIAotCWJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKLQlib29sIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOworCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKKwlGWF9CT09MIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOwogCWlmKGJDdHJsICYmICFiQWx0KQogCXsKIAkvL2hvdCBrZXlzIGZvciBlZGl0IGNvbnRyb2wuCkBAIC05ODAsNyArOTgwLDcgQEAKIAkJY2FzZSAnWCc6CiAJCWNhc2UgJ0EnOgogCQljYXNlICdaJzoKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtOTkyLDIyICs5OTIsMjIgQEAKIAljYXNlIEZXTF9WS0VZX0JhY2s6CiAJY2FzZSBGV0xfVktFWV9SZXR1cm46CiAJY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogCiB9CiAKLWJvb2wgQ1BXTF9FZGl0OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOwogCi0JYm9vbCBiUkMgPSB0cnVlOwotCWJvb2wgYkV4aXQgPSBmYWxzZTsKKwlGWF9CT09MIGJSQyA9IFRSVUU7CisJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogCi0JYm9vbCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOworCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKIAlpZiAoIWJDdHJsKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKQEAgLTEwMzYsMTIgKzEwMzYsMTIgQEAKIAkJCX0KIAogCQkJQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKHRydWUsIEdldEF0dGFjaGVkRGF0YSgpLCBuS2V5Q29kZSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIHRydWUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIG5LZXlDb2RlLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQl9CiAJfQogCi0JaWYgKCFiUkMpIHJldHVybiB0cnVlOwotCWlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOworCWlmICghYlJDKSByZXR1cm4gVFJVRTsKKwlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKIAogCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCiAJewpAQCAtMTA1MiwyMSArMTA1MiwyMSBAQAogCQkJU2V0Q2hhclNldChuTmV3Q2hhclNldCk7CiAJCX0KIAl9Ci0JYm9vbCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25DaGFyKG5DaGFyLG5GbGFnKTsKKwlGWF9CT09MIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCiAJaWYgKCFiQ3RybCkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZSh0cnVlLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CisJCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKKwkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwogCQl9CiAJfQogCiAJcmV0dXJuIGJSZXQ7CiB9CiAKLWJvb2wJQ1BXTF9FZGl0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX0VkaXQ6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJaWYgKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpCiAJewpAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogCQl9CiAJCVNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CiAKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKQEAgLTEyMDUsMjIgKzEyMDUsMjIgQEAKIAogQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0CiB7Ci0JcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIHRydWUsIGZhbHNlKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UobV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKHBvaW50KSwgVFJVRSwgRkFMU0UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAogewotCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgdHJ1ZSwgZmFsc2UpOworCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgVFJVRSwgRkFMU0UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKIHsKLQlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIGZhbHNlLCB0cnVlKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIEZBTFNFLCBUUlVFKTsKIH0KIAogI2RlZmluZSBQV0xfSVNBUkFCSUNXT1JEKHdvcmQpICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiTGF0aW4sIGJvb2wgYkFyYWJpYykgY29uc3QKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiTGF0aW4sIEZYX0JPT0wgYkFyYWJpYykgY29uc3QKIHsKIAlDUFZUX1dvcmRSYW5nZSByYW5nZTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAppbmRleCAxMWUxZmU3Li4wZDE0NTg3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcApAQCAtMjIsNyArMjIsNyBAQAogQ1BXTF9FZGl0Q3RybDo6Q1BXTF9FZGl0Q3RybCgpIDoKICAgICBtX3BFZGl0KE5VTEwpLAogICAgIG1fcEVkaXRDYXJldChOVUxMKSwKLSAgICBtX2JNb3VzZURvd24oZmFsc2UpLAorICAgIG1fYk1vdXNlRG93bihGQUxTRSksCiAgICAgbV9wRWRpdE5vdGlmeShOVUxMKSwKICAgICBtX25DaGFyU2V0KERFRkFVTFRfQ0hBUlNFVCksCiAgICAgbV9uQ29kZVBhZ2UoMCkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX3BFZGl0LT5Jbml0aWFsaXplKCk7CiB9CiAKLWJvb2wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKIHsKICAgICBDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwogICAgIENQREZfUG9pbnQgcG9pbnQxKDAsMSk7CkBAIC0xNjcsMTcgKzE2NywxNyBAQAogICAgIHJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOwogfQogCi1ib29sIENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOworICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOwogCi0gICAgYm9vbCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CisgICAgRlhfQk9PTCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CiAKICAgICAvL0ZJTFRFUgogICAgIHN3aXRjaCAobkNoYXIpCiAgICAgewogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgpAQCAtMjA5LDM1ICsyMDksMzUgQEAKICAgICB7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgICAgICAgICAgRGVsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0luc2VydDoKICAgICAgICAgICAgIGlmIChJc1NISUZUcHJlc3NlZChuRmxhZykpCiAgICAgICAgICAgICAgICAgUGFzdGVUZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOgogICAgICAgICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0VuZDoKICAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246CiAgICAgICAgICAgICBpZiAoIUlzU0hJRlRwcmVzc2VkKG5GbGFnKSkKICAgICAgICAgICAgICAgICBDbGVhcigpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIEN1dFRleHQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICByZXR1cm4gYlJldDsKIH0KIAotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLSAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gVFJVRTsKIAogICAgIENQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCkBAIC0yNTYsMTQgKzI1NiwxNCBAQAogICAgIHsKICAgICAgICAgY2FzZSAweDBBOgogICAgICAgICBjYXNlIDB4MUI6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0gICAgYm9vbCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKLSAgICBib29sIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKKyAgICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgICAgRlhfQk9PTCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKKyAgICBGWF9CT09MIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKIAogICAgIEZYX1dPUkQgd29yZCA9IG5DaGFyOwogCkBAIC0yNzMsMjkgKzI3MywyOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICdDJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgQ29weVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIGNhc2UgJ1YnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBQYXN0ZVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIGNhc2UgJ1gnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBDdXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICBjYXNlICdBJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICBjYXNlICdaJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgaWYgKGJTaGlmdCkKICAgICAgICAgICAgICAgICAgICAgUmVkbygpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgVW5kbygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAobkNoYXIgPCAzMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gVFJVRTsKIAogICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkgJiYgd29yZCA9PSAgRldMX1ZLRVlfQmFjaykKICAgICAgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247CkBAIC0zMTksMTAgKzMxOSwxMCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTMzMSwxNiArMzMxLDE2IEBACiAgICAgICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCgpOwogCi0gICAgICAgIG1fYk1vdXNlRG93biA9IHRydWU7CisgICAgICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CiAgICAgICAgIFNldENhcHR1cmUoKTsKIAogICAgICAgICBtX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIApAQCAtMzUxLDIwICszNTEsMjAgQEAKICAgICAgICAgICAgIFNldEZvY3VzKCk7CiAKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gZmFsc2U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogICAgIH0KIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKIAogICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgICAgIG1fcEVkaXQtPk9uTW91c2VNb3ZlKHBvaW50LGZhbHNlLGZhbHNlKTsKKyAgICAgICAgbV9wRWRpdC0+T25Nb3VzZU1vdmUocG9pbnQsRkFMU0UsRkFMU0UpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIENQREZfUmVjdCBDUFdMX0VkaXRDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoYm9vbCBiVmlzaWJsZSkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KEZYX0JPT0wgYlZpc2libGUpCiB7CiAgICAgQ1BERl9Qb2ludCBwdEhlYWQoMCwwKSxwdEZvb3QoMCwwKTsKIApAQCAtNDE4LDE4ICs0MTgsMTggQEAKICAgICBQV0x0b1duZChwdEhlYWQsIHgsIHkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCiB7CiAgICAgaWYgKG1fcEVkaXRDYXJldCkKICAgICB7CiAgICAgICAgIGlmICghSXNGb2N1c2VkKCkgfHwgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotICAgICAgICAgICAgYlZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJWaXNpYmxlID0gRkFMU0U7CiAKICAgICAgICAgbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwogICAgIH0KIH0KIAotYm9vbCBDUFdMX0VkaXRDdHJsOjpJc01vZGlmaWVkKCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcEVkaXQtPklzTW9kaWZpZWQoKTsKIH0KQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgICAgICBtX3BFZGl0LT5QYWludCgpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6RW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKQogewogICAgIGlmIChtX3BFZGl0KQogICAgICAgICBtX3BFZGl0LT5FbmFibGVSZWZyZXNoKGJSZWZyZXNoKTsKQEAgLTU3OCw3ICs1NzgsNyBAQAogewogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpCiB7CiB9CiAKQEAgLTYxMiwxMiArNjEyLDEyIEBACiAgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZSgpOwogfQogCi1ib29sIENQV0xfRWRpdEN0cmw6OkNhblVuZG8oKSBjb25zdAorRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QKIHsKICAgICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7CiB9CiAKLWJvb2wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0CitGWF9CT09MIENQV0xfRWRpdEN0cmw6OkNhblJlZG8oKSBjb25zdAogewogICAgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPkNhblJlZG8oKTsKIH0KQEAgLTY1MSwxMSArNjUxLDExIEBACiAgICAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pCiAgICAgICAgIHx8IElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikpCiAgICAgewotICAgICAgICBTaG93VlNjcm9sbEJhcihmYWxzZSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKEZBTFNFKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgU2hvd1ZTY3JvbGxCYXIodHJ1ZSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKFRSVUUpOwogICAgIH0KIH0KIApAQCAtNjY0LDcgKzY2NCw3IEBACiAgICAgT25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwgKGludHB0cl90KSZmeSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKQordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpCiB7CiAgICAgUFdMX0NBUkVUX0lORk8gY0luZm87CiAgICAgY0luZm8uYlZpc2libGUgPSBiVmlzaWJsZTsKQEAgLTcxNyw2ICs3MTcsNiBAQAogICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgewogICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICBtX2JNb3VzZURvd24gPSBmYWxzZTsKKyAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKaW5kZXggMmYwMjk3My4uNTBiMzIxZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgcmV0dXJuICIiOwogfQogCi1ib29sIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCitGWF9CT09MIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCiB7CiAgICAgaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKICAgICB7CkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkKQEAgLTEwNiwxMyArMTA2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQzMl90IG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoR2V0TmF0aXZlRm9udE5hbWUobkNoYXJzZXQpLCBuQ2hhcnNldCwgdHJ1ZSk7CisgICAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0gR2V0Rm9udEluZGV4KEdldE5hdGl2ZUZvbnROYW1lKG5DaGFyc2V0KSwgbkNoYXJzZXQsIFRSVUUpOwogICAgIGlmIChuTmV3Rm9udEluZGV4ID49IDApCiAgICAgewogICAgICAgICBpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCiAgICAgICAgICAgICByZXR1cm4gbk5ld0ZvbnRJbmRleDsKICAgICB9Ci0gICAgbk5ld0ZvbnRJbmRleCA9IEdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgZmFsc2UpOworICAgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIEZBTFNFKTsKICAgICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQogICAgIHsKICAgICAgICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHNGb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwogCi0gICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBmYWxzZSk7CisgICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7CiB9CiAKIApAQCAtMjA2LDE1ICsyMDYsMTUgQEAKICAgICAiVGltZXMtUm9tYW4iLCAiVGltZXMtQm9sZCIsICJUaW1lcy1JdGFsaWMiLCAiVGltZXMtQm9sZEl0YWxpYyIsCiAgICAgIlN5bWJvbCIsICJaYXBmRGluZ2JhdHMifTsKIAotYm9vbCBDUFdMX0ZvbnRNYXA6OklzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpCitGWF9CT09MIENQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKIHsKICAgICBmb3IgKGludDMyX3QgaT0wOyBpPDE0OyBpKyspCiAgICAgewogICAgICAgICBpZiAoc0ZvbnROYW1lID09IGdfc0RFU3RhbmRhcmRGb250TmFtZVtpXSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpCkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgYm9vbCBiRmluZCkKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgRlhfQk9PTCBiRmluZCkKIHsKICAgICBpbnQzMl90IG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKICAgICBpZiAobkZvbnRJbmRleCA+PSAwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKaW5kZXggODVjNGJjMC4uNzExNzRkZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCkBAIC0xNDUsMTIgKzE0NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1ib29sCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCitGWF9CT09MCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5Jc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUICYgZkxlZnQsIEZYX0ZMT0FUICYgZkJvdHRvbSkKQEAgLTE3NSwxMiArMTc1LDEyIEBACiAJfQogfQogCi1ib29sIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCitGWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5HZXRGaXR0aW5nQm91bmRzKCk7CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKaW5kZXggZWNiYjBmZC4uMTU3ZWJhNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIENQV0xfSWNvbkxpc3RfSXRlbTo6Q1BXTF9JY29uTGlzdF9JdGVtKCkgOgogCW1fbkljb25JbmRleCgtMSksCiAJbV9wRGF0YShOVUxMKSwKLQltX2JTZWxlY3RlZChmYWxzZSksCisJbV9iU2VsZWN0ZWQoRkFMU0UpLAogCW1fcFRleHQoTlVMTCkKIHsKIH0KQEAgLTY3LDcgKzY3LDcgQEAKIAkJbV9jckljb24sIG1fcFRleHQtPkdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRTZWxlY3QoYm9vbCBiU2VsZWN0ZWQpCit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKQogewogCW1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwogCkBAIC03OCw3ICs3OCw3IEBACiAKIH0KIAotYm9vbAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAorRlhfQk9PTAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAogewogCXJldHVybiBtX2JTZWxlY3RlZDsKIH0KQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJcmNDbGllbnQubGVmdCArPSAoUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEggKyBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4pOwogCi0JbV9wVGV4dC0+TW92ZShyY0NsaWVudCwgdHJ1ZSwgZmFsc2UpOworCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKIH0KIAogdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCkBAIC0xNTEsOCArMTUxLDggQEAKIENQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCkgOgogCW1fblNlbGVjdEluZGV4KC0xKSwKIAltX3BOb3RpZnkoTlVMTCksCi0JbV9iRW5hYmxlTm90aWZ5KHRydWUpLAotCW1fYk1vdXNlRG93bihmYWxzZSksCisJbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAorCW1fYk1vdXNlRG93bihGQUxTRSksCiAJbV9uTGlzdENvdW50KG5MaXN0Q291bnQpCiB7CiB9CkBAIC0xOTIsMjkgKzE5MiwyOSBAQAogCX0KIH0KIAotYm9vbAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJU2V0Rm9jdXMoKTsKIAogCVNldENhcHR1cmUoKTsKLQltX2JNb3VzZURvd24gPSB0cnVlOworCW1fYk1vdXNlRG93biA9IFRSVUU7CiAKIAlpbnQzMl90IG5JdGVtSW5kZXggPSBGaW5kSXRlbUluZGV4KHBvaW50KTsKIAlTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CiAJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JbV9iTW91c2VEb3duID0gZmFsc2U7CisJbV9iTW91c2VEb3duID0gRkFMU0U7CiAJUmVsZWFzZUNhcHR1cmUoKTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX2JNb3VzZURvd24pCiAJewpAQCAtMjIzLDEwICsyMjMsMTAgQEAKIAkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sCUNQV0xfSWNvbkxpc3RfQ29udGVudDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKIAlzd2l0Y2ggKG5DaGFyKQogCXsKQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJCWlmIChtX25TZWxlY3RJbmRleCA8IG1fbkxpc3RDb3VudC0xKQogCQl7CkBAIC0yNDUsMTAgKzI0NSwxMCBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gVFJVRTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiBpbnQzMl90IENQV0xfSWNvbkxpc3RfQ29udGVudDo6RmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKQEAgLTMwNyw4ICszMDcsOCBAQAogewogCWlmIChtX25TZWxlY3RJbmRleCAhPSBuSW5kZXgpCiAJewotCQlTZWxlY3RJdGVtKG1fblNlbGVjdEluZGV4LCBmYWxzZSk7Ci0JCVNlbGVjdEl0ZW0obkluZGV4LCB0cnVlKTsKKwkJU2VsZWN0SXRlbShtX25TZWxlY3RJbmRleCwgRkFMU0UpOworCQlTZWxlY3RJdGVtKG5JbmRleCwgVFJVRSk7CiAJCW1fblNlbGVjdEluZGV4ID0gbkluZGV4OwogCiAJCWlmIChJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSA9IEdldE5vdGlmeSgpKQpAQCAtMzMzLDEyICszMzMsMTIgQEAKIAltX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSkKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQogewogCW1fYkVuYWJsZU5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZWxlY3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0KQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpCiB7CiAJaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKIAl7CkBAIC00MjMsNyArNDIzLDcgQEAKIAlDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOwogCiAJaWYgKG1fcExpc3RDb250ZW50KQotCQltX3BMaXN0Q29udGVudC0+TW92ZShHZXRDbGllbnRSZWN0KCksIHRydWUsIGZhbHNlKTsKKwkJbV9wTGlzdENvbnRlbnQtPk1vdmUoR2V0Q2xpZW50UmVjdCgpLCBUUlVFLCBGQUxTRSk7CiB9CiAKIHZvaWQgQ1BXTF9JY29uTGlzdDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCkBAIC00NDIsNyArNDQyLDcgQEAKIAl7CiAJCXBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7CiAJCXBTY3JvbGxCYXItPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKHRydWUpOworCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOwogCX0KIH0KIApAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJCQlwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKFRSVUUpOwogCQkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCQkJCQl7CiAJCQkJCQlpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCQkJCQkJUmVQb3NDaGlsZFduZCgpOwogCQkJCQkJfQogCkBAIC01MjIsNyArNTIyLDcgQEAKIAltX3BMaXN0Q29udGVudC0+U2V0Tm90aWZ5KHBOb3RpZnkpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpCit2b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpCiB7CiAJbV9wTGlzdENvbnRlbnQtPkVuYWJsZU5vdGlmeShiTm90aWZ5KTsKIH0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCW1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKIH0KIAotYm9vbAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsUG9zKCk7CiAJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wTGlzdENvbnRlbnQtPkdldFNjcm9sbEFyZWEoKTsKQEAgLTU4MywxMCArNTgzLDEwIEBACiAJCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCiAJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCmluZGV4IDNlMjMxZDUuLmUxNzgwYzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAJaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCiAJewogCQlTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwwLjBmLDAuMGYsMC4wZikpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3codHJ1ZSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCmluZGV4IGQwZTljYzYuLjQ4ZmI0MDkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApAQCAtNDksNyArNDksNyBAQAogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShmYWxzZSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwogCQkJfQogCQl9CkBAIC01Nyw3ICs1Nyw3IEBACiAJCXsKIAkJCWlmICghcFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZSh0cnVlKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOwogCQkJCW1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKIAkJCX0KIAkJfQpAQCAtNzksOCArNzksOCBAQAogQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKSA6CiAJbV9wTGlzdChOVUxMKSwKIAltX3BMaXN0Tm90aWZ5KE5VTEwpLAotCW1fYk1vdXNlRG93bihmYWxzZSksCi0JbV9iSG92ZXJTZWwoZmFsc2UpLAorCW1fYk1vdXNlRG93bihGQUxTRSksCisJbV9iSG92ZXJTZWwoRkFMU0UpLAogCW1fcEZpbGxlck5vdGlmeShOVUxMKQogewogCW1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOwpAQCAtMjI5LDE2ICsyMjksMTYgQEAKIAl9CiB9CiAKLWJvb2wgQ1BXTF9MaXN0Qm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfTGlzdEJveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCWlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOworCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwogCiAJc3dpdGNoIChuQ2hhcikKIAl7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gRkFMU0U7CiAJY2FzZSBGV0xfVktFWV9VcDoKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJY2FzZSBGV0xfVktFWV9Ib21lOgpAQCAtMjcyLDMzICsyNzIsMzMgQEAKIAkJYnJlYWs7CiAJfQogCi0JYm9vbCBiRXhpdCA9IGZhbHNlOwotCU9uTm90aWZ5U2VsQ2hhbmdlZCh0cnVlLGJFeGl0LG5GbGFnKTsKKwlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsbkZsYWcpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BXTF9MaXN0Qm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfTGlzdEJveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCi0JaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIW1fcExpc3QtPk9uQ2hhcihuQ2hhcixJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpKSByZXR1cm4gZmFsc2U7CisJaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIEZBTFNFOwogCi0JYm9vbCBiRXhpdCA9IGZhbHNlOwotCU9uTm90aWZ5U2VsQ2hhbmdlZCh0cnVlLGJFeGl0LCBuRmxhZyk7CisJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LCBuRmxhZyk7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQogCXsKLQkJbV9iTW91c2VEb3duID0gdHJ1ZTsKKwkJbV9iTW91c2VEb3duID0gVFJVRTsKIAkJU2V0Rm9jdXMoKTsKIAkJU2V0Q2FwdHVyZSgpOwogCkBAIC0zMDYsMzEgKzMwNiwzMSBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAotYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCiAJaWYgKG1fYk1vdXNlRG93bikKIAl7CiAJCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCW1fYk1vdXNlRG93biA9IGZhbHNlOworCQltX2JNb3VzZURvd24gPSBGQUxTRTsKIAl9CiAKLQlib29sIGJFeGl0ID0gZmFsc2U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LG5GbGFnKTsKKwlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LG5GbGFnKTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoYm9vbCBiSG92ZXJTZWwpCit2b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpCiB7CiAJbV9iSG92ZXJTZWwgPSBiSG92ZXJTZWw7CiB9CiAKLWJvb2wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LCBuRmxhZyk7CiAKQEAgLTM0Niw3ICszNDYsNyBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtNDA1LDE5ICs0MDUsMTkgQEAKIAkJbV9wTGlzdC0+U2V0UGxhdGVSZWN0KEdldExpc3RSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnlTZWxDaGFuZ2VkKGJvb2wgYktleURvd24sIGJvb2wgJiBiRXhpdCwgIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5U2VsQ2hhbmdlZChGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYkV4aXQsICBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJYm9vbCBiUkMgPSB0cnVlOworCQlGWF9CT09MIGJSQyA9IFRSVUU7CiAJCUNGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlID0gR2V0VGV4dCgpOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gc3dDaGFuZ2UuR2V0TGVuZ3RoKCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoZmFsc2UsIEdldEF0dGFjaGVkRGF0YSgpLCAwLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgYktleURvd24sIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShGQUxTRSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBiS2V5RG93biwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoZmFsc2UsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShGQUxTRSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKIAl9CiB9CiAKQEAgLTQ5OCwxMiArNDk4LDEyIEBACiAJCW1fcExpc3QtPkNhbmNlbCgpOwogfQogCi1ib29sIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CitGWF9CT09MIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCk7CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiBpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q2FyZXRJbmRleCgpIGNvbnN0CkBAIC01MjIsMTIgKzUyMiwxMiBAQAogCXJldHVybiAtMTsKIH0KIAotYm9vbCBDUFdMX0xpc3RCb3g6OklzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChuSXRlbUluZGV4KTsKIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIGludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdApAQCAtNTc4LDkgKzU3OCw5IEBACiAJcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiB9CiAKLWJvb2wJQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX0xpc3RCb3g6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CiAKIAlpZiAoekRlbHRhIDwgMCkKIAl7CkBAIC01OTEsOCArNTkxLDggQEAKIAkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCWJvb2wgYkV4aXQgPSBmYWxzZTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoZmFsc2UsYkV4aXQsIG5GbGFnKTsKLQlyZXR1cm4gdHJ1ZTsKKwlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LCBuRmxhZyk7CisJcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKaW5kZXggZDJkZWFjYi4uMzA3N2U2MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKQEAgLTUyLDcgKzUyLDcgQEAKIAogdm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEZhY2UoKQogewotCVJlc2V0QWxsKGZhbHNlLCAwKTsKKwlSZXNldEFsbChGQUxTRSwgMCk7CiB9CiAKIHZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KQpAQCAtNjAsNyArNjAsNyBAQAogCWlmIChuU3RhcnQgPCAwKQogCQluU3RhcnQgPSAwOwogCWlmIChuU3RhcnQgPj0gMCAmJiBuU3RhcnQgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCi0JCVJlc2V0QWxsKHRydWUsIG5TdGFydCk7CisJCVJlc2V0QWxsKFRSVUUsIG5TdGFydCk7CiB9CiAKIEZYX0ZMT0FUIENQV0xfTGlzdEN0cmw6OkdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKQpAQCAtOTEsNyArOTEsNyBAQAogCXJldHVybiBmUmV0OwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0QWxsKGJvb2wgYk1vdmUsIGludDMyX3QgblN0YXJ0KQordm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEFsbChGWF9CT09MIGJNb3ZlLCBpbnQzMl90IG5TdGFydCkKIHsKIAlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogCQkJaWYgKGJNb3ZlKQogCQkJewogCQkJCUZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZXaWR0aCAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIHRydWUsIGZhbHNlKTsKKwkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIFRSVUUsIEZBTFNFKTsKIAkJCQlmeSAtPSBmSXRlbUhlaWdodDsKIAkJCQlmeSAtPSBtX2ZJdGVtU3BhY2U7CiAJCQl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcAppbmRleCBmM2M1ODE2Li43ZWQxMTE1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKQEAgLTYwLDEzICs2MCwxMyBAQAogCQlpZiAocmNDbGllbnQuV2lkdGgoKSA+IDE1LjBmKQogCQl7CiAJCQlyY0NsaWVudC5yaWdodCAtPSAxNS4wZjsKLQkJCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIHRydWUsIGZhbHNlKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUodHJ1ZSk7CisJCQltX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCBUUlVFLCBGQUxTRSk7CisJCQltX3BUZXh0LT5TZXRWaXNpYmxlKFRSVUUpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIHRydWUsIGZhbHNlKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoZmFsc2UpOworCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIFRSVUUsIEZBTFNFKTsKKwkJCW1fcFRleHQtPlNldFZpc2libGUoRkFMU0UpOwogCQl9CiAJfQogfQpAQCAtMTIyLDkgKzEyMiw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfTm90ZV9FZGl0OjpDUFdMX05vdGVfRWRpdCgpIDogbV9iRW5hYmxlTm90aWZ5KHRydWUpLAorQ1BXTF9Ob3RlX0VkaXQ6OkNQV0xfTm90ZV9FZGl0KCkgOiBtX2JFbmFibGVOb3RpZnkoVFJVRSksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChmYWxzZSksCisJbV9iU2l6ZUNoYW5nZWQoRkFMU0UpLAogCW1fZk9sZE1pbigwLjBmKSwKIAltX2ZPbGRNYXgoMC4wZikKIHsKQEAgLTEzNiwzMyArMTM2LDMzIEBACiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQogewotCW1fYkVuYWJsZU5vdGlmeSA9IGZhbHNlOworCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwogCUNQV0xfRWRpdDo6UmVQb3NDaGlsZFduZCgpOwotCW1fYkVuYWJsZU5vdGlmeSA9IHRydWU7CisJbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKIAogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpCiB7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gZmFsc2U7CisJbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7CiAJQ1BXTF9FZGl0OjpTZXRUZXh0KGNzVGV4dCk7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gdHJ1ZTsKKwltX2JFbmFibGVOb3RpZnkgPSBUUlVFOwogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQltX2JFbmFibGVOb3RpZnkgPSBmYWxzZTsKKwltX2JFbmFibGVOb3RpZnkgPSBGQUxTRTsKIAlDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKLQltX2JFbmFibGVOb3RpZnkgPSB0cnVlOworCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CiAKLQlFbmFibGVTcGVsbENoZWNrKHRydWUpOworCUVuYWJsZVNwZWxsQ2hlY2soVFJVRSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlFbmFibGVTcGVsbENoZWNrKGZhbHNlKTsKKwlFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKIAogCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJCQlpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwKIAkJCQkJCSFJc0Zsb2F0RXF1YWwocEluZm8tPmZDb250ZW50TWluLCBtX2ZPbGRNaW4pKQogCQkJCQl7Ci0JCQkJCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CisJCQkJCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CiAJCQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQkJCQl7CiAJCQkJCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCiAJCQl7CiAJCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCQluZXdJbmZvLmJWaXNpYmxlID0gdHJ1ZTsKKwkJCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKIAkJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQkJbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOwogCkBAIC0yMzksMTggKzIzOSwxOCBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKIAotCQlFbmFibGVOb3RpZnkoZmFsc2UpOwotCQlFbmFibGVSZWZyZXNoKGZhbHNlKTsKLQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KGZhbHNlKTsKKwkJRW5hYmxlTm90aWZ5KEZBTFNFKTsKKwkJRW5hYmxlUmVmcmVzaChGQUxTRSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CiAKLQkJTW92ZShDUERGX1JlY3QoMCwwLGZMaW1pdFdpZHRoLDApLCB0cnVlLCBmYWxzZSk7CisJCU1vdmUoQ1BERl9SZWN0KDAsMCxmTGltaXRXaWR0aCwwKSwgVFJVRSwgRkFMU0UpOwogCQlGWF9GTE9BVCBmUmV0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7Ci0JCUVuYWJsZU5vdGlmeSh0cnVlKTsKLQkJRW5hYmxlUmVmcmVzaCh0cnVlKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworCQlFbmFibGVOb3RpZnkoVFJVRSk7CisJCUVuYWJsZVJlZnJlc2goVFJVRSk7CiAKIAkJcmV0dXJuIGZSZXQ7CiAJfQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfQ2xvc2VCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKGZhbHNlKQorQ1BXTF9Ob3RlX0Nsb3NlQm94OjpDUFdMX05vdGVfQ2xvc2VCb3goKSA6IG1fYk1vdXNlRG93bihGQUxTRSkKIHsKIH0KIApAQCAtMzg3LDE5ICszODcsMTkgQEAKIAkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLWJvb2wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldEJvcmRlclN0eWxlKFBCU19JTlNFVCk7CiAJSW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQltX2JNb3VzZURvd24gPSB0cnVlOworCW1fYk1vdXNlRG93biA9IFRSVUU7CiAKIAlyZXR1cm4gQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogfQogCi1ib29sCUNQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wJQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCW1fYk1vdXNlRG93biA9IGZhbHNlOworCW1fYk1vdXNlRG93biA9IEZBTFNFOwogCiAJU2V0Qm9yZGVyU3R5bGUoUEJTX0JFVkVMRUQpOwogCUludmFsaWRhdGVSZWN0KE5VTEwpOwpAQCAtNDI5LDE4ICs0MjksMTggQEAKIAllY3AucFBhcmVudFduZCA9IHRoaXM7CiAJZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19URVhUT1ZFUkZMT1cgfCBQRVNfVU5ETyB8IFBFU19TUEVMTENIRUNLOwogCi0JbV9wRWRpdC0+RW5hYmxlTm90aWZ5KGZhbHNlKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwogCW1fcEVkaXQtPkNyZWF0ZShlY3ApOwotCW1fcEVkaXQtPkVuYWJsZU5vdGlmeSh0cnVlKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKIHsKIAlpZiAobV9wRWRpdCkKIAl7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CiAJCW1fcEVkaXQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeSh0cnVlKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCQlPbk5vdGlmeShtX3BFZGl0LCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAl9CiB9CkBAIC01NTEsOSArNTUxLDkgQEAKIAkJCWludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KHBXbmQpOwogCQkJaWYgKG5JbmRleCA8IDApIG5JbmRleCA9IDA7CiAKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwogCQkJUmVzZXRDb250ZW50KG5JbmRleCk7Ci0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CiAKIAkJCWZvciAoaW50MzJfdCBpPW5JbmRleCsxLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQogCQl7CiAJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwotCQkJbmV3SW5mby5iVmlzaWJsZSA9IHRydWU7CisJCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKIAkJCW5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKIAkJCW5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIApAQCAtNTg4LDkgKzU4OCw5IEBACiAJCXJldHVybjsKIAljYXNlIFBOTV9OT1RFUkVTRVQ6CiAJCXsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwogCQkJUmVzZXRDb250ZW50KDApOwotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCiAJCQlmb3IgKGludDMyX3QgaT0xLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU5OCw5ICs1OTgsOSBAQAogCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwogCQkJfQogCi0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKIAkJCVJlc2V0Q29udGVudCgwKTsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeSh0cnVlKTsKKwkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKIAkJfQogCQlyZXR1cm47CiAJfQpAQCAtNjA4LDE5ICs2MDgsMTkgQEAKIAlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLWJvb2wJQ1BXTF9Ob3RlX0NvbnRlbnRzOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MCUNQV0xfTm90ZV9Db250ZW50czo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiB0cnVlOworCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiBUUlVFOwogCiAJaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkKIAl7CiAJCW1fcEVkaXQtPlNldEZvY3VzKCk7CiAJfQogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoYm9vbCBiTGFzdCkKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCkKIHsKIAlpZiAoIW1fcEVkaXQtPklzRm9jdXNlZCgpKQogCXsKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXJldHVybiBtX3BFZGl0OwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCiB7CiAJaWYgKCFiRW5hYmxlZCkKIAkJbV9wRWRpdC0+QWRkRmxhZyhQV1NfUkVBRE9OTFkpOwpAQCAtNjU0LDcgKzY1NCw3IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlUmVhZChib29sIGJFbmFibGVkKQordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkKIHsKIAlpZiAoIWJFbmFibGVkKQogCQltX3BFZGl0LT5BZGRGbGFnKFBFU19OT1JFQUQpOwpAQCAtNjgzLDggKzY4Myw4IEBACiAJbV9wUHJpdmF0ZURhdGEoTlVMTCksCiAJbV9zQXV0aG9yKEwiIiksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChmYWxzZSksCi0JbV9iQWxsb3dNb2RpZnkodHJ1ZSkKKwltX2JTaXplQ2hhbmdlZChGQUxTRSksCisJbV9iQWxsb3dNb2RpZnkoVFJVRSkKIHsKIH0KIApAQCAtNzQ4LDcgKzc0OCw3IEBACiAJCXJjU3ViamVjdC5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLCByY0NsaWVudC5yaWdodCk7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OwpAQCAtNzU2LDcgKzc1Niw3IEBACiAJCXJjRGF0ZS5sZWZ0ID0gUFdMX01BWChyY0RhdGUucmlnaHQgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpIC0gMS4wZiwgcmNTdWJqZWN0LnJpZ2h0KTsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIHRydWUsIGZhbHNlKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCBUUlVFLCBGQUxTRSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKQEAgLTc2NSw3ICs3NjUsNyBAQAogCQlyY0NvbnRlbnRzLnRvcCA9IHJjRGF0ZS5ib3R0b20gLSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIOwogCQlyY0NvbnRlbnRzLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCB0cnVlLCBmYWxzZSk7CisJCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIFRSVUUsIEZBTFNFKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAJfQogCkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKIAogCQlBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKIAkJQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwpAQCAtMTA2NiwyNiArMTA2NiwyNiBAQAogCXJldHVybiBQT1BVUF9JVEVNX1NJREVNQVJHSU47CiB9CiAKLWJvb2wJQ1BXTF9Ob3RlSXRlbTo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MCUNQV0xfTm90ZUl0ZW06Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmICghbV9wQ29udGVudHMtPlduZEhpdFRlc3QobV9wQ29udGVudHMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7Ci0JCVNldE5vdGVGb2N1cyhmYWxzZSk7CisJCVNldE5vdGVGb2N1cyhGQUxTRSk7CiAJfQogCiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCiAJewotCQlTZXROb3RlRm9jdXMoZmFsc2UpOworCQlTZXROb3RlRm9jdXMoRkFMU0UpOwogCQlQb3B1cE5vdGVJdGVtTWVudShwb2ludCk7CiAKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBUUlVFOwogCX0KIAogCXJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsbkZsYWcpOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAlzd2l0Y2ggKG1zZykKIAl7CiAJY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOgotCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CisJCW1fYlNpemVDaGFuZ2VkID0gVFJVRTsKIAogCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJewpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIAkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKIAkJewogCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCW5ld0luZm8uYlZpc2libGUgPSB0cnVlOworCQkJbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7CiAJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQluZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CiAKQEAgLTExMTgsNyArMTExOCw3IEBACiAJCX0KIAkJcmV0dXJuOwogCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSB0cnVlOworCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CiAJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKIAogCQlyZXR1cm47CkBAIC0xMTc4LDE4ICsxMTc4LDE4IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldE5vdGVGb2N1cyhib29sIGJMYXN0KQordm9pZCBDUFdMX05vdGVJdGVtOjpTZXROb3RlRm9jdXMoRlhfQk9PTCBiTGFzdCkKIHsKIAltX3BDb250ZW50cy0+U2V0RWRpdEZvY3VzKGJMYXN0KTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVNb2RpZnkoYm9vbCBiRW5hYmxlZCkKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiAJbV9iQWxsb3dNb2RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkKIHsKIAltX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CkBAIC0xMjA1LDkgKzEyMDUsOSBAQAogCW1fcENvbnRlbnRzQmFyKE5VTEwpLAogCW1fcE9wdGlvbnMoTlVMTCksCiAJbV9wTm90ZU5vdGlmeShwTm90ZU5vdGlmeSksCi0JbV9iUmVzaXppbmcoZmFsc2UpLAorCW1fYlJlc2l6aW5nKEZBTFNFKSwKIAltX3JjQ2FwdGlvbigwLDAsMCwwKSwKLQltX2JFbmFsYmxlTm90aWZ5KHRydWUpLAorCW1fYkVuYWxibGVOb3RpZnkoVFJVRSksCiAJbV9wUG9wdXBOb3RlKHBQb3B1cE5vdGUpCiB7CiB9CkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCXJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KGJvb2wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpCiB7CiAJbV9iRW5hbGJsZU5vdGlmeSA9IGJFbmFibGVkOwogfQpAQCAtMTI0MywxOSArMTI0MywxOSBAQAogCX0KIH0KIAotYm9vbCBDUFdMX05vdGU6OlJlc2V0U2Nyb2xsQmFyKCkKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpSZXNldFNjcm9sbEJhcigpCiB7Ci0JYm9vbCBiU2Nyb2xsQ2hhbmdlZCA9IGZhbHNlOworCUZYX0JPT0wgYlNjcm9sbENoYW5nZWQgPSBGQUxTRTsKIAogCWlmIChTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkpCiAJewogCQlpZiAoIW1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKIAkJewotCQkJbV9wQ29udGVudHNCYXItPlNldFZpc2libGUodHJ1ZSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShUUlVFKTsKIAkJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQl7CiAJCQkJbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJCWJTY3JvbGxDaGFuZ2VkID0gdHJ1ZTsKKwkJCQliU2Nyb2xsQ2hhbmdlZCA9IFRSVUU7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMjYzLDEwICsxMjYzLDEwIEBACiAJewogCQlpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKQogCQl7Ci0JCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShmYWxzZSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCQltX3BDb250ZW50c0Jhci0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQkJCWJTY3JvbGxDaGFuZ2VkID0gdHJ1ZTsKKwkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKIAkJfQogCX0KIApAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAkJcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CiAJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQlyY0NvbnRlbnRzLnJpZ2h0IC09IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIHRydWUsIHRydWUpOworCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBUUlVFLCBUUlVFKTsKIAkJbV9wQ29udGVudHMtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsMC4wZikpOwogCQltX3BDb250ZW50cy0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAJfQpAQCAtMTI4NSw3ICsxMjg1LDcgQEAKIAlyZXR1cm4gYlNjcm9sbENoYW5nZWQ7CiB9CiAKLWJvb2wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKIHsKIAlDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwogCUNQREZfUmVjdCByY0NvbnRlbnRzQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKQEAgLTEzMDUsNyArMTMwNSw3IEBACiB7CiAJaWYgKG1fYlJlc2l6aW5nKSByZXR1cm47CiAKLQltX2JSZXNpemluZyA9IHRydWU7CisJbV9iUmVzaXppbmcgPSBUUlVFOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7CkBAIC0xMzI3LDcgKzEzMjcsNyBAQAogCQlyY0ljb24ucmlnaHQgPSByY0ljb24ubGVmdCArIDE0LjBmOwogCQlyY0ljb24uYm90dG9tID0gcmNJY29uLnRvcCAtIDE0LjBmOwogCQlyY0ljb24uTm9ybWFsaXplKCk7Ci0JCW1fcEljb24tPk1vdmUocmNJY29uLCB0cnVlLCBmYWxzZSk7CisJCW1fcEljb24tPk1vdmUocmNJY29uLCBUUlVFLCBGQUxTRSk7CiAJCW1fcEljb24tPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0ljb24pKTsKIAogCQlDUERGX1JlY3QgcmNDbG9zZUJveCA9IHJjQ2xpZW50OwpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIAkJcmNDbG9zZUJveC5sZWZ0ID0gcmNDbG9zZUJveC5yaWdodCAtIDE0LjBmOwogCQlyY0Nsb3NlQm94LmJvdHRvbSA9IHJjQ2xvc2VCb3gudG9wIC0gMTQuMGY7CiAJCXJjQ2xvc2VCb3guTm9ybWFsaXplKCk7Ci0JCW1fcENsb3NlQm94LT5Nb3ZlKHJjQ2xvc2VCb3gsIHRydWUsIGZhbHNlKTsKKwkJbV9wQ2xvc2VCb3gtPk1vdmUocmNDbG9zZUJveCwgVFJVRSwgRkFMU0UpOwogCQltX3BDbG9zZUJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ2xvc2VCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNEYXRlID0gcmNDbGllbnQ7CkBAIC0xMzQ1LDcgKzEzNDUsNyBAQAogCQlyY0RhdGUudG9wID0gcmNDbGllbnQudG9wIC0gMi4wZjsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIHRydWUsIGZhbHNlKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCBUUlVFLCBGQUxTRSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjU3ViamVjdCA9IHJjQ2xpZW50OwpAQCAtMTM1NCw3ICsxMzU0LDcgQEAKIAkJcmNTdWJqZWN0LnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjT3B0aW9ucyA9IHJjQ2xpZW50OwpAQCAtMTM2Miw3ICsxMzYyLDcgQEAKIAkJcmNPcHRpb25zLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOwogCQlyY09wdGlvbnMuYm90dG9tID0gcmNPcHRpb25zLnRvcCAtIG1fcE9wdGlvbnMtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAJCXJjT3B0aW9ucy5Ob3JtYWxpemUoKTsKLQkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIHRydWUsIGZhbHNlKTsKKwkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIFRSVUUsIEZBTFNFKTsKIAkJbV9wT3B0aW9ucy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjT3B0aW9ucykpOwogCiAJCUNQREZfUmVjdCByY0F1dGhvciA9IHJjQ2xpZW50OwpAQCAtMTM3MSwyMSArMTM3MSwyMSBAQAogCQlyY0F1dGhvci5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BBdXRob3ItPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjT3B0aW9ucy5sZWZ0IC0gMS4wZik7CiAJCXJjQXV0aG9yLmJvdHRvbSA9IHJjQXV0aG9yLnRvcCAtIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNBdXRob3IuTm9ybWFsaXplKCk7Ci0JCW1fcEF1dGhvci0+TW92ZShyY0F1dGhvciwgdHJ1ZSwgZmFsc2UpOworCQltX3BBdXRob3ItPk1vdmUocmNBdXRob3IsIFRSVUUsIEZBTFNFKTsKIAkJbV9wQXV0aG9yLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNBdXRob3IpKTsKIAogCQlDUERGX1JlY3QgcmNMQkJveCA9IHJjQ2xpZW50OwogCQlyY0xCQm94LnRvcCA9IHJjTEJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNMQkJveC5yaWdodCA9IHJjTEJCb3gubGVmdCArIDcuMGY7CiAJCXJjTEJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcExCQm94LT5Nb3ZlKHJjTEJCb3gsIHRydWUsIGZhbHNlKTsKKwkJbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgVFJVRSwgRkFMU0UpOwogCQltX3BMQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjTEJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNSQkJveCA9IHJjQ2xpZW50OwogCQlyY1JCQm94LnRvcCA9IHJjUkJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNSQkJveC5sZWZ0ID0gcmNSQkJveC5yaWdodCAtIDcuMGY7CiAJCXJjUkJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcFJCQm94LT5Nb3ZlKHJjUkJCb3gsIHRydWUsIGZhbHNlKTsKKwkJbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgVFJVRSwgRkFMU0UpOwogCQltX3BSQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjUkJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNDb250ZW50cyA9IHJjQ2xpZW50OwpAQCAtMTM5NiwyMCArMTM5NiwyMCBAQAogCQkJcmNDb250ZW50cy5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSAxNC4wZjsKIAkJcmNDb250ZW50cy5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgZmFsc2UsIGZhbHNlKTsKKwkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgRkFMU0UsIEZBTFNFKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHNCYXIgPSByY0NvbnRlbnRzOwogCQlyY0NvbnRlbnRzQmFyLnJpZ2h0ID0gcmNDbGllbnQucmlnaHQgLSAzLjBmOwogCQlyY0NvbnRlbnRzQmFyLmxlZnQgPSByY0NvbnRlbnRzQmFyLnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSDsKIAkJcmNDb250ZW50c0Jhci5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHNCYXItPk1vdmUocmNDb250ZW50c0JhciwgdHJ1ZSwgZmFsc2UpOworCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCBUUlVFLCBGQUxTRSk7CiAKIAkJbV9yY0NhcHRpb24gPSByY0NsaWVudDsKIAkJbV9yY0NhcHRpb24uYm90dG9tID0gcmNDb250ZW50cy50b3A7CiAJfQogCi0JbV9iUmVzaXppbmcgPSBmYWxzZTsKKwltX2JSZXNpemluZyA9IEZBTFNFOwogfQogCiAvLzAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvIDUtb3B0aW9ucwpAQCAtMTUwNyw3ICsxNTA3LDcgQEAKIAlzY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZik7CiAJc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOwogCW1fcENvbnRlbnRzQmFyLT5DcmVhdGUoc2NwKTsKLQltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcih0cnVlKTsKKwltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcihUUlVFKTsKIH0KIAogdm9pZCBDUFdMX05vdGU6OlNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKQEAgLTE1MzgsNyArMTUzOCw3IEBACiAJcmV0dXJuIEwiIjsKIH0KIAotYm9vbCBDUFdMX05vdGU6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfTm90ZTo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwogCUNQREZfUmVjdCByY1Njcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxBcmVhKCk7CkBAIC0xNTY2LDExICsxNTY2LDExIEBACiAJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAJCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEZBTFNFOwogfQogCiB2b2lkIENQV0xfTm90ZTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC0xNTkxLDcgKzE1OTEsNyBAQAogCiAJCQlpZiAoRlhTWVNfbWVtY21wKCZtX09sZFNjcm9sbEluZm8sICZzSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCiAJCQl7Ci0JCQkJYm9vbCBiU2Nyb2xsQ2hhbmdlZCA9IGZhbHNlOworCQkJCUZYX0JPT0wgYlNjcm9sbENoYW5nZWQgPSBGQUxTRTsKIAogCQkJCWlmIChsUGFyYW0gPCAzKSAvL7fA1rnLwNGtu7cgbWFudGlzOjE1NzU5CiAJCQkJewpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAkJbV9wUkJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIH0KIAotYm9vbAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7CkBAIC0xNzE3LDE0ICsxNzE3LDE0IEBACiAJCQlLaWxsRm9jdXMoKTsKIAkJCXBOb3RpZnktPk9uUG9wdXBNZW51KHgsIHkpOwogCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBUUlVFOwogCQl9CiAJfQogCiAJcmV0dXJuIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKIH0KIAotYm9vbAlDUFdMX05vdGU6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MCUNQV0xfTm90ZTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlyZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIH0KQEAgLTE3NDgsMTIgKzE3NDgsMTIgQEAKIAkJbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKQogewogCW1fcENvbnRlbnRzLT5FbmFibGVSZWFkKGJFbmFibGVkKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAppbmRleCA0Mjg3YmMyLi42ZDYxNzA1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAJfQogfQogCi1ib29sCVBXTF9GTE9BVFJBTkdFOjpJbihGWF9GTE9BVCB4KSBjb25zdAorRlhfQk9PTAlQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QKIHsKIAlyZXR1cm4gKElzRmxvYXRCaWdnZXIoeCxmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCiAJCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOwpAQCAtOTksMTQgKzk5LDE0IEBACiAJZkJpZ1N0ZXAgPSBzdGVwOwogfQogCi1ib29sIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCitGWF9CT09MIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCiB7CiAJaWYgKFNjcm9sbFJhbmdlLkluKHBvcykpCiAJewogCQlmU2Nyb2xsUG9zID0gcG9zOwotCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFRSVUU7CiAJfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOwogCW1fZVNCQnV0dG9uVHlwZSA9IGVCdXR0b25UeXBlOwogCi0JbV9iTW91c2VEb3duID0gZmFsc2U7CisJbV9iTW91c2VEb3duID0gRkFMU0U7CiB9CiAKIENQV0xfU0JCdXR0b246On5DUFdMX1NCQnV0dG9uKCkKQEAgLTM1OSw3ICszNTksNyBAQAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAKIAkJCQlpZiAoSXNFbmFibGVkKCkpCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCB0cnVlLCBmYWxzZSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOwogCQkJCWVsc2UKIAkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSkpOwogCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCQkvL2RyYXcgYmFja2dyb3VuZAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAJCQkJaWYgKElzRW5hYmxlZCgpKQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgdHJ1ZSwgZmFsc2UsIHJjRHJhdywgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7CisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCBUUlVFLCBGQUxTRSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKIAkJCQllbHNlCiAJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKIApAQCAtNTY1LDMzICs1NjUsMzMgQEAKIAl9CiB9CiAKLWJvb2wgQ1BXTF9TQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLChpbnRwdHJfdCkmcG9pbnQpOwogCi0JbV9iTW91c2VEb3duID0gdHJ1ZTsKKwltX2JNb3VzZURvd24gPSBUUlVFOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIAogCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsKGludHB0cl90KSZwb2ludCk7CiAKLQltX2JNb3VzZURvd24gPSBmYWxzZTsKKwltX2JNb3VzZURvd24gPSBGQUxTRTsKIAlSZWxlYXNlQ2FwdHVyZSgpOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKLWJvb2wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsbkZsYWcpOwogCkBAIC02MDMsMTIgKzYwMywxMiBAQAogCQlpZiAobV9iTW91c2VEb3duICYmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4gfHwgbV9lU0JCdXR0b25UeXBlID09IFBTQlRfTUFYKSkKIAkJewogCQkJaWYgKCFwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTixuRmxhZ3MsKGludHB0cl90KSZwb2ludCkpCi0JCQkJcmV0dXJuIGZhbHNlOworCQkJCXJldHVybiBGQUxTRTsKIAkJfQogCQkqLwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTYxOCw5ICs2MTgsOSBAQAogCW1fcE1pbkJ1dHRvbihOVUxMKSwKIAltX3BNYXhCdXR0b24oTlVMTCksCiAJbV9wUG9zQnV0dG9uKE5VTEwpLAotCW1fYk1vdXNlRG93bihmYWxzZSksCi0JbV9iTWluT3JNYXgoZmFsc2UpLAotCW1fYk5vdGlmeUZvcmV2ZXIodHJ1ZSkKKwltX2JNb3VzZURvd24oRkFMU0UpLAorCW1fYk1pbk9yTWF4KEZBTFNFKSwKKwltX2JOb3RpZnlGb3JldmVyKFRSVUUpCiB7CiB9CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCxyY0NsaWVudC5ib3R0b20sCiAJCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoZmFsc2UpOworCQkJZWxzZSBTZXRWaXNpYmxlKEZBTFNFKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNCVF9WU0NST0xMOgpAQCAtNjg3LDE2ICs2ODcsMTYgQEAKIAkJCQlyY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKIAkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgZkJXaWR0aCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoZmFsc2UpOworCQkJZWxzZSBTZXRWaXNpYmxlKEZBTFNFKTsKIAkJfQogCQlicmVhazsKIAl9CiAKICAgICBpZiAobV9wTWluQnV0dG9uKQotICAgICAgICBtX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgbV9wTWluQnV0dG9uLT5Nb3ZlKHJjTWluQnV0dG9uLCBUUlVFLCBGQUxTRSk7CiAgICAgaWYgKG1fcE1heEJ1dHRvbikKLSAgICAgICAgbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLCB0cnVlLCBmYWxzZSk7Ci0gICAgTW92ZVBvc0J1dHRvbihmYWxzZSk7CisgICAgICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgVFJVRSwgRkFMU0UpOworICAgIE1vdmVQb3NCdXR0b24oRkFMU0UpOwogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQpAQCAtNzA4LDcgKzcwOCw3IEBACiAJCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwogCiAJCXNCdXR0b24gPDwgInFcbiI7Ci0JCXNCdXR0b24gPDwgIjAgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCYWNrZ3JvdW5kQ29sb3IoKSx0cnVlKTsKKwkJc0J1dHRvbiA8PCAiMCB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLFRSVUUpOwogCQlzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCiAJCQkJPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJfQogfQogCi1ib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC03NzcsMjIgKzc3NywyMiBAQAogCQlpZiAocmNNaW5BcmVhLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSkpCiAJCXsKIAkJCW1fc0RhdGEuU3ViQmlnKCk7Ci0JCQlNb3ZlUG9zQnV0dG9uKHRydWUpOworCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKIAkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCQl9CiAKIAkJaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludC54LHBvaW50LnkpKQogCQl7CiAJCQltX3NEYXRhLkFkZEJpZygpOwotCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKKwkJCU1vdmVQb3NCdXR0b24oVFJVRSk7CiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAkJfQogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCkBAIC04MDYsOSArODA2LDkgQEAKIAl9CiAKIAlFbmRUaW1lcigpOwotCW1fYk1vdXNlRG93biA9IGZhbHNlOworCW1fYk1vdXNlRG93biA9IEZBTFNFOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKCFtX3BQb3NCdXR0b24pCiAJewogCQltX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX1BPUyk7Ci0JCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CisJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCW1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7CiAJfQogfQpAQCAtOTQzLDEyICs5NDMsMTIgQEAKIAogCQlpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkKIAkJewotCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKGZhbHNlKTsKKwkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQltX3BQb3NCdXR0b24tPlNldFZpc2libGUodHJ1ZSk7Ci0JCQlNb3ZlUG9zQnV0dG9uKHRydWUpOworCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKFRSVUUpOworCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKIAkJfQogCX0KIH0KQEAgLTk2MCw3ICs5NjAsNyBAQAogCW1fc0RhdGEuU2V0UG9zKGZQb3MpOwogCiAJaWYgKCFJc0Zsb2F0RXF1YWwobV9zRGF0YS5mU2Nyb2xsUG9zLCBmT2xkUG9zKSkKLQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKKwkJTW92ZVBvc0J1dHRvbihUUlVFKTsKIH0KIAogdm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKQpAQCAtOTY5LDcgKzk2OSw3IEBACiAJbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oYm9vbCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCkKIHsKIAlBU1NFUlQgKG1fcFBvc0J1dHRvbiAhPSBOVUxMKTsKIAlBU1NFUlQgKG1fcE1pbkJ1dHRvbiAhPSBOVUxMKTsKQEAgLTEwMzEsMTcgKzEwMzEsMTcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJbV9wUG9zQnV0dG9uLT5Nb3ZlKHJjUG9zQnV0dG9uLHRydWUsYlJlZnJlc2gpOworCQltX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sVFJVRSxiUmVmcmVzaCk7CiAJfQogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7CiAJbV9zRGF0YS5TdWJTbWFsbCgpOwotCU1vdmVQb3NCdXR0b24odHJ1ZSk7CisJTW92ZVBvc0J1dHRvbihUUlVFKTsKIAlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAotCW1fYk1pbk9yTWF4ID0gdHJ1ZTsKKwltX2JNaW5Pck1heCA9IFRSVUU7CiAKIAlFbmRUaW1lcigpOwogCUJlZ2luVGltZXIoMTAwKTsKQEAgLTEwNTgsMTAgKzEwNTgsMTAgQEAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKIHsKIAltX3NEYXRhLkFkZFNtYWxsKCk7Ci0JTW92ZVBvc0J1dHRvbih0cnVlKTsKKwlNb3ZlUG9zQnV0dG9uKFRSVUUpOwogCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCi0JbV9iTWluT3JNYXggPSBmYWxzZTsKKwltX2JNaW5Pck1heCA9IEZBTFNFOwogCiAJRW5kVGltZXIoKTsKIAlCZWdpblRpbWVyKDEwMCk7CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7Ci0JbV9iTW91c2VEb3duID0gdHJ1ZTsKKwltX2JNb3VzZURvd24gPSBUUlVFOwogCiAJaWYgKG1fcFBvc0J1dHRvbikKIAl7CkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCQlpZiAoIW1fYk5vdGlmeUZvcmV2ZXIpCiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAl9Ci0JbV9iTW91c2VEb3duID0gZmFsc2U7CisJbV9iTW91c2VEb3duID0gRkFMU0U7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKQEAgLTExNjMsNyArMTE2Myw3IEBACiAKIAkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKIAkJewotCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKKwkJCU1vdmVQb3NCdXR0b24oVFJVRSk7CiAKIAkJCWlmIChtX2JOb3RpZnlGb3JldmVyKQogCQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwpAQCAtMTI5Nyw3ICsxMjk3LDcgQEAKIAogCWlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKQogCXsKLQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKKwkJTW92ZVBvc0J1dHRvbihUUlVFKTsKIAkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwCmluZGV4IDIzYmU3MWEuLjc2YjJiZDMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAKQEAgLTcwLDkgKzcwLDkgQEAKIAltX3BUZXh0KE5VTEwpLAogCW1fcERlc2NyaXB0aW9uKE5VTEwpLAogCW1fcEltYWdlKE5VTEwpLAotCW1fYlRleHRFeGlzdCh0cnVlKSwKLQltX2JJbWFnZUV4aXN0KGZhbHNlKSwKLQltX2JGbGFnRXhpc3QodHJ1ZSkKKwltX2JUZXh0RXhpc3QoVFJVRSksCisJbV9iSW1hZ2VFeGlzdChGQUxTRSksCisJbV9iRmxhZ0V4aXN0KFRSVUUpCiB7CiB9CiAKQEAgLTgwLDIxICs4MCwyMSBAQAogewogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhib29sIGJUZXh0RXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhGWF9CT09MIGJUZXh0RXhpc3QpCiB7CiAJbV9iVGV4dEV4aXN0ID0gYlRleHRFeGlzdDsKIAogCVJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VGbGFnKGJvb2wgYkltYWdlRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCkKIHsKIAltX2JJbWFnZUV4aXN0ID0gYkltYWdlRXhpc3Q7CiAKIAlSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEZveGl0RmxhZyhib29sIGJGbGFnRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRGb3hpdEZsYWcoRlhfQk9PTCBiRmxhZ0V4aXN0KQogewogCW1fYkZsYWdFeGlzdCA9IGJGbGFnRXhpc3Q7CiB9CkBAIC0xMzUsNyArMTM1LDcgQEAKIAlDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7CiAJQ1BERl9SZWN0IHJjRGVzY3JpcHRpb24gPSByY0NsaWVudDsKIAotCWJvb2wgYlRleHRWaXNpYmxlID0gbV9iVGV4dEV4aXN0ICYmIG1fcFRleHQtPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDA7CisJRlhfQk9PTCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKIAogCWlmICgoYlRleHRWaXNpYmxlIHx8IG1fYkltYWdlRXhpc3QpICYmCiAJCW1fcERlc2NyaXB0aW9uLT5HZXRUZXh0KCkuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtMTU1LDkgKzE1NSw5IEBACiAJbV9wVGV4dC0+U2V0VmlzaWJsZShiVGV4dFZpc2libGUpOwogCW1fcEltYWdlLT5TZXRWaXNpYmxlKG1fYkltYWdlRXhpc3QpOwogCi0JbV9wVGV4dC0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKLQltX3BJbWFnZS0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKLQltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCB0cnVlLCBmYWxzZSk7CisJbV9wVGV4dC0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKKwltX3BJbWFnZS0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKKwltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCBUUlVFLCBGQUxTRSk7CiB9CiAKIHZvaWQgQ1BXTF9TaWduYXR1cmU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKaW5kZXggN2JiMzhjNC4uOTBmYThmOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChmYWxzZSkKK0NQV0xfQ2hlY2tCb3g6OkNQV0xfQ2hlY2tCb3goKSA6IG1fYkNoZWNrZWQoRkFMU0UpCiB7CiB9CiAKQEAgLTQ1LDMzICs0NSwzMyBAQAogCXJldHVybiAiQ1BXTF9DaGVja0JveCI7CiB9CiAKLXZvaWQgQ1BXTF9DaGVja0JveDo6U2V0Q2hlY2soYm9vbCBiQ2hlY2spCit2b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLWJvb2wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotYm9vbCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBmYWxzZTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gRkFMU0U7CiAKIAlTZXRDaGVjayghSXNDaGVja2VkKCkpOwotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCi1ib29sIENQV0xfQ2hlY2tCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wgQ1BXTF9DaGVja0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1JhZGlvQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9SYWRpb0J1dHRvbjo6Q1BXTF9SYWRpb0J1dHRvbigpIDogbV9iQ2hlY2tlZChmYWxzZSkKK0NQV0xfUmFkaW9CdXR0b246OkNQV0xfUmFkaW9CdXR0b24oKSA6IG1fYkNoZWNrZWQoRkFMU0UpCiB7CiB9CiAKQEAgLTg0LDI3ICs4NCwyNyBAQAogCXJldHVybiAiQ1BXTF9SYWRpb0J1dHRvbiI7CiB9CiAKLWJvb2wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK0ZYX0JPT0wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gZmFsc2U7CisJaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIEZBTFNFOwogCi0JU2V0Q2hlY2sodHJ1ZSk7Ci0JcmV0dXJuIHRydWU7CisJU2V0Q2hlY2soVFJVRSk7CisJcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgQ1BXTF9SYWRpb0J1dHRvbjo6U2V0Q2hlY2soYm9vbCBiQ2hlY2spCit2b2lkIENQV0xfUmFkaW9CdXR0b246OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLWJvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotYm9vbCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitGWF9CT09MIENQV0xfUmFkaW9CdXR0b246Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLQlTZXRDaGVjayh0cnVlKTsKLQlyZXR1cm4gdHJ1ZTsKKwlTZXRDaGVjayhUUlVFKTsKKwlyZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAppbmRleCA0ZTRhYzk0Li5iOWJhNzY2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcApAQCAtODcsMTMgKzg3LDEzIEBACiAJCXJlY3QucmlnaHQgKyB4LHJlY3QudG9wICsgeSk7CiB9CiAKLWJvb2wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKK0ZYX0JPT0wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKIHsKIAlyZXR1cm4gcmNDaGlsZC5sZWZ0ID49IHJjUGFyZW50LmxlZnQgJiYgcmNDaGlsZC5ib3R0b20gPj0gcmNQYXJlbnQuYm90dG9tICYmCiAJCQlyY0NoaWxkLnJpZ2h0IDw9IHJjUGFyZW50LnJpZ2h0ICYmIHJjQ2hpbGQudG9wIDw9IHJjUGFyZW50LnRvcDsKIH0KIAotYm9vbCBDUFdMX1V0aWxzOjpJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpCitGWF9CT09MIENQV0xfVXRpbHM6OkludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0MikKIHsKIAlGWF9GTE9BVCBsZWZ0ID0gcmVjdDEubGVmdCA+IHJlY3QyLmxlZnQgPyByZWN0MS5sZWZ0IDogcmVjdDIubGVmdDsKIAlGWF9GTE9BVCByaWdodCA9IHJlY3QxLnJpZ2h0IDwgcmVjdDIucmlnaHQgPyByZWN0MS5yaWdodCA6IHJlY3QyLnJpZ2h0OwpAQCAtNDIwLDcgKzQyMCw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yOwpAQCAtNDM1LDcgKzQzNSw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiZlxuUVxuIjsKQEAgLTQ1OCw3ICs0NTgsNyBAQAogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSwKLQkJCQkJCQkJCQkJCQkJYm9vbCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkKQorCQkJCQkJCQkJCQkJCQlGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQpCiB7CiAJcmV0dXJuIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShwRWRpdCxwdE9mZnNldCxwUmFuZ2UsYkNvbnRpbnVvdXMsU3ViV29yZCk7CiB9CkBAIC00OTgsNyArNDk4LDcgQEAKIAlGWF9GTE9BVCBmWSA9IDAuMGY7CiAJRlhfRkxPQVQgZlN0ZXAgPSAwLjBmOwogCi0JYm9vbCBiQnJlYWsgPSBmYWxzZTsKKwlGWF9CT09MIGJCcmVhayA9IEZBTFNFOwogCiAJaWYgKHBJdGVyYXRvcikKIAl7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CiAJCQkJfQogCi0JCQkJYkJyZWFrID0gdHJ1ZTsKKwkJCQliQnJlYWsgPSBUUlVFOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCXsKIAkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CiAKLQkJCWJvb2wgYkxhdGluV29yZCA9IGZhbHNlOworCQkJRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7CiAJCQlDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKIAkJCUNGWF9CeXRlU3RyaW5nIHNXb3JkOwogCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCQkJCWlmICghYkxhdGluV29yZCkKIAkJCQkJCXsKIAkJCQkJCQl3cFdvcmRTdGFydCA9IHBsYWNlOwotCQkJCQkJCWJMYXRpbldvcmQgPSB0cnVlOworCQkJCQkJCWJMYXRpbldvcmQgPSBUUlVFOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC02MDIsNyArNjAyLDcgQEAKIAkJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAJCQkJCQkJCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwogCQkJCQkJCX0KLQkJCQkJCQliTGF0aW5Xb3JkID0gZmFsc2U7CisJCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZC5FbXB0eSgpOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzV29yZCkpCiAJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7Ci0JCQkJCQliTGF0aW5Xb3JkID0gZmFsc2U7CisJCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CiAJCQkJCQlzV29yZC5FbXB0eSgpOwogCQkJCQl9CiAJCQkJfQpAQCAtNjI1LDcgKzYyNSw3IEBACiAJCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKIAkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAKLQkJCQliTGF0aW5Xb3JkID0gZmFsc2U7CisJCQkJYkxhdGluV29yZCA9IEZBTFNFOwogCQkJCXNXb3JkLkVtcHR5KCk7CiAJCQl9CiAJCX0KQEAgLTYzNiw3ICs2MzYsNyBAQAogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCxJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsCiAJCQkJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nICYgc1RleHQsIGludDMyX3QgbkFsaWdubWVudEgsIGludDMyX3QgbkFsaWdubWVudFYsCi0JCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgYm9vbCBiTXVsdGlMaW5lLCBib29sIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQorCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYk11bHRpTGluZSwgRlhfQk9PTCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc1JldDsKIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCXBFZGl0LT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CiAJCXBFZGl0LT5TZXRBdXRvUmV0dXJuKGJBdXRvUmV0dXJuKTsKIAkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUpOworCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKIAkJZWxzZQogCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKQEAgLTY4MywxMCArNjgzLDEwIEBACiAJCXBFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKIAkJcEVkaXQtPlNldEFsaWdubWVudEgoMSk7CiAJCXBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOwotCQlwRWRpdC0+U2V0TXVsdGlMaW5lKGZhbHNlKTsKLQkJcEVkaXQtPlNldEF1dG9SZXR1cm4oZmFsc2UpOworCQlwRWRpdC0+U2V0TXVsdGlMaW5lKEZBTFNFKTsKKwkJcEVkaXQtPlNldEF1dG9SZXR1cm4oRkFMU0UpOwogCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCXBFZGl0LT5TZXRBdXRvRm9udFNpemUodHJ1ZSk7CisJCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOwogCQllbHNlCiAJCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIApAQCAtODkyLDcgKzg5Miw3IEBACiAKIAkJaWYgKCFyY0ljb24uSXNFbXB0eSgpKQogCQl7Ci0JCQlJY29uLk1vdmUocmNJY29uLCBmYWxzZSwgZmFsc2UpOworCQkJSWNvbi5Nb3ZlKHJjSWNvbiwgRkFMU0UsIEZBTFNFKTsKIAkJCXNUZW1wIDw8IEljb24uR2V0SW1hZ2VBcHBTdHJlYW0oKTsKIAkJfQogCkBAIC05MjMsNyArOTIzLDcgQEAKIAlyZXR1cm4gIiI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSkKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwogCkBAIC05NjcsNyArOTY3LDcgQEAKIAkJewogCQlkZWZhdWx0OgogCQljYXNlIFBCU19TT0xJRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLHRydWUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsVFJVRSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0RBU0g6Ci0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixmYWxzZSk7CisJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk5Miw3ICs5OTIsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0JFVkVMRUQ6CiAJCWNhc2UgUEJTX0lOU0VUOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLHRydWUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLFRSVUUpOwogCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQl7CiAJCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7CkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwogCQkJfQogCi0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLHRydWUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSxUUlVFKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAJCQl9CiAKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLHRydWUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsVFJVRSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTEwMjYsNyArMTAyNiw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKKwkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCWNhc2UgUEJTX1VOREVSTElORUQ6CiAJCQl7Ci0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQQlNfREFTSDoKIAkJCXsKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixmYWxzZSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCQkJewogCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTEwOTgsNyArMTA5OCw3IEBACiAJCQkJCQk8PCAiIFNcblFcbiI7CiAJCQkJfQogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLGZhbHNlKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsRkFMU0UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLGZhbHNlKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLEZBTFNFKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTExMTksNyArMTExOSw3IEBACiAJCQl7CiAJCQkJRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixmYWxzZSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsZmFsc2UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxGQUxTRSk7CiAJCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQkJewogCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCQkJCQkJPDwgIiBTXG5RXG4iOwogCQkJCX0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sZmFsc2UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sRkFMU0UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTIwOCw0MiArMTIwOCw0MiBAQAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NoZWNrKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0FQOwotCXNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsdHJ1ZSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2hlY2socmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCx0cnVlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxmYWxzZSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MocmNCQm94KSA8PCAiU1xuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LEZBTFNFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhyY0JCb3gpIDw8ICJTXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbjEgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsdHJ1ZSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOworCXNBUCA8PCAicVxuMSB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9EaWFtb25kKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCx0cnVlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKIAlyZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIApAQCAtMTI5OSw3ICsxMjk5LDcgQEAKIAogCWlmICghcmNCQm94LklzRW1wdHkoKSkKIAl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDIyMC4wZi8yNTUuMGYsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmKSx0cnVlKTsKKwkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpLFRSVUUpOwogCQlzQXBwU3RyZWFtIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgogCQkJCTw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiIHJlIGZcbiI7CiAJCXNBcHBTdHJlYW0gPDwgIlFcbiI7CkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogfQogCiB2b2lkIENQV0xfVXRpbHM6OkRyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJYm9vbCBiVmVydGljYWwsIGJvb2wgYkhvcml6b250YWwsIENQREZfUmVjdCByZWN0LAorCQkJCQkJCQkJCQkJCQlGWF9CT09MIGJWZXJ0aWNhbCwgRlhfQk9PTCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCiAJCQkJCQkJCQkJCQkJCWludDMyX3QgblRyYW5zcGFyYW5jeSwgaW50MzJfdCBuU3RhcnRHcmF5LCBpbnQzMl90IG5FbmRHcmF5KQogewogCUZYX0ZMT0FUIGZTdGVwR3JheSA9IDEuMGY7CkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCUZYX0ZMT0FUIGZZID0gMC4wZjsKIAlGWF9GTE9BVCBmU3RlcCA9IDAuMGY7CiAKLQlib29sIGJCcmVhayA9IGZhbHNlOworCUZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CiAKIAlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQogCXsKQEAgLTE2NzgsNyArMTY3OCw3IEBACiAJCQkJCWZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwogCQkJCX0KIAotCQkJCWJCcmVhayA9IHRydWU7CisJCQkJYkJyZWFrID0gVFJVRTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKQEAgLTE3MDAsNyArMTcwMCw3IEBACiAJY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApOwogCiAJLy9mb3Igc3BlbGxjaGVjawotCWJvb2wgYkxhdGluV29yZCA9IGZhbHNlOworCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOwogCUNQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OwogCUNGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7CiAKQEAgLTE3NDQsNyArMTc0NCw3IEBACiAJCQkJCQlpZiAoIWJMYXRpbldvcmQpCiAJCQkJCQl7CiAJCQkJCQkJd3BXb3JkU3RhcnQgPSBwbGFjZTsKLQkJCQkJCQliTGF0aW5Xb3JkID0gdHJ1ZTsKKwkJCQkJCQliTGF0aW5Xb3JkID0gVFJVRTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC0xNzYxLDcgKzE3NjEsNyBAQAogCQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOworCQkJCQkJCWJMYXRpbldvcmQgPSBGQUxTRTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTc4MSw3ICsxNzgxLDcgQEAKIAkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOworCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwogCQkJCQl9CiAKIAkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTgwNiwxMiArMTgwNiwxMiBAQAogCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi1ib29sIENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQorRlhfQk9PTCBDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKIHsKIAlzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpCiAJewogCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBGQUxTRTsKIAljYXNlIENPTE9SVFlQRV9HUkFZOgogCQlyZXR1cm4gY29sb3IuZkNvbG9yMSA8IDAuNWY7CiAJY2FzZSBDT0xPUlRZUEVfUkdCOgpAQCAtMTgyMCw3ICsxODIwLDcgQEAKIAkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyArIGNvbG9yLmZDb2xvcjQgPiAyLjBmOwogCX0KIAotCXJldHVybiB0cnVlOworCXJldHVybiBUUlVFOwogfQogCiBDUFdMX0NvbG9yIENQV0xfVXRpbHM6OkdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE4NTEsOCArMTg1MSw4IEBACiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRJY29uQXBwU3RyZWFtKGludDMyX3QgblR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmVjdCwgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLAogCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpCiB7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBmYWxzZSk7Ci0Jc0FwcFN0cmVhbSArPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckZpbGwsIHRydWUpOworCUNGWF9CeXRlU3RyaW5nIHNBcHBTdHJlYW0gPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclN0cm9rZSwgRkFMU0UpOworCXNBcHBTdHJlYW0gKz0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JGaWxsLCBUUlVFKTsKIAogCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwogCUNGWF9QYXRoRGF0YSBwYXRoOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IGYyMTRmYjMuLjQzM2IzYzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEyMyw0MCArMTIzLDQwIEBACiAgICAgICAgIG1fcE1haW5LZXlib2FyZFduZCA9IE5VTEw7CiAgICAgfQogCi0gICAgYm9vbCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIEZYX0JPT0wgSXNXbmRDcmVhdGVkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BDcmVhdGVkV25kID09IHBXbmQ7CiAgICAgfQogCi0gICAgYm9vbCBJc01haW5DYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIEZYX0JPT0wgSXNNYWluQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKICAgICB9CiAKLSAgICBib29sIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKKyAgICBGWF9CT09MIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChwV25kKQogICAgICAgICAgICAgZm9yKCBpbnQzMl90IGk9MCxzej1tX2FNb3VzZVBhdGguR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKG1fYU1vdXNlUGF0aC5HZXRBdChpKSA9PSBwV25kKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgYm9vbCBJc01haW5DYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIEZYX0JPT0wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5LZXlib2FyZFduZDsKICAgICB9CiAKIAotICAgIGJvb2wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIEZYX0JPT0wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKHBXbmQpCiAgICAgICAgICAgICBmb3IoIGludDMyX3QgaT0wLHN6PW1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICBpZiAobV9hS2V5Ym9hcmRQYXRoLkdldEF0KGkpID09IHBXbmQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKIAotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB2b2lkIFNldEZvY3VzKENQV0xfV25kICogcFduZCkKQEAgLTIyNSwxNiArMjI1LDE2IEBACiAgICAgbV9wVlNjcm9sbEJhcihOVUxMKSwKICAgICBtX3JjV2luZG93KCksCiAgICAgbV9yY0NsaXAoKSwKLSAgICBtX2JDcmVhdGVkKGZhbHNlKSwKLSAgICBtX2JWaXNpYmxlKGZhbHNlKSwKLSAgICBtX2JOb3RpZnlpbmcoZmFsc2UpLAotICAgIG1fYkVuYWJsZWQodHJ1ZSkKKyAgICBtX2JDcmVhdGVkKEZBTFNFKSwKKyAgICBtX2JWaXNpYmxlKEZBTFNFKSwKKyAgICBtX2JOb3RpZnlpbmcoRkFMU0UpLAorICAgIG1fYkVuYWJsZWQoVFJVRSkKIHsKIH0KIAogQ1BXTF9XbmQ6On5DUFdMX1duZCgpCiB7Ci0gICAgQVNTRVJUKG1fYkNyZWF0ZWQgPT0gZmFsc2UpOworICAgIEFTU0VSVChtX2JDcmVhdGVkID09IEZBTFNFKTsKIH0KIAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgT25DcmVhdGVkKCk7CiAKICAgICAgICAgUmVQb3NDaGlsZFduZCgpOwotICAgICAgICBtX2JDcmVhdGVkID0gdHJ1ZTsKKyAgICAgICAgbV9iQ3JlYXRlZCA9IFRSVUU7CiAgICAgfQogfQogCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogICAgICAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCiAgICAgICAgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX1JFTU9WRUNISUxEKTsKLSAgICAgICAgbV9iQ3JlYXRlZCA9IGZhbHNlOworICAgICAgICBtX2JDcmVhdGVkID0gRkFMU0U7CiAgICAgfQogCiAgICAgRGVzdHJveU1zZ0NvbnRyb2woKTsKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFZTY3JvbGxCYXIgPSBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LCBib29sIGJSZXNldCxib29sIGJSZWZyZXNoKQordm9pZCBDUFdMX1duZDo6TW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldywgRlhfQk9PTCBiUmVzZXQsRlhfQk9PTCBiUmVmcmVzaCkKIHsKICAgICBpZiAoSXNWYWxpZCgpKQogICAgIHsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogfQogCiAjZGVmaW5lIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChrZXlfbWV0aG9kX25hbWUpXAotYm9vbCBDUFdMX1duZDo6a2V5X21ldGhvZF9uYW1lKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKVwKK0ZYX0JPT0wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZShGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZylcCiB7XAogICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAogICAgIHtcCkBAIC01MTIsMTEgKzUxMiwxMSBAQAogICAgICAgICAgICAgfVwKICAgICAgICAgfVwKICAgICB9XAotICAgIHJldHVybiBmYWxzZTtcCisgICAgcmV0dXJuIEZBTFNFO1wKIH0KIAogI2RlZmluZSBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChtb3VzZV9tZXRob2RfbmFtZSlcCi1ib29sIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKVwKK0ZYX0JPT0wgQ1BXTF9XbmQ6Om1vdXNlX21ldGhvZF9uYW1lKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpXAoge1wKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKVwKICAgICB7XApAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgICAgICAgICAgICAgU2V0Q3Vyc29yKCk7XAogICAgICAgICB9XAogICAgIH1cCi0gICAgcmV0dXJuIGZhbHNlO1wKKyAgICByZXR1cm4gRkFMU0U7XAogfQogCiBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25LZXlEb3duKQpAQCAtNTY3LDcgKzU2Nyw3IEBACiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQogCi1ib29sIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorRlhfQk9PTCBDUFdMX1duZDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKQogICAgIHsKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkFkZENoaWxkKENQV0xfV25kICogcFduZCkKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgIH0KIH0KIAotYm9vbCBDUFdMX1duZDo6SXNWYWxpZCgpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpJc1ZhbGlkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iQ3JlYXRlZDsKIH0KQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLDAuMWYpKTsKIH0KIAotYm9vbCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAorRlhfQk9PTCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAogewogICAgIHJldHVybiAobV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgJiBkd0ZsYWdzKSAhPSAwOwogfQpAQCAtODY1LDEyICs4NjUsMTIgQEAKIHsKIH0KIAotYm9vbCBDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKIHsKICAgICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludC54LHBvaW50LnkpOwogfQogCi1ib29sIENQV0xfV25kOjpDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAogewogICAgIHJldHVybiBJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgR2V0Q2xpZW50UmVjdCgpLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSk7CiB9CkBAIC04ODMsNyArODgzLDcgQEAKICAgICByZXR1cm4gdGhpczsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShib29sIGJWaXNpYmxlKQordm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewpAQCAtOTE1LDcgKzkxNSw3IEBACiAgICAgcmV0dXJuIG1fcmNDbGlwOwogfQogCi1ib29sIENQV0xfV25kOjpJc1JlYWRPbmx5KCkgY29uc3QKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdAogewogICAgIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7CiB9CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQtMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQudG9wKTsKIAotICAgIGlmIChwVlNCKSBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCx0cnVlLGZhbHNlKTsKKyAgICBpZiAocFZTQikgcFZTQi0+TW92ZShyY1ZTY3JvbGwsVFJVRSxGQUxTRSk7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpAQCAtOTY4LDMzICs5NjgsMzMgQEAKICAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sOwogfQogCi1ib29sIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIElzV25kQ2FwdHVyZU1vdXNlKHRoaXMpOwogfQogCi1ib29sIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0CiB7CiAgICAgaWYgKENQV0xfTXNnQ29udHJvbCAqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQogICAgICAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZU1vdXNlKHBXbmQpOwogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorRlhfQk9PTCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVLZXlib2FyZChwV25kKTsKIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKLWJvb2wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpJc0ZvY3VzZWQoKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc01haW5DYXB0dXJlS2V5Ym9hcmQodGhpcyk7CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coYm9vbCBiRW5hYmxlKQordm9pZCBDUFdMX1duZDo6RW5hYmxlV2luZG93KEZYX0JPT0wgYkVuYWJsZSkKIHsKICAgICBpZiAobV9iRW5hYmxlZCAhPSBiRW5hYmxlKQogICAgIHsKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAgICAgfQogfQogCi1ib29sIENQV0xfV25kOjpJc0VuYWJsZWQoKQorRlhfQk9PTCBDUFdMX1duZDo6SXNFbmFibGVkKCkKIHsKICAgICByZXR1cm4gbV9iRW5hYmxlZDsKIH0KQEAgLTEyNTEsNDIgKzEyNTEsNDIgQEAKIHsKIH0KIAotYm9vbCBDUFdMX1duZDo6SXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0CiB7CiAgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUFdMX1duZDo6SXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0CitGWF9CT09MIENQV0xfV25kOjpJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKIHsKICAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorRlhfQk9PTCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQUxUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorRlhfQk9PTCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzSU5TRVJUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBGQUxTRTsKIH0K