ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGEzMDc3MTkuLjdjNTcyNTggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTUsMTcgKzE1LDQgQEAKICMKIExPQ0FMX1BBVEggOj0gJChteS1kaXIpCiAKLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi0gIGluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZWxzZQotICBpbmNsdWRlICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCQoYWRkc3VmZml4IC9BbmRyb2lkLm1rLCBcCi0JICAgICAgYWRiIFwKLQkgICAgICBsaWJjdXRpbHMgXAotCSAgICAgIGxpYnN5c3V0aWxzIFwKLQkgICAgICBsaWJsb2cgXAotCSAgICAgIGxpYm5ldHV0aWxzIFwKLQkgICAgICBsaWJwaXhlbGZsaW5nZXIgXAotCSAgICAgIGxpYnVzYmhvc3QgXAotCSAgICAgIGxpYnppcGZpbGUgXAotCSAgICkpCi1lbmRpZgoraW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9hZGIvQW5kcm9pZC5tayBiL2FkYi9BbmRyb2lkLm1rCmluZGV4IDJhYzkzMzUuLjc3NDRkMmIgMTAwNjQ0Ci0tLSBhL2FkYi9BbmRyb2lkLm1rCisrKyBiL2FkYi9BbmRyb2lkLm1rCkBAIC05NSwxMSArOTUsNyBAQAogIyBhZGJkIGRldmljZSBkYWVtb24KICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSMgYnVpbGQgYWRiZCBpbiBhbGwgbm9uLXNpbXVsYXRvciBidWlsZHMKLUJVSUxEX0FEQkQgOj0gZmFsc2UKLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi0gICAgQlVJTERfQURCRCA6PSB0cnVlCi1lbmRpZgorQlVJTERfQURCRCA6PSB0cnVlCiAKICMgYnVpbGQgYWRiZCBmb3IgdGhlIExpbnV4IHNpbXVsYXRvciBidWlsZAogIyBzbyB3ZSBjYW4gdXNlIGl0IHRvIHRlc3QgdGhlIGFkYiBVU0IgZ2FkZ2V0IGRyaXZlciBvbiB4ODYKQEAgLTE0MywyMSArMTM5LDE0IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVF9TQklOKQogTE9DQUxfVU5TVFJJUFBFRF9QQVRIIDo9ICQoVEFSR0VUX1JPT1RfT1VUX1NCSU5fVU5TVFJJUFBFRCkKIAotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmN1dGlscwotICBMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi0gIGluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi1lbHNlCi0gIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmMKLSAgaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi1lbmRpZgorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliYworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKIGVuZGlmCiAKIAogIyBhZGIgaG9zdCB0b29sIGZvciBkZXZpY2UtYXMtaG9zdAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCiBpZm5lcSAoJChTREtfT05MWSksdHJ1ZSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC0xOTYsNCArMTg1LDMgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiBlbmRpZgotZW5kaWYKZGlmZiAtLWdpdCBhL2FkYi9hZGIuaCBiL2FkYi9hZGIuaAppbmRleCA5MmRjNjJlLi5hYzMxZjExIDEwMDY0NAotLS0gYS9hZGIvYWRiLmgKKysrIGIvYWRiL2FkYi5oCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIEFEQl9WRVJTSU9OX01BSk9SIDEgICAgICAgICAvLyBVc2VkIGZvciBoZWxwL3ZlcnNpb24gaW5mb3JtYXRpb24KICNkZWZpbmUgQURCX1ZFUlNJT05fTUlOT1IgMCAgICAgICAgIC8vIFVzZWQgZm9yIGhlbHAvdmVyc2lvbiBpbmZvcm1hdGlvbgogCi0jZGVmaW5lIEFEQl9TRVJWRVJfVkVSU0lPTiAgICAyNyAgICAvLyBJbmNyZW1lbnQgdGhpcyB3aGVuIHdlIHdhbnQgdG8gZm9yY2UgdXNlcnMgdG8gc3RhcnQgYSBuZXcgYWRiIHNlcnZlcgorI2RlZmluZSBBREJfU0VSVkVSX1ZFUlNJT04gICAgMjkgICAgLy8gSW5jcmVtZW50IHRoaXMgd2hlbiB3ZSB3YW50IHRvIGZvcmNlIHVzZXJzIHRvIHN0YXJ0IGEgbmV3IGFkYiBzZXJ2ZXIKIAogdHlwZWRlZiBzdHJ1Y3QgYW1lc3NhZ2UgYW1lc3NhZ2U7CiB0eXBlZGVmIHN0cnVjdCBhcGFja2V0IGFwYWNrZXQ7CmRpZmYgLS1naXQgYS9hZGIvYmFja3VwX3NlcnZpY2UuYyBiL2FkYi9iYWNrdXBfc2VydmljZS5jCmluZGV4IDJlNmU3NTQuLjY2OWZmODYgMTAwNjQ0Ci0tLSBhL2FkYi9iYWNrdXBfc2VydmljZS5jCisrKyBiL2FkYi9iYWNrdXBfc2VydmljZS5jCkBAIC0yMiw2ICsyMiwzMSBAQAogI2RlZmluZSBUUkFDRV9UQUcgIFRSQUNFX0FEQgogI2luY2x1ZGUgImFkYi5oIgogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgcGlkX3QgcGlkOworICAgIGludCBmZDsKK30gYmFja3VwX2hhcnZlc3RfcGFyYW1zOworCisvLyBzb2NrZXRwYWlyIGJ1dCBkbyAqbm90KiBtYXJrIGFzIGNsb3NlX29uX2V4ZWMKK3N0YXRpYyBpbnQgYmFja3VwX3NvY2tldHBhaXIoaW50IHN2WzJdKSB7CisgICAgaW50IHJjID0gdW5peF9zb2NrZXRwYWlyKCBBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc3YgKTsKKyAgICBpZiAocmMgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gaGFydmVzdCB0aGUgY2hpbGQgcHJvY2VzcyB0aGVuIGNsb3NlIHRoZSByZWFkIGVuZCBvZiB0aGUgc29ja2V0cGFpcgorc3RhdGljIHZvaWQqIGJhY2t1cF9jaGlsZF93YWl0ZXIodm9pZCogYXJncykgeworICAgIGludCBzdGF0dXM7CisgICAgYmFja3VwX2hhcnZlc3RfcGFyYW1zKiBwYXJhbXMgPSAoYmFja3VwX2hhcnZlc3RfcGFyYW1zKikgYXJnczsKKworICAgIHdhaXRwaWQocGFyYW1zLT5waWQsICZzdGF0dXMsIDApOworICAgIGFkYl9jbG9zZShwYXJhbXMtPmZkKTsKKyAgICBmcmVlKHBhcmFtcyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8qIHJldHVybnMgdGhlIGRhdGEgc29ja2V0IHBhc3NpbmcgdGhlIGJhY2t1cCBkYXRhIGhlcmUgZm9yIGZvcndhcmRpbmcgKi8KIGludCBiYWNrdXBfc2VydmljZShCYWNrdXBPcGVyYXRpb24gb3AsIGNoYXIqIGFyZ3MpIHsKICAgICBwaWRfdCBwaWQ7CkBAIC00MiwxMiArNjcsMTUgQEAKIAogICAgIC8vIHNldCB1cCB0aGUgcGlwZSBmcm9tIHRoZSBzdWJwcm9jZXNzIHRvIGhlcmUKICAgICAvLyBwYXJlbnQgd2lsbCByZWFkIHNbMF07IGNoaWxkIHdpbGwgd3JpdGUgc1sxXQotICAgIGlmIChhZGJfc29ja2V0cGFpcihzKSkgeworICAgIGlmIChiYWNrdXBfc29ja2V0cGFpcihzKSkgewogICAgICAgICBEKCJjYW4ndCBjcmVhdGUgYmFja3VwL3Jlc3RvcmUgc29ja2V0cGFpclxuIik7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGNyZWF0ZSBiYWNrdXAvcmVzdG9yZSBzb2NrZXRwYWlyXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIEQoIkJhY2t1cC9yZXN0b3JlIHNvY2tldCBwYWlyOiAoc2VuZD0lZCwgcmVjZWl2ZT0lZClcbiIsIHNbMV0sIHNbMF0pOworICAgIGNsb3NlX29uX2V4ZWMoc1swXSk7ICAgIC8vIG9ubHkgdGhlIHNpZGUgd2UgaG9sZCBvbiB0bworCiAgICAgLy8gc3BpbiBvZmYgdGhlIGNoaWxkIHByb2Nlc3MgdG8gcnVuIHRoZSBiYWNrdXAgY29tbWFuZAogICAgIHBpZCA9IGZvcmsoKTsKICAgICBpZiAocGlkIDwgMCkgewpAQCAtNjEsMTIgKzg5LDE0IEBACiAKICAgICAvLyBHcmVhdCwgd2UncmUgb2ZmIGFuZCBydW5uaW5nLgogICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICAvLyBjaGlsZCAtLSBhY3R1YWxseSBydW4gdGhlIGJhY2t1cCBoZXJlCiAgICAgICAgIGNoYXIqIHA7CiAgICAgICAgIGludCBhcmdjOworICAgICAgICBjaGFyIHBvcnRudW1bMTZdOwogICAgICAgICBjaGFyKiogYnVfYXJnczsKIAotICAgICAgICAvLyBjaGlsZCAtLSBhY3R1YWxseSBydW4gdGhlIGJhY2t1cCBoZXJlCi0gICAgICAgIGFyZ2MgPSAyOyAvLyByb29tIGZvciB0aGUgYmFzaWMgJ2J1JyBhcmd2WzBdIGFuZCAnW29wZXJhdGlvbl0nIGFyZ3ZbMV0KKyAgICAgICAgLy8gZml4ZWQgYXJnczogIFswXSBpcyAnYnUnLCBbMV0gaXMgdGhlIHBvcnQgbnVtYmVyLCBbMl0gaXMgdGhlICdvcGVyYXRpb24nIHN0cmluZworICAgICAgICBhcmdjID0gMzsKICAgICAgICAgZm9yIChwID0gKGNoYXIqKWFyZ3M7IHAgJiYgKnA7ICkgewogICAgICAgICAgICAgYXJnYysrOwogICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICc6JykgcCsrOwpAQCAtNzQsOSArMTA0LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBidV9hcmdzID0gKGNoYXIqKikgYWxsb2NhKGFyZ2Mqc2l6ZW9mKGNoYXIqKSArIDEpOwotICAgICAgICBidV9hcmdzWzBdID0gImJ1IjsKLSAgICAgICAgYnVfYXJnc1sxXSA9IG9wZXJhdGlvbjsKLSAgICAgICAgYXJnYyA9IDI7ICAgLy8gcnVuIHRocm91Z2ggYWdhaW4gdG8gYnVpbGQgdGhlIGFyZ3YgYXJyYXkKKworICAgICAgICAvLyBydW4gdGhyb3VnaCBhZ2FpbiB0byBidWlsZCB0aGUgYXJndiBhcnJheQorICAgICAgICBhcmdjID0gMDsKKyAgICAgICAgYnVfYXJnc1thcmdjKytdID0gImJ1IjsKKyAgICAgICAgc25wcmludGYocG9ydG51bSwgc2l6ZW9mKHBvcnRudW0pLCAiJWQiLCBzWzFdKTsKKyAgICAgICAgYnVfYXJnc1thcmdjKytdID0gcG9ydG51bTsKKyAgICAgICAgYnVfYXJnc1thcmdjKytdID0gb3BlcmF0aW9uOwogICAgICAgICBmb3IgKHAgPSAoY2hhciopYXJnczsgcCAmJiAqcDsgKSB7CiAgICAgICAgICAgICBidV9hcmdzW2FyZ2MrK10gPSBwOwogICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICc6JykgcCsrOwpAQCAtOTAsNyArMTI0LDYgQEAKICAgICAgICAgLy8gQ2xvc2UgdGhlIGhhbGYgb2YgdGhlIHNvY2tldCB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQsIHJvdXRlICdidSdzIGNvbnNvbGUKICAgICAgICAgLy8gdG8gdGhlIG91dHB1dCBzb2NrZXQsIGFuZCBvZmYgd2UgZ28KICAgICAgICAgYWRiX2Nsb3NlKHNbMF0pOwotICAgICAgICBkdXAyKHNbMV0sIHNvY2tldG51bSk7CiAKICAgICAgICAgLy8gb2ZmIHdlIGdvCiAgICAgICAgIGV4ZWN2cCgiL3N5c3RlbS9iaW4vYnUiLCAoY2hhciAqIGNvbnN0ICopYnVfYXJncyk7CkBAIC05OCw4ICsxMzEsMjMgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZXhlYyAnYnUnLCBiYWlsaW5nXG4iKTsKICAgICAgICAgZXhpdCgtMSk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgYWRiX3RocmVhZF90IHQ7CisgICAgICAgIGJhY2t1cF9oYXJ2ZXN0X3BhcmFtcyogcGFyYW1zOworCiAgICAgICAgIC8vIHBhcmVudCwgaS5lLiBhZGJkIC0tIGNsb3NlIHRoZSBzZW5kaW5nIGhhbGYgb2YgdGhlIHNvY2tldAorICAgICAgICBEKCJmb3JrKCkgcmV0dXJuZWQgcGlkICVkXG4iLCBwaWQpOwogICAgICAgICBhZGJfY2xvc2Uoc1sxXSk7CisKKyAgICAgICAgLy8gc3BpbiBhIHRocmVhZCB0byBoYXJ2ZXN0IHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAgIHBhcmFtcyA9IChiYWNrdXBfaGFydmVzdF9wYXJhbXMqKSBtYWxsb2Moc2l6ZW9mKGJhY2t1cF9oYXJ2ZXN0X3BhcmFtcykpOworICAgICAgICBwYXJhbXMtPnBpZCA9IHBpZDsKKyAgICAgICAgcGFyYW1zLT5mZCA9IHNbMF07CisgICAgICAgIGlmIChhZGJfdGhyZWFkX2NyZWF0ZSgmdCwgYmFja3VwX2NoaWxkX3dhaXRlciwgcGFyYW1zKSkgeworICAgICAgICAgICAgYWRiX2Nsb3NlKHNbMF0pOworICAgICAgICAgICAgZnJlZShwYXJhbXMpOworICAgICAgICAgICAgRCgiVW5hYmxlIHRvIGNyZWF0ZSBjaGlsZCBoYXJ2ZXN0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gd2UnbGwgYmUgcmVhZGluZyBmcm9tIHNbMF0gYXMgdGhlIGRhdGEgaXMgc2VudCBieSB0aGUgY2hpbGQgcHJvY2VzcwpkaWZmIC0tZ2l0IGEvYWRiL2NvbW1hbmRsaW5lLmMgYi9hZGIvY29tbWFuZGxpbmUuYwppbmRleCA0NjAxMjBlLi4yOGJhZTk4IDEwMDY0NAotLS0gYS9hZGIvY29tbWFuZGxpbmUuYworKysgYi9hZGIvY29tbWFuZGxpbmUuYwpAQCAtMTMxLDggKzEzMSw4IEBACiAgICAgICAgICJcbiIKICAgICAgICAgIiAgYWRiIGJhY2t1cCBbLWYgPGZpbGU+XSBbLWFwa3wtbm9hcGtdIFstc2hhcmVkfC1ub3NoYXJlZF0gWy1hbGxdIFs8cGFja2FnZXMuLi4+XVxuIgogICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gV3JpdGUgYSB0YXJmaWxlIGJhY2t1cCBvZiB0aGUgZGV2aWNlJ3MgZGF0YSB0byA8ZmlsZT4uXG4iCi0gICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWYgb3B0aW9uIG11c3QgY29tZSBmaXJzdDsgaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBkYXRhXG4iCi0gICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB3cml0dGVuIHRvIFwiYmFja3VwLnRhclwiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgLWYgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCB0aGVuIHRoZSBkYXRhIGlzXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvIFwiYmFja3VwLnRhclwiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cbiIKICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtYXBrfC1ub2FwayBlbmFibGUvZGlzYWJsZSBiYWNrdXAgb2YgdGhlIC5hcGtzIHRoZW1zZWx2ZXNcbiIKICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSB0YXJmaWxlOyB0aGUgZGVmYXVsdCBpcyBub2Fway4pXG4iCiAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXNoYXJlZHwtbm9zaGFyZWQgZW5hYmxlL2Rpc2FibGUgYmFja3VwIG9mIHRoZSBkZXZpY2Unc1xuIgpAQCAtMjM5LDIyICsyMzksMzEgQEAKIH0KIAogc3RhdGljIHZvaWQgY29weV90b19maWxlKGludCBpbkZkLCBpbnQgb3V0RmQpIHsKLSAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICBjb25zdCBzaXplX3QgQlVGU0laRSA9IDMyICogMTAyNDsKKyAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhCVUZTSVpFKTsKICAgICBpbnQgbGVuOworICAgIGxvbmcgdG90YWwgPSAwOwogCiAgICAgRCgiY29weV90b19maWxlKCVkIC0+ICVkKVxuIiwgaW5GZCwgb3V0RmQpOwogICAgIGZvciAoOzspIHsKLSAgICAgICAgbGVuID0gYWRiX3JlYWQoaW5GZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGxlbiA9IGFkYl9yZWFkKGluRmQsIGJ1ZiwgQlVGU0laRSk7CiAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgRCgiY29weV90b19maWxlKCkgOiByZWFkIDAgYnl0ZXM7IGV4aXRpbmdcbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgY29udGludWU7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBEKCJjb3B5X3RvX2ZpbGUoKSA6IEVJTlRSLCByZXRyeWluZ1xuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBEKCJjb3B5X3RvX2ZpbGUoKSA6IGVycm9yICVkXG4iLCBlcnJubyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBhZGJfd3JpdGUob3V0RmQsIGJ1ZiwgbGVuKTsKKyAgICAgICAgdG90YWwgKz0gbGVuOwogICAgIH0KKyAgICBEKCJjb3B5X3RvX2ZpbGUoKSBmaW5pc2hlZCBhZnRlciAlbHUgYnl0ZXNcbiIsIHRvdGFsKTsKKyAgICBmcmVlKGJ1Zik7CiB9CiAKIHN0YXRpYyB2b2lkICpzdGRpbl9yZWFkX3RocmVhZCh2b2lkICp4KQpAQCAtNTY4LDEyICs1NzcsMjUgQEAKICAgICBjaGFyIGJ1Zls0MDk2XTsKICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSA9ICIuL2JhY2t1cC50YXIiOwogICAgIGludCBmZCwgb3V0RmQ7CisgICAgaW50IGksIGo7CiAKLSAgICBpZiAoIXN0cmNtcCgiLWYiLCBhcmd2WzFdKSkgewotICAgICAgICBpZiAoYXJnYyA8IDMpIHJldHVybiB1c2FnZSgpOwotICAgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMl07Ci0gICAgICAgIGFyZ2MgLT0gMjsKLSAgICAgICAgYXJndiArPSAyOworICAgIC8qIGJhcmUgImFkYiBiYWNrdXAiIGlzIG5vdCBhIHZhbGlkIGNvbW1hbmQgKi8KKyAgICBpZiAoYXJnYyA8IDIpIHJldHVybiB1c2FnZSgpOworCisgICAgLyogZmluZCwgZXh0cmFjdCwgYW5kIHVzZSBhbnkgLWYgYXJndW1lbnQgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKCItZiIsIGFyZ3ZbaV0pKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBhcmdjLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogLWYgcGFzc2VkIHdpdGggbm8gZmlsZW5hbWVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiB1c2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZW5hbWUgPSBhcmd2W2krMV07CisgICAgICAgICAgICBmb3IgKGogPSBpKzI7IGogPD0gYXJnYzsgKSB7CisgICAgICAgICAgICAgICAgYXJndltpKytdID0gYXJndltqKytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnYyAtPSAyOworICAgICAgICAgICAgYXJndlthcmdjXSA9IE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBvdXRGZCA9IGFkYl9vcGVuX21vZGUoZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDApOwpkaWZmIC0tZ2l0IGEvYWRiL3NlcnZpY2VzLmMgYi9hZGIvc2VydmljZXMuYwppbmRleCA2YmJkNmY4Li42OTQwYmU4IDEwMDY0NAotLS0gYS9hZGIvc2VydmljZXMuYworKysgYi9hZGIvc2VydmljZXMuYwpAQCAtMTI1LDE0ICsxMjUsMTIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHByb3BlcnR5X3NldCgic2VydmljZS5hZGIucm9vdCIsICIxIik7CiAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJyZXN0YXJ0aW5nIGFkYmQgYXMgcm9vdFxuIik7CiAgICAgICAgIHdyaXRleChmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CiAgICAgICAgIGFkYl9jbG9zZShmZCk7CiAKLSAgICAgICAgLy8gcXVpdCwgYW5kIGluaXQgd2lsbCByZXN0YXJ0IHVzIGFzIHJvb3QKLSAgICAgICAgc2xlZXAoMSk7Ci0gICAgICAgIGV4aXQoMSk7CisgICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBhIHByb3BlcnR5IHRyaWdnZXIgaW4gaW5pdC5yYyB0byByZXN0YXJ0IHVzCisgICAgICAgIHByb3BlcnR5X3NldCgic2VydmljZS5hZGIucm9vdCIsICIxIik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9hZGIvc29ja2V0cy5jIGIvYWRiL3NvY2tldHMuYwppbmRleCA0NWQ5MzVjLi5kZjIyM2IxIDEwMDY0NAotLS0gYS9hZGIvc29ja2V0cy5jCisrKyBiL2FkYi9zb2NrZXRzLmMKQEAgLTIyNSwxMCArMjI1LDEyIEBACiAgICAgICAgICAgcy0+aWQsIHMtPnBlZXItPmlkLCBzLT5wZWVyLT5mZCk7CiAgICAgICAgIHMtPnBlZXItPnBlZXIgPSAwOwogICAgICAgICAvLyB0d2VhayB0byBhdm9pZCBkZWFkbG9jawotICAgICAgICBpZiAocy0+cGVlci0+Y2xvc2UgPT0gbG9jYWxfc29ja2V0X2Nsb3NlKQorICAgICAgICBpZiAocy0+cGVlci0+Y2xvc2UgPT0gbG9jYWxfc29ja2V0X2Nsb3NlKSB7CiAgICAgICAgICAgICBsb2NhbF9zb2NrZXRfY2xvc2VfbG9ja2VkKHMtPnBlZXIpOwotICAgICAgICBlbHNlCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzLT5wZWVyLT5jbG9zZShzLT5wZWVyKTsKKyAgICAgICAgfQorICAgICAgICBzLT5wZWVyID0gMDsKICAgICB9CiAKICAgICAgICAgLyogSWYgd2UgYXJlIGFscmVhZHkgY2xvc2luZywgb3IgaWYgdGhlcmUgYXJlIG5vCkBAIC0yNzgsNiArMjgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYoZXJybm8gPT0gRUFHQUlOKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIGlmKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRCgiIGNsb3NpbmcgYWZ0ZXIgd3JpdGUgYmVjYXVzZSByPSVkIGFuZCBlcnJubyBpcyAlZFxuIiwgciwgZXJybm8pOwogICAgICAgICAgICAgICAgIHMtPmNsb3NlKHMpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTI5Myw2ICsyOTYsNyBAQAogICAgICAgICAgICAgKiogd2UgY2FuIG5vdyBkZXN0cm95IGl0LgogICAgICAgICAgICAgKi8KICAgICAgICAgaWYgKHMtPmNsb3NpbmcpIHsKKyAgICAgICAgICAgIEQoIiBjbG9zaW5nIGJlY2F1c2UgJ2Nsb3NpbmcnIGlzIHNldCBhZnRlciB3cml0ZVxuIik7CiAgICAgICAgICAgICBzLT5jbG9zZShzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMzYyLDYgKzM2Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgLyogRG9uJ3QgYWxsb3cgYSBmb3JjZWQgZW9mIGlmIGRhdGEgaXMgc3RpbGwgdGhlcmUgKi8KICAgICAgICAgaWYoKHMtPmZkZS5mb3JjZV9lb2YgJiYgIXIpIHx8IGlzX2VvZikgeworICAgICAgICAgICAgRCgiIGNsb3NpbmcgYmVjYXVzZSBpc19lb2Y9JWQgcj0lZCBzLT5mZGUuZm9yY2VfZW9mPSVkXG4iLCBpc19lb2YsIHIsIHMtPmZkZS5mb3JjZV9lb2YpOwogICAgICAgICAgICAgcy0+Y2xvc2Uocyk7CiAgICAgICAgIH0KICAgICB9CkBAIC03OTksNiArODA0LDcgQEAKICAgICBpZihzLT5wZWVyKSB7CiAgICAgICAgIHMtPnBlZXItPnBlZXIgPSAwOwogICAgICAgICBzLT5wZWVyLT5jbG9zZShzLT5wZWVyKTsKKyAgICAgICAgcy0+cGVlciA9IDA7CiAgICAgfQogICAgIGZyZWUocyk7CiB9CmRpZmYgLS1naXQgYS9hZGIvdXNiX3ZlbmRvcnMuYyBiL2FkYi91c2JfdmVuZG9ycy5jCmluZGV4IDFhYjUxMDAuLjJlZmZiMTIgMTAwNjQ0Ci0tLSBhL2FkYi91c2JfdmVuZG9ycy5jCisrKyBiL2FkYi91c2JfdmVuZG9ycy5jCkBAIC05MSw2ICs5MSwxNCBAQAogI2RlZmluZSBWRU5ET1JfSURfRlVOQUkgICAgICAgICAweDBGMUMKIC8vIEdpZ2FieXRlJ3MgVVNCIFZlbmRvciBJRAogI2RlZmluZSBWRU5ET1JfSURfR0lHQUJZVEUgICAgICAweDA0MTQKKy8vIElSaXZlcidzIFVTQiBWZW5kb3IgSUQKKyNkZWZpbmUgVkVORE9SX0lEX0lSSVZFUiAgICAgICAgMHgyNDIwCisvLyBDb21wYWwncyBVU0IgVmVuZG9yIElECisjZGVmaW5lIFZFTkRPUl9JRF9DT01QQUwgICAgICAgIDB4MTIxOQorLy8gVCAmIEEgTW9iaWxlIFBob25lcycgVVNCIFZlbmRvciBJRAorI2RlZmluZSBWRU5ET1JfSURfVF9BTkRfQSAgICAgICAweDFCQkIKKy8vIExlbm92bydzIFVTQiBWZW5kb3IgSUQKKyNkZWZpbmUgVkVORE9SX0lEX0xFTk9WTyAgICAgICAgMHgyMDA2CiAKIAogLyoqIGJ1aWx0LWluIHZlbmRvciBsaXN0ICovCkBAIC0xMjMsNiArMTMxLDEwIEBACiAgICAgVkVORE9SX0lEX1RJLAogICAgIFZFTkRPUl9JRF9GVU5BSSwKICAgICBWRU5ET1JfSURfR0lHQUJZVEUsCisgICAgVkVORE9SX0lEX0lSSVZFUiwKKyAgICBWRU5ET1JfSURfQ09NUEFMLAorICAgIFZFTkRPUl9JRF9UX0FORF9BLAorICAgIFZFTkRPUl9JRF9MRU5PVk8sCiB9OwogCiAjZGVmaW5lIEJVSUxUX0lOX1ZFTkRPUl9DT1VOVCAgICAoc2l6ZW9mKGJ1aWx0SW5WZW5kb3JJZHMpL3NpemVvZihidWlsdEluVmVuZG9ySWRzWzBdKSkKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC94ODYvdW53aW5kLmMgYi9kZWJ1Z2dlcmQveDg2L3Vud2luZC5jCmluZGV4IDhmODRlMDEuLjBhN2YwNGMgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC94ODYvdW53aW5kLmMKKysrIGIvZGVidWdnZXJkL3g4Ni91bndpbmQuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAvL2VicD09MCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWNrIGlzIHBvcGVkIHRvIHRoZSBib3R0b20gb3IgdGhlcmUgaXMgbm8gc3RhY2sgYXQgYWxsLgogICAgIHdoaWxlIChlYnApIHsKLSAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiMwJWQgIixzdGFja19sZXZlbCk7CiAgICAgICAgIG1pID0gcGNfdG9fbWFwaW5mbyhtYXAsIGVpcCwgJnJlbF9wYyk7CiAKICAgICAgICAgLyogU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgd2hhdCBzeW1ib2wgdGhpcyBzdGFjayBmcmFtZSByZXNpZGVzIGluICovCkBAIC0zMiw5ICszMSwxMSBAQAogICAgICAgICAgICAgc3ltID0gc3ltYm9sX3RhYmxlX2xvb2t1cChtaS0+c3ltYm9scywgcmVsX3BjKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3ltKSB7Ci0gICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgIGVpcDogJTA4eCAgJXMgKCVzKVxuIiwgZWlwLCBtaSA/IG1pLT5uYW1lIDogIiIsIHN5bS0+bmFtZSk7CisgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICMlMDJkICBlaXA6ICUwOHggICVzICglcylcbiIsCisgICAgICAgICAgICAgICAgIHN0YWNrX2xldmVsLCBlaXAsIG1pID8gbWktPm5hbWUgOiAiIiwgc3ltLT5uYW1lKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgZWlwOiAlMDh4ICAlc1xuIiwgZWlwLCBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgICAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAjJTAyZCAgZWlwOiAlMDh4ICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RhY2tfbGV2ZWwsIGVpcCwgbWkgPyBtaS0+bmFtZSA6ICIiKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YWNrX2xldmVsKys7CkBAIC00OSw3ICs1MCw2IEBACiAgICAgaWYgKGVicCkKICAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgInN0YWNrOiBcbiIpOwogICAgIHdoaWxlIChlYnApIHsKLSAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiMwJWQgXG4iLHN0YWNrX2xldmVsKTsKICAgICAgICAgc3RhY2tfcHRyID0gY3VyX3NwOwogICAgICAgICB3aGlsZSgoaW50KShlYnAgLSBzdGFja19wdHIpID49IDApIHsKICAgICAgICAgICAgIHN0YWNrX2NvbnRlbnQgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilzdGFja19wdHIsIE5VTEwpOwpAQCAtNjAsMTAgKzYwLDExIEBACiAgICAgICAgICAgICAgICAgc3ltID0gc3ltYm9sX3RhYmxlX2xvb2t1cChtaS0+c3ltYm9scywgcmVsX3BjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzeW0pIHsKLSAgICAgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICUwOHggICUwOHggICVzICglcylcbiIsCi0gICAgICAgICAgICAgICAgICAgIHN0YWNrX3B0ciwgc3RhY2tfY29udGVudCwgbWkgPyBtaS0+bmFtZSA6ICIiLCBzeW0tPm5hbWUpOworICAgICAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgIyUwMmQgICUwOHggICUwOHggICVzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdGFja19sZXZlbCwgc3RhY2tfcHRyLCBzdGFja19jb250ZW50LCBtaSA/IG1pLT5uYW1lIDogIiIsIHN5bS0+bmFtZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgJTA4eCAgJTA4eCAgJXNcbiIsIHN0YWNrX3B0ciwgc3RhY2tfY29udGVudCwgbWkgPyBtaS0+bmFtZSA6ICIiKTsKKyAgICAgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICMlMDJkICAlMDh4ICAlMDh4ICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YWNrX2xldmVsLCBzdGFja19wdHIsIHN0YWNrX2NvbnRlbnQsIG1pID8gbWktPm5hbWUgOiAiIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YWNrX3B0ciA9IHN0YWNrX3B0ciArIDQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCBiL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oCmluZGV4IGYzZmIzNzAuLjJkZWE2ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oCisrKyBiL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oCkBAIC01NCw2ICs1NCw5IEBACiAvKiBhZGQgYSBuYW1lZCBjaGlsZCB0byBhIGNvbmZpZyBub2RlIChvciBtb2RpZnkgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMpICovCiB2b2lkIGNvbmZpZ19zZXQoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKIAorLyogZnJlZSBhIGNvbmZpZyBub2RlIHRyZWUgKi8KK3ZvaWQgY29uZmlnX2ZyZWUoY25vZGUgKnJvb3QpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvcGFydGl0aW9uX3V0aWxzLmggYi9pbmNsdWRlL2N1dGlscy9wYXJ0aXRpb25fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTdkZjkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jdXRpbHMvcGFydGl0aW9uX3V0aWxzLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0NVVElMU19QQVJUSVRJT05fV0lQRURfSF9fCisjZGVmaW5lIF9fQ1VUSUxTX1BBUlRJVElPTl9XSVBFRF9IX18KKworX19CRUdJTl9ERUNMUworCitpbnQgcGFydGl0aW9uX3dpcGVkKGNoYXIgKnNvdXJjZSk7Cit2b2lkIGVyYXNlX2Zvb3Rlcihjb25zdCBjaGFyICpkZXZfcGF0aCwgbG9uZyBsb25nIHNpemUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX19DVVRJTFNfUEFSVElUSU9OX1dJUEVEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvcXRhZ3VpZC5oIGIvaW5jbHVkZS9jdXRpbHMvcXRhZ3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2N1dGlscy9xdGFndWlkLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19DVVRJTFNfUVRBR1VJRF9ICisjZGVmaW5lIF9fQ1VUSUxTX1FUQUdVSURfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIFNldCB0YWdzIChhbmQgb3duaW5nIFVJRHMpIGZvciBuZXR3b3JrIHNvY2tldHMuCisqLworZXh0ZXJuIGludCBzZXRfcXRhZ3VpZChpbnQgc29ja2ZkLCBpbnQgdGFnLCB1aWRfdCB1aWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19DVVRJTFNfUVRBR19VSURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIGIvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oCmluZGV4IGFhODY4MmUuLjE5Y2FlMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaAorKysgYi9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAogI2lmZGVmIEhBVkVfV0lOU09DSwogI2luY2x1ZGUgPHdpbnNvY2syLmg+CkBAIC05Miw3ICs5MywxOCBAQAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZXNwYWNlSWQsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgc29ja2V0X2xvY2FsX2NsaWVudChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZXNwYWNlSWQsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgc29ja2V0X2luYWRkcl9hbnlfc2VydmVyKGludCBwb3J0LCBpbnQgdHlwZSk7Ci0gICAgCisKKy8qCisgKiBzb2NrZXRfcGVlcl9pc190cnVzdGVkIC0gVGFrZXMgYSBzb2NrZXQgd2hpY2ggaXMgcHJlc3VtZWQgdG8gYmUgYQorICogY29ubmVjdGVkIGxvY2FsIHNvY2tldCAoZS5nLiBBRl9MT0NBTCkgYW5kIHJldHVybnMgd2hldGhlciB0aGUgcGVlcgorICogKHRoZSB1c2VyaWQgdGhhdCBvd25zIHRoZSBwcm9jZXNzIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhhdCBzb2NrZXQpCisgKiBpcyBvbmUgb2YgdGhlIHR3byB0cnVzdGVkIHVzZXJpZHMsIHJvb3Qgb3Igc2hlbGwuCisgKgorICogTm90ZTogVGhpcyBvbmx5IHdvcmtzIGFzIGFkdmVydGlzZWQgb24gdGhlIEFuZHJvaWQgT1MgYW5kIGFsd2F5cworICoganVzdCByZXR1cm5zIHRydWUgd2hlbiBjYWxsZWQgb24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCisgKi8KK2V4dGVybiBib29sIHNvY2tldF9wZWVyX2lzX3RydXN0ZWQoaW50IGZkKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIGIvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgKaW5kZXggNTg3MTQ5Yy4uNWY1ZTZjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgKKysrIGIvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgKQEAgLTIzLDcgKzIzLDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLXNzaXplX3QgdWV2ZW50X2NoZWNrZWRfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworc3NpemVfdCB1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXR1dGlscy9pZmMuaCBiL2luY2x1ZGUvbmV0dXRpbHMvaWZjLmgKaW5kZXggMzY4MjdlZS4uNTc1ZTcyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXR1dGlscy9pZmMuaAorKysgYi9pbmNsdWRlL25ldHV0aWxzL2lmYy5oCkBAIC0zNCw3ICszNCw3IEBACiBleHRlcm4gaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKIGV4dGVybiBpbnQgaWZjX2Rpc2FibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKIAotZXh0ZXJuIGludCBpZmNfcmVzZXRfY29ubmVjdGlvbnMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2V4dGVybiBpbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSwgY29uc3QgaW50IHJlc2V0X21hc2spOwogCiBleHRlcm4gaW50IGlmY19nZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgKmFkZHIpOwogZXh0ZXJuIGludCBpZmNfc2V0X2FkZHIoY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IGFkZHIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBiL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgKaW5kZXggNTVkOTIyMC4uZmM3MWExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCkBAIC01Myw3ICs1Myw3IEBACiAjZGVmaW5lIEFJRF9LRVlTVE9SRSAgICAgIDEwMTcgIC8qIGtleXN0b3JlIHN1YnN5c3RlbSAqLwogI2RlZmluZSBBSURfVVNCICAgICAgICAgICAxMDE4ICAvKiBVU0IgZGV2aWNlcyAqLwogI2RlZmluZSBBSURfRFJNICAgICAgICAgICAxMDE5ICAvKiBEUk0gc2VydmVyICovCi0jZGVmaW5lIEFJRF9LRVlDSEFJTiAgICAgIDEwMjAgIC8qIGtleWNoYWluIHNlcnZpY2UgKi8KKyNkZWZpbmUgQUlEX0FWQUlMQUJMRSAgICAgMTAyMCAgLyogYXZhaWxhYmxlIGZvciB1c2UgKi8KICNkZWZpbmUgQUlEX0dQUyAgICAgICAgICAgMTAyMSAgLyogR1BTIGRhZW1vbiAqLwogI2RlZmluZSBBSURfVU5VU0VEMSAgICAgICAxMDIyICAvKiBkZXByZWNhdGVkLCBETyBOT1QgVVNFICovCiAjZGVmaW5lIEFJRF9NRURJQV9SVyAgICAgIDEwMjMgIC8qIGludGVybmFsIG1lZGlhIHN0b3JhZ2Ugd3JpdGUgYWNjZXNzICovCkBAIC03MSw2ICs3MSw4IEBACiAjZGVmaW5lIEFJRF9JTkVUICAgICAgICAgIDMwMDMgIC8qIGNhbiBjcmVhdGUgQUZfSU5FVCBhbmQgQUZfSU5FVDYgc29ja2V0cyAqLwogI2RlZmluZSBBSURfTkVUX1JBVyAgICAgICAzMDA0ICAvKiBjYW4gY3JlYXRlIHJhdyBJTkVUIHNvY2tldHMgKi8KICNkZWZpbmUgQUlEX05FVF9BRE1JTiAgICAgMzAwNSAgLyogY2FuIGNvbmZpZ3VyZSBpbnRlcmZhY2VzIGFuZCByb3V0aW5nIHRhYmxlcy4gKi8KKyNkZWZpbmUgQUlEX05FVF9CV19TVEFUUyAgMzAwNiAgLyogcmVhZCBiYW5kd2lkdGggc3RhdGlzdGljcyAqLworI2RlZmluZSBBSURfTkVUX0JXX0FDQ1QgICAzMDA3ICAvKiBjaGFuZ2UgYmFuZHdpZHRoIHN0YXRpc3RpY3MgYWNjb3VudGluZyAqLwogCiAjZGVmaW5lIEFJRF9NSVNDICAgICAgICAgIDk5OTggIC8qIGFjY2VzcyB0byBtaXNjIHN0b3JhZ2UgKi8KICNkZWZpbmUgQUlEX05PQk9EWSAgICAgICAgOTk5OQpAQCAtMTAxLDcgKzEwMyw3IEBACiAgICAgeyAiaW5zdGFsbCIsICAgQUlEX0lOU1RBTEwsIH0sCiAgICAgeyAibWVkaWEiLCAgICAgQUlEX01FRElBLCB9LAogICAgIHsgImRybSIsICAgICAgIEFJRF9EUk0sIH0sCi0gICAgeyAia2V5Y2hhaW4iLCAgQUlEX0tFWUNIQUlOLCB9LAorICAgIHsgImF2YWlsYWJsZSIsIEFJRF9BVkFJTEFCTEUsIH0sCiAgICAgeyAibmZjIiwgICAgICAgQUlEX05GQywgfSwKICAgICB7ICJzaGVsbCIsICAgICBBSURfU0hFTEwsIH0sCiAgICAgeyAiY2FjaGUiLCAgICAgQUlEX0NBQ0hFLCB9LApAQCAtMTE4LDYgKzEyMCw4IEBACiAgICAgeyAiaW5ldCIsICAgICAgQUlEX0lORVQsIH0sCiAgICAgeyAibmV0X3JhdyIsICAgQUlEX05FVF9SQVcsIH0sCiAgICAgeyAibmV0X2FkbWluIiwgQUlEX05FVF9BRE1JTiwgfSwKKyAgICB7ICJuZXRfYndfc3RhdHMiLCBBSURfTkVUX0JXX1NUQVRTLCB9LAorICAgIHsgIm5ldF9id19hY2N0IiwgQUlEX05FVF9CV19BQ0NULCB9LAogICAgIHsgIm1pc2MiLCAgICAgIEFJRF9NSVNDLCB9LAogICAgIHsgIm5vYm9keSIsICAgIEFJRF9OT0JPRFksIH0sCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXN0ZW0vYXVkaW8uaCBiL2luY2x1ZGUvc3lzdGVtL2F1ZGlvLmgKaW5kZXggOGYyYWMwYy4uMmUyNjFjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zeXN0ZW0vYXVkaW8uaAorKysgYi9pbmNsdWRlL3N5c3RlbS9hdWRpby5oCkBAIC04OCw4ICs4OCwxMCBAQAogCiAvKiBQQ00gc3ViIGZvcm1hdHMgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUICAgICAgICAgID0gMHgxLCAvKiBETyBOT1QgQ0hBTkdFICovCi0gICAgQVVESU9fRk9STUFUX1BDTV9TVUJfOF9CSVQgICAgICAgICAgID0gMHgyLCAvKiBETyBOT1QgQ0hBTkdFICovCisgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUICAgICAgICAgID0gMHgxLCAvKiBETyBOT1QgQ0hBTkdFIC0gUENNIHNpZ25lZCAxNiBiaXRzICovCisgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfOF9CSVQgICAgICAgICAgID0gMHgyLCAvKiBETyBOT1QgQ0hBTkdFIC0gUENNIHVuc2lnbmVkIDggYml0cyAqLworICAgIEFVRElPX0ZPUk1BVF9QQ01fU1VCXzMyX0JJVCAgICAgICAgICA9IDB4MywgLyogUENNIHNpZ25lZCAuMzEgZml4ZWQgcG9pbnQgKi8KKyAgICBBVURJT19GT1JNQVRfUENNX1NVQl84XzI0X0JJVCAgICAgICAgPSAweDQsIC8qIFBDTSBzaWduZWQgNy4yNCBmaXhlZCBwb2ludCAqLwogfSBhdWRpb19mb3JtYXRfcGNtX3N1Yl9mbXRfdDsKIAogLyogTVAzIHN1YiBmb3JtYXQgZmllbGQgZGVmaW5pdGlvbiA6IGNhbiB1c2UgMTEgTFNCcyBpbiB0aGUgc2FtZSB3YXkgYXMgTVAzCkBAIC0xNDQsNiArMTQ2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUKSwKICAgICBBVURJT19GT1JNQVRfUENNXzhfQklUICAgICAgICAgICA9IChBVURJT19GT1JNQVRfUENNIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX1NVQl84X0JJVCksCisgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQgICAgICAgICAgPSAoQVVESU9fRk9STUFUX1BDTSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMzJfQklUKSwKKyAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUICAgICAgICA9IChBVURJT19GT1JNQVRfUENNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX1NVQl84XzI0X0JJVCksCiB9IGF1ZGlvX2Zvcm1hdF90OwogCiAvKiBDaGFubmVsIG1hc2sgZGVmaW5pdGlvbnMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBKQVZBIHZhbHVlcyBpbgpAQCAtMzYzLDYgKzM2OSwxMCBAQAogewogICAgIHN3aXRjaCAoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgewogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTToKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAgICAgICAgIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzhfQklUKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICBjYXNlIEFVRElPX0ZPUk1BVF9NUDM6CiAgICAgY2FzZSBBVURJT19GT1JNQVRfQU1SX05COgogICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9XQjoKQEAgLTM3OCwxNSArMzg4LDI5IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBhdWRpb19pc19saW5lYXJfcGNtKHVpbnQzMl90IGZvcm1hdCkKIHsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIHJldHVybiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pOwogfQogCitzdGF0aWMgaW5saW5lIHNpemVfdCBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHVpbnQzMl90IGZvcm1hdCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmggYi9pbmNsdWRlL3N5c3RlbS9hdWRpb19wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBhZjdkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09SRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0NPUkVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGVudW1zIHdlcmUgbW92ZWQgaGVyZSBtb3N0bHkgZnJvbQorICogZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorICovCisKKy8qIHJlcXVlc3QgdG8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgd2l0aCBnZXRfb3V0cHV0KCkgKGJ5IG9wcG9zaXRpb24gdG8KKyAqIHNoYXJpbmcgYW4gb3V0cHV0IHdpdGggb3RoZXIgQXVkaW9UcmFja3MpCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0lORElSRUNUID0gMHgwLAorICAgIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1QgPSAweDEKK30gYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190OworCisvKiBkZXZpY2UgY2F0ZWdvcmllcyB1c2VkIGZvciBhdWRpb19wb2xpY3ktPnNldF9mb3JjZV91c2UoKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUiwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUywKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPLAorICAgIEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQLAorICAgIEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlksCisgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLLAorICAgIEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0ssCisgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLLAorICAgIEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0ssCisKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX01BWCA9IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UIC0gMSwKKworICAgIEFVRElPX1BPTElDWV9GT1JDRV9ERUZBVUxUID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUsCit9IGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q7CisKKy8qIHVzYWdlcyB1c2VkIGZvciBhdWRpb19wb2xpY3ktPnNldF9mb3JjZV91c2UoKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04sCisgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0ssCisKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCwKKyAgICBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX01BWCA9IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UIC0gMSwKK30gYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90OworCisvKiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZXMgdXNlZCBmb3IgYXVkaW9fcG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUoKQorICovCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisKKyAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0NOVCwKKyAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX01BWCA9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQ05UIC0gMSwKK30gYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0geworICAgIC8qIFVzZWQgdG8gZ2VuZXJhdGUgYSB0b25lIHRvIG5vdGlmeSB0aGUgdXNlciBvZiBhCisgICAgICogbm90aWZpY2F0aW9uL2FsYXJtL3Jpbmd0b25lIHdoaWxlIHRoZXkgYXJlIGluIGEgY2FsbC4gKi8KKyAgICBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiA9IDAsCisKKyAgICBBVURJT19QT0xJQ1lfVE9ORV9DTlQsCisgICAgQVVESU9fUE9MSUNZX1RPTkVfTUFYICAgICAgICAgICAgICAgICAgPSBBVURJT19QT0xJQ1lfVE9ORV9DTlQgLSAxLAorfSBhdWRpb19wb2xpY3lfdG9uZV90OworCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhdWRpb19pc19sb3dfdmlzaWJpbGl0eShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBzd2l0Y2ggKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCitfX0VORF9ERUNMUworCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fUE9MSUNZX0NPUkVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXN0ZW0vd2luZG93LmggYi9pbmNsdWRlL3N5c3RlbS93aW5kb3cuaAppbmRleCA1NzYyYTUwLi40ZDUxOWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c3RlbS93aW5kb3cuaAorKysgYi9pbmNsdWRlL3N5c3RlbS93aW5kb3cuaApAQCAtMTA4LDggKzEwOCw4IEBACiAvKiBhdHRyaWJ1dGVzIHF1ZXJpYWJsZSB3aXRoIHF1ZXJ5KCkgKi8KIGVudW0gewogICAgIE5BVElWRV9XSU5ET1dfV0lEVEggICAgID0gMCwKLSAgICBOQVRJVkVfV0lORE9XX0hFSUdIVCwKLSAgICBOQVRJVkVfV0lORE9XX0ZPUk1BVCwKKyAgICBOQVRJVkVfV0lORE9XX0hFSUdIVCAgICA9IDEsCisgICAgTkFUSVZFX1dJTkRPV19GT1JNQVQgICAgPSAyLAogCiAgICAgLyogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBtdXN0IHJlbWFpbiB1bi1kZXF1ZXVlZCBhZnRlciBhIGJ1ZmZlcgogICAgICAqIGhhcyBiZWVuIHF1ZXVlZC4gIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IGlmIHNldF9idWZmZXJfY291bnQgd2FzIHVzZWQgdG8KQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIDQuIENhbmNlbCBNIGJ1ZmZlcnMKICAgICAgKiA1LiBRdWV1ZSwgZGVxdWV1ZSwgcXVldWUsIGRlcXVldWUsIGFkIGluZmluaXR1bQogICAgICAqLwotICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKKyAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMgPSAzLAogCiAgICAgLyogQ2hlY2sgd2hldGhlciBxdWV1ZUJ1ZmZlciBvcGVyYXRpb25zIG9uIHRoZSBBTmF0aXZlV2luZG93IHNlbmQgdGhlIGJ1ZmZlcgogICAgICAqIHRvIHRoZSB3aW5kb3cgY29tcG9zaXRvci4gIFRoZSBxdWVyeSBzZXRzIHRoZSByZXR1cm5lZCAndmFsdWUnIGFyZ3VtZW50CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgKiBtZWNoYW5pc20gKGUuZy4gdGhlIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIGZsYWcpIHNob3VsZCBiZSB1c2VkIGluCiAgICAgICogY29uanVuY3Rpb24gd2l0aCB0aGlzIHF1ZXJ5LgogICAgICAqLwotICAgIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKKyAgICBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIgPSA0LAogCiAgICAgLyogR2V0IHRoZSBjb25jcmV0ZSB0eXBlIG9mIGEgQU5hdGl2ZVdpbmRvdy4gIFNlZSBiZWxvdyBmb3IgdGhlIGxpc3Qgb2YKICAgICAgKiBwb3NzaWJsZSByZXR1cm4gdmFsdWVzLgpAQCAtMTUyLDI0ICsxNTIsMTAzIEBACiAgICAgICogVGhpcyBxdWVyeSBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgYW5kIHdpbGwKICAgICAgKiBsaWtlbHkgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuCiAgICAgICovCi0gICAgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFLAorICAgIE5BVElWRV9XSU5ET1dfQ09OQ1JFVEVfVFlQRSA9IDUsCisKKworICAgIC8qCisgICAgICogRGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBBTmF0aXZlV2luZG93LCB0aGVzZSBhcmUgdGhlIGRpbWVuc2lvbnMKKyAgICAgKiBvZiB0aGUgd2luZG93IGlycmVzcGVjdGl2ZSBvZiB0aGUgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19ESU1FTlNJT05TCisgICAgICogY2FsbC4KKyAgICAgKi8KKyAgICBOQVRJVkVfV0lORE9XX0RFRkFVTFRfV0lEVEggPSA2LAorICAgIE5BVElWRV9XSU5ET1dfREVGQVVMVF9IRUlHSFQgPSA3LAorCisgICAgLyoKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiB0aGF0IHdpbGwgbW9zdC1saWtlbHkgYmUgYXBwbGllZCB0byBidWZmZXJzLiBUaGlzIGlzIG9ubHkKKyAgICAgKiBhIGhpbnQsIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24gYXBwbGllZCBtaWdodCBiZSBkaWZmZXJlbnQuCisgICAgICoKKyAgICAgKiBJTlRFTkRFRCBVU0U6CisgICAgICoKKyAgICAgKiBUaGUgdHJhbnNmb3JtIGhpbnQgY2FuIGJlIHVzZWQgYnkgYSBwcm9kdWNlciwgZm9yIGluc3RhbmNlIHRoZSBHTEVTCisgICAgICogZHJpdmVyLCB0byBwcmUtcm90YXRlIHRoZSByZW5kZXJpbmcgc3VjaCB0aGF0IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbgorICAgICAqIGluIHRoZSBjb21wb3NlciBpcyBpZGVudGl0eS4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB1c2VkIGluCisgICAgICogY29uanVuY3Rpb24gd2l0aCB0aGUgaC93IGNvbXBvc2VyIEhBTCwgaW4gc2l0dWF0aW9ucyB3aGVyZSBpdAorICAgICAqIGNhbm5vdCBoYW5kbGUgYXJiaXRyYXJ5IHJvdGF0aW9ucy4KKyAgICAgKgorICAgICAqIDEuIEJlZm9yZSBkZXF1ZXVpbmcgYSBidWZmZXIsIHRoZSBHTCBkcml2ZXIgKG9yIGFueSBvdGhlciBBTlcgY2xpZW50KQorICAgICAqICAgIHF1ZXJpZXMgdGhlIEFOVyBmb3IgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVC4KKyAgICAgKgorICAgICAqIDIuIFRoZSBHTCBkcml2ZXIgb3ZlcnJpZGVzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBBTlcgdG8KKyAgICAgKiAgICBhY2NvdW50IGZvciBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ISU5ULiBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcKKyAgICAgKiAgICBOQVRJVkVfV0lORE9XX0RFRkFVTFRfe1dJRFRIIHwgSEVJR0hUfSwgc3dhcHBpbmcgdGhlIGRpbWVuc2lvbnMKKyAgICAgKiAgICBhY2NvcmRpbmcgdG8gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVCBhbmQgY2FsbGluZworICAgICAqICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucygpLgorICAgICAqCisgICAgICogMy4gVGhlIEdMIGRyaXZlciBkZXF1ZXVlcyBhIGJ1ZmZlciBvZiB0aGUgbmV3IHByZS1yb3RhdGVkIHNpemUuCisgICAgICoKKyAgICAgKiA0LiBUaGUgR0wgZHJpdmVyIHJlbmRlcnMgdG8gdGhlIGJ1ZmZlciBzdWNoIHRoYXQgdGhlIGltYWdlIGlzCisgICAgICogICAgYWxyZWFkeSB0cmFuc2Zvcm1lZCwgdGhhdCBpcyBhcHBseWluZyBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ISU5UCisgICAgICogICAgdG8gdGhlIHJlbmRlcmluZy4KKyAgICAgKgorICAgICAqIDUuIFRoZSBHTCBkcml2ZXIgY2FsbHMgbmF0aXZlX3dpbmRvd19zZXRfdHJhbnNmb3JtIHRvIGFwcGx5CisgICAgICogICAgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgYnVmZmVyIGl0IGp1c3QgcmVuZGVyZWQuCisgICAgICogICAgSW4gb3JkZXIgdG8gZG8gdGhpcywgdGhlIEdMIGRyaXZlciBuZWVkcworICAgICAqICAgIHRvIGNhbGN1bGF0ZSB0aGUgaW52ZXJzZSBvZiBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ISU5ULCB0aGlzIGlzCisgICAgICogICAgZG9uZSBlYXNpbHk6CisgICAgICoKKyAgICAgKiAgICAgICAgaW50IGhpbnRUcmFuc2Zvcm0sIGludmVyc2VUcmFuc2Zvcm07CisgICAgICogICAgICAgIHF1ZXJ5KC4uLiwgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVCwgJmhpbnRUcmFuc2Zvcm0pOworICAgICAqICAgICAgICBpbnZlcnNlVHJhbnNmb3JtID0gaGludFRyYW5zZm9ybTsKKyAgICAgKiAgICAgICAgaWYgKGhpbnRUcmFuc2Zvcm0gJiBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgKiAgICAgICAgICAgIGludmVyc2VUcmFuc2Zvcm0gXj0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAqCisgICAgICoKKyAgICAgKiA2LiBUaGUgR0wgZHJpdmVyIHF1ZXVlcyB0aGUgcHJlLXRyYW5zZm9ybWVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIDcuIFRoZSBjb21wb3NlciBjb21iaW5lcyB0aGUgYnVmZmVyIHRyYW5zZm9ybSB3aXRoIHRoZSBkaXNwbGF5CisgICAgICogICAgdHJhbnNmb3JtLiAgSWYgdGhlIGJ1ZmZlciB0cmFuc2Zvcm0gaGFwcGVucyB0byBjYW5jZWwgb3V0IHRoZQorICAgICAqICAgIGRpc3BsYXkgdHJhbnNmb3JtIHRoZW4gbm8gcm90YXRpb24gaXMgbmVlZGVkLgorICAgICAqCisgICAgICovCisgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVCA9IDgsCiB9OwogCiAvKiB2YWxpZCBvcGVyYXRpb25zIGZvciB0aGUgKCpwZXJmb3JtKSgpIGhvb2sgKi8KIGVudW0gewotICAgIE5BVElWRV9XSU5ET1dfU0VUX1VTQUdFICA9IDAsCi0gICAgTkFUSVZFX1dJTkRPV19DT05ORUNULAotICAgIE5BVElWRV9XSU5ET1dfRElTQ09OTkVDVCwKLSAgICBOQVRJVkVfV0lORE9XX1NFVF9DUk9QLAotICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUl9DT1VOVCwKLSAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0dFT01FVFJZLAotICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVFJBTlNGT1JNLAotICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVElNRVNUQU1QLAorICAgIE5BVElWRV9XSU5ET1dfU0VUX1VTQUdFICAgICAgICAgICAgICAgICA9ICAwLAorICAgIE5BVElWRV9XSU5ET1dfQ09OTkVDVCAgICAgICAgICAgICAgICAgICA9ICAxLAorICAgIE5BVElWRV9XSU5ET1dfRElTQ09OTkVDVCAgICAgICAgICAgICAgICA9ICAyLAorICAgIE5BVElWRV9XSU5ET1dfU0VUX0NST1AgICAgICAgICAgICAgICAgICA9ICAzLAorICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUl9DT1VOVCAgICAgICAgICA9ICA0LAorICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfR0VPTUVUUlkgICAgICA9ICA1LCAgIC8qIGRlcHJlY2F0ZWQgKi8KKyAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RSQU5TRk9STSAgICAgPSAgNiwKKyAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUCAgICAgPSAgNywKKyAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0RJTUVOU0lPTlMgICAgPSAgOCwKKyAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0ZPUk1BVCAgICAgICAgPSAgOSwKKyAgICBOQVRJVkVfV0lORE9XX1NFVF9TQ0FMSU5HX01PREUgICAgICAgICAgPSAxMCwKKyAgICBOQVRJVkVfV0lORE9XX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKiBwcml2YXRlICovCisgICAgTkFUSVZFX1dJTkRPV19VTkxPQ0tfQU5EX1BPU1QgICAgICAgICAgID0gMTIsICAgLyogcHJpdmF0ZSAqLwogfTsKIAogLyogcGFyYW1ldGVyIGZvciBOQVRJVkVfV0lORE9XX1tESVNdQ09OTkVDVCAqLwogZW51bSB7Ci0gICAgTkFUSVZFX1dJTkRPV19BUElfRUdMID0gMQorICAgIC8qIEJ1ZmZlcnMgd2lsbCBiZSBxdWV1ZWQgYnkgRUdMIHZpYSBlZ2xTd2FwQnVmZmVycyBhZnRlciBiZWluZyBmaWxsZWQgdXNpbmcKKyAgICAgKiBPcGVuR0wgRVMuCisgICAgICovCisgICAgTkFUSVZFX1dJTkRPV19BUElfRUdMID0gMSwKKworICAgIC8qIEJ1ZmZlcnMgd2lsbCBiZSBxdWV1ZWQgYWZ0ZXIgYmVpbmcgZmlsbGVkIHVzaW5nIHRoZSBDUFUKKyAgICAgKi8KKyAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUgPSAyLAorCisgICAgLyogQnVmZmVycyB3aWxsIGJlIHF1ZXVlZCBieSBTdGFnZWZyaWdodCBhZnRlciBiZWluZyBmaWxsZWQgYnkgYSB2aWRlbworICAgICAqIGRlY29kZXIuICBUaGUgdmlkZW8gZGVjb2RlciBjYW4gZWl0aGVyIGJlIGEgc29mdHdhcmUgb3IgaGFyZHdhcmUgZGVjb2Rlci4KKyAgICAgKi8KKyAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSA9IDMsCisKKyAgICAvKiBCdWZmZXJzIHdpbGwgYmUgcXVldWVkIGJ5IHRoZSB0aGUgY2FtZXJhIEhBTC4KKyAgICAgKi8KKyAgICBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEgPSA0LAogfTsKIAogLyogcGFyYW1ldGVyIGZvciBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RSQU5TRk9STSAqLwpAQCAtMTg2LDExICsyNjUsMjEgQEAKICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwLAogfTsKIAorLyogcGFyYW1ldGVyIGZvciBOQVRJVkVfV0lORE9XX1NFVF9TQ0FMSU5HX01PREUgKi8KK2VudW0geworICAgIC8qIHRoZSB3aW5kb3cgY29udGVudCBpcyBub3QgdXBkYXRlZCAoZnJvemVuKSB1bnRpbCBhIGJ1ZmZlciBvZgorICAgICAqIHRoZSB3aW5kb3cgc2l6ZSBpcyByZWNlaXZlZCAoZW5xdWV1ZWQpCisgICAgICovCisgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFICAgICAgICAgICA9IDAsCisgICAgLyogdGhlIGJ1ZmZlciBpcyBzY2FsZWQgaW4gYm90aCBkaW1lbnNpb25zIHRvIG1hdGNoIHRoZSB3aW5kb3cgc2l6ZSAqLworICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyAgPSAxLAorfTsKKwogLyogdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEUgcXVlcnkgKi8KIGVudW0gewotICAgIE5BVElWRV9XSU5ET1dfRlJBTUVCVUZGRVIsICAgICAgICAgICAgICAgICAgLy8gRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cKLSAgICBOQVRJVkVfV0lORE9XX1NVUkZBQ0UsICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UKLSAgICBOQVRJVkVfV0lORE9XX1NVUkZBQ0VfVEVYVFVSRV9DTElFTlQsICAgICAgIC8vIFN1cmZhY2VUZXh0dXJlQ2xpZW50CisgICAgTkFUSVZFX1dJTkRPV19GUkFNRUJVRkZFUiAgICAgICAgICAgICAgID0gMCwgLyogRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cgKi8KKyAgICBOQVRJVkVfV0lORE9XX1NVUkZBQ0UgICAgICAgICAgICAgICAgICAgPSAxLCAvKiBTdXJmYWNlICovCisgICAgTkFUSVZFX1dJTkRPV19TVVJGQUNFX1RFWFRVUkVfQ0xJRU5UICAgID0gMiwgLyogU3VyZmFjZVRleHR1cmVDbGllbnQgKi8KIH07CiAKIC8qIHBhcmFtZXRlciBmb3IgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19USU1FU1RBTVAKQEAgLTIxMiw4ICszMDEsOCBAQAogICAgICAgICBtZW1zZXQoY29tbW9uLnJlc2VydmVkLCAwLCBzaXplb2YoY29tbW9uLnJlc2VydmVkKSk7CiAgICAgfQogCi0gICAgLy8gSW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgc3A8QU5hdGl2ZVdpbmRvdz4gZXhwZWN0cyBzbyB0aGF0IGl0Ci0gICAgLy8gY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSByZWZjb3VudCBBTmF0aXZlV2luZG93J3MuCisgICAgLyogSW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgc3A8QU5hdGl2ZVdpbmRvdz4gZXhwZWN0cyBzbyB0aGF0IGl0CisgICAgICAgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSByZWZjb3VudCBBTmF0aXZlV2luZG93J3MuICovCiAgICAgdm9pZCBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKICAgICAgICAgY29tbW9uLmluY1JlZihjb25zdF9jYXN0PGFuZHJvaWRfbmF0aXZlX2Jhc2VfdCo+KCZjb21tb24pKTsKICAgICB9CkBAIC0zMDMsOSArMzkyLDE0IEBACiAgICAgICogICAgIE5BVElWRV9XSU5ET1dfRElTQ09OTkVDVAogICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9DUk9QCiAgICAgICogICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUl9DT1VOVAotICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0dFT01FVFJZCisgICAgICogICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfR0VPTUVUUlkgIChkZXByZWNhdGVkKQogICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RSQU5TRk9STQogICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUAorICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0RJTUVOU0lPTlMKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19GT1JNQVQKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19TRVRfU0NBTElOR19NT0RFCisgICAgICogICAgIE5BVElWRV9XSU5ET1dfTE9DSyAgICAgICAgICAgICAgICAgICAocHJpdmF0ZSkKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19VTkxPQ0tfQU5EX1BPU1QgICAgICAgIChwcml2YXRlKQogICAgICAqCiAgICAgICovCiAKQEAgLTQwNCwxNiArNDk4LDEyIEBACiAKIC8qCiAgKiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KC4uLiwgaW50IHcsIGludCBoLCBpbnQgZm9ybWF0KQotICogQWxsIGJ1ZmZlcnMgZGVxdWV1ZWQgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgaGF2ZSB0aGUgZ2VvbWV0cnkgc3BlY2lmaWVkLgotICogSW4gcGFydGljdWxhciwgYWxsIGJ1ZmZlcnMgd2lsbCBoYXZlIGEgZml4ZWQtc2l6ZSwgaW5kZXBlbmRlbnQgZm9ybSB0aGUKLSAqIG5hdGl2ZS13aW5kb3cgc2l6ZS4gVGhleSB3aWxsIGJlIGFwcHJvcHJpYXRlbHkgc2NhbGVkIHRvIHRoZSB3aW5kb3ctc2l6ZQotICogdXBvbiBjb21wb3NpdGlvbi4KKyAqIEFsbCBidWZmZXJzIGRlcXVldWVkIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGhhdmUgdGhlIGRpbWVuc2lvbnMgYW5kIGZvcm1hdAorICogc3BlY2lmaWVkLiAgQSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKKyAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfc2l6ZSBhbmQgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQuCiAgKgotICogSWYgYWxsIHBhcmFtZXRlcnMgYXJlIDAsIHRoZSBub3JtYWwgYmVoYXZpb3IgaXMgcmVzdG9yZWQuIFRoYXQgaXMsCi0gKiBkZXF1ZXVlZCBidWZmZXJzIGZvbGxvd2luZyB0aGlzIGNhbGwgd2lsbCBiZSBzaXplZCB0byB0aGUgd2luZG93J3Mgc2l6ZS4KLSAqCi0gKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgd2luZG93IGNyb3AgdG8gYSBOVUxMIHZhbHVlLCB3aGljaAotICogZGlzYWJsZXMgY3JvcHBpbmcgb2YgdGhlIGJ1ZmZlcnMuCisgKiBYWFg6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gIFRoZSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMKKyAqIGFuZCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdCBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICAqLwogc3RhdGljIGlubGluZSBpbnQgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKICAgICAgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKQEAgLTQyNCw2ICs1MTQsNDAgQEAKIH0KIAogLyoKKyAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyguLi4sIGludCB3LCBpbnQgaCkKKyAqIEFsbCBidWZmZXJzIGRlcXVldWVkIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGhhdmUgdGhlIGRpbWVuc2lvbnMgc3BlY2lmaWVkLgorICogSW4gcGFydGljdWxhciwgYWxsIGJ1ZmZlcnMgd2lsbCBoYXZlIGEgZml4ZWQtc2l6ZSwgaW5kZXBlbmRlbnQgZm9ybSB0aGUKKyAqIG5hdGl2ZS13aW5kb3cgc2l6ZS4gVGhleSB3aWxsIGJlIHNjYWxlZCBhY2NvcmRpbmcgdG8gdGhlIHNjYWxpbmcgbW9kZQorICogKHNlZSBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUpIHVwb24gd2luZG93IGNvbXBvc2l0aW9uLgorICoKKyAqIElmIHcgYW5kIGggYXJlIDAsIHRoZSBub3JtYWwgYmVoYXZpb3IgaXMgcmVzdG9yZWQuIFRoYXQgaXMsIGRlcXVldWVkIGJ1ZmZlcnMKKyAqIGZvbGxvd2luZyB0aGlzIGNhbGwgd2lsbCBiZSBzaXplZCB0byBtYXRjaCB0aGUgd2luZG93J3Mgc2l6ZS4KKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgd2luZG93IGNyb3AgdG8gYSBOVUxMIHZhbHVlLCB3aGljaAorICogZGlzYWJsZXMgY3JvcHBpbmcgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucygKKyAgICAgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIHJldHVybiB3aW5kb3ctPnBlcmZvcm0od2luZG93LCBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0RJTUVOU0lPTlMsCisgICAgICAgICAgICB3LCBoKTsKK30KKworLyoKKyAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KC4uLiwgaW50IGZvcm1hdCkKKyAqIEFsbCBidWZmZXJzIGRlcXVldWVkIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGhhdmUgdGhlIGZvcm1hdCBzcGVjaWZpZWQuCisgKgorICogSWYgdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgMCwgdGhlIGRlZmF1bHQgYnVmZmVyIGZvcm1hdCB3aWxsIGJlIHVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAorICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LAorICAgICAgICBpbnQgZm9ybWF0KQoreworICAgIHJldHVybiB3aW5kb3ctPnBlcmZvcm0od2luZG93LCBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0ZPUk1BVCwgZm9ybWF0KTsKK30KKworLyoKICAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKC4uLiwgaW50IHRyYW5zZm9ybSkKICAqIEFsbCBidWZmZXJzIHF1ZXVlZCBhZnRlciB0aGlzIGNhbGwgd2lsbCBiZSBkaXNwbGF5ZWQgdHJhbnNmb3JtZWQgYWNjb3JkaW5nCiAgKiB0byB0aGUgdHJhbnNmb3JtIHBhcmFtZXRlciBzcGVjaWZpZWQuCkBAIC00NDEsOCArNTY1LDEwIEBACiAgKiBBbGwgYnVmZmVycyBxdWV1ZWQgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lc3RhbXAKICAqIHBhcmFtZXRlciBzcGVjaWZpZWQuIElmIHRoZSB0aW1lc3RhbXAgaXMgc2V0IHRvIE5BVElWRV9XSU5ET1dfVElNRVNUQU1QX0FVVE8KICAqICh0aGUgZGVmYXVsdCksIHRpbWVzdGFtcHMgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHF1ZXVlQnVmZmVyIGlzCi0gKiBjYWxsZWQuIFRoZSB0aW1lc3RhbXAgaXMgbWVhc3VyZWQgaW4gbmFub3NlY29uZHMsIGFuZCBtdXN0IGJlIG1vbm90b25pY2FsbHkKLSAqIGluY3JlYXNpbmcuCisgKiBjYWxsZWQuIFRoZSB0aW1lc3RhbXAgaXMgbWVhc3VyZWQgaW4gbmFub3NlY29uZHMsIGFuZCBpcyBub3JtYWxseSBtb25vdG9uaWNhbGx5CisgKiBpbmNyZWFzaW5nLiBUaGUgdGltZXN0YW1wIHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IHRpbWUtb2YtZGF5IGFkanVzdG1lbnRzLAorICogYW5kIGZvciBhIGNhbWVyYSBzaG91bGQgYmUgc3RyaWN0bHkgbW9ub3RvbmljIGJ1dCBmb3IgYSBtZWRpYSBwbGF5ZXIgbWF5IGJlCisgKiByZXNldCB3aGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKAogICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LApAQCAtNDUyLDYgKzU3OCwxOSBAQAogICAgICAgICAgICAgdGltZXN0YW1wKTsKIH0KIAorLyoKKyAqIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSguLi4sIGludCBtb2RlKQorICogQWxsIGJ1ZmZlcnMgcXVldWVkIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NhbGluZyBtb2RlCisgKiBzcGVjaWZpZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKKyAgICAgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgaW50IG1vZGUpCit7CisgICAgcmV0dXJuIHdpbmRvdy0+cGVyZm9ybSh3aW5kb3csIE5BVElWRV9XSU5ET1dfU0VUX1NDQUxJTkdfTU9ERSwKKyAgICAgICAgICAgIG1vZGUpOworfQorCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX1dJTkRPV19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3V0aWxzL05ldGxpbmtFdmVudC5oIGIvaW5jbHVkZS9zeXN1dGlscy9OZXRsaW5rRXZlbnQuaAppbmRleCBiMzI5YjA5Li4yNWE1NmY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c3V0aWxzL05ldGxpbmtFdmVudC5oCisrKyBiL2luY2x1ZGUvc3lzdXRpbHMvTmV0bGlua0V2ZW50LmgKQEAgLTE2LDYgKzE2LDggQEAKICNpZm5kZWYgX05FVExJTktFVkVOVF9ICiAjZGVmaW5lIF9ORVRMSU5LRVZFTlRfSAogCisjaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0xpc3RlbmVyLmg+CisKICNkZWZpbmUgTkxfUEFSQU1TX01BWCAzMgogCiBjbGFzcyBOZXRsaW5rRXZlbnQgewpAQCAtMzAsMTcgKzMyLDIzIEBACiAgICAgY29uc3Qgc3RhdGljIGludCBObEFjdGlvbkFkZDsKICAgICBjb25zdCBzdGF0aWMgaW50IE5sQWN0aW9uUmVtb3ZlOwogICAgIGNvbnN0IHN0YXRpYyBpbnQgTmxBY3Rpb25DaGFuZ2U7CisgICAgY29uc3Qgc3RhdGljIGludCBObEFjdGlvbkxpbmtEb3duOworICAgIGNvbnN0IHN0YXRpYyBpbnQgTmxBY3Rpb25MaW5rVXA7CiAKICAgICBOZXRsaW5rRXZlbnQoKTsKICAgICB2aXJ0dWFsIH5OZXRsaW5rRXZlbnQoKTsKIAotICAgIGJvb2wgZGVjb2RlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworICAgIGJvb2wgZGVjb2RlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGludCBmb3JtYXQgPSBOZXRsaW5rTGlzdGVuZXI6Ok5FVExJTktfRk9STUFUX0FTQ0lJKTsKICAgICBjb25zdCBjaGFyICpmaW5kUGFyYW0oY29uc3QgY2hhciAqcGFyYW1OYW1lKTsKIAogICAgIGNvbnN0IGNoYXIgKmdldFN1YnN5c3RlbSgpIHsgcmV0dXJuIG1TdWJzeXN0ZW07IH0KICAgICBpbnQgZ2V0QWN0aW9uKCkgeyByZXR1cm4gbUFjdGlvbjsgfQogCiAgICAgdm9pZCBkdW1wKCk7CisKKyBwcm90ZWN0ZWQ6CisgICAgYm9vbCBwYXJzZUJpbmFyeU5ldGxpbmtNZXNzYWdlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworICAgIGJvb2wgcGFyc2VBc2NpaU5ldGxpbmtNZXNzYWdlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oIGIvaW5jbHVkZS9zeXN1dGlscy9OZXRsaW5rTGlzdGVuZXIuaAppbmRleCAyODgwMDQ2Li5iZWI4YmRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oCisrKyBiL2luY2x1ZGUvc3lzdXRpbHMvTmV0bGlua0xpc3RlbmVyLmgKQEAgLTIyLDEzICsyMiwyNyBAQAogCiBjbGFzcyBOZXRsaW5rTGlzdGVuZXIgOiBwdWJsaWMgU29ja2V0TGlzdGVuZXIgewogICAgIGNoYXIgbUJ1ZmZlcls2NCAqIDEwMjRdOworICAgIGludCBtRm9ybWF0OwogCiBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGludCBORVRMSU5LX0ZPUk1BVF9BU0NJSSA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBORVRMSU5LX0ZPUk1BVF9CSU5BUlkgPSAxOworCisjaWYgMQorICAgIC8qIHRlbXBvcmFyeSB2ZXJzaW9uIHVudGlsIHdlIGNhbiBnZXQgTW90b3JvbGEgdG8gdXBkYXRlIHRoZWlyCisgICAgICogcmlsLnNvLiAgVGhlaXIgcHJlYnVpbHQgcmlsLnNvIGlzIHVzaW5nIHRoaXMgcHJpdmF0ZSBjbGFzcworICAgICAqIHNvIGNoYW5naW5nIHRoZSBOZXRsaW5rTGlzdGVuZXIoKSBjb25zdHJ1Y3RvciBicmVha3MgdGhlaXIgcmlsLgorICAgICAqLwogICAgIE5ldGxpbmtMaXN0ZW5lcihpbnQgc29ja2V0KTsKKyAgICBOZXRsaW5rTGlzdGVuZXIoaW50IHNvY2tldCwgaW50IGZvcm1hdCk7CisjZWxzZQorICAgIE5ldGxpbmtMaXN0ZW5lcihpbnQgc29ja2V0LCBpbnQgZm9ybWF0ID0gTkVUTElOS19GT1JNQVRfQVNDSUkpOworI2VuZGlmCiAgICAgdmlydHVhbCB+TmV0bGlua0xpc3RlbmVyKCkge30KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgYm9vbCBvbkRhdGFBdmFpbGFibGUoU29ja2V0Q2xpZW50ICpjbGkpOwogICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KSA9IDA7CiB9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luaXQvYnVpbHRpbnMuYyBiL2luaXQvYnVpbHRpbnMuYwppbmRleCBmMmY3NmI3Li4wNmVmOTZkIDEwMDY0NAotLS0gYS9pbml0L2J1aWx0aW5zLmMKKysrIGIvaW5pdC9idWlsdGlucy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPGN1dGlscy9wYXJ0aXRpb25fdXRpbHMuaD4KIAogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJrZXl3b3Jkcy5oIgpAQCAtMjI1LDE0ICsyMjYsMTAgQEAKICAgICByZXR1cm4gZG9faW5zbW9kX2lubmVyKG5hcmdzLCBhcmdzLCBzaXplKTsKIH0KIAotaW50IGRvX2ltcG9ydChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotICAgIHJldHVybiBpbml0X3BhcnNlX2NvbmZpZ19maWxlKGFyZ3NbMV0pOwotfQotCiBpbnQgZG9fbWtkaXIoaW50IG5hcmdzLCBjaGFyICoqYXJncykKIHsKICAgICBtb2RlX3QgbW9kZSA9IDA3NTU7CisgICAgaW50IHJldDsKIAogICAgIC8qIG1rZGlyIDxwYXRoPiBbbW9kZV0gW293bmVyXSBbZ3JvdXBdICovCiAKQEAgLTI0MCw3ICsyMzcsMTIgQEAKICAgICAgICAgbW9kZSA9IHN0cnRvdWwoYXJnc1syXSwgMCwgOCk7CiAgICAgfQogCi0gICAgaWYgKG1rZGlyKGFyZ3NbMV0sIG1vZGUpKSB7CisgICAgcmV0ID0gbWtkaXIoYXJnc1sxXSwgbW9kZSk7CisgICAgLyogY2htb2QgaW4gY2FzZSB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzICovCisgICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFRVhJU1QpIHsKKyAgICAgICAgcmV0ID0gY2htb2QoYXJnc1sxXSwgbW9kZSk7CisgICAgfQorICAgIGlmIChyZXQgPT0gLTEpIHsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICB9CiAKQEAgLTM2Nyw3ICszNjksOSBAQAogICAgICAgICBpZiAod2FpdCkKICAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoc291cmNlLCBDT01NQU5EX1JFVFJZX1RJTUVPVVQpOwogICAgICAgICBpZiAobW91bnQoc291cmNlLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgewotICAgICAgICAgICAgLyogSWYgdGhpcyBmYWlscywgaXQgbWF5IGJlIGFuIGVuY3J5cHRlZCBmaWxlc3lzdGVtLgorICAgICAgICAgICAgLyogSWYgdGhpcyBmYWlscywgaXQgbWF5IGJlIGFuIGVuY3J5cHRlZCBmaWxlc3lzdGVtCisgICAgICAgICAgICAgKiBvciBpdCBjb3VsZCBqdXN0IGJlIHdpcGVkLiAgSWYgd2lwZWQsIHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICogaGFuZGxlZCBsYXRlciBpbiB0aGUgYm9vdCBwcm9jZXNzLgogICAgICAgICAgICAgICogV2Ugb25seSBzdXBwb3J0IGVuY3J5cHRpbmcgL2RhdGEuICBDaGVjawogICAgICAgICAgICAgICogaWYgd2UncmUgdHJ5aW5nIHRvIG1vdW50IGl0LCBhbmQgaWYgc28sCiAgICAgICAgICAgICAgKiBhc3N1bWUgaXQncyBlbmNyeXB0ZWQsIG1vdW50IGEgdG1wZnMgaW5zdGVhZC4KQEAgLTM3NSw3ICszNzksNyBAQAogICAgICAgICAgICAgICogZm9yIHZvbGQgdG8gcXVlcnkgd2hlbiBpdCBtb3VudHMgdGhlIHJlYWwKICAgICAgICAgICAgICAqIGVuY3J5cHRlZCAvZGF0YS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFzdHJjbXAodGFyZ2V0LCBEQVRBX01OVF9QT0lOVCkpIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKHRhcmdldCwgREFUQV9NTlRfUE9JTlQpICYmICFwYXJ0aXRpb25fd2lwZWQoc291cmNlKSkgewogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcGZzX29wdGlvbnM7CiAKICAgICAgICAgICAgICAgICB0bXBmc19vcHRpb25zID0gcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8udG1wZnNfb3B0aW9ucyIpOwpAQCAtNDQyLDcgKzQ0NiwyNCBAQAogCiBpbnQgZG9fc2V0cHJvcChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQogewotICAgIHByb3BlcnR5X3NldChhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYXJnc1sxXTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IGFyZ3NbMl07CisKKyAgICBpZiAodmFsdWVbMF0gPT0gJyQnKSB7CisgICAgICAgIC8qIFVzZSB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gcHJvcGVydHkgaWYgdmFsdWUgc3RhcnRzIHdpdGggJyQnICovCisgICAgICAgIHZhbHVlKys7CisgICAgICAgIGlmICh2YWx1ZVswXSAhPSAnJCcpIHsKKyAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBFUlJPUigicHJvcGVydHkgJXMgaGFzIG5vIHZhbHVlIGZvciBhc3NpZ25pbmcgdG8gJXNcbiIsIHZhbHVlLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBlbHNlIGZhbGwgdGhyb3VnaCB0byBzdXBwb3J0IGRvdWJsZSAnJCcgcHJlZml4IGZvciBzZXR0aW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgKiB0byBzdHJpbmcgbGl0ZXJhbHMgdGhhdCBzdGFydCB3aXRoICckJworICAgICAgICAgICAqLworICAgIH0KKworICAgIHByb3BlcnR5X3NldChuYW1lLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTUyNCw3ICs1NDUsMjMgQEAKIAogaW50IGRvX3dyaXRlKGludCBuYXJncywgY2hhciAqKmFyZ3MpCiB7Ci0gICAgcmV0dXJuIHdyaXRlX2ZpbGUoYXJnc1sxXSwgYXJnc1syXSk7CisgICAgY29uc3QgY2hhciAqcGF0aCA9IGFyZ3NbMV07CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBhcmdzWzJdOworICAgIGlmICh2YWx1ZVswXSA9PSAnJCcpIHsKKyAgICAgICAgLyogV3JpdGUgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGlmIHZhbHVlIHN0YXJ0cyB3aXRoICckJyAqLworICAgICAgICB2YWx1ZSsrOworICAgICAgICBpZiAodmFsdWVbMF0gIT0gJyQnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldCh2YWx1ZSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgRVJST1IoInByb3BlcnR5ICVzIGhhcyBubyB2YWx1ZSBmb3Igd3JpdGluZyB0byAlc1xuIiwgdmFsdWUsIHBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGVsc2UgZmFsbCB0aHJvdWdoIHRvIHN1cHBvcnQgZG91YmxlICckJyBwcmVmaXggZm9yIHdyaXRpbmcKKyAgICAgICAgICAgKiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCBzdGFydCB3aXRoICckJworICAgICAgICAgICAqLworICAgIH0KKworICAgIHJldHVybiB3cml0ZV9maWxlKHBhdGgsIHZhbHVlKTsKIH0KIAogaW50IGRvX2NvcHkoaW50IG5hcmdzLCBjaGFyICoqYXJncykKZGlmZiAtLWdpdCBhL2luaXQvZGV2aWNlcy5jIGIvaW5pdC9kZXZpY2VzLmMKaW5kZXggYTIwMGM5NS4uNjA2NTljZSAxMDA2NDQKLS0tIGEvaW5pdC9kZXZpY2VzLmMKKysrIGIvaW5pdC9kZXZpY2VzLmMKQEAgLTc3NCw3ICs3NzQsNyBAQAogewogICAgIGNoYXIgbXNnW1VFVkVOVF9NU0dfTEVOKzJdOwogICAgIGludCBuOwotICAgIHdoaWxlICgobiA9IHVldmVudF9jaGVja2VkX3JlY3YoZGV2aWNlX2ZkLCBtc2csIFVFVkVOVF9NU0dfTEVOKSkgPiAwKSB7CisgICAgd2hpbGUgKChuID0gdWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdihkZXZpY2VfZmQsIG1zZywgVUVWRU5UX01TR19MRU4pKSA+IDApIHsKICAgICAgICAgaWYobiA+PSBVRVZFTlRfTVNHX0xFTikgICAvKiBvdmVyZmxvdyAtLSBkaXNjYXJkICovCiAgICAgICAgICAgICBjb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvaW5pdC9pbml0X3BhcnNlci5jIGIvaW5pdC9pbml0X3BhcnNlci5jCmluZGV4IGU4ZTY1YWMuLmQ5ZDMwODQgMTAwNjQ0Ci0tLSBhL2luaXQvaW5pdF9wYXJzZXIuYworKysgYi9pbml0L2luaXRfcGFyc2VyLmMKQEAgLTE3OSw2ICsxNzksMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfaW1wb3J0OgorICAgICAgICBpZiAobmFyZ3MgIT0gMikgeworICAgICAgICAgICAgRVJST1IoInNpbmdsZSBhcmd1bWVudCBuZWVkZWQgZm9yIGltcG9ydFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gaW5pdF9wYXJzZV9jb25maWdfZmlsZShhcmdzWzFdKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgRVJST1IoImNvdWxkIG5vdCBpbXBvcnQgZmlsZSAlc1xuIiwgYXJnc1sxXSk7CisgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGUtPnBhcnNlX2xpbmUgPSBwYXJzZV9saW5lX25vX29wOwogfQpAQCAtMzQ3LDcgKzM1NSw4IEBACiAKICAgICAgICAgICAgIGlmICghc3RybmNtcChuYW1lLCB0ZXN0LCBuYW1lX2xlbmd0aCkgJiYKICAgICAgICAgICAgICAgICAgICAgdGVzdFtuYW1lX2xlbmd0aF0gPT0gJz0nICYmCi0gICAgICAgICAgICAgICAgICAgICFzdHJjbXAodGVzdCArIG5hbWVfbGVuZ3RoICsgMSwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICghc3RyY21wKHRlc3QgKyBuYW1lX2xlbmd0aCArIDEsIHZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcCh0ZXN0ICsgbmFtZV9sZW5ndGggKyAxLCAiKiIpKSkgewogICAgICAgICAgICAgICAgIGFjdGlvbl9hZGRfcXVldWVfdGFpbChhY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNzcsNyArMzg2LDggQEAKIAogICAgICAgICAgICAgICAgICAgICAvKiBkb2VzIHRoZSBwcm9wZXJ0eSBleGlzdCwgYW5kIG1hdGNoIHRoZSB0cmlnZ2VyIHZhbHVlPyAqLwogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldChwcm9wX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgIXN0cmNtcChlcXVhbHMgKyAxLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICghc3RyY21wKGVxdWFscyArIDEsIHZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZXF1YWxzICsgMSwgIioiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9hZGRfcXVldWVfdGFpbChhY3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaW5pdC9rZXl3b3Jkcy5oIGIvaW5pdC9rZXl3b3Jkcy5oCmluZGV4IDk1YWNkMDEuLjNlMzczM2YgMTAwNjQ0Ci0tLSBhL2luaXQva2V5d29yZHMuaAorKysgYi9pbml0L2tleXdvcmRzLmgKQEAgLTExLDcgKzExLDYgQEAKIGludCBkb19ob3N0bmFtZShpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19pZnVwKGludCBuYXJncywgY2hhciAqKmFyZ3MpOwogaW50IGRvX2luc21vZChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKLWludCBkb19pbXBvcnQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fbWtkaXIoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fbW91bnQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fcmVzdGFydChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKQEAgLTU0LDcgKzUzLDcgQEAKICAgICBLRVlXT1JEKGhvc3RuYW1lLCAgICBDT01NQU5ELCAxLCBkb19ob3N0bmFtZSkKICAgICBLRVlXT1JEKGlmdXAsICAgICAgICBDT01NQU5ELCAxLCBkb19pZnVwKQogICAgIEtFWVdPUkQoaW5zbW9kLCAgICAgIENPTU1BTkQsIDEsIGRvX2luc21vZCkKLSAgICBLRVlXT1JEKGltcG9ydCwgICAgICBDT01NQU5ELCAxLCBkb19pbXBvcnQpCisgICAgS0VZV09SRChpbXBvcnQsICAgICAgU0VDVElPTiwgMSwgMCkKICAgICBLRVlXT1JEKGtleWNvZGVzLCAgICBPUFRJT04sICAwLCAwKQogICAgIEtFWVdPUkQobWtkaXIsICAgICAgIENPTU1BTkQsIDEsIGRvX21rZGlyKQogICAgIEtFWVdPUkQobW91bnQsICAgICAgIENPTU1BTkQsIDMsIGRvX21vdW50KQpkaWZmIC0tZ2l0IGEvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlLmMgYi9pbml0L3Byb3BlcnR5X3NlcnZpY2UuYwppbmRleCBjOGQ2YzA5Li4wNDZiMTIwIDEwMDY0NAotLS0gYS9pbml0L3Byb3BlcnR5X3NlcnZpY2UuYworKysgYi9pbml0L3Byb3BlcnR5X3NlcnZpY2UuYwpAQCAtNzUsOCArNzUsNiBAQAogICAgIHsgIndsYW4uIiwgICAgICAgICAgICBBSURfU1lTVEVNLCAgIDAgfSwKICAgICB7ICJkaGNwLiIsICAgICAgICAgICAgQUlEX1NZU1RFTSwgICAwIH0sCiAgICAgeyAiZGhjcC4iLCAgICAgICAgICAgIEFJRF9ESENQLCAgICAgMCB9LAotICAgIHsgInZwbi4iLCAgICAgICAgICAgICBBSURfU1lTVEVNLCAgIDAgfSwKLSAgICB7ICJ2cG4uIiwgICAgICAgICAgICAgQUlEX1ZQTiwgICAgICAwIH0sCiAgICAgeyAiZGVidWcuIiwgICAgICAgICAgIEFJRF9TSEVMTCwgICAgMCB9LAogICAgIHsgImxvZy4iLCAgICAgICAgICAgICBBSURfU0hFTEwsICAgIDAgfSwKICAgICB7ICJzZXJ2aWNlLmFkYi5yb290IiwgQUlEX1NIRUxMLCAgICAwIH0sCkBAIC0zNzQsMTEgKzM3MiwxMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgciA9IHJlY3YocywgJm1zZywgc2l6ZW9mKG1zZyksIDApOworICAgIHIgPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVjdihzLCAmbXNnLCBzaXplb2YobXNnKSwgMCkpOwogICAgIGlmKHIgIT0gc2l6ZW9mKHByb3BfbXNnKSkgeworICAgICAgICBFUlJPUigic3lzX3Byb3A6IG1pcy1tYXRjaCBtc2cgc2l6ZSByZWNpZXZlZDogJWQgZXhwZWN0ZWQ6ICVkIGVycm5vOiAlZFxuIiwKKyAgICAgICAgICAgICAgciwgc2l6ZW9mKHByb3BfbXNnKSwgZXJybm8pOwogICAgICAgICBjbG9zZShzKTsKLSAgICAgICAgRVJST1IoInN5c19wcm9wOiBtaXMtbWF0Y2ggbXNnIHNpemUgcmVjaWV2ZWQ6ICVkIGV4cGVjdGVkOiAlZFxuIiwKLSAgICAgICAgICAgICAgciwgc2l6ZW9mKHByb3BfbXNnKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9BbmRyb2lkLm1rIGIvbGliY3V0aWxzL0FuZHJvaWQubWsKaW5kZXggM2I4Y2JiYi4uMGM0ZTIzNSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGliY3V0aWxzL0FuZHJvaWQubWsKQEAgLTM1LDYgKzM1LDcgQEAKIAlzb2NrZXRfbG9vcGJhY2tfY2xpZW50LmMgXAogCXNvY2tldF9sb29wYmFja19zZXJ2ZXIuYyBcCiAJc29ja2V0X25ldHdvcmtfY2xpZW50LmMgXAorCXNvY2tldHMuYyBcCiAJY29uZmlnX3V0aWxzLmMgXAogCWNwdV9pbmZvLmMgXAogCWxvYWRfZmlsZS5jIFwKQEAgLTkyLDI1ICs5MywxMSBAQAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCiAKIAotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotCi0jIFNoYXJlZCBsaWJyYXJ5IGZvciBzaW11bGF0b3IKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmN1dGlscwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uU291cmNlcykgJChjb21tb25Ib3N0U291cmNlcykgbWVtb3J5LmMgZGxtYWxsb2Nfc3R1YnMuYwotTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKLUxPQ0FMX0NGTEFHUyArPSAkKHRhcmdldFNtcEZsYWcpCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVsc2UgIyFzaW0KLQogIyBTaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IGxpYmN1dGlscwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uU291cmNlcykgYXNobWVtLWRldi5jIG1xLmMgYW5kcm9pZF9yZWJvb3QuYyB1ZXZlbnQuYworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uU291cmNlcykgYXNobWVtLWRldi5jIG1xLmMgYW5kcm9pZF9yZWJvb3QuYyBwYXJ0aXRpb25fdXRpbHMuYyB1ZXZlbnQuYyBxdGFndWlkLmMKIAogaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQogTE9DQUxfU1JDX0ZJTEVTICs9IGFyY2gtYXJtL21lbXNldDMyLlMKQEAgLTE0Niw1ICsxMzMsMyBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotZW5kaWYgIyFzaW0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9jb25maWdfdXRpbHMuYyBiL2xpYmN1dGlscy9jb25maWdfdXRpbHMuYwppbmRleCA3NWZhNmM2Li5mYzVjYTc4IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvY29uZmlnX3V0aWxzLmMKKysrIGIvbGliY3V0aWxzL2NvbmZpZ191dGlscy5jCkBAIC0zMTUsMyArMzE1LDE1IEBACiAgICAgZGF0YSA9IGxvYWRfZmlsZShmbiwgMCk7CiAgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CiB9CisKK3ZvaWQgY29uZmlnX2ZyZWUoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKmN1ciA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgd2hpbGUgKGN1cikgeworICAgICAgICBjbm9kZSAqcHJldiA9IGN1cjsKKyAgICAgICAgY29uZmlnX2ZyZWUoY3VyKTsKKyAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgICAgICBmcmVlKHByZXYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9wYXJ0aXRpb25fdXRpbHMuYyBiL2xpYmN1dGlscy9wYXJ0aXRpb25fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUzOWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL3BhcnRpdGlvbl91dGlscy5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+IC8qIGZvciBCTEtHRVRTSVpFICovCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworc3RhdGljIGludCBvbmx5X29uZV9jaGFyKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY2hhciBjKQoreworICAgIGludCBpLCByZXQ7CisKKyAgICByZXQgPSAxOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIGlmIChidWZbaV0gIT0gYykgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBwYXJ0aXRpb25fd2lwZWQoY2hhciAqc291cmNlKQoreworICAgIGNoYXIgYnVmWzQwOTZdOworICAgIGludCBmZCwgcmV0LCB3aXBlZDsKKworICAgIGlmICgoZmQgPSBvcGVuKHNvdXJjZSwgT19SRE9OTFkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgY2xvc2UoZmQpOworCisgICAgaWYgKHJldCAhPSBzaXplb2YoYnVmKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgYWxsIHplcm9zICovCisgICAgaWYgKG9ubHlfb25lX2NoYXIoYnVmLCBzaXplb2YoYnVmKSwgMCkpIHsKKyAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgYWxsIG9uZXMgKi8KKyAgICBpZiAob25seV9vbmVfY2hhcihidWYsIHNpemVvZihidWYpLCAweGZmKSkgeworICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvcXRhZ3VpZC5jIGIvbGliY3V0aWxzL3F0YWd1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTdlNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL3F0YWd1aWQuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBsaWJjdXRpbHMvcXRhZ3VpZC5jCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAicXRhZ3VpZCIKKworI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworZXh0ZXJuIGludCBzZXRfcXRhZ3VpZChpbnQgc29ja2ZkLCBpbnQgdGFnLCB1aWRfdCB1aWQpIHsKKyAgICBjaGFyIGxpbmVCdWZbMTI4XTsKKyAgICBpbnQgZmQsIGNudCA9IDA7CisgICAgdWludDY0X3Qga1RhZyA9ICh1aW50NjRfdCl0YWcgPDwgMzI7CisgICAgc25wcmludGYobGluZUJ1Ziwgc2l6ZW9mKGxpbmVCdWYpLCAidCAlZCAlbGx1ICVkIiwgc29ja2ZkLCBrVGFnLCB1aWQpOworCisgICAgTE9HVigiVGFnZ2luZyBTb2NrZXQgd2l0aCBjb21tYW5kICVzXG4iLCBsaW5lQnVmKTsKKyAgICAvKiBUT0RPOiBFbmFibGUgYWZ0ZXIgdGhlIGtlcm5lbCBtb2R1bGUgaXMgZml4ZWQuCisgICAgICAgZmQgPSBvcGVuKCIvcHJvYy9uZXQveHRfcXRhZ3VpZC9jdHJsIiwgT19XUk9OTFkpOworICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIH0KKworICAgICAgIGNudCA9IHdyaXRlKGZkLCBsaW5lQnVmLCBzdHJsZW4obGluZUJ1ZikpOworICAgICAgIGNsb3NlKGZkKTsKKyAgICAqLworICAgIHJldHVybiAoY250PjA/MDotMSk7Cit9CmRpZmYgLS1naXQgYS9saWJjdXRpbHMvc29ja2V0cy5jIGIvbGliY3V0aWxzL3NvY2tldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFhMzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL3NvY2tldHMuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisvKiBGb3IgdGhlIHNvY2tldCB0cnVzdCAoY3JlZGVudGlhbHMpIGNoZWNrICovCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjZW5kaWYKKworYm9vbCBzb2NrZXRfcGVlcl9pc190cnVzdGVkKGludCBmZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBzdHJ1Y3QgdWNyZWQgY3I7CisgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihjcik7CisgICAgaW50IG4gPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyLCAmbGVuKTsKKworICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgTE9HRSgiY291bGQgbm90IGdldCBzb2NrZXQgY3JlZGVudGlhbHM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChjci51aWQgIT0gQUlEX1JPT1QpICYmIChjci51aWQgIT0gQUlEX1NIRUxMKSkgeworICAgICAgICBMT0dFKCJ1bnRydXN0ZWQgdXNlcmlkIG9uIG90aGVyIGVuZCBvZiBzb2NrZXQ6IHVzZXJpZCAlZFxuIiwgY3IudWlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9saWJjdXRpbHMvdWV2ZW50LmMgYi9saWJjdXRpbHMvdWV2ZW50LmMKaW5kZXggMzUzM2MwMC4uMzIwZjhkMSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3VldmVudC5jCisrKyBiL2xpYmN1dGlscy91ZXZlbnQuYwpAQCAtMjQsNyArMjQsNyBAQAogLyoqCiAgKiBMaWtlIHJlY3YoKSwgYnV0IGNoZWNrcyB0aGF0IG1lc3NhZ2VzIGFjdHVhbGx5IG9yaWdpbmF0ZSBmcm9tIHRoZSBrZXJuZWwuCiAgKi8KLXNzaXplX3QgdWV2ZW50X2NoZWNrZWRfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3NzaXplX3QgdWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgICBzdHJ1Y3QgaW92ZWMgaW92ID0geyBidWZmZXIsIGxlbmd0aCB9OwogICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOwogICAgIGNoYXIgY29udHJvbFtDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgdWNyZWQpKV07CmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsgYi9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsKaW5kZXggYzg4Nzk1NS4uNzRiZTJkOSAxMDA2NDQKLS0tIGEvbGliZGlza2NvbmZpZy9BbmRyb2lkLm1rCisrKyBiL2xpYmRpc2tjb25maWcvQW5kcm9pZC5tawpAQCAtMSw4ICsxLDYgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotCiBjb21tb25Tb3VyY2VzIDo9IFwKIAlkaXNrY29uZmlnLmMgXAogCWRpc2t1dGlscy5jIFwKQEAgLTIzLDUgKzIxLDMgQEAKIExPQ0FMX0NGTEFHUyA6PSAtTzIgLWcgLVcgLVdhbGwgLVdlcnJvciAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UKIGluY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQogZW5kaWYgIyBIT1NUX09TID09IGxpbnV4Ci0KLWVuZGlmICAjICEgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvbGlibG9nL0FuZHJvaWQubWsgYi9saWJsb2cvQW5kcm9pZC5tawppbmRleCAwZWVjODdmLi5iZDRmZWQ0IDEwMDY0NAotLS0gYS9saWJsb2cvQW5kcm9pZC5taworKysgYi9saWJsb2cvQW5kcm9pZC5tawpAQCAtNDgsMjUgKzQ4LDE0IEBACiBMT0NBTF9DRkxBR1MgOj0gLURGQUtFX0xPR19ERVZJQ0U9MQogaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCiAKLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLSAgIyBTaGFyZWQgbGlicmFyeSBmb3Igc2ltdWxhdG9yCi0gICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0gIExPQ0FMX01PRFVMRSA6PSBsaWJsb2cKLSAgTE9DQUxfU1JDX0ZJTEVTIDo9ICQobGlibG9nX2hvc3Rfc291cmNlcykKLSAgTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZAotICBMT0NBTF9DRkxBR1MgOj0gLURGQUtFX0xPR19ERVZJQ0U9MQotICBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbHNlICMgIXNpbQotICAjIFNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAotICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotICBMT0NBTF9NT0RVTEUgOj0gbGlibG9nCi0gIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGxpYmxvZ19zb3VyY2VzKQotICBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisjIFNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGlibG9nCitMT0NBTF9TUkNfRklMRVMgOj0gJChsaWJsb2dfc291cmNlcykKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAotICBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLSAgTE9DQUxfTU9EVUxFIDo9IGxpYmxvZwotICBMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmxvZwotICBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZiAjICFzaW0KK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmxvZworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJsb2cKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL0FuZHJvaWQubWsgYi9saWJuZXR1dGlscy9BbmRyb2lkLm1rCmluZGV4IDQ2MTAyZDUuLjFlZjdkYTkgMTAwNjQ0Ci0tLSBhL2xpYm5ldHV0aWxzL0FuZHJvaWQubWsKKysrIGIvbGlibmV0dXRpbHMvQW5kcm9pZC5tawpAQCAtMTEsMTMgKzExLDYgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscwogCi0jIG5lZWQgIi1scnQiIG9uIExpbnV4IHNpbXVsYXRvciB0byBwaWNrIHVwIGNsb2NrX2dldHRpbWUKLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLQlpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotCQlMT0NBTF9MRExJQlMgKz0gLWxydCAtbHB0aHJlYWQKLQllbmRpZgotZW5kaWYKLQogTE9DQUxfTU9EVUxFOj0gbGlibmV0dXRpbHMKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwppbmRleCAyZTNkZjAwLi4wNGIwZGZhIDEwMDY0NAotLS0gYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuYworKysgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwpAQCAtNTEsNiArNTEsOCBAQAogc3RhdGljIGludCBpZmNfY3RsX3NvY2s2ID0gLTE7CiB2b2lkIHByaW50ZXJyKGNoYXIgKmZtdCwgLi4uKTsKIAorI2RlZmluZSBEQkcgMAorCiBpbl9hZGRyX3QgcHJlZml4TGVuZ3RoVG9JcHY0TmV0bWFzayhpbnQgcHJlZml4X2xlbmd0aCkKIHsKICAgICBpbl9hZGRyX3QgbWFzayA9IDA7CkBAIC04OCwxMyArOTAsMTcgQEAKIAogaW50IGlmY19pbml0KHZvaWQpCiB7CisgICAgaW50IHJldDsKICAgICBpZiAoaWZjX2N0bF9zb2NrID09IC0xKSB7Ci0gICAgICAgIGlmY19jdGxfc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsgICAgCisgICAgICAgIGlmY19jdGxfc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKICAgICAgICAgaWYgKGlmY19jdGxfc29jayA8IDApIHsKICAgICAgICAgICAgIHByaW50ZXJyKCJzb2NrZXQoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBpZmNfY3RsX3NvY2sgPCAwID8gLTEgOiAwOworCisgICAgcmV0ID0gaWZjX2N0bF9zb2NrIDwgMCA/IC0xIDogMDsKKyAgICBpZiAoREJHKSBwcmludGVycigiaWZjX2luaXRfcmV0dXJuaW5nICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQgaWZjX2luaXQ2KHZvaWQpCkBAIC0xMTAsNiArMTE2LDcgQEAKIAogdm9pZCBpZmNfY2xvc2Uodm9pZCkKIHsKKyAgICBpZiAoREJHKSBwcmludGVycigiaWZjX2Nsb3NlIik7CiAgICAgaWYgKGlmY19jdGxfc29jayAhPSAtMSkgewogICAgICAgICAodm9pZCljbG9zZShpZmNfY3RsX3NvY2spOwogICAgICAgICBpZmNfY3RsX3NvY2sgPSAtMTsKQEAgLTE0MSw3ICsxNDgsNyBAQAogICAgIGlmKHIgPCAwKSByZXR1cm4gLTE7CiAKICAgICBtZW1jcHkocHRyLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOwotICAgIHJldHVybiAwOyAgICAKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IGlmY19nZXRfaWZpbmRleChjb25zdCBjaGFyICpuYW1lLCBpbnQgKmlmX2luZGV4cCkKQEAgLTE2OSwxMiArMTc2LDE2IEBACiAKIGludCBpZmNfdXAoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICByZXR1cm4gaWZjX3NldF9mbGFncyhuYW1lLCBJRkZfVVAsIDApOworICAgIGludCByZXQgPSBpZmNfc2V0X2ZsYWdzKG5hbWUsIElGRl9VUCwgMCk7CisgICAgaWYgKERCRykgcHJpbnRlcnIoImlmY191cCglcykgPSAlZCIsIG5hbWUsIHJldCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogaW50IGlmY19kb3duKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgcmV0dXJuIGlmY19zZXRfZmxhZ3MobmFtZSwgMCwgSUZGX1VQKTsKKyAgICBpbnQgcmV0ID0gaWZjX3NldF9mbGFncyhuYW1lLCAwLCBJRkZfVVApOworICAgIGlmIChEQkcpIHByaW50ZXJyKCJpZmNfZG93biglcykgPSAlZCIsIG5hbWUsIHJldCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgaW5pdF9zb2NrYWRkcl9pbihzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbl9hZGRyX3QgYWRkcikKQEAgLTE4OCwxMSArMTk5LDE0IEBACiBpbnQgaWZjX3NldF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBhZGRyKQogewogICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgaW50IHJldDsKIAogICAgIGlmY19pbml0X2lmcihuYW1lLCAmaWZyKTsKICAgICBpbml0X3NvY2thZGRyX2luKCZpZnIuaWZyX2FkZHIsIGFkZHIpOwogCi0gICAgcmV0dXJuIGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ1NJRkFERFIsICZpZnIpOworICAgIHJldCA9IGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ1NJRkFERFIsICZpZnIpOworICAgIGlmIChEQkcpIHByaW50ZXJyKCJpZmNfc2V0X2FkZHIoJXMsIHh4KSA9ICVkIiwgbmFtZSwgcmV0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQgaWZjX3NldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqcHRyKQpAQCAtMjA5LDExICsyMjMsMTQgQEAKIGludCBpZmNfc2V0X21hc2soY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IG1hc2spCiB7CiAgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpbnQgcmV0OwogCiAgICAgaWZjX2luaXRfaWZyKG5hbWUsICZpZnIpOwogICAgIGluaXRfc29ja2FkZHJfaW4oJmlmci5pZnJfYWRkciwgbWFzayk7CiAKLSAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGTkVUTUFTSywgJmlmcik7CisgICAgcmV0ID0gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGTkVUTUFTSywgJmlmcik7CisgICAgaWYgKERCRykgcHJpbnRlcnIoImlmY19zZXRfbWFzayglcywgeHgpID0gJWQiLCBuYW1lLCByZXQpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludCBpZmNfc2V0X3ByZWZpeExlbmd0aChjb25zdCBjaGFyICpuYW1lLCBpbnQgcHJlZml4TGVuZ3RoKQpAQCAtMzIzLDYgKzM0MCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorLyogZGVwcmVjYXRlZCAtIHY0IG9ubHkgKi8KIGludCBpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IGd3KQogewogICAgIHN0cnVjdCBpbl9hZGRyIGluX2RzdCwgaW5fZ3c7CkBAIC0zMzAsNyArMzQ4LDIwIEBACiAgICAgaW5fZHN0LnNfYWRkciA9IDA7CiAgICAgaW5fZ3cuc19hZGRyID0gZ3c7CiAKLSAgICByZXR1cm4gaWZjX2FjdF9vbl9yb3V0ZShTSU9DQUREUlQsIG5hbWUsIGluX2RzdCwgMCwgaW5fZ3cpOworICAgIGludCByZXQgPSBpZmNfYWN0X29uX2lwdjRfcm91dGUoU0lPQ0FERFJULCBuYW1lLCBpbl9kc3QsIDAsIGluX2d3KTsKKyAgICBpZiAoREJHKSBwcmludGVycigiaWZjX2NyZWF0ZV9kZWZhdWx0X3JvdXRlKCVzLCAlZCkgPSAlZCIsIG5hbWUsIGd3LCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIGRlcHJlY2F0ZWQgdjQtb25seSAqLworaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgZHN0KQoreworICAgIHN0cnVjdCBpbl9hZGRyIGluX2RzdCwgaW5fZ3c7CisKKyAgICBpbl9kc3Quc19hZGRyID0gZHN0OworICAgIGluX2d3LnNfYWRkciA9IDA7CisKKyAgICByZXR1cm4gaWZjX2FjdF9vbl9pcHY0X3JvdXRlKFNJT0NBRERSVCwgbmFtZSwgaW5fZHN0LCAzMiwgaW5fZ3cpOwogfQogCiBpbnQgaWZjX2VuYWJsZShjb25zdCBjaGFyICppZm5hbWUpCkBAIC0zNjMsNyArMzk0LDExIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IGlmY19yZXNldF9jb25uZWN0aW9ucyhjb25zdCBjaGFyICppZm5hbWUpCisjZGVmaW5lIFJFU0VUX0lQVjRfQUREUkVTU0VTIDB4MDEKKyNkZWZpbmUgUkVTRVRfSVBWNl9BRERSRVNTRVMgMHgwMgorI2RlZmluZSBSRVNFVF9BTExfQUREUkVTU0VTICAoUkVTRVRfSVBWNF9BRERSRVNTRVMgfCBSRVNFVF9JUFY2X0FERFJFU1NFUykKKworaW50IGlmY19yZXNldF9jb25uZWN0aW9ucyhjb25zdCBjaGFyICppZm5hbWUsIGNvbnN0IGludCByZXNldF9tYXNrKQogewogI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgIGludCByZXN1bHQsIHN1Y2Nlc3M7CkBAIC0zNzEsMjggKzQwNiwzNCBAQAogICAgIHN0cnVjdCBpZnJlcSBpZnI7CiAgICAgc3RydWN0IGluNl9pZnJlcSBpZnI2OwogCi0gICAgLyogSVB2NC4gQ2xlYXIgY29ubmVjdGlvbnMgb24gdGhlIElQIGFkZHJlc3MuICovCi0gICAgaWZjX2luaXQoKTsKLSAgICBpZmNfZ2V0X2luZm8oaWZuYW1lLCAmbXlhZGRyLCBOVUxMLCBOVUxMKTsKLSAgICBpZmNfaW5pdF9pZnIoaWZuYW1lLCAmaWZyKTsKLSAgICBpbml0X3NvY2thZGRyX2luKCZpZnIuaWZyX2FkZHIsIG15YWRkcik7Ci0gICAgcmVzdWx0ID0gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DS0lMTEFERFIsICAmaWZyKTsKLSAgICBpZmNfY2xvc2UoKTsKLQotICAgIC8qCi0gICAgICogSVB2Ni4gT24gTGludXgsIHdoZW4gYW4gaW50ZXJmYWNlIGdvZXMgZG93biBpdCBsb3NlcyBhbGwgaXRzIElQdjYKLSAgICAgKiBhZGRyZXNzZXMsIHNvIHdlIGRvbid0IGtub3cgd2hpY2ggY29ubmVjdGlvbnMgYmVsb25nZWQgdG8gdGhhdCBpbnRlcmZhY2UKLSAgICAgKiBTbyB3ZSBjbGVhciBhbGwgdW51c2VkIElQdjYgY29ubmVjdGlvbnMgb24gdGhlIGRldmljZSBieSBzcGVjaWZ5aW5nIGFuCi0gICAgICogZW1wdHkgSVB2NiBhZGRyZXNzLgotICAgICAqLwotICAgIGlmY19pbml0NigpOwotICAgIC8vIFRoaXMgaW1wbGljaXRseSBzcGVjaWZpZXMgYW4gYWRkcmVzcyBvZiA6OiwgaS5lLiwga2lsbCBhbGwgSVB2NiBzb2NrZXRzLgotICAgIG1lbXNldCgmaWZyNiwgMCwgc2l6ZW9mKGlmcjYpKTsKLSAgICBzdWNjZXNzID0gaW9jdGwoaWZjX2N0bF9zb2NrNiwgU0lPQ0tJTExBRERSLCAgJmlmcjYpOwotICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBzdWNjZXNzOworICAgIGlmIChyZXNldF9tYXNrICYgUkVTRVRfSVBWNF9BRERSRVNTRVMpIHsKKyAgICAgICAgLyogSVB2NC4gQ2xlYXIgY29ubmVjdGlvbnMgb24gdGhlIElQIGFkZHJlc3MuICovCisgICAgICAgIGlmY19pbml0KCk7CisgICAgICAgIGlmY19nZXRfaW5mbyhpZm5hbWUsICZteWFkZHIsIE5VTEwsIE5VTEwpOworICAgICAgICBpZmNfaW5pdF9pZnIoaWZuYW1lLCAmaWZyKTsKKyAgICAgICAgaW5pdF9zb2NrYWRkcl9pbigmaWZyLmlmcl9hZGRyLCBteWFkZHIpOworICAgICAgICByZXN1bHQgPSBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NLSUxMQUREUiwgICZpZnIpOworICAgICAgICBpZmNfY2xvc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAwOwogICAgIH0KLSAgICBpZmNfY2xvc2U2KCk7CisKKyAgICBpZiAocmVzZXRfbWFzayAmIFJFU0VUX0lQVjZfQUREUkVTU0VTKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIElQdjYuIE9uIExpbnV4LCB3aGVuIGFuIGludGVyZmFjZSBnb2VzIGRvd24gaXQgbG9zZXMgYWxsIGl0cyBJUHY2CisgICAgICAgICAqIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3Qga25vdyB3aGljaCBjb25uZWN0aW9ucyBiZWxvbmdlZCB0byB0aGF0IGludGVyZmFjZQorICAgICAgICAgKiBTbyB3ZSBjbGVhciBhbGwgdW51c2VkIElQdjYgY29ubmVjdGlvbnMgb24gdGhlIGRldmljZSBieSBzcGVjaWZ5aW5nIGFuCisgICAgICAgICAqIGVtcHR5IElQdjYgYWRkcmVzcy4KKyAgICAgICAgICovCisgICAgICAgIGlmY19pbml0NigpOworICAgICAgICAvLyBUaGlzIGltcGxpY2l0bHkgc3BlY2lmaWVzIGFuIGFkZHJlc3Mgb2YgOjosIGkuZS4sIGtpbGwgYWxsIElQdjYgc29ja2V0cy4KKyAgICAgICAgbWVtc2V0KCZpZnI2LCAwLCBzaXplb2YoaWZyNikpOworICAgICAgICBzdWNjZXNzID0gaW9jdGwoaWZjX2N0bF9zb2NrNiwgU0lPQ0tJTExBRERSLCAgJmlmcjYpOworICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgaWZjX2Nsb3NlNigpOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiAjZWxzZQpAQCAtNDQ5LDYgKzQ5MCw3MCBAQAogfQogCiAvKgorICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IGdhdGV3YXkKKyAqCisgKiBUT0RPOiBmYWN0b3Igb3V0IGNvbW1vbiBjb2RlIGZyb20gdGhpcyBhbmQgcmVtb3ZlX2hvc3Rfcm91dGVzKCkKKyAqIHNvIHRoYXQgd2Ugb25seSBzY2FuIC9wcm9jL25ldC9yb3V0ZSBpbiBvbmUgcGxhY2UuCisgKgorICogREVQUkVDQVRFRAorICovCitpbnQgaWZjX2dldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKyAgICBjaGFyIG5hbWVbNjRdOworICAgIGluX2FkZHJfdCBkZXN0LCBnd2F5LCBtYXNrOworICAgIGludCBmbGFncywgcmVmY250LCB1c2UsIG1ldHJpYywgbXR1LCB3aW4sIGlydHQ7CisgICAgaW50IHJlc3VsdDsKKyAgICBGSUxFICpmcDsKKworICAgIGZwID0gZm9wZW4oIi9wcm9jL25ldC9yb3V0ZSIsICJyIik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIC8qIFNraXAgdGhlIGhlYWRlciBsaW5lICovCisgICAgaWYgKGZzY2FuZihmcCwgIiUqW15cbl1cbiIpIDwgMCkgeworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWZjX2luaXQoKTsKKyAgICByZXN1bHQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IG5yZWFkID0gZnNjYW5mKGZwLCAiJTYzcyVYJVglWCVkJWQlZCVYJWQlZCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgJmRlc3QsICZnd2F5LCAmZmxhZ3MsICZyZWZjbnQsICZ1c2UsICZtZXRyaWMsICZtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10dSwgJndpbiwgJmlydHQpOworICAgICAgICBpZiAobnJlYWQgIT0gMTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgoZmxhZ3MgJiAoUlRGX1VQfFJURl9HQVRFV0FZKSkgPT0gKFJURl9VUHxSVEZfR0FURVdBWSkKKyAgICAgICAgICAgICAgICAmJiBkZXN0ID09IDAKKyAgICAgICAgICAgICAgICAmJiBzdHJjbXAoaWZuYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnd2F5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZmNfY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogU2V0cyB0aGUgc3BlY2lmaWVkIGdhdGV3YXkgYXMgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCisgKiBERVBSRUNBVEVECisgKi8KK2ludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBpbl9hZGRyX3QgZ2F0ZXdheSkKK3sKKyAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZmNfaW5pdCgpOworICAgIGFkZHIuc19hZGRyID0gZ2F0ZXdheTsKKyAgICBpZiAoKHJlc3VsdCA9IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShpZm5hbWUsIGdhdGV3YXkpKSA8IDApIHsKKyAgICAgICAgTE9HRCgiZmFpbGVkIHRvIGFkZCAlcyBhcyBkZWZhdWx0IHJvdXRlIGZvciAlczogJXMiLAorICAgICAgICAgICAgIGluZXRfbnRvYShhZGRyKSwgaWZuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgICBpZmNfY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgogICogUmVtb3ZlcyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgdGhlIG5hbWVkIGludGVyZmFjZS4KICAqLwogaW50IGlmY19yZW1vdmVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpCkBAIC02MjcsOSArNzMyLDMxIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIERFUFJFQ0FURUQKKyAqLworaW50IGlmY19hZGRfaXB2NF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHN0cnVjdCBpbl9hZGRyIGRzdCwgaW50IHByZWZpeF9sZW5ndGgsCisgICAgICBzdHJ1Y3QgaW5fYWRkciBndykKK3sKKyAgICBpbnQgaSA9aWZjX2FjdF9vbl9pcHY0X3JvdXRlKFNJT0NBRERSVCwgaWZuYW1lLCBkc3QsIHByZWZpeF9sZW5ndGgsIGd3KTsKKyAgICBwcmludGVycigiaWZjX2FkZF9pcHY0X3JvdXRlKCVzLCB4eCwgJWQsIHh4KSA9ICVkIiwgaWZuYW1lLCBwcmVmaXhfbGVuZ3RoLCBpKTsKKyAgICByZXR1cm4gaTsKK30KKworLyoKKyAqIERFUFJFQ0FURUQKKyAqLworaW50IGlmY19hZGRfaXB2Nl9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHN0cnVjdCBpbjZfYWRkciBkc3QsIGludCBwcmVmaXhfbGVuZ3RoLAorICAgICAgc3RydWN0IGluNl9hZGRyIGd3KQoreworICAgIHJldHVybiBpZmNfYWN0X29uX2lwdjZfcm91dGUoU0lPQ0FERFJULCBpZm5hbWUsIGRzdCwgcHJlZml4X2xlbmd0aCwgZ3cpOworfQorCiBpbnQgaWZjX2FkZF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIGNvbnN0IGNoYXIgKmRzdCwgaW50IHByZWZpeF9sZW5ndGgsIGNvbnN0IGNoYXIgKmd3KQogewotICAgIHJldHVybiBpZmNfYWN0X29uX3JvdXRlKFNJT0NBRERSVCwgaWZuYW1lLCBkc3QsIHByZWZpeF9sZW5ndGgsIGd3KTsKKyAgICBpbnQgaSA9IGlmY19hY3Rfb25fcm91dGUoU0lPQ0FERFJULCBpZm5hbWUsIGRzdCwgcHJlZml4X2xlbmd0aCwgZ3cpOworICAgIHByaW50ZXJyKCJpZmNfYWRkX3JvdXRlKCVzLCAlcywgJWQsICVzKSA9ICVkIiwgaWZuYW1lLCBkc3QsIHByZWZpeF9sZW5ndGgsIGd3LCBpKTsKKyAgICByZXR1cm4gaTsKIH0KIAogaW50IGlmY19yZW1vdmVfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBjaGFyKmRzdCwgaW50IHByZWZpeF9sZW5ndGgsIGNvbnN0IGNoYXIgKmd3KQpkaWZmIC0tZ2l0IGEvbGlibmxfMi8uZ2l0aWdub3JlIGIvbGlibmxfMi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2E3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitpbmNsdWRlL25ldGxpbmsvdmVyc2lvbi5oLmluCitjc2NvcGUuKgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9BbmRyb2lkLm1rIGIvbGlibmxfMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGMyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgYXR0ci5jIFwKKyAgICAgICAgY2FjaGUuYyBcCisgICAgICAgIGdlbmwvZ2VubC5jIFwKKyAgICAgICAgZ2VubC9mYW1pbHkuYyBcCisgICAgICAgIGhhbmRsZXJzLmMgXAorICAgICAgICBtc2cuYyBcCisgICAgICAgIG5ldGxpbmsuYyBcCisgICAgICAgIG9iamVjdC5jIFwKKyAgICAgICAgc29ja2V0LmMKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCisjIFN0YXRpYyBMaWJyYXJ5CitMT0NBTF9NT0RVTEUgOj0gbGlibmxfMgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNoYXJlZCBsaWJyYXJ5IGN1cnJlbnRseSB1bmF2YWlsaWFibGUKKyMgKiBOZXRsaW5rIGNhY2hlIG5vdCBpbXBsZW1lbnRlZAorIyAqIExpYnJhcnkgaXMgbm90IHRocmVhZCBzYWZlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9SRUFETUUgYi9saWJubF8yL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTgwNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9SRUFETUUKQEAgLTAsMCArMSwzNSBAQAorTmV0bGluayBQcm90b2NvbCBGb3JtYXQgKFJGQzM1NDkpCisrLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0rCit8TmV0bGluayBNZXNzYWdlICB8UHwgR2VuZXJpYyBOZXRsaW5rICAgfFB8Cit8ICAgIEhlYWRlciAgICAgICB8QXwgIE1lc3NhZ2UgSGVhZGVyICAgfEF8Cit8KHN0cnVjdCBubG1zZ2hkcil8RHwoc3RydWN0IGdlbmxtc2doZHIpfER8CisrLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0rCisrLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0tLS0tLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0tLS0tLS0tKy0rLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0rCit8TmV0bGluayBBdHRyaWJ1dGV8UHxOZXRsaW5rIEF0dHJpYnV0ZXxQfE5ldGxpbmsgQXR0cmlidXRlfFB8TmV0bGluayBBdHRyaWJ1dGV8UHwuLi58Cit8ICAgICMwIEhlYWRlciAgICB8QXwgICAjMCBQYXlsb2FkICAgIHxBfCAgICMxIEhlYWRlciAgICAgfEF8ICAgIzEgUGF5bG9hZCAgICB8QXwgICB8Cit8IChzdHJ1Y3QgbmxhdHRyKSB8RHwgICAgICh2b2lkKSAgICAgIHxEfCAoc3RydWN0IG5sYXR0cikgfER8ICAgICAodm9pZCkgICAgICB8RHwgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0tLS0tLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0tLS0tLS0tKy0rLS0tLS0tLS0tLS0tLS0tLS0rLSstLS0rCisKKyogRWFjaCBuZXRsaW5rIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBiaXRzdHJlYW0gd2l0aCBhIG5ldGxpbmsgaGVhZGVyLgorKiBBZnRlciB0aGlzIGhlYWRlciBhIHNlY29uZCBoZWFkZXIgKmNhbiogYmUgdXNlZCBzcGVjaWZpYyB0byB0aGUgbmV0bGluaworICBmYW1pbHkgaW4gdXNlLiBUaGlzIGxpYnJhcnkgd2FzIHRlc3RlZCB1c2luZyB0aGUgZ2VuZXJpYyBuZXRsaW5rCisgIHByb3RvY29sIGRlZmluZWQgYnkgc3RydWN0IGdlbmxtc2doZHIgdG8gc3VwcG9ydCBubDgwMjExLgorKiBBZnRlciB0aGUgaGVhZGVyKHMpIG5ldGxpbmsgYXR0cmlidXRlcyBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2UKKyAgd2hpY2ggaG9sZCBjYW4gaG9sZCBiYXNpYyB0eXBlcyBzdWNoIGFzIHVuc2lnbmVkIGludGVnZXJzIGFuZCBzdHJpbmdzLgorKiBBbGwgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXJlIGJ5dGUtYWxpZ25lZCAoQ3VycmVudGx5IDQgYnl0ZXMpLgorKiBBY2tub3dsZWRnZW1lbnRzIChBQ0tzKSBhcmUgc2VudCBhcyBOTE1TR19FUlJPUiBuZXRsaW5rIG1lc3NhZ2UgdHlwZXMgKDB4MikgYW5kCisgIGhhdmUgYW4gZXJyb3IgdmFsdWUgb2YgMC4KKworS05PV04gQlVHUworKiBOT1QgVEhSRUFEIFNBRkUhISEKKyogbmxhX3BhcnNlIC0gZG9lcyBub3QgdXNlIG5sYV9wb2xpY3kgYXJndW1lbnQKKyogbmxfcmVjdm1zZ3MgLSBkb2VzIG5vdCBzdXBwb3J0IG5sX2NiX292ZXJ3cml0ZV9yZWN2KCkKKyogbmxfcmVjdiAtIHNldHMvdW5zZXRzIGFzeW5jLiBmbGFnCisqIGdlbmxfY3RybF9hbGxvY19jYWNoZSAtIG5ldGxpbmsgc2VuZC9yZWN2IGZ1bmNzIHNob3VsZCBiZSB1c2VkCisKK1JFRkVSRU5DRVMKKyogbmw4MDIxMS5oCisqIG5ldGxpbmtfdHlwZXMuaAorKiAkTElOVVhfS0VSTkVML25ldC93aXJlbGVzcy9ubDgwMjExLmMKKyogaHR0cDovL3d3dy5pbmZyYWRlYWQub3JnL350Z3IvbGlibmwvZG9jLTMuMC9pbmRleC5odG1sCisqIGh0dHA6Ly93d3cubmV0ZmlsdGVyLm9yZy9wcm9qZWN0cy9saWJtbmwvZG94eWdlbi9pbmRleC5odG1sCmRpZmYgLS1naXQgYS9saWJubF8yL2F0dHIuYyBiL2xpYm5sXzIvYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Njc2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2F0dHIuYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKglodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBOT1RJQ0U6IFRoaXMgaXMgYSBjbGVhbiByb29tIHJlLWltcGxlbWVudGF0aW9uIG9mIGxpYm5sICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIm5ldGxpbmsvbmV0bGluay5oIgorI2luY2x1ZGUgIm5ldGxpbmsvbXNnLmgiCisjaW5jbHVkZSAibmV0bGluay9hdHRyLmgiCisjaW5jbHVkZSAibmV0bGluay10eXBlcy5oIgorCisvKiBSZXR1cm4gcGF5bG9hZCBvZiBzdHJpbmcgYXR0cmlidXRlLiAqLworY2hhciAqbmxhX2dldF9zdHJpbmcoc3RydWN0IG5sYXR0ciAqbmxhKQoreworCXJldHVybiAoY2hhciAqKSBubGFfZGF0YShubGEpOworfQorCisvKiBSZXR1cm4gcGF5bG9hZCBvZiAxNiBiaXQgaW50ZWdlciBhdHRyaWJ1dGUuICovCit1aW50MTZfdCBubGFfZ2V0X3UxNihzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJcmV0dXJuICooKHVpbnQxNl90ICopIG5sYV9kYXRhKG5sYSkpOworfQorCisvKiBSZXR1cm4gcGF5bG9hZCBvZiAzMiBiaXQgaW50ZWdlciBhdHRyaWJ1dGUuICovCit1aW50MzJfdCBubGFfZ2V0X3UzMihzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJcmV0dXJuICooKHVpbnQzMl90ICopIG5sYV9kYXRhKG5sYSkpOworfQorCisvKiBSZXR1cm4gdmFsdWUgb2YgOCBiaXQgaW50ZWdlciBhdHRyaWJ1dGUuICovCit1aW50OF90IG5sYV9nZXRfdTgoc3RydWN0IG5sYXR0ciAqbmxhKQoreworCXJldHVybiAqKCh1aW50OF90ICopIG5sYV9kYXRhKG5sYSkpOworfQorCisvKiBSZXR1cm4gcGF5bG9hZCBvZiB1aW50NjRfdCBhdHRyaWJ1dGUuICovCit1aW50NjRfdCBubGFfZ2V0X3U2NChzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJdWludDY0X3QgdG1wOworCW5sYV9tZW1jcHkoJnRtcCwgbmxhLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcDsKK30KKworLyogSGVhZCBvZiBwYXlsb2FkICovCit2b2lkICpubGFfZGF0YShjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBubGEgKyBOTEFfSERSTEVOKTsKK30KKworLyogUmV0dXJuIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCAuICovCitpbnQgbmxhX2xlbihjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJcmV0dXJuIG5sYS0+bmxhX2xlbiAtIE5MQV9IRFJMRU47Cit9CisKKy8qIFN0YXJ0IGEgbmV3IGxldmVsIG9mIG5lc3RlZCBhdHRyaWJ1dGVzLiAqLworc3RydWN0IG5sYXR0ciAqbmxhX25lc3Rfc3RhcnQoc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXR0cnR5cGUpCit7CisJaWYgKCFubGFfcHV0KG1zZywgYXR0cnR5cGUsIDAsIE5VTEwpKSB7CisJCS8qIEdldCByZWYgdG8gbGFzdCAobmVzdGVkIHN0YXJ0KSBhdHRyCSovCisJCWludCBwYWRkaW5nOworCQlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwkJcGFkZGluZyA9IG5sbXNnX3BhZGxlbihubG1zZ19kYXRhbGVuKG5sbXNnX2hkcihtc2cpKSk7CisJCW5sYSA9IChzdHJ1Y3QgbmxhdHRyICopIFwKKwkJCSgoY2hhciAqKSBubG1zZ190YWlsKG1zZy0+bm1fbmxoKSAtIHBhZGRpbmcpOworCQlyZXR1cm4gbmxhOworCisJfSBlbHNlCisJCXJldHVybiBOVUxMOworCit9CisKKy8qIEZpbmFsaXplIG5lc3Rpbmcgb2YgYXR0cmlidXRlcy4gKi8KK2ludCBubGFfbmVzdF9lbmQoc3RydWN0IG5sX21zZyAqbXNnLCBzdHJ1Y3QgbmxhdHRyICpzdGFydCkKK3sKKwlzdGFydC0+bmxhX2xlbiA9ICh1bnNpZ25lZCBjaGFyICopIFwKKwkJbmxtc2dfdGFpbChubG1zZ19oZHIobXNnKSkgLSAodW5zaWduZWQgY2hhciAqKXN0YXJ0OworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gbmV4dCBhdHRyaWJ1dGUgaW4gYSBzdHJlYW0gb2YgYXR0cmlidXRlcy4gKi8KK3N0cnVjdCBubGF0dHIgKm5sYV9uZXh0KGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgaW50ICpyZW1haW5pbmcpCit7CisJc3RydWN0IG5sYXR0ciAqbmV4dF9ubGEgPSBOVUxMOworCWlmIChubGEtPm5sYV9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBubGF0dHIpICYmCisJICAgbmxhLT5ubGFfbGVuIDw9ICpyZW1haW5pbmcpeworCQluZXh0X25sYSA9IChzdHJ1Y3QgbmxhdHRyICopIFwKKwkJCSgoY2hhciAqKSBubGEgKyBOTEFfQUxJR04obmxhLT5ubGFfbGVuKSk7CisJCSpyZW1haW5pbmcgPSAqcmVtYWluaW5nIC0gTkxBX0FMSUdOKG5sYS0+bmxhX2xlbik7CisJfQorCisJcmV0dXJuIG5leHRfbmxhOworCit9CisKKy8qIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaGVhZGVyIGFuZCBwYXlsb2FkIGNhbiBiZSBhY2Nlc3NlZCBzYWZlbHkuICovCitpbnQgbmxhX29rKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgaW50IHJlbWFpbmluZykKK3sKKwlyZXR1cm4gcmVtYWluaW5nID4gMCAmJgorCQlubGEtPm5sYV9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBubGF0dHIpICYmCisJCXNpemVvZihzdHJ1Y3QgbmxhdHRyKSA8PSAodW5zaWduZWQgaW50KSByZW1haW5pbmcgJiYKKwkJbmxhLT5ubGFfbGVuIDw9IHJlbWFpbmluZzsKK30KKworLyogQ3JlYXRlIGF0dHJpYnV0ZSBpbmRleCBiYXNlZCBvbiBhIHN0cmVhbSBvZiBhdHRyaWJ1dGVzLiAqLworLyogTk9URTogUG9saWN5IG5vdCB1c2VkICEgKi8KK2ludCBubGFfcGFyc2Uoc3RydWN0IG5sYXR0ciAqdGJbXSwgaW50IG1heHR5cGUsIHN0cnVjdCBubGF0dHIgKmhlYWQsCisJaW50IGxlbiwgc3RydWN0IG5sYV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgbmxhdHRyICpwb3M7CisJaW50IHJlbTsKKworCS8qIEZpcnN0IGNsZWFyIHRhYmxlICovCisJbWVtc2V0KHRiLCAwLCAobWF4dHlwZSsxKSAqIHNpemVvZihzdHJ1Y3QgbmxhdHRyICopKTsKKworCW5sYV9mb3JfZWFjaF9hdHRyKHBvcywgaGVhZCwgbGVuLCByZW0pIHsKKwkJY29uc3QgaW50IHR5cGUgPSBubGFfdHlwZShwb3MpOworCisJCWlmICh0eXBlIDw9IG1heHR5cGUpCisJCQl0Ylt0eXBlXSA9IHBvczsKKworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIENyZWF0ZSBhdHRyaWJ1dGUgaW5kZXggYmFzZWQgb24gbmVzdGVkIGF0dHJpYnV0ZS4gKi8KK2ludCBubGFfcGFyc2VfbmVzdGVkKHN0cnVjdCBubGF0dHIgKnRiW10sIGludCBtYXh0eXBlLAorCQlzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCBubGFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIG5sYV9wYXJzZSh0YiwgbWF4dHlwZSwgbmxhX2RhdGEobmxhKSwgbmxhX2xlbihubGEpLCBwb2xpY3kpOworfQorCisKKy8qIEFkZCBhIHVuc3BlY2lmaWMgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4gKi8KK2ludCBubGFfcHV0KHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGF0dHJ0eXBlLCBpbnQgZGF0YWxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwkvKiBSZXNlcnZlIHNwYWNlIGFuZCBpbml0IG5sYSBoZWFkZXIgKi8KKwlubGEgPSBubGFfcmVzZXJ2ZShtc2csIGF0dHJ0eXBlLCBkYXRhbGVuKTsKKwlpZiAobmxhKSB7CisJCW1lbWNweShubGFfZGF0YShubGEpLCBkYXRhLCBkYXRhbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7CisKK30KKworCisvKiBBZGQgbmVzdGVkIGF0dHJpYnV0ZXMgdG8gbmV0bGluayBtZXNzYWdlLiAqLworLyogVGFrZXMgdGhlIGF0dHJpYnV0ZXMgZm91bmQgaW4gdGhlIG5lc3RlZCBtZXNzYWdlIGFuZCBhcHBlbmRzIHRoZW0KKyAqIHRvIHRoZSBtZXNzYWdlIG1zZyBuZXN0ZWQgaW4gYSBjb250YWluZXIgb2YgdGhlIHR5cGUgYXR0cnR5cGUuIFRoZQorICogbmVzdGVkIG1lc3NhZ2UgbWF5IG5vdCBoYXZlIGEgZmFtaWx5IHNwZWNpZmljIGhlYWRlciAqLworaW50IG5sYV9wdXRfbmVzdGVkKHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGF0dHJ0eXBlLCBzdHJ1Y3QgbmxfbXNnICpuZXN0ZWQpCit7CisJaW50IHJjID0gLTE7CisJY29uc3QgaW50IE5PX0hFQURFUiA9IDA7CisKKwlyYyA9IG5sYV9wdXQoCisJCW1zZywKKwkJYXR0cnR5cGUsCisJCW5sbXNnX2F0dHJsZW4obmxtc2dfaGRyKG5lc3RlZCksIE5PX0hFQURFUiksCisJCShjb25zdCB2b2lkICopIG5sbXNnX2F0dHJkYXRhKG5sbXNnX2hkcihuZXN0ZWQpLCBOT19IRUFERVIpCisJCSk7CisJcmV0dXJuIHJjOworCit9CisKKy8qIFJldHVybiB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuICovCitpbnQgbmxhX3R5cGUoY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhKQoreworCXJldHVybiAoaW50KSBubGEtPm5sYV90eXBlOworfQorCisvKiBSZXNlcnZlcyByb29tIGZvciBhbiBhdHRyaWJ1dGUgaW4gc3BlY2lmaWVkIG5ldGxpbmsgbWVzc2FnZSBhbmQgZmlsbHMKKyAqIGluIHRoZSBhdHRyaWJ1dGUgaGVhZGVyICh0eXBlLGxlbmd0aCkuIFJldHVybiBOVUxMIGlmIGluc3VmZmljaWVudCBzcGFjZSAqLworc3RydWN0IG5sYXR0ciAqbmxhX3Jlc2VydmUoc3RydWN0IG5sX21zZyAqIG1zZywgaW50IGF0dHJ0eXBlLCBpbnQgZGF0YV9sZW4pCit7CisKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisJY29uc3QgdW5zaWduZWQgaW50IE5FV19TSVpFID0gXAorCQltc2ctPm5tX25saC0+bmxtc2dfbGVuICsgTkxBX0FMSUdOKE5MQV9IRFJMRU4gKyBkYXRhX2xlbik7CisKKwkvKiBDaGVjayBlbm91Z2ggc3BhY2UgZm9yIGF0dHJpYnV0ZSAqLworCWlmIChORVdfU0laRSA8PSBtc2ctPm5tX3NpemUpIHsKKwkJY29uc3QgaW50IGZhbV9oZHJsZW4gPSBtc2ctPm5tX25saC0+bmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOOworCQltc2ctPm5tX25saC0+bmxtc2dfbGVuID0gTkVXX1NJWkU7CisJCW5sYSA9IG5sbXNnX2F0dHJkYXRhKG1zZy0+bm1fbmxoLCBmYW1faGRybGVuKTsKKwkJbmxhLT5ubGFfdHlwZSA9IGF0dHJ0eXBlOworCQlubGEtPm5sYV9sZW4gPSBOTEFfSERSTEVOICsgZGF0YV9sZW47CisJfSBlbHNlCisJCWdvdG8gZmFpbDsKKworCXJldHVybiBubGE7CitmYWlsOgorCXJldHVybiBOVUxMOworCit9CisKKy8qIENvcHkgYXR0cmlidXRlIHBheWxvYWQgdG8gYW5vdGhlciBtZW1vcnkgYXJlYS4gKi8KK2ludCBubGFfbWVtY3B5KHZvaWQgKmRlc3QsIHN0cnVjdCBubGF0dHIgKnNyYywgaW50IGNvdW50KQoreworCWludCByYzsKKwl2b2lkICpyZXRfZGVzdCA9IG1lbWNweShkZXN0LCBubGFfZGF0YShzcmMpLCBjb3VudCk7CisJaWYgKCFyZXRfZGVzdCkKKwkJcmV0dXJuIGNvdW50OworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9jYWNoZS5jIGIvbGlibmxfMi9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTk3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2NhY2hlLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIE5PVElDRTogVGhpcyBpcyBhIGNsZWFuIHJvb20gcmUtaW1wbGVtZW50YXRpb24gb2YgbGlibmwgKi8KKworI2luY2x1ZGUgIm5ldGxpbmsvY2FjaGUuaCIKKyNpbmNsdWRlICJuZXRsaW5rL29iamVjdC5oIgorCit2b2lkIG5sX2NhY2hlX2ZyZWUoc3RydWN0IG5sX2NhY2hlICpjYWNoZSkKK3sKKworfQorCit2b2lkIG5sX2NhY2hlX2NsZWFyKHN0cnVjdCBubF9jYWNoZSAqY2FjaGUpCit7CisKK30KKwordm9pZCBubF9jYWNoZV9yZW1vdmUoc3RydWN0IG5sX29iamVjdCAqb2JqKQoreworCit9CisKKwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9nZW5sL2ZhbWlseS5jIGIvbGlibmxfMi9nZW5sL2ZhbWlseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWVlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2dlbmwvZmFtaWx5LmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKglodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBOT1RJQ0U6IFRoaXMgaXMgYSBjbGVhbiByb29tIHJlLWltcGxlbWVudGF0aW9uIG9mIGxpYm5sICovCisKKyNpbmNsdWRlICJuZXRsaW5rLXR5cGVzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgKmdlbmxfZmFtaWx5X2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlbGVhc2UgcmVmZXJlbmNlIGFuZCBub25lIG91dHN0YW5kaW5nICAqLwordm9pZCBnZW5sX2ZhbWlseV9wdXQoc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHkpCit7CisJZmFtaWx5LT5jZV9yZWZjbnQtLTsKKwlpZiAoZmFtaWx5LT5jZV9yZWZjbnQgPD0gMCkKKwkJZnJlZShmYW1pbHkpOworfQorCit1bnNpZ25lZCBpbnQgZ2VubF9mYW1pbHlfZ2V0X2lkKHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5KQoreworCWNvbnN0IGludCBOT19GQU1JTFlfSUQgPSAwOworCisJaWYgKCFmYW1pbHkpCisJCXJldHVybiBOT19GQU1JTFlfSUQ7CisJZWxzZQorCQlyZXR1cm4gZmFtaWx5LT5nZl9pZDsKKworfQorCmRpZmYgLS1naXQgYS9saWJubF8yL2dlbmwvZ2VubC5jIGIvbGlibmxfMi9nZW5sL2dlbmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDIwNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9nZW5sL2dlbmwuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKglodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBOT1RJQ0U6IFRoaXMgaXMgYSBjbGVhbiByb29tIHJlLWltcGxlbWVudGF0aW9uIG9mIGxpYm5sICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSAibmV0bGluay10eXBlcy5oIgorCisvKiBHZXQgaGVhZCBvZiBhdHRyaWJ1dGUgZGF0YS4gKi8KK3N0cnVjdCBubGF0dHIgKmdlbmxtc2dfYXR0cmRhdGEoY29uc3Qgc3RydWN0IGdlbmxtc2doZHIgKmdubGgsIGludCBoZHJsZW4pCit7CisJcmV0dXJuIChzdHJ1Y3QgbmxhdHRyICopIFwKKwkJKChjaGFyICopIGdubGggKyBHRU5MX0hEUkxFTiArIE5MTVNHX0FMSUdOKGhkcmxlbikpOworCit9CisKKy8qIEdldCBsZW5ndGggb2YgYXR0cmlidXRlIGRhdGEuICovCitpbnQgZ2VubG1zZ19hdHRybGVuKGNvbnN0IHN0cnVjdCBnZW5sbXNnaGRyICpnbmxoLCBpbnQgaGRybGVuKQoreworCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCW5sYSA9IGdlbmxtc2dfYXR0cmRhdGEoZ25saCwgaGRybGVuKTsKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopICgoY2hhciAqKSBnbmxoIC0gTkxNU0dfSERSTEVOKTsKKwlyZXR1cm4gKGNoYXIgKikgbmxtc2dfdGFpbChubGgpIC0gKGNoYXIgKikgbmxhOworfQorCisvKiBBZGQgZ2VuZXJpYyBuZXRsaW5rIGhlYWRlciB0byBuZXRsaW5rIG1lc3NhZ2UuICovCit2b2lkICpnZW5sbXNnX3B1dChzdHJ1Y3QgbmxfbXNnICptc2csIHVpbnQzMl90IHBpZCwgdWludDMyX3Qgc2VxLCBpbnQgZmFtaWx5LAorCQlpbnQgaGRybGVuLCBpbnQgZmxhZ3MsIHVpbnQ4X3QgY21kLCB1aW50OF90IHZlcnNpb24pCit7CisJaW50IG5ld19zaXplOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBnZW5sbXNnaGRyICpnbWg7CisKKwkvKiBNYWtlIHN1cmUgbmxfbXNnIGhhcyBlbm91Z2ggc3BhY2UgKi8KKwluZXdfc2l6ZSA9IE5MTVNHX0hEUkxFTiArIEdFTkxfSERSTEVOICsgaGRybGVuOworCWlmICgoc2l6ZW9mKHN0cnVjdCBubF9tc2cpICsgbmV3X3NpemUpID4gbXNnLT5ubV9zaXplKQorCQlnb3RvIGZhaWw7CisKKwkvKiBGaWxsIGluIG5ldGxpbmsgaGVhZGVyICovCisJbmxoID0gbXNnLT5ubV9ubGg7CisJbmxoLT5ubG1zZ19sZW4gPSBuZXdfc2l6ZTsKKwlubGgtPm5sbXNnX3R5cGUgPSBmYW1pbHk7CisJbmxoLT5ubG1zZ19waWQgPSBnZXRwaWQoKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gZmxhZ3MgfCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLOworCisJLyogR2V0IGN1cnJlbnQgdGltZSBmb3Igc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKGdldHRpbWVvZmRheSgmdHYsIE5VTEwpKQorCQlubGgtPm5sbXNnX3NlcSA9IDE7CisJZWxzZQorCQlubGgtPm5sbXNnX3NlcSA9IChpbnQpIHR2LnR2X3NlYzsKKworCS8qIFNldHVwIGdlbmxtc2doZHIgaW4gbmV3IG1lc3NhZ2UgKi8KKwlnbWggPSAoc3RydWN0IGdlbmxtc2doZHIgKikgKChjaGFyICopbmxoICsgTkxNU0dfSERSTEVOKTsKKwlnbWgtPmNtZCA9IChfX3U4KSBjbWQ7CisJZ21oLT52ZXJzaW9uID0gdmVyc2lvbjsKKworCXJldHVybiBnbWg7CitmYWlsOgorCXJldHVybiBOVUxMOworCit9CisKKy8qIFNvY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jZWQgdG8gY29ubmVjdCBpdCB0byBrZXJuZWw/ICovCitpbnQgZ2VubF9jb25uZWN0KHN0cnVjdCBubF9zb2NrICpzaykKK3sKKwlyZXR1cm4gbmxfY29ubmVjdChzaywgTkVUTElOS19HRU5FUklDKTsKKworfQorCitpbnQgZ2VubF9jdHJsX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICpzb2NrLCBzdHJ1Y3QgbmxfY2FjaGUgKipyZXN1bHQpCit7CisJaW50IHJjID0gLTE7CisJaW50IG5sODAyMTFfZ2VubF9pZCA9IC0xOworCWNoYXIgc2VuZGJ1ZltzaXplb2Yoc3RydWN0IG5sbXNnaGRyKStzaXplb2Yoc3RydWN0IGdlbmxtc2doZHIpXTsKKwlzdHJ1Y3Qgbmxtc2doZHIgbmxtaGRyOworCXN0cnVjdCBnZW5sbXNnaGRyIGdtaGhkcjsKKwlzdHJ1Y3QgaW92ZWMgc2VuZG1zZ19pb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJaW50IG51bV9jaGFyOworCWNvbnN0IGludCBSRUNWX0JVRl9TSVpFID0gZ2V0cGFnZXNpemUoKTsKKwljaGFyICpyZWN2YnVmOworCXN0cnVjdCBpb3ZlYyByZWN2bXNnX2lvdjsKKwlpbnQgbmw4MDIxMV9mbGFnID0gMCwgbmxtX2ZfbXVsdGkgPSAwLCBubG1zZ19kb25lID0gMDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCS8qIFJFUVVFU1QgR0VORVJJQyBORVRMSU5LIEZBTUlMWSBJRCAqLworCS8qIE1lc3NhZ2UgYnVmZmVyICovCisJbmxtaGRyLm5sbXNnX2xlbiA9IHNpemVvZihzZW5kYnVmKTsKKwlubG1oZHIubmxtc2dfdHlwZSA9IE5FVExJTktfR0VORVJJQzsKKwlubG1oZHIubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLIHwgTkxNX0ZfRFVNUDsKKwlubG1oZHIubmxtc2dfc2VxID0gc29jay0+c19zZXFfbmV4dDsKKwlubG1oZHIubmxtc2dfcGlkID0gc29jay0+c19sb2NhbC5ubF9waWQ7CisKKwkvKiBHZW5lcmljIG5ldGxpbmsgaGVhZGVyICovCisJZ21oaGRyLmNtZCA9IENUUkxfQ01EX0dFVEZBTUlMWTsKKwlnbWhoZHIudmVyc2lvbiA9IENUUkxfQVRUUl9GQU1JTFlfSUQ7CisKKwkvKiBDb21iaW5lIG5ldGxpbmsgYW5kIGdlbmVyaWMgbmV0bGluayBoZWFkZXJzICovCisJbWVtY3B5KCZzZW5kYnVmWzBdLCAmbmxtaGRyLCBzaXplb2YobmxtaGRyKSk7CisJbWVtY3B5KCZzZW5kYnVmWzBdK3NpemVvZihubG1oZHIpLCAmZ21oaGRyLCBzaXplb2YoZ21oaGRyKSk7CisKKwkvKiBDcmVhdGUgSU8gdmVjdG9yIHdpdGggTmV0bGluayBtZXNzYWdlICovCisJc2VuZG1zZ19pb3YuaW92X2Jhc2UgPSAmc2VuZGJ1ZjsKKwlzZW5kbXNnX2lvdi5pb3ZfbGVuID0gc2l6ZW9mKHNlbmRidWYpOworCisJLyogU29ja2V0IG1lc3NhZ2UgKi8KKwltc2cubXNnX25hbWUgPSAodm9pZCAqKSAmc29jay0+c19wZWVyOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihzb2NrLT5zX3BlZXIpOworCW1zZy5tc2dfaW92ID0gJnNlbmRtc2dfaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsgLyogT25seSBzZW5kaW5nIG9uZSBpb3YgKi8KKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IDA7CisKKwkvKiBTZW5kIG1lc3NhZ2UgYW5kIHZlcmlmeSBzZW50ICovCisJbnVtX2NoYXIgPSBzZW5kbXNnKHNvY2stPnNfZmQsICZtc2csIDApOworCWlmIChudW1fY2hhciA9PSAtMSkKKwkJcmV0dXJuIC1lcnJubzsKKworCS8qIFJFQ0VJVkUgR0VOTCBDTUQgUkVTUE9OU0UgKi8KKworCS8qIENyZWF0ZSByZWNlaXZlIGlvdiBidWZmZXIgKi8KKwlyZWN2YnVmID0gKGNoYXIgKikgbWFsbG9jKFJFQ1ZfQlVGX1NJWkUpOworCisJLyogQXR0YWNoIHRvIGlvdiAqLworCXJlY3Ztc2dfaW92Lmlvdl9iYXNlID0gcmVjdmJ1ZjsKKwlyZWN2bXNnX2lvdi5pb3ZfbGVuID0gUkVDVl9CVUZfU0laRTsKKworCW1zZy5tc2dfaW92ID0gJnJlY3Ztc2dfaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogUmVjZWl2ZSBtZXNzYWdlLiBJZiBtdWx0aXBhcnQgbWVzc2FnZSwga2VlcCByZWNlaXZpbmcgdW50aWwgKi8KKwkvKiBtZXNzYWdlIHR5cGUgaXMgTkxNU0dfRE9ORQkJCQkgICAgICAgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZG8geworCisJCWludCByZWN2bXNnX2xlbiwgbmxtc2dfcmVtOworCisJCS8qIFJlY2VpdmUgbWVzc2FnZSAqLworCQltZW1zZXQocmVjdmJ1ZiwgMCwgUkVDVl9CVUZfU0laRSk7CisJCXJlY3Ztc2dfbGVuID0gcmVjdm1zZyhzb2NrLT5zX2ZkLCAmbXNnLCAwKTsKKworCQkvKiBNYWtlIHN1cmUgcmVjZWl2ZSBzdWNjZXNzZnVsICovCisJCWlmIChyZWN2bXNnX2xlbiA8IDApIHsKKwkJCXJjID0gLWVycm5vOworCQkJZ290byBlcnJvcl9yZWN2YnVmOworCQl9CisKKwkJLyogUGFyc2Ugbmxtc2doZHIgKi8KKwkJbmxtc2dfZm9yX2VhY2hfbXNnKG5saCwgKHN0cnVjdCBubG1zZ2hkciAqKSByZWN2YnVmLCBcCisJCQkJcmVjdm1zZ19sZW4sIG5sbXNnX3JlbSkgeworCQkJc3RydWN0IG5sYXR0ciAqbmxhOworCQkJaW50IG5sYV9yZW07CisKKwkJCS8qIENoZWNrIHR5cGUgKi8KKwkJCXN3aXRjaCAobmxoLT5ubG1zZ190eXBlKSB7CisJCQljYXNlIE5MTVNHX0RPTkU6CisJCQkJZ290byByZXR1cm5fZ2VubF9pZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTkxNU0dfRVJST1I6CisKKwkJCQkvKiBTaG91bGQgY2hlY2sgbmxtc2dlcnIgc3RydWN0IHJlY2VpdmVkICovCisJCQkJZnByaW50ZihzdGRlcnIsICJSZWNlaXZlIG1lc3NhZ2UgZXJyb3JcbiIpOworCQkJCWdvdG8gZXJyb3JfcmVjdmJ1ZjsKKwkJCWNhc2UgTkxNU0dfT1ZFUlJVTjoKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlY2VpdmUgZGF0YSBwYXJ0bHkgbG9zdFxuIik7CisJCQkJZ290byBlcnJvcl9yZWN2YnVmOworCQkJY2FzZSBOTE1TR19NSU5fVFlQRToKKwkJCWNhc2UgTkxNU0dfTk9PUDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKworCisJCQkvKiBDaGVjayBmbGFncyAqLworCQkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9NVUxUSSkKKwkJCQlubG1fZl9tdWx0aSA9IDE7CisJCQllbHNlCisJCQkJbmxtX2ZfbXVsdGkgPSAwOworCisJCQlpZiAobmxoLT5ubG1zZ190eXBlICYgTkxNU0dfRE9ORSkKKwkJCQlubG1zZ19kb25lID0gMTsKKwkJCWVsc2UKKwkJCQlubG1zZ19kb25lID0gMDsKKworCQkJLyogSXRlcmF0dmUgb3ZlciBhdHRyaWJ1dGVzICovCisJCQlubGFfZm9yX2VhY2hfYXR0cihubGEsCisJCQkJCW5sbXNnX2F0dHJkYXRhKG5saCwgR0VOTF9IRFJMRU4pLAorCQkJCQlubG1zZ19hdHRybGVuKG5saCwgR0VOTF9IRFJMRU4pLAorCQkJCQlubGFfcmVtKXsKKworCQkJCS8qIElmIHRoaXMgZmFtaWx5IGlzIG5sODAyMTEgKi8KKwkJCQlpZiAobmxhLT5ubGFfdHlwZSA9PSBDVFJMX0FUVFJfRkFNSUxZX05BTUUgJiYKKwkJCQkJIXN0cmNtcCgoY2hhciAqKW5sYV9kYXRhKG5sYSksCisJCQkJCQkibmw4MDIxMSIpKQorCQkJCQlubDgwMjExX2ZsYWcgPSAxOworCisJCQkJLyogU2F2ZSB0aGUgZmFtaWx5IGlkICovCisJCQkJZWxzZSBpZiAobmw4MDIxMV9mbGFnICYmCisJCQkJCW5sYS0+bmxhX3R5cGUgPT0gQ1RSTF9BVFRSX0ZBTUlMWV9JRCkKKwkJCQkJbmw4MDIxMV9nZW5sX2lkID0gXAorCQkJCQkJKigoaW50ICopbmxhX2RhdGEobmxhKSk7CisKKwkJCX0KKworCQl9CisKKwl9IHdoaWxlIChubG1fZl9tdWx0aSAmJiAhbmxtc2dfZG9uZSk7CisKK3JldHVybl9nZW5sX2lkOgorCS8qIFJldHVybiBmYW1pbHkgaWQgYXMgY2FjaGUgcG9pbnRlciAqLworCSpyZXN1bHQgPSAoc3RydWN0IG5sX2NhY2hlICopIG5sODAyMTFfZ2VubF9pZDsKKwlyYyA9IDA7CitlcnJvcl9yZWN2YnVmOgorCWZyZWUocmVjdmJ1Zik7CitlcnJvcjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qIENoZWNrcyB0aGUgbmV0bGluayBjYWNoZSB0byBmaW5kIGZhbWlseSByZWZlcmVuY2UgYnkgbmFtZSBzdHJpbmcgKi8KKy8qIE5PVEU6IENhbGxlciBuZWVkcyB0byBjYWxsIGdlbmxfZmFtaWx5X3B1dCgpIHdoZW4gZG9uZSB3aXRoICoKKyAqIHJldHVybmVkIG9iamVjdCAqLworc3RydWN0IGdlbmxfZmFtaWx5ICpnZW5sX2N0cmxfc2VhcmNoX2J5X25hbWUoc3RydWN0IG5sX2NhY2hlICpjYWNoZSwgXAorCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCS8qIFRPRE86IFdoZW4gd2lsbCB3ZSByZWxlYXNlIHRoaXMgbWVtb3J5ID8gKi8KKwlzdHJ1Y3QgZ2VubF9mYW1pbHkgKmdmID0gKHN0cnVjdCBnZW5sX2ZhbWlseSAqKSBcCisJCW1hbGxvYyhzaXplb2Yoc3RydWN0IGdlbmxfZmFtaWx5KSk7CisJaWYgKCFnZikKKwkJZ290byBmYWlsOworCW1lbXNldChnZiwgMCwgc2l6ZW9mKCpnZikpOworCisJLyogQWRkIHJlZiAqLworCWdmLT5jZV9yZWZjbnQrKzsKKworCS8qIE92ZXJyaWRpbmcgY2FjaGUgcG9pbnRlciBhcyBmYW1pbHkgaWQgZm9yIG5vdyAqLworCWdmLT5nZl9pZCA9ICh1aW50MTZfdCkgKCh1aW50MzJfdCkgY2FjaGUpOworCXN0cmNweShnZi0+Z2ZfbmFtZSwgIm5sODAyMTEiKTsKKworCXJldHVybiBnZjsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7CisKK30KKworaW50IGdlbmxfY3RybF9yZXNvbHZlKHN0cnVjdCBubF9zb2NrICpzaywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBIYWNrIHRvIHN1cHBvcnQgd3BhX3N1cHBsaWNhbnQgKi8KKwlpZiAoc3RyY21wKG5hbWUsICJubGN0cmwiKSA9PSAwKQorCQlyZXR1cm4gTkVUTElOS19HRU5FUklDOworCWVsc2UgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJZnByaW50ZihzdGRlcnIsIFwKKwkJCSJPbmx5IG5sY3RybCBzdXBwb3J0ZWQgYnkgZ2VubF9jdHJsX3Jlc29sdmUhXG4iKTsKKwkJcmV0dXJuIC1lcnJzdjsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9oYW5kbGVycy5jIGIvbGlibmxfMi9oYW5kbGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGQ1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2hhbmRsZXJzLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKglodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBOT1RJQ0U6IFRoaXMgaXMgYSBjbGVhbiByb29tIHJlLWltcGxlbWVudGF0aW9uIG9mIGxpYm5sICovCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJuZXRsaW5rLXR5cGVzLmgiCisjaW5jbHVkZSAibmV0bGluay9oYW5kbGVycy5oIgorCisvKiBBbGxvY2F0ZSBhIG5ldyBjYWxsYmFjayBoYW5kbGUuICovCitzdHJ1Y3QgbmxfY2IgKm5sX2NiX2FsbG9jKGVudW0gbmxfY2Jfa2luZCBraW5kKQoreworCXN0cnVjdCBubF9jYiAqY2I7CisKKwljYiA9IChzdHJ1Y3QgbmxfY2IgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmxfY2IpKTsKKwlpZiAoY2IgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChjYiwgMCwgc2l6ZW9mKCpjYikpOworCisJcmV0dXJuIG5sX2NiX2dldChjYik7CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBDbG9uZSBhbiBleGlzdGluZyBjYWxsYmFjayBoYW5kbGUgKi8KK3N0cnVjdCBubF9jYiAqbmxfY2JfY2xvbmUoc3RydWN0IG5sX2NiICpvcmlnKQoreworCXN0cnVjdCBubF9jYiAqbmV3X2NiOworCWludCBuZXdfcmVmY250OworCisJbmV3X2NiID0gbmxfY2JfYWxsb2MoTkxfQ0JfREVGQVVMVCk7CisJaWYgKG5ld19jYiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwkvKiBQcmVzZXJ2ZSByZWZlcmVuY2UgY291bnQgYW5kIGNvcHkgb3JpZ2luYWwgKi8KKwluZXdfcmVmY250ID0gbmV3X2NiLT5jYl9yZWZjbnQ7CisJbWVtY3B5KG5ld19jYiwgb3JpZywgc2l6ZW9mKCpvcmlnKSk7CisJbmV3X2NiLT5jYl9yZWZjbnQgPSBuZXdfcmVmY250OworCisJcmV0dXJuIG5ld19jYjsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB1cCBhIGNhbGxiYWNrLiAqLworaW50IG5sX2NiX3NldChzdHJ1Y3QgbmxfY2IgKmNiLCBlbnVtIG5sX2NiX3R5cGUgdHlwZSwgZW51bSBubF9jYl9raW5kIGtpbmQsIFwKKwlubF9yZWN2bXNnX21zZ19jYl90IGZ1bmMsIHZvaWQgKmFyZykKK3sKKwljYi0+Y2Jfc2V0W3R5cGVdID0gZnVuYzsKKwljYi0+Y2JfYXJnc1t0eXBlXSA9IGFyZzsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIFNldCB1cCBhbiBlcnJvciBjYWxsYmFjay4gKi8KK2ludCBubF9jYl9lcnIoc3RydWN0IG5sX2NiICpjYiwgZW51bSBubF9jYl9raW5kIGtpbmQsIFwKKwlubF9yZWN2bXNnX2Vycl9jYl90IGZ1bmMsIHZvaWQgKmFyZykKK3sKKwljYi0+Y2JfZXJyID0gZnVuYzsKKwljYi0+Y2JfZXJyX2FyZyA9IGFyZzsKKwlyZXR1cm4gMDsKKworfQorCitzdHJ1Y3QgbmxfY2IgKm5sX2NiX2dldChzdHJ1Y3QgbmxfY2IgKmNiKQoreworCWNiLT5jYl9yZWZjbnQrKzsKKwlyZXR1cm4gY2I7Cit9CisKK3ZvaWQgbmxfY2JfcHV0KHN0cnVjdCBubF9jYiAqY2IpCit7CisJY2ItPmNiX3JlZmNudC0tOworCWlmIChjYi0+Y2JfcmVmY250IDw9IDApCisJCWZyZWUoY2IpOworCit9CisKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rLWdlbmVyaWMuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rLWdlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGFhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmstZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBuZXRsaW5rLWdlbmVyaWMuaAlMb2NhbCBHZW5lcmljIE5ldGxpbmsgSW50ZXJmYWNlCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0dFTkxfUFJJVl9IXworI2RlZmluZSBORVRMSU5LX0dFTkxfUFJJVl9IXworCisjaW5jbHVkZSA8bmV0bGluay1sb2NhbC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorCisjZGVmaW5lIEdFTkxfSERSU0laRShoZHJsZW4pIChHRU5MX0hEUkxFTiArIChoZHJsZW4pKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rLWxvY2FsLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay1sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOGM5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay1sb2NhbC5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogbmV0bGluay1sb2NhbC5oCQlMb2NhbCBOZXRsaW5rIEludGVyZmFjZQorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19MT0NBTF9IXworI2RlZmluZSBORVRMSU5LX0xPQ0FMX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpZm5kZWYgU09MX05FVExJTksKKyNkZWZpbmUgU09MX05FVExJTksgMjcwCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIGxvY2FsIGhlYWRlciBjb3BpZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbl9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwX21wX2FsZy5oPgorCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9oYW5kbGVycy5oPgorI2luY2x1ZGUgPG5ldGxpbmsvY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL3RjLmg+CisjaW5jbHVkZSA8bmV0bGluay9vYmplY3QtYXBpLmg+CisjaW5jbHVkZSA8bmV0bGluay9jYWNoZS1hcGkuaD4KKyNpbmNsdWRlIDxuZXRsaW5rLXR5cGVzLmg+CisKK3N0cnVjdCB0cmFuc190YmwgeworCWludCBpOworCWNvbnN0IGNoYXIgKmE7Cit9OworCisjZGVmaW5lIF9fQUREKGlkLCBuYW1lKSB7IC5pID0gaWQsIC5hID0gI25hbWUgfSwKKworc3RydWN0IHRyYW5zX2xpc3QgeworCWludCBpOworCWNoYXIgKmE7CisJc3RydWN0IG5sX2xpc3RfaGVhZCBsaXN0OworfTsKKworI2RlZmluZSBOTF9ERUJVRwkxCisKKyNkZWZpbmUgTkxfREJHKExWTCxGTVQsQVJHLi4uKSBcCisJZG8gewlcCisJCWlmIChMVkwgPD0gbmxfZGVidWcpIFwKKwkJCWZwcmludGYoc3RkZXJyLCAiREJHPCIgI0xWTCAiPjogIiBGTVQsICMjQVJHKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQlVHKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiAlczolZFxuIiwgIFwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgICAgXAorCQlhc3NlcnQoMCk7CVwKKwl9IHdoaWxlICgwKQorCitleHRlcm4gaW50IF9fbmxfcmVhZF9udW1fc3RyX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwKKwkJCQkgIGludCAoKmNiKShsb25nLCBjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIGludCBfX3RyYW5zX2xpc3RfYWRkKGludCwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbmxfbGlzdF9oZWFkICopOworZXh0ZXJuIHZvaWQgX190cmFuc19saXN0X2NsZWFyKHN0cnVjdCBubF9saXN0X2hlYWQgKik7CisKK2V4dGVybiBjaGFyICpfX3R5cGUyc3RyKGludCwgY2hhciAqLCBzaXplX3QsIHN0cnVjdCB0cmFuc190YmwgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgX19zdHIydHlwZShjb25zdCBjaGFyICosIHN0cnVjdCB0cmFuc190YmwgKiwgc2l6ZV90KTsKKworZXh0ZXJuIGNoYXIgKl9fbGlzdF90eXBlMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90LCBzdHJ1Y3QgbmxfbGlzdF9oZWFkICopOworZXh0ZXJuIGludCBfX2xpc3Rfc3RyMnR5cGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbmxfbGlzdF9oZWFkICopOworCitleHRlcm4gY2hhciAqX19mbGFnczJzdHIoaW50LCBjaGFyICosIHNpemVfdCwgc3RydWN0IHRyYW5zX3RibCAqLCBzaXplX3QpOworZXh0ZXJuIGludCBfX3N0cjJmbGFncyhjb25zdCBjaGFyICosIHN0cnVjdCB0cmFuc190YmwgKiwgc2l6ZV90KTsKKworZXh0ZXJuIHZvaWQgZHVtcF9mcm9tX29wcyhzdHJ1Y3Qgbmxfb2JqZWN0ICosIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmxfY2FjaGUgKmRwX2NhY2hlKHN0cnVjdCBubF9vYmplY3QgKm9iaikKK3sKKwlpZiAob2JqLT5jZV9jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gbmxfY2FjaGVfbW5ndF9yZXF1aXJlKG9iai0+Y2Vfb3BzLT5vb19uYW1lKTsKKworCXJldHVybiBvYmotPmNlX2NhY2hlOworfQorCitzdGF0aWMgaW5saW5lIGludCBubF9jYl9jYWxsKHN0cnVjdCBubF9jYiAqY2IsIGludCB0eXBlLCBzdHJ1Y3QgbmxfbXNnICptc2cpCit7CisJcmV0dXJuIGNiLT5jYl9zZXRbdHlwZV0obXNnLCBjYi0+Y2JfYXJnc1t0eXBlXSk7Cit9CisKKyNkZWZpbmUgQVJSQVlfU0laRShYKSAoc2l6ZW9mKFgpIC8gc2l6ZW9mKChYKVswXSkpCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChzaXplX3QpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorI2VuZGlmCisKKyNkZWZpbmUgX19pbml0IF9fYXR0cmlidXRlX18gKChjb25zdHJ1Y3RvcikpCisjZGVmaW5lIF9fZXhpdCBfX2F0dHJpYnV0ZV9fICgoZGVzdHJ1Y3RvcikpCisjdW5kZWYgX19kZXByZWNhdGVkCisjZGVmaW5lIF9fZGVwcmVjYXRlZCBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCisKKyNkZWZpbmUgbWluKHgseSkgKHsgXAorCXR5cGVvZih4KSBfeCA9ICh4KTsJXAorCXR5cGVvZih5KSBfeSA9ICh5KTsJXAorCSh2b2lkKSAoJl94ID09ICZfeSk7CQlcCisJX3ggPCBfeSA/IF94IDogX3k7IH0pCisKKyNkZWZpbmUgbWF4KHgseSkgKHsgXAorCXR5cGVvZih4KSBfeCA9ICh4KTsJXAorCXR5cGVvZih5KSBfeSA9ICh5KTsJXAorCSh2b2lkKSAoJl94ID09ICZfeSk7CQlcCisJX3ggPiBfeSA/IF94IDogX3k7IH0pCisKKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpIFwKKwkoeyB0eXBlIF9feCA9ICh4KTsgdHlwZSBfX3kgPSAoeSk7IF9feCA8IF9feSA/IF9feDogX195OyB9KQorI2RlZmluZSBtYXhfdCh0eXBlLHgseSkgXAorCSh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194ID4gX195ID8gX194OiBfX3k7IH0pCisKK2V4dGVybiBpbnQgbmxfY2FjaGVfcGFyc2Uoc3RydWN0IG5sX2NhY2hlX29wcyAqLCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwKKwkJCSAgc3RydWN0IG5sbXNnaGRyICosIHN0cnVjdCBubF9wYXJzZXJfcGFyYW0gKik7CisKKworc3RhdGljIGlubGluZSB2b2lkIHJ0bmxfY29weV9yYXRlc3BlYyhzdHJ1Y3QgcnRubF9yYXRlc3BlYyAqZHN0LAorCQkJCSAgICAgIHN0cnVjdCB0Y19yYXRlc3BlYyAqc3JjKQoreworCWRzdC0+cnNfY2VsbF9sb2cgPSBzcmMtPmNlbGxfbG9nOworCWRzdC0+cnNfZmVhdHVyZSA9IHNyYy0+ZmVhdHVyZTsKKwlkc3QtPnJzX2FkZGVuZCA9IHNyYy0+YWRkZW5kOworCWRzdC0+cnNfbXB1ID0gc3JjLT5tcHU7CisJZHN0LT5yc19yYXRlID0gc3JjLT5yYXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRubF9yY29weV9yYXRlc3BlYyhzdHJ1Y3QgdGNfcmF0ZXNwZWMgKmRzdCwKKwkJCQkgICAgICAgc3RydWN0IHJ0bmxfcmF0ZXNwZWMgKnNyYykKK3sKKwlkc3QtPmNlbGxfbG9nID0gc3JjLT5yc19jZWxsX2xvZzsKKwlkc3QtPmZlYXR1cmUgPSBzcmMtPnJzX2ZlYXR1cmU7CisJZHN0LT5hZGRlbmQgPSBzcmMtPnJzX2FkZGVuZDsKKwlkc3QtPm1wdSA9IHNyYy0+cnNfbXB1OworCWRzdC0+cmF0ZSA9IHNyYy0+cnNfcmF0ZTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpubF9jYWNoZV9uYW1lKHN0cnVjdCBubF9jYWNoZSAqY2FjaGUpCit7CisJcmV0dXJuIGNhY2hlLT5jX29wcyA/IGNhY2hlLT5jX29wcy0+Y29fbmFtZSA6ICJ1bmtub3duIjsKK30KKworI2RlZmluZSBHRU5MX0ZBTUlMWShpZCwgbmFtZSkgXAorCXsgXAorCQl7IGlkLCBOTF9BQ1RfVU5TUEVDLCBuYW1lIH0sIFwKKwkJRU5EX09GX01TR1RZUEVTX0xJU1QsIFwKKwl9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfZm9yX2FjayhzdHJ1Y3Qgbmxfc29jayAqc2spCit7CisJaWYgKHNrLT5zX2ZsYWdzICYgTkxfTk9fQVVUT19BQ0spCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIG5sX3dhaXRfZm9yX2Fjayhzayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmstdHlwZXMuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZTg3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rLXR5cGVzLmgKQEAgLTAsMCArMSw4MzIgQEAKKy8qCisgKiBuZXRsaW5rLXR5cGVzLmgJTmV0bGluayBUeXBlcyAoUHJpdmF0ZSkKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfTE9DQUxfVFlQRVNfSF8KKyNkZWZpbmUgTkVUTElOS19MT0NBTF9UWVBFU19IXworCisjaW5jbHVkZSA8bmV0bGluay9saXN0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9saW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9xZGlzYy5oPgorI2luY2x1ZGUgPG5ldGxpbmsvcm91dGUvcnRubC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvcm91dGUvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL29iamVjdC1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworI2RlZmluZSBOTF9TT0NLX0JVRlNJWkVfU0VUCSgxPDwwKQorI2RlZmluZSBOTF9TT0NLX1BBU1NDUkVECSgxPDwxKQorI2RlZmluZSBOTF9PV05fUE9SVAkJKDE8PDIpCisjZGVmaW5lIE5MX01TR19QRUVLCQkoMTw8MykKKyNkZWZpbmUgTkxfTk9fQVVUT19BQ0sJCSgxPDw0KQorCisjZGVmaW5lIE5MX01TR19DUkVEX1BSRVNFTlQgMQorCitzdHJ1Y3QgbmxfY2FjaGVfb3BzOworc3RydWN0IG5sX3NvY2s7CitzdHJ1Y3Qgbmxfb2JqZWN0OworCitzdHJ1Y3QgbmxfY2IKK3sKKwlubF9yZWN2bXNnX21zZ19jYl90CWNiX3NldFtOTF9DQl9UWVBFX01BWCsxXTsKKwl2b2lkICoJCQljYl9hcmdzW05MX0NCX1RZUEVfTUFYKzFdOworCisJbmxfcmVjdm1zZ19lcnJfY2JfdAljYl9lcnI7CisJdm9pZCAqCQkJY2JfZXJyX2FyZzsKKworCS8qKiBNYXkgYmUgdXNlZCB0byByZXBsYWNlIG5sX3JlY3Ztc2dzIHdpdGggeW91ciBvd24gaW1wbGVtZW50YXRpb24KKwkgKiBpbiBhbGwgaW50ZXJuYWwgY2FsbHMgdG8gbmxfcmVjdm1zZ3MuICovCisJaW50CQkJKCpjYl9yZWN2bXNnc19vdykoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCSAgc3RydWN0IG5sX2NiICopOworCisJLyoqIE92ZXJ3cml0ZSBpbnRlcm5hbCBjYWxscyB0byBubF9yZWN2LCBtdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mCisJICogb2N0ZXRzIHJlYWQgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgcmVjZWl2ZWQgZGF0YS4gKi8KKwlpbnQJCQkoKmNiX3JlY3Zfb3cpKHN0cnVjdCBubF9zb2NrICosCisJCQkJCSAgICAgIHN0cnVjdCBzb2NrYWRkcl9ubCAqLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyICoqLAorCQkJCQkgICAgICBzdHJ1Y3QgdWNyZWQgKiopOworCisJLyoqIE92ZXJ3cml0ZXMgaW50ZXJuYWwgY2FsbHMgdG8gbmxfc2VuZCwgbXVzdCBzZW5kIHRoZSBuZXRsaW5rCisJICogbWVzc2FnZS4gKi8KKwlpbnQJCQkoKmNiX3NlbmRfb3cpKHN0cnVjdCBubF9zb2NrICosCisJCQkJCSAgICAgIHN0cnVjdCBubF9tc2cgKik7CisKKwlpbnQJCQljYl9yZWZjbnQ7Cit9OworCitzdHJ1Y3Qgbmxfc29jaworeworCXN0cnVjdCBzb2NrYWRkcl9ubAlzX2xvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9ubAlzX3BlZXI7CisJaW50CQkJc19mZDsKKwlpbnQJCQlzX3Byb3RvOworCXVuc2lnbmVkIGludAkJc19zZXFfbmV4dDsKKwl1bnNpZ25lZCBpbnQJCXNfc2VxX2V4cGVjdDsKKwlpbnQJCQlzX2ZsYWdzOworCXN0cnVjdCBubF9jYiAqCQlzX2NiOworfTsKKworc3RydWN0IG5sX2NhY2hlCit7CisJc3RydWN0IG5sX2xpc3RfaGVhZAljX2l0ZW1zOworCWludAkJCWNfbml0ZW1zOworCWludCAgICAgICAgICAgICAgICAgICAgIGNfaWFyZzE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgY19pYXJnMjsKKwlzdHJ1Y3QgbmxfY2FjaGVfb3BzICogICBjX29wczsKK307CisKK3N0cnVjdCBubF9jYWNoZV9hc3NvYworeworCXN0cnVjdCBubF9jYWNoZSAqCWNhX2NhY2hlOworCWNoYW5nZV9mdW5jX3QJCWNhX2NoYW5nZTsKKwl2b2lkICoJCQljYV9jaGFuZ2VfZGF0YTsKK307CisKK3N0cnVjdCBubF9jYWNoZV9tbmdyCit7CisJaW50CQkJY21fcHJvdG9jb2w7CisJaW50CQkJY21fZmxhZ3M7CisJaW50CQkJY21fbmFzc29jczsKKwlzdHJ1Y3Qgbmxfc29jayAqCWNtX2hhbmRsZTsKKwlzdHJ1Y3QgbmxfY2FjaGVfYXNzb2MgKgljbV9hc3NvY3M7Cit9OworCitzdHJ1Y3QgbmxfcGFyc2VyX3BhcmFtOworCisjZGVmaW5lIExPT1NFX0NPTVBBUklTT04JMQorCisjZGVmaW5lIE5MX09CSl9NQVJLCQkxCisKK3N0cnVjdCBubF9vYmplY3QKK3sKKwlOTEhEUl9DT01NT04KK307CisKK3N0cnVjdCBubF9kYXRhCit7CisJc2l6ZV90CQkJZF9zaXplOworCXZvaWQgKgkJCWRfZGF0YTsKK307CisKK3N0cnVjdCBubF9hZGRyCit7CisJaW50CQkJYV9mYW1pbHk7CisJdW5zaWduZWQgaW50CQlhX21heHNpemU7CisJdW5zaWduZWQgaW50CQlhX2xlbjsKKwlpbnQJCQlhX3ByZWZpeGxlbjsKKwlpbnQJCQlhX3JlZmNudDsKKwljaGFyCQkJYV9hZGRyWzBdOworfTsKKworc3RydWN0IG5sX21zZworeworCWludAkJCW5tX3Byb3RvY29sOworCWludAkJCW5tX2ZsYWdzOworCXN0cnVjdCBzb2NrYWRkcl9ubAlubV9zcmM7CisJc3RydWN0IHNvY2thZGRyX25sCW5tX2RzdDsKKwlzdHJ1Y3QgdWNyZWQJCW5tX2NyZWRzOworCXN0cnVjdCBubG1zZ2hkciAqCW5tX25saDsKKwlzaXplX3QJCQlubV9zaXplOworCWludAkJCW5tX3JlZmNudDsKK307CisKK3N0cnVjdCBydG5sX2xpbmtfbWFwCit7CisJdWludDY0X3QgbG1fbWVtX3N0YXJ0OworCXVpbnQ2NF90IGxtX21lbV9lbmQ7CisJdWludDY0X3QgbG1fYmFzZV9hZGRyOworCXVpbnQxNl90IGxtX2lycTsKKwl1aW50OF90ICBsbV9kbWE7CisJdWludDhfdCAgbG1fcG9ydDsKK307CisKKyNkZWZpbmUgSUZRRElTQ1NJWgkzMgorCitzdHJ1Y3QgcnRubF9saW5rCit7CisJTkxIRFJfQ09NTU9OCisKKwljaGFyCQlsX25hbWVbSUZOQU1TSVpdOworCisJdWludDMyX3QJbF9mYW1pbHk7CisJdWludDMyX3QJbF9hcnB0eXBlOworCXVpbnQzMl90CWxfaW5kZXg7CisJdWludDMyX3QJbF9mbGFnczsKKwl1aW50MzJfdAlsX2NoYW5nZTsKKwl1aW50MzJfdCAJbF9tdHU7CisJdWludDMyX3QJbF9saW5rOworCXVpbnQzMl90CWxfdHhxbGVuOworCXVpbnQzMl90CWxfd2VpZ2h0OworCXVpbnQzMl90CWxfbWFzdGVyOworCXN0cnVjdCBubF9hZGRyICpsX2FkZHI7CisJc3RydWN0IG5sX2FkZHIgKmxfYmNhc3Q7CisJY2hhcgkJbF9xZGlzY1tJRlFESVNDU0laXTsKKwlzdHJ1Y3QgcnRubF9saW5rX21hcCBsX21hcDsKKwl1aW50NjRfdAlsX3N0YXRzW1JUTkxfTElOS19TVEFUU19NQVgrMV07CisJdWludDMyX3QJbF9mbGFnX21hc2s7CisJdWludDhfdAkJbF9vcGVyc3RhdGU7CisJdWludDhfdAkJbF9saW5rbW9kZTsKKwkvKiAyIGJ5dGUgaG9sZSAqLworCXN0cnVjdCBydG5sX2xpbmtfaW5mb19vcHMgKmxfaW5mb19vcHM7CisJdm9pZCAqCQlsX2luZm87Cit9OworCitzdHJ1Y3QgcnRubF9uY2FjaGVpbmZvCit7CisJdWludDMyX3QgbmNpX2NvbmZpcm1lZDsJLyoqPCBUaW1lIHNpbmNlIG5laWdoYm91ciB2YWxpZHR5IHdhcyBsYXN0IGNvbmZpcm1lZCAqLworCXVpbnQzMl90IG5jaV91c2VkOwkvKio8IFRpbWUgc2luY2UgbmVpZ2hib3VyIGVudHJ5IHdhcyBsYXN0IHVlZCAqLworCXVpbnQzMl90IG5jaV91cGRhdGVkOwkvKio8IFRpbWUgc2luY2UgbGFzdCB1cGRhdGUgKi8KKwl1aW50MzJfdCBuY2lfcmVmY250OwkvKio8IFJlZmVyZW5jZSBjb3VudGVyICovCit9OworCisKK3N0cnVjdCBydG5sX25laWdoCit7CisJTkxIRFJfQ09NTU9OCisJdWludDMyX3QJbl9mYW1pbHk7CisJdWludDMyX3QJbl9pZmluZGV4OworCXVpbnQxNl90CW5fc3RhdGU7CisJdWludDhfdAkJbl9mbGFnczsKKwl1aW50OF90CQluX3R5cGU7CisJc3RydWN0IG5sX2FkZHIgKm5fbGxhZGRyOworCXN0cnVjdCBubF9hZGRyICpuX2RzdDsKKwl1aW50MzJfdAluX3Byb2JlczsKKwlzdHJ1Y3QgcnRubF9uY2FjaGVpbmZvIG5fY2FjaGVpbmZvOworCXVpbnQzMl90ICAgICAgICAgICAgICAgIG5fc3RhdGVfbWFzazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBuX2ZsYWdfbWFzazsKK307CisKKworc3RydWN0IHJ0bmxfYWRkcl9jYWNoZWluZm8KK3sKKwkvKiBQcmVmZXJyZWQgbGlmZXRpbWUgaW4gc2Vjb25kcyAqLworCXVpbnQzMl90IGFjaV9wcmVmZXJlZDsKKworCS8qIFZhbGlkIGxpZmV0aW1lIGluIHNlY29uZHMgKi8KKwl1aW50MzJfdCBhY2lfdmFsaWQ7CisKKwkvKiBUaW1lc3RhbXAgb2YgY3JlYXRpb24gaW4gMS8xMDBzIHNlaW5jZSBib290dGltZSAqLworCXVpbnQzMl90IGFjaV9jc3RhbXA7CisKKwkvKiBUaW1lc3RhbXAgb2YgbGFzdCB1cGRhdGUgaW4gMS8xMDBzIHNpbmNlIGJvb3R0aW1lICovCisJdWludDMyX3QgYWNpX3RzdGFtcDsKK307CisKK3N0cnVjdCBydG5sX2FkZHIKK3sKKwlOTEhEUl9DT01NT04KKworCXVpbnQ4X3QJCWFfZmFtaWx5OworCXVpbnQ4X3QJCWFfcHJlZml4bGVuOworCXVpbnQ4X3QJCWFfZmxhZ3M7CisJdWludDhfdAkJYV9zY29wZTsKKwl1aW50MzJfdAlhX2lmaW5kZXg7CisKKwlzdHJ1Y3QgbmxfYWRkciAqYV9wZWVyOworCXN0cnVjdCBubF9hZGRyICphX2xvY2FsOworCXN0cnVjdCBubF9hZGRyICphX2JjYXN0OworCXN0cnVjdCBubF9hZGRyICphX2FueWNhc3Q7CisJc3RydWN0IG5sX2FkZHIgKmFfbXVsdGljYXN0OworCisJc3RydWN0IHJ0bmxfYWRkcl9jYWNoZWluZm8gYV9jYWNoZWluZm87CisKKwljaGFyIGFfbGFiZWxbSUZOQU1TSVpdOworCXVpbnQzMl90IGFfZmxhZ19tYXNrOworfTsKKworc3RydWN0IHJ0bmxfbmV4dGhvcAoreworCXVpbnQ4X3QJCQlydG5oX2ZsYWdzOworCXVpbnQ4X3QJCQlydG5oX2ZsYWdfbWFzazsKKwl1aW50OF90CQkJcnRuaF93ZWlnaHQ7CisJLyogMSBieXRlIHNwYXJlICovCisJdWludDMyX3QJCXJ0bmhfaWZpbmRleDsKKwlzdHJ1Y3QgbmxfYWRkciAqCXJ0bmhfZ2F0ZXdheTsKKwl1aW50MzJfdAkJY2VfbWFzazsgLyogSEFDSyB0byBzdXBwb3J0IGF0dHIgbWFjcm9zICovCisJc3RydWN0IG5sX2xpc3RfaGVhZAlydG5oX2xpc3Q7CisJdWludDMyX3QJCXJ0bmhfcmVhbG1zOworfTsKKworc3RydWN0IHJ0bmxfcm91dGUKK3sKKwlOTEhEUl9DT01NT04KKworCXVpbnQ4X3QJCQlydF9mYW1pbHk7CisJdWludDhfdAkJCXJ0X2RzdF9sZW47CisJdWludDhfdAkJCXJ0X3NyY19sZW47CisJdWludDhfdAkJCXJ0X3RvczsKKwl1aW50OF90CQkJcnRfcHJvdG9jb2w7CisJdWludDhfdAkJCXJ0X3Njb3BlOworCXVpbnQ4X3QJCQlydF90eXBlOworCXVpbnQ4X3QJCQlydF9ubWV0cmljczsKKwl1aW50MzJfdAkJcnRfZmxhZ3M7CisJc3RydWN0IG5sX2FkZHIgKglydF9kc3Q7CisJc3RydWN0IG5sX2FkZHIgKglydF9zcmM7CisJdWludDMyX3QJCXJ0X3RhYmxlOworCXVpbnQzMl90CQlydF9paWY7CisJdWludDMyX3QJCXJ0X3ByaW87CisJdWludDMyX3QJCXJ0X21ldHJpY3NbUlRBWF9NQVhdOworCXVpbnQzMl90CQlydF9tZXRyaWNzX21hc2s7CisJdWludDMyX3QJCXJ0X25yX25oOworCXN0cnVjdCBubF9hZGRyICoJcnRfcHJlZl9zcmM7CisJc3RydWN0IG5sX2xpc3RfaGVhZAlydF9uZXh0aG9wczsKKwlzdHJ1Y3QgcnRubF9ydGNhY2hlaW5mbwlydF9jYWNoZWluZm87CisJdWludDMyX3QJCXJ0X2ZsYWdfbWFzazsKK307CisKK3N0cnVjdCBydG5sX3J1bGUKK3sKKwlOTEhEUl9DT01NT04KKworCXVpbnQ2NF90CXJfbWFyazsKKwl1aW50MzJfdAlyX3ByaW87CisJdWludDMyX3QJcl9yZWFsbXM7CisJdWludDMyX3QJcl90YWJsZTsKKwl1aW50OF90CQlyX2RzZmllbGQ7CisJdWludDhfdAkJcl90eXBlOworCXVpbnQ4X3QJCXJfZmFtaWx5OworCXVpbnQ4X3QJCXJfc3JjX2xlbjsKKwl1aW50OF90CQlyX2RzdF9sZW47CisJY2hhcgkJcl9paWZbSUZOQU1TSVpdOworCXN0cnVjdCBubF9hZGRyICpyX3NyYzsKKwlzdHJ1Y3QgbmxfYWRkciAqcl9kc3Q7CisJc3RydWN0IG5sX2FkZHIgKnJfc3JjbWFwOworfTsKKworc3RydWN0IHJ0bmxfbmVpZ2h0YmxfcGFybXMKK3sKKwkvKioKKwkgKiBJbnRlcmZhY2UgaW5kZXggb2YgdGhlIGRldmljZSB0aGlzIHBhcmFtZXRlciBzZXQgaXMgYXNzaWduZWQKKwkgKiB0byBvciAwIGZvciB0aGUgZGVmYXVsdCBzZXQuCisJICovCisJdWludDMyX3QJCW50cF9pZmluZGV4OworCisJLyoqCisJICogTnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBwYXJhbWV0ZXIgc2V0LgorCSAqLworCXVpbnQzMl90CQludHBfcmVmY250OworCisJLyoqCisJICogUXVldWUgbGVuZ3RoIGZvciBwZW5kaW5nIGFycCByZXF1ZXN0cywgaS5lLiB0aGUgbnVtYmVyIG9mCisJICogcGFja2V0cyB3aGljaCBhcmUgYWNjZXB0ZWQgZnJvbSBvdGhlciBsYXllcnMgd2hpbGUgdGhlCisJICogbmVpZ2hib3VyIGFkZHJlc3MgaXMgc3RpbGwgYmVpbmcgcmVzb2x2ZWQKKwkgKi8KKwl1aW50MzJfdAkJbnRwX3F1ZXVlX2xlbjsKKworCS8qKgorCSAqIE51bWJlciBvZiByZXF1ZXN0cyB0byBzZW5kIHRvIHRoZSB1c2VyIGxldmVsIEFSUCBkYWVtb24uCisJICogU3BlY2lmeSAwIHRvIGRpc2FibGUuCisJICovCisJdWludDMyX3QJCW50cF9hcHBfcHJvYmVzOworCisJLyoqCisJICogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgdW5pY2FzdCBzb2xpY2l0YXRpb24uCisJICovCisJdWludDMyX3QJCW50cF91Y2FzdF9wcm9iZXM7CisKKwkvKioKKwkgKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciBtdWx0aWNhc3Qgc29saWNpdGF0aW9uLgorCSAqLworCXVpbnQzMl90CQludHBfbWNhc3RfcHJvYmVzOworCisJLyoqCisJICogQmFzZSB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgdG8gb21wdXRlIHJlYWNoYWJsZSB0aW1lLCBzZWUgUkZDMjQ2MS4KKwkgKi8KKwl1aW50NjRfdAkJbnRwX2Jhc2VfcmVhY2hhYmxlX3RpbWU7CisKKwkvKioKKwkgKiBBY3R1YWwgcmVhY2hhYmxlIHRpbWUgKHJlYWQtb25seSkKKwkgKi8KKwl1aW50NjRfdAkJbnRwX3JlYWNoYWJsZV90aW1lOwkvKiBzZWNzICovCisKKwkvKioKKwkgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXRyYW5zbWl0dGVkIE5laWdoYm9yCisJICogU29saWNpdGF0aW9uIG1lc3NhZ2VzLgorCSAqLworCXVpbnQ2NF90CQludHBfcmV0cmFuc190aW1lOworCisJLyoqCisJICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNoZWNrIGZvciBzdGFsZSBuZWlnaGJvdXIKKwkgKiBlbnRyaWVzLgorCSAqLworCXVpbnQ2NF90CQludHBfZ2Nfc3RhbGVfdGltZTsJLyogc2VjcyAqLworCisJLyoqCisJICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgZmlyc3QgdGltZSBwcm9iZSBpZgorCSAqIHRoZSBuZWlnaGJvdXIgaXMgcmVhY2hhYmxlLgorCSAqLworCXVpbnQ2NF90CQludHBfcHJvYmVfZGVsYXk7CS8qIHNlY3MgKi8KKworCS8qKgorCSAqIE1heGltdW0gZGVsYXkgaW4gbWlsbGlzZWNvbmRzIG9mIGFuIGFuc3dlciB0byBhIG5laWdoYm91cgorCSAqIHNvbGljaXRhdGlvbiBtZXNzYWdlLgorCSAqLworCXVpbnQ2NF90CQludHBfYW55Y2FzdF9kZWxheTsKKworCS8qKgorCSAqIE1pbmltdW0gYWdlIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSBuZWlnaGJvdXIgZW50cnkKKwkgKiBtYXkgYmUgcmVwbGFjZWQuCisJICovCisJdWludDY0X3QJCW50cF9sb2NrdGltZTsKKworCS8qKgorCSAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW5zd2VyaW5nIHRvIGFuIEFSUCByZXF1ZXN0CisJICogZm9yIHdoaWNoIGEgcHJveHkgQVJQIGVudHJ5IGV4aXN0cy4KKwkgKi8KKwl1aW50NjRfdAkJbnRwX3Byb3h5X2RlbGF5OworCisJLyoqCisJICogUXVldWUgbGVuZ3RoIGZvciB0aGUgZGVsYXllZCBwcm94eSBhcnAgcmVxdWVzdHMuCisJICovCisJdWludDMyX3QJCW50cF9wcm94eV9xbGVuOworCisJLyoqCisJICogTWFzayBvZiBhdmFpbGFibGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMKKwkgKi8KKwl1aW50MzJfdAkJbnRwX21hc2s7Cit9OworCisjZGVmaW5lIE5UQkxOQU1TSVoJMzIKKworLyoqCisgKiBOZWlnaGJvdXIgdGFibGUKKyAqIEBpbmdyb3VwIG5laWdodGJsCisgKi8KK3N0cnVjdCBydG5sX25laWdodGJsCit7CisJTkxIRFJfQ09NTU9OCisKKwljaGFyCQkJbnRfbmFtZVtOVEJMTkFNU0laXTsKKwl1aW50MzJfdAkJbnRfZmFtaWx5OworCXVpbnQzMl90CQludF9nY190aHJlc2gxOworCXVpbnQzMl90CQludF9nY190aHJlc2gyOworCXVpbnQzMl90CQludF9nY190aHJlc2gzOworCXVpbnQ2NF90CQludF9nY19pbnRlcnZhbDsKKwlzdHJ1Y3QgbmR0X2NvbmZpZwludF9jb25maWc7CisJc3RydWN0IHJ0bmxfbmVpZ2h0YmxfcGFybXMgbnRfcGFybXM7CisJc3RydWN0IG5kdF9zdGF0cwludF9zdGF0czsKK307CisKK3N0cnVjdCBydG5sX3JhdGVzcGVjCit7CisJdWludDhfdAkJCXJzX2NlbGxfbG9nOworCXVpbnQxNl90CQlyc19mZWF0dXJlOworCXVpbnQxNl90CQlyc19hZGRlbmQ7CisJdWludDE2X3QJCXJzX21wdTsKKwl1aW50MzJfdAkJcnNfcmF0ZTsKK307CisKK3N0cnVjdCBydG5sX3RzdGF0cworeworCXN0cnVjdCB7CisJCXVpbnQ2NF90ICAgICAgICAgICAgYnl0ZXM7CisJCXVpbnQ2NF90ICAgICAgICAgICAgcGFja2V0czsKKwl9IHRjc19iYXNpYzsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90ICAgICAgICAgICAgYnBzOworCQl1aW50MzJfdCAgICAgICAgICAgIHBwczsKKwl9IHRjc19yYXRlX2VzdDsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90ICAgICAgICAgICAgcWxlbjsKKwkJdWludDMyX3QgICAgICAgICAgICBiYWNrbG9nOworCQl1aW50MzJfdCAgICAgICAgICAgIGRyb3BzOworCQl1aW50MzJfdCAgICAgICAgICAgIHJlcXVldWVzOworCQl1aW50MzJfdCAgICAgICAgICAgIG92ZXJsaW1pdHM7CisJfSB0Y3NfcXVldWU7Cit9OworCisjZGVmaW5lIFRDS0lORFNJWgkzMgorCisjZGVmaW5lIE5MX1RDQV9HRU5FUklDKHByZSkJCQkJXAorCU5MSERSX0NPTU1PTgkJCQkJXAorCXVpbnQzMl90CQlwcmUgIyNfZmFtaWx5OwkJXAorCXVpbnQzMl90CQlwcmUgIyNfaWZpbmRleDsJCVwKKwl1aW50MzJfdAkJcHJlICMjX2hhbmRsZTsJCVwKKwl1aW50MzJfdAkJcHJlICMjX3BhcmVudDsJCVwKKwl1aW50MzJfdAkJcHJlICMjX2luZm87CQlcCisJY2hhcgkJCXByZSAjI19raW5kW1RDS0lORFNJWl07CVwKKwlzdHJ1Y3QgbmxfZGF0YSAqCXByZSAjI19vcHRzOwkJXAorCXVpbnQ2NF90CQlwcmUgIyNfc3RhdHNbUlROTF9UQ19TVEFUU19NQVgrMV07IFwKKwlzdHJ1Y3QgbmxfZGF0YSAqCXByZSAjI194c3RhdHM7CQlcCisJc3RydWN0IG5sX2RhdGEgKglwcmUgIyNfc3ViZGF0YTsJCVwKKworCitzdHJ1Y3QgcnRubF90Y2EKK3sKKwlOTF9UQ0FfR0VORVJJQyh0Yyk7Cit9OworCitzdHJ1Y3QgcnRubF9xZGlzYworeworCU5MX1RDQV9HRU5FUklDKHEpOworCXN0cnVjdCBydG5sX3FkaXNjX29wcwkqcV9vcHM7Cit9OworCitzdHJ1Y3QgcnRubF9jbGFzcworeworCU5MX1RDQV9HRU5FUklDKGMpOworCXN0cnVjdCBydG5sX2NsYXNzX29wcwkqY19vcHM7Cit9OworCitzdHJ1Y3QgcnRubF9jbHMKK3sKKwlOTF9UQ0FfR0VORVJJQyhjKTsKKwl1aW50MTZfdAkJY19wcmlvOworCXVpbnQxNl90CQljX3Byb3RvY29sOworCXN0cnVjdCBydG5sX2Nsc19vcHMJKmNfb3BzOworfTsKKworc3RydWN0IHJ0bmxfdTMyCit7CisJdWludDMyX3QJCWN1X2Rpdmlzb3I7CisJdWludDMyX3QJCWN1X2hhc2g7CisJdWludDMyX3QJCWN1X2NsYXNzaWQ7CisJdWludDMyX3QJCWN1X2xpbms7CisJc3RydWN0IG5sX2RhdGEgKgljdV9wY250OworCXN0cnVjdCBubF9kYXRhICoJY3Vfc2VsZWN0b3I7CisJc3RydWN0IG5sX2RhdGEgKgljdV9hY3Q7CisJc3RydWN0IG5sX2RhdGEgKgljdV9wb2xpY2U7CisJY2hhcgkJCWN1X2luZGV2W0lGTkFNU0laXTsKKwlpbnQJCQljdV9tYXNrOworfTsKKworc3RydWN0IHJ0bmxfY2dyb3VwCit7CisJc3RydWN0IHJ0bmxfZW1hdGNoX3RyZWUgKmNnX2VtYXRjaDsKKwlpbnQJCQljZ19tYXNrOworfTsKKworc3RydWN0IHJ0bmxfZncKK3sKKwl1aW50MzJfdAkJY2ZfY2xhc3NpZDsKKwlzdHJ1Y3QgbmxfZGF0YSAqCWNmX2FjdDsKKwlzdHJ1Y3QgbmxfZGF0YSAqCWNmX3BvbGljZTsKKwljaGFyCQkJY2ZfaW5kZXZbSUZOQU1TSVpdOworCWludAkJCWNmX21hc2s7Cit9OworCitzdHJ1Y3QgcnRubF9lbWF0Y2gKK3sKKwl1aW50MTZfdAkJZV9pZDsKKwl1aW50MTZfdAkJZV9raW5kOworCXVpbnQxNl90CQllX2ZsYWdzOworCisJc3RydWN0IG5sX2xpc3RfaGVhZAllX2NoaWxkczsKKwlzdHJ1Y3QgbmxfbGlzdF9oZWFkCWVfbGlzdDsKKwlzdHJ1Y3QgcnRubF9lbWF0Y2hfb3BzICplX29wczsKKworCWNoYXIJCQllX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgcnRubF9lbWF0Y2hfdHJlZQoreworCXVpbnQxNl90CQlldF9wcm9naWQ7CisJc3RydWN0IG5sX2xpc3RfaGVhZAlldF9saXN0OworCit9OworCitzdHJ1Y3QgcnRubF9kc21hcmtfcWRpc2MKK3sKKwl1aW50MTZfdAlxZG1faW5kaWNlczsKKwl1aW50MTZfdAlxZG1fZGVmYXVsdF9pbmRleDsKKwl1aW50MzJfdAlxZG1fc2V0X3RjX2luZGV4OworCXVpbnQzMl90CXFkbV9tYXNrOworfTsKKworc3RydWN0IHJ0bmxfZHNtYXJrX2NsYXNzCit7CisJdWludDhfdAkJY2RtX2JtYXNrOworCXVpbnQ4X3QJCWNkbV92YWx1ZTsKKwl1aW50MzJfdAljZG1fbWFzazsKK307CisKK3N0cnVjdCBydG5sX2ZpZm8KK3sKKwl1aW50MzJfdAlxZl9saW1pdDsKKwl1aW50MzJfdAlxZl9tYXNrOworfTsKKworc3RydWN0IHJ0bmxfcHJpbworeworCXVpbnQzMl90CXFwX2JhbmRzOworCXVpbnQ4X3QJCXFwX3ByaW9tYXBbVENfUFJJT19NQVgrMV07CisJdWludDMyX3QJcXBfbWFzazsKK307CisKK3N0cnVjdCBydG5sX3RiZgoreworCXVpbnQzMl90CQlxdF9saW1pdDsKKwl1aW50MzJfdAkJcXRfbXB1OworCXN0cnVjdCBydG5sX3JhdGVzcGVjCXF0X3JhdGU7CisJdWludDMyX3QJCXF0X3JhdGVfYnVja2V0OworCXVpbnQzMl90CQlxdF9yYXRlX3R4dGltZTsKKwlzdHJ1Y3QgcnRubF9yYXRlc3BlYwlxdF9wZWFrcmF0ZTsKKwl1aW50MzJfdAkJcXRfcGVha3JhdGVfYnVja2V0OworCXVpbnQzMl90CQlxdF9wZWFrcmF0ZV90eHRpbWU7CisJdWludDMyX3QJCXF0X21hc2s7Cit9OworCitzdHJ1Y3QgcnRubF9zZnEKK3sKKwl1aW50MzJfdAlxc19xdWFudHVtOworCXVpbnQzMl90CXFzX3BlcnR1cmI7CisJdWludDMyX3QJcXNfbGltaXQ7CisJdWludDMyX3QJcXNfZGl2aXNvcjsKKwl1aW50MzJfdAlxc19mbG93czsKKwl1aW50MzJfdAlxc19tYXNrOworfTsKKworc3RydWN0IHJ0bmxfbmV0ZW1fY29ycgoreworCXVpbnQzMl90CW5tY19kZWxheTsKKwl1aW50MzJfdAlubWNfbG9zczsKKwl1aW50MzJfdAlubWNfZHVwbGljYXRlOworfTsKKworc3RydWN0IHJ0bmxfbmV0ZW1fcmVvCit7CisJdWludDMyX3QJbm1yb19wcm9iYWJpbGl0eTsKKwl1aW50MzJfdAlubXJvX2NvcnJlbGF0aW9uOworfTsKKworc3RydWN0IHJ0bmxfbmV0ZW1fY3JwdAoreworCXVpbnQzMl90CW5tY3JfcHJvYmFiaWxpdHk7CisJdWludDMyX3QJbm1jcl9jb3JyZWxhdGlvbjsKK307CisKK3N0cnVjdCBydG5sX25ldGVtX2Rpc3QKK3sKKwlpbnQxNl90CSoJZGlzdF9kYXRhOworCXNpemVfdAkJZGlzdF9zaXplOworfTsKKworc3RydWN0IHJ0bmxfbmV0ZW0KK3sKKwl1aW50MzJfdAkJcW5tX2xhdGVuY3k7CisJdWludDMyX3QJCXFubV9saW1pdDsKKwl1aW50MzJfdAkJcW5tX2xvc3M7CisJdWludDMyX3QJCXFubV9nYXA7CisJdWludDMyX3QJCXFubV9kdXBsaWNhdGU7CisJdWludDMyX3QJCXFubV9qaXR0ZXI7CisJdWludDMyX3QJCXFubV9tYXNrOworCXN0cnVjdCBydG5sX25ldGVtX2NvcnIJcW5tX2NvcnI7CisJc3RydWN0IHJ0bmxfbmV0ZW1fcmVvCXFubV9ybzsKKwlzdHJ1Y3QgcnRubF9uZXRlbV9jcnB0CXFubV9jcnB0OworCXN0cnVjdCBydG5sX25ldGVtX2Rpc3QgIHFubV9kaXN0OworfTsKKworc3RydWN0IHJ0bmxfaHRiX3FkaXNjCit7CisJdWludDMyX3QJCXFoX3JhdGUycXVhbnR1bTsKKwl1aW50MzJfdAkJcWhfZGVmY2xzOworCXVpbnQzMl90CQlxaF9tYXNrOworfTsKKworc3RydWN0IHJ0bmxfaHRiX2NsYXNzCit7CisJdWludDMyX3QJCWNoX3ByaW87CisJdWludDMyX3QJCWNoX210dTsKKwlzdHJ1Y3QgcnRubF9yYXRlc3BlYwljaF9yYXRlOworCXN0cnVjdCBydG5sX3JhdGVzcGVjCWNoX2NlaWw7CisJdWludDMyX3QJCWNoX3JidWZmZXI7CisJdWludDMyX3QJCWNoX2NidWZmZXI7CisJdWludDMyX3QJCWNoX3F1YW50dW07CisJdWludDhfdAkJCWNoX292ZXJoZWFkOworCXVpbnQ4X3QJCQljaF9tcHU7CisJdWludDMyX3QJCWNoX21hc2s7Cit9OworCitzdHJ1Y3QgcnRubF9jYnEKK3sKKwlzdHJ1Y3QgdGNfY2JxX2xzc29wdCAgICBjYnFfbHNzOworCXN0cnVjdCB0Y19yYXRlc3BlYyAgICAgIGNicV9yYXRlOworCXN0cnVjdCB0Y19jYnFfd3Jyb3B0ICAgIGNicV93cnI7CisJc3RydWN0IHRjX2NicV9vdmwgICAgICAgY2JxX292bDsKKwlzdHJ1Y3QgdGNfY2JxX2ZvcHQgICAgICBjYnFfZm9wdDsKKwlzdHJ1Y3QgdGNfY2JxX3BvbGljZSAgICBjYnFfcG9saWNlOworfTsKKworc3RydWN0IHJ0bmxfcmVkCit7CisJdWludDMyX3QJcXJfbGltaXQ7CisJdWludDMyX3QJcXJfcXRoX21pbjsKKwl1aW50MzJfdAlxcl9xdGhfbWF4OworCXVpbnQ4X3QJCXFyX2ZsYWdzOworCXVpbnQ4X3QJCXFyX3dsb2c7CisJdWludDhfdAkJcXJfcGxvZzsKKwl1aW50OF90CQlxcl9zY2VsbF9sb2c7CisJdWludDMyX3QJcXJfbWFzazsKK307CisKK3N0cnVjdCBmbG5sX3JlcXVlc3QKK3sKKwlOTEhEUl9DT01NT04KKworCXN0cnVjdCBubF9hZGRyICoJbHJfYWRkcjsKKwl1aW50MzJfdAkJbHJfZndtYXJrOworCXVpbnQ4X3QJCQlscl90b3M7CisJdWludDhfdAkJCWxyX3Njb3BlOworCXVpbnQ4X3QJCQlscl90YWJsZTsKK307CisKKworc3RydWN0IGZsbmxfcmVzdWx0Cit7CisJTkxIRFJfQ09NTU9OCisKKwlzdHJ1Y3QgZmxubF9yZXF1ZXN0ICoJZnJfcmVxOworCXVpbnQ4X3QJCQlmcl90YWJsZV9pZDsKKwl1aW50OF90CQkJZnJfcHJlZml4bGVuOworCXVpbnQ4X3QJCQlmcl9uaF9zZWw7CisJdWludDhfdAkJCWZyX3R5cGU7CisJdWludDhfdAkJCWZyX3Njb3BlOworCXVpbnQzMl90CQlmcl9lcnJvcjsKK307CisKKyNkZWZpbmUgR0VOTF9PUF9IQVNfUE9MSUNZCTEKKyNkZWZpbmUgR0VOTF9PUF9IQVNfRE9JVAkyCisjZGVmaW5lIEdFTkxfT1BfSEFTX0RVTVBJVAk0CisKK3N0cnVjdCBnZW5sX2ZhbWlseV9vcAoreworCXVpbnQzMl90CQlvX2lkOworCXVpbnQzMl90CQlvX2ZsYWdzOworCisJc3RydWN0IG5sX2xpc3RfaGVhZAlvX2xpc3Q7Cit9OworCitzdHJ1Y3QgZ2VubF9mYW1pbHkKK3sKKwlOTEhEUl9DT01NT04KKworCXVpbnQxNl90CQlnZl9pZDsKKwljaGFyIAkJCWdmX25hbWVbR0VOTF9OQU1TSVpdOworCXVpbnQzMl90CQlnZl92ZXJzaW9uOworCXVpbnQzMl90CQlnZl9oZHJzaXplOworCXVpbnQzMl90CQlnZl9tYXhhdHRyOworCisJc3RydWN0IG5sX2xpc3RfaGVhZAlnZl9vcHM7Cit9OworCit1bmlvbiBuZm5sX2N0X3Byb3RvCit7CisJc3RydWN0IHsKKwkJdWludDE2X3QJc3JjOworCQl1aW50MTZfdAlkc3Q7CisJfSBwb3J0OworCXN0cnVjdCB7CisJCXVpbnQxNl90CWlkOworCQl1aW50OF90CQl0eXBlOworCQl1aW50OF90CQljb2RlOworCX0gaWNtcDsKK307CisKK3N0cnVjdCBuZm5sX2N0X2RpciB7CisJc3RydWN0IG5sX2FkZHIgKglzcmM7CisJc3RydWN0IG5sX2FkZHIgKglkc3Q7CisJdW5pb24gbmZubF9jdF9wcm90bwlwcm90bzsKKwl1aW50NjRfdAkJcGFja2V0czsKKwl1aW50NjRfdAkJYnl0ZXM7Cit9OworCit1bmlvbiBuZm5sX2N0X3Byb3RvaW5mbyB7CisJc3RydWN0IHsKKwkJdWludDhfdAkJc3RhdGU7CisJfSB0Y3A7Cit9OworCitzdHJ1Y3QgbmZubF9jdCB7CisJTkxIRFJfQ09NTU9OCisKKwl1aW50OF90CQkJY3RfZmFtaWx5OworCXVpbnQ4X3QJCQljdF9wcm90bzsKKwl1bmlvbiBuZm5sX2N0X3Byb3RvaW5mbwljdF9wcm90b2luZm87CisKKwl1aW50MzJfdAkJY3Rfc3RhdHVzOworCXVpbnQzMl90CQljdF9zdGF0dXNfbWFzazsKKwl1aW50MzJfdAkJY3RfdGltZW91dDsKKwl1aW50MzJfdAkJY3RfbWFyazsKKwl1aW50MzJfdAkJY3RfdXNlOworCXVpbnQzMl90CQljdF9pZDsKKworCXN0cnVjdCBuZm5sX2N0X2RpcgljdF9vcmlnOworCXN0cnVjdCBuZm5sX2N0X2RpcgljdF9yZXBsOworfTsKKworc3RydWN0IG5mbmxfbG9nIHsKKwlOTEhEUl9DT01NT04KKworCXVpbnQxNl90CQlsb2dfZ3JvdXA7CisJdWludDhfdAkJCWxvZ19jb3B5X21vZGU7CisJdWludDMyX3QJCWxvZ19jb3B5X3JhbmdlOworCXVpbnQzMl90CQlsb2dfZmx1c2hfdGltZW91dDsKKwl1aW50MzJfdAkJbG9nX2FsbG9jX3NpemU7CisJdWludDMyX3QJCWxvZ19xdWV1ZV90aHJlc2hvbGQ7CisJdWludDMyX3QJCWxvZ19mbGFnczsKKwl1aW50MzJfdAkJbG9nX2ZsYWdfbWFzazsKK307CisKK3N0cnVjdCBuZm5sX2xvZ19tc2cgeworCU5MSERSX0NPTU1PTgorCisJdWludDhfdAkJCWxvZ19tc2dfZmFtaWx5OworCXVpbnQ4X3QJCQlsb2dfbXNnX2hvb2s7CisJdWludDE2X3QJCWxvZ19tc2dfaHdwcm90bzsKKwl1aW50MzJfdAkJbG9nX21zZ19tYXJrOworCXN0cnVjdCB0aW1ldmFsCQlsb2dfbXNnX3RpbWVzdGFtcDsKKwl1aW50MzJfdAkJbG9nX21zZ19pbmRldjsKKwl1aW50MzJfdAkJbG9nX21zZ19vdXRkZXY7CisJdWludDMyX3QJCWxvZ19tc2dfcGh5c2luZGV2OworCXVpbnQzMl90CQlsb2dfbXNnX3BoeXNvdXRkZXY7CisJdWludDhfdAkJCWxvZ19tc2dfaHdhZGRyWzhdOworCWludAkJCWxvZ19tc2dfaHdhZGRyX2xlbjsKKwl2b2lkICoJCQlsb2dfbXNnX3BheWxvYWQ7CisJaW50CQkJbG9nX21zZ19wYXlsb2FkX2xlbjsKKwljaGFyICoJCQlsb2dfbXNnX3ByZWZpeDsKKwl1aW50MzJfdAkJbG9nX21zZ191aWQ7CisJdWludDMyX3QJCWxvZ19tc2dfZ2lkOworCXVpbnQzMl90CQlsb2dfbXNnX3NlcTsKKwl1aW50MzJfdAkJbG9nX21zZ19zZXFfZ2xvYmFsOworfTsKKworc3RydWN0IG5mbmxfcXVldWUgeworCU5MSERSX0NPTU1PTgorCisJdWludDE2X3QJCXF1ZXVlX2dyb3VwOworCXVpbnQzMl90CQlxdWV1ZV9tYXhsZW47CisJdWludDMyX3QJCXF1ZXVlX2NvcHlfcmFuZ2U7CisJdWludDhfdAkJCXF1ZXVlX2NvcHlfbW9kZTsKK307CisKK3N0cnVjdCBuZm5sX3F1ZXVlX21zZyB7CisJTkxIRFJfQ09NTU9OCisKKwl1aW50MTZfdAkJcXVldWVfbXNnX2dyb3VwOworCXVpbnQ4X3QJCQlxdWV1ZV9tc2dfZmFtaWx5OworCXVpbnQ4X3QJCQlxdWV1ZV9tc2dfaG9vazsKKwl1aW50MTZfdAkJcXVldWVfbXNnX2h3cHJvdG87CisJdWludDMyX3QJCXF1ZXVlX21zZ19wYWNrZXRpZDsKKwl1aW50MzJfdAkJcXVldWVfbXNnX21hcms7CisJc3RydWN0IHRpbWV2YWwJCXF1ZXVlX21zZ190aW1lc3RhbXA7CisJdWludDMyX3QJCXF1ZXVlX21zZ19pbmRldjsKKwl1aW50MzJfdAkJcXVldWVfbXNnX291dGRldjsKKwl1aW50MzJfdAkJcXVldWVfbXNnX3BoeXNpbmRldjsKKwl1aW50MzJfdAkJcXVldWVfbXNnX3BoeXNvdXRkZXY7CisJdWludDhfdAkJCXF1ZXVlX21zZ19od2FkZHJbOF07CisJaW50CQkJcXVldWVfbXNnX2h3YWRkcl9sZW47CisJdm9pZCAqCQkJcXVldWVfbXNnX3BheWxvYWQ7CisJaW50CQkJcXVldWVfbXNnX3BheWxvYWRfbGVuOworCXVpbnQzMl90CQlxdWV1ZV9tc2dfdmVyZGljdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvYWRkci5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2QyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9hZGRyLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIG5ldGxpbmsvYWRkci5oCQlBYnN0cmFjdCBBZGRyZXNzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0FERFJfSF8KKyNkZWZpbmUgTkVUTElOS19BRERSX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgbmxfYWRkcjsKKworLyogQ3JlYXRpb24gKi8KK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqCW5sX2FkZHJfYWxsb2Moc2l6ZV90KTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqCW5sX2FkZHJfYWxsb2NfYXR0cihzdHJ1Y3QgbmxhdHRyICosIGludCk7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKglubF9hZGRyX2J1aWxkKGludCwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludAkJbmxfYWRkcl9wYXJzZShjb25zdCBjaGFyICosIGludCwgc3RydWN0IG5sX2FkZHIgKiopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJbmxfYWRkcl9jbG9uZShzdHJ1Y3QgbmxfYWRkciAqKTsKKworLyogRGVzdHJveWFnZSAqLworZXh0ZXJuIHZvaWQJCW5sX2FkZHJfZGVzdHJveShzdHJ1Y3QgbmxfYWRkciAqKTsKKworLyogVXNhZ2UgTWFuYWdlbWVudCAqLworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJbmxfYWRkcl9nZXQoc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gdm9pZAkJbmxfYWRkcl9wdXQoc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gaW50CQlubF9hZGRyX3NoYXJlZChzdHJ1Y3QgbmxfYWRkciAqKTsKKworZXh0ZXJuIGludAkJbmxfYWRkcl9jbXAoc3RydWN0IG5sX2FkZHIgKiwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gaW50CQlubF9hZGRyX2NtcF9wcmVmaXgoc3RydWN0IG5sX2FkZHIgKiwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gaW50CQlubF9hZGRyX2lzemVybyhzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBpbnQJCW5sX2FkZHJfdmFsaWQoY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCAgICAgIAlubF9hZGRyX2d1ZXNzX2ZhbWlseShzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBpbnQJCW5sX2FkZHJfZmlsbF9zb2NrYWRkcihzdHJ1Y3QgbmxfYWRkciAqLAorCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworZXh0ZXJuIGludAkJbmxfYWRkcl9pbmZvKHN0cnVjdCBubF9hZGRyICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitleHRlcm4gaW50CQlubF9hZGRyX3Jlc29sdmUoc3RydWN0IG5sX2FkZHIgKmFkZHIsIGNoYXIgKmhvc3QsIHNpemVfdCBob3N0bGVuKTsKKworLyogQWNjZXNzIEZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQJCW5sX2FkZHJfc2V0X2ZhbWlseShzdHJ1Y3QgbmxfYWRkciAqLCBpbnQpOworZXh0ZXJuIGludAkJbmxfYWRkcl9nZXRfZmFtaWx5KHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIGludAkJbmxfYWRkcl9zZXRfYmluYXJ5X2FkZHIoc3RydWN0IG5sX2FkZHIgKiwgdm9pZCAqLAorCQkJCQkJc2l6ZV90KTsKK2V4dGVybiB2b2lkICoJCW5sX2FkZHJfZ2V0X2JpbmFyeV9hZGRyKHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHVuc2lnbmVkIGludAlubF9hZGRyX2dldF9sZW4oc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gdm9pZAkJbmxfYWRkcl9zZXRfcHJlZml4bGVuKHN0cnVjdCBubF9hZGRyICosIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50CW5sX2FkZHJfZ2V0X3ByZWZpeGxlbihzdHJ1Y3QgbmxfYWRkciAqKTsKKworLyogQWRkcmVzcyBGYW1pbHkgVHJhbnNsYXRpb25zICovCitleHRlcm4gY2hhciAqCQlubF9hZjJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CQlubF9zdHIyYWYoY29uc3QgY2hhciAqKTsKKworLyogVHJhbnNsYXRpb25zIHRvIFN0cmluZ3MgKi8KK2V4dGVybiBjaGFyICoJCW5sX2FkZHIyc3RyKHN0cnVjdCBubF9hZGRyICosIGNoYXIgKiwgc2l6ZV90KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay9hdHRyLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9hdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3OWMyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2F0dHIuaApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIG5ldGxpbmsvYXR0ci5oCQlOZXRsaW5rIEF0dHJpYnV0ZXMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfQVRUUl9IXworI2RlZmluZSBORVRMSU5LX0FUVFJfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9kYXRhLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IG5sX21zZzsKKworLyoqCisgKiBAbmFtZSBCYXNpYyBBdHRyaWJ1dGUgRGF0YSBUeXBlcworICogQHsKKyAqLworCisgLyoqCisgICogQGluZ3JvdXAgYXR0cgorICAqIEJhc2ljIGF0dHJpYnV0ZSBkYXRhIHR5cGVzCisgICoKKyAgKiBTZWUgXHJlZiBhdHRyX2RhdGF0eXBlcyBmb3IgbW9yZSBkZXRhaWxzLgorICAqLworZW51bSB7CisJTkxBX1VOU1BFQywJLyoqPCBVbnNwZWNpZmllZCB0eXBlLCBiaW5hcnkgZGF0YSBjaHVuayAqLworCU5MQV9VOCwJCS8qKjwgOCBiaXQgaW50ZWdlciAqLworCU5MQV9VMTYsCS8qKjwgMTYgYml0IGludGVnZXIgKi8KKwlOTEFfVTMyLAkvKio8IDMyIGJpdCBpbnRlZ2VyICovCisJTkxBX1U2NCwJLyoqPCA2NCBiaXQgaW50ZWdlciAqLworCU5MQV9TVFJJTkcsCS8qKjwgTlVMIHRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZyAqLworCU5MQV9GTEFHLAkvKio8IEZsYWcgKi8KKwlOTEFfTVNFQ1MsCS8qKjwgTWljcm8gc2Vjb25kcyAoNjRiaXQpICovCisJTkxBX05FU1RFRCwJLyoqPCBOZXN0ZWQgYXR0cmlidXRlcyAqLworCV9fTkxBX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBOTEFfVFlQRV9NQVggKF9fTkxBX1RZUEVfTUFYIC0gMSkKKworLyoqIEB9ICovCisKKy8qKgorICogQGluZ3JvdXAgYXR0cgorICogQXR0cmlidXRlIHZhbGlkYXRpb24gcG9saWN5LgorICoKKyAqIFNlZSBccmVmIGF0dHJfZGF0YXR5cGVzIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3N0cnVjdCBubGFfcG9saWN5IHsKKwkvKiogVHlwZSBvZiBhdHRyaWJ1dGUgb3IgTkxBX1VOU1BFQyAqLworCXVpbnQxNl90CXR5cGU7CisKKwkvKiogTWluaW1hbCBsZW5ndGggb2YgcGF5bG9hZCByZXF1aXJlZCAqLworCXVpbnQxNl90CW1pbmxlbjsKKworCS8qKiBNYXhpbWFsIGxlbmd0aCBvZiBwYXlsb2FkIGFsbG93ZWQgKi8KKwl1aW50MTZfdAltYXhsZW47Cit9OworCisvKiBTaXplIGNhbGN1bGF0aW9ucyAqLworZXh0ZXJuIGludAkJbmxhX2F0dHJfc2l6ZShpbnQgcGF5bG9hZCk7CitleHRlcm4gaW50CQlubGFfdG90YWxfc2l6ZShpbnQgcGF5bG9hZCk7CitleHRlcm4gaW50CQlubGFfcGFkbGVuKGludCBwYXlsb2FkKTsKKworLyogQXR0cmlidXRlIHBhcnNpbmcgKi8KK2V4dGVybiBpbnQJCW5sYV90eXBlKGNvbnN0IHN0cnVjdCBubGF0dHIgKik7CitleHRlcm4gdm9pZCAqCQlubGFfZGF0YShjb25zdCBzdHJ1Y3QgbmxhdHRyICopOworZXh0ZXJuIGludAkJbmxhX2xlbihjb25zdCBzdHJ1Y3QgbmxhdHRyICopOworZXh0ZXJuIGludAkJbmxhX29rKGNvbnN0IHN0cnVjdCBubGF0dHIgKiwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJbmxhX25leHQoY29uc3Qgc3RydWN0IG5sYXR0ciAqLCBpbnQgKik7CitleHRlcm4gaW50CQlubGFfcGFyc2Uoc3RydWN0IG5sYXR0ciAqKiwgaW50LCBzdHJ1Y3QgbmxhdHRyICosCisJCQkJICBpbnQsIHN0cnVjdCBubGFfcG9saWN5ICopOworZXh0ZXJuIGludAkJbmxhX3ZhbGlkYXRlKHN0cnVjdCBubGF0dHIgKiwgaW50LCBpbnQsCisJCQkJICAgICBzdHJ1Y3QgbmxhX3BvbGljeSAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJbmxhX2ZpbmQoc3RydWN0IG5sYXR0ciAqLCBpbnQsIGludCk7CisKKy8qIEhlbHBlciBGdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQJCW5sYV9tZW1jcHkodm9pZCAqLCBzdHJ1Y3QgbmxhdHRyICosIGludCk7CitleHRlcm4gc2l6ZV90CQlubGFfc3RybGNweShjaGFyICosIGNvbnN0IHN0cnVjdCBubGF0dHIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCW5sYV9tZW1jbXAoY29uc3Qgc3RydWN0IG5sYXR0ciAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gaW50CQlubGFfc3RyY21wKGNvbnN0IHN0cnVjdCBubGF0dHIgKiwgY29uc3QgY2hhciAqKTsKKworLyogVW5zcGVjaWZpYyBhdHRyaWJ1dGUgKi8KK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJbmxhX3Jlc2VydmUoc3RydWN0IG5sX21zZyAqLCBpbnQsIGludCk7CitleHRlcm4gaW50CQlubGFfcHV0KHN0cnVjdCBubF9tc2cgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7CitleHRlcm4gaW50CQlubGFfcHV0X2RhdGEoc3RydWN0IG5sX21zZyAqLCBpbnQsIHN0cnVjdCBubF9kYXRhICopOworZXh0ZXJuIGludAkJbmxhX3B1dF9hZGRyKHN0cnVjdCBubF9tc2cgKiwgaW50LCBzdHJ1Y3QgbmxfYWRkciAqKTsKKworLyogSW50ZWdlciBhdHRyaWJ1dGUgKi8KK2V4dGVybiB1aW50OF90CQlubGFfZ2V0X3U4KHN0cnVjdCBubGF0dHIgKik7CitleHRlcm4gaW50CQlubGFfcHV0X3U4KHN0cnVjdCBubF9tc2cgKiwgaW50LCB1aW50OF90KTsKK2V4dGVybiB1aW50MTZfdAkJbmxhX2dldF91MTYoc3RydWN0IG5sYXR0ciAqKTsKK2V4dGVybiBpbnQJCW5sYV9wdXRfdTE2KHN0cnVjdCBubF9tc2cgKiwgaW50LCB1aW50MTZfdCk7CitleHRlcm4gdWludDMyX3QJCW5sYV9nZXRfdTMyKHN0cnVjdCBubGF0dHIgKik7CitleHRlcm4gaW50CQlubGFfcHV0X3UzMihzdHJ1Y3QgbmxfbXNnICosIGludCwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQ2NF90CQlubGFfZ2V0X3U2NChzdHJ1Y3QgbmxhdHRyICopOworZXh0ZXJuIGludAkJbmxhX3B1dF91NjQoc3RydWN0IG5sX21zZyAqLCBpbnQsIHVpbnQ2NF90KTsKKworLyogU3RyaW5nIGF0dHJpYnV0ZSAqLworZXh0ZXJuIGNoYXIgKgkJbmxhX2dldF9zdHJpbmcoc3RydWN0IG5sYXR0ciAqKTsKK2V4dGVybiBjaGFyICoJCW5sYV9zdHJkdXAoc3RydWN0IG5sYXR0ciAqKTsKK2V4dGVybiBpbnQJCW5sYV9wdXRfc3RyaW5nKHN0cnVjdCBubF9tc2cgKiwgaW50LCBjb25zdCBjaGFyICopOworCisvKiBGbGFnIGF0dHJpYnV0ZSAqLworZXh0ZXJuIGludAkJbmxhX2dldF9mbGFnKHN0cnVjdCBubGF0dHIgKik7CitleHRlcm4gaW50CQlubGFfcHV0X2ZsYWcoc3RydWN0IG5sX21zZyAqLCBpbnQpOworCisvKiBNc2VjIGF0dHJpYnV0ZSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcJbmxhX2dldF9tc2VjcyhzdHJ1Y3QgbmxhdHRyICopOworZXh0ZXJuIGludAkJbmxhX3B1dF9tc2VjcyhzdHJ1Y3QgbmxfbXNnICosIGludCwgdW5zaWduZWQgbG9uZyk7CisKKy8qIEF0dHJpYnV0ZSBuZXN0aW5nICovCitleHRlcm4gaW50CQlubGFfcHV0X25lc3RlZChzdHJ1Y3QgbmxfbXNnICosIGludCwgc3RydWN0IG5sX21zZyAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJbmxhX25lc3Rfc3RhcnQoc3RydWN0IG5sX21zZyAqLCBpbnQpOworZXh0ZXJuIGludAkJbmxhX25lc3RfZW5kKHN0cnVjdCBubF9tc2cgKiwgc3RydWN0IG5sYXR0ciAqKTsKK2V4dGVybiBpbnQJCW5sYV9wYXJzZV9uZXN0ZWQoc3RydWN0IG5sYXR0ciAqKiwgaW50LCBzdHJ1Y3QgbmxhdHRyICosCisJCQkJCSBzdHJ1Y3QgbmxhX3BvbGljeSAqKTsKKworLyoqCisgKiBAbmFtZSBBdHRyaWJ1dGUgQ29uc3RydWN0aW9uIChFeGNlcHRpb24gQmFzZWQpCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgYXR0cgorICogQWRkIHVuc3BlY2lmaWMgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyBhdHRybGVuCQlMZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQuCisgKiBAYXJnIGRhdGEJCUhlYWQgb2YgYXR0cmlidXRlIHBheWxvYWQuCisgKi8KKyNkZWZpbmUgTkxBX1BVVChtc2csIGF0dHJ0eXBlLCBhdHRybGVuLCBkYXRhKSBcCisJZG8geyBcCisJCWlmIChubGFfcHV0KG1zZywgYXR0cnR5cGUsIGF0dHJsZW4sIGRhdGEpIDwgMCkgXAorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7IFwKKwl9IHdoaWxlKDApCisKKy8qKgorICogQGluZ3JvdXAgYXR0cgorICogQWRkIGF0b21pYyB0eXBlIGF0dHJpYnV0ZSB0byBuZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIG1zZwkJTmV0bGluayBtZXNzYWdlLgorICogQGFyZyB0eXBlCQlBdG9taWMgdHlwZS4KKyAqIEBhcmcgYXR0cnR5cGUJQXR0cmlidXRlIHR5cGUuCisgKiBAYXJnIHZhbHVlCQlIZWFkIG9mIGF0dHJpYnV0ZSBwYXlsb2FkLgorICovCisjZGVmaW5lIE5MQV9QVVRfVFlQRShtc2csIHR5cGUsIGF0dHJ0eXBlLCB2YWx1ZSkgXAorCWRvIHsgXAorCQl0eXBlIF9fdG1wID0gdmFsdWU7IFwKKwkJTkxBX1BVVChtc2csIGF0dHJ0eXBlLCBzaXplb2YodHlwZSksICZfX3RtcCk7IFwKKwl9IHdoaWxlKDApCisKKy8qKgorICogQWRkIDggYml0IGludGVnZXIgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyB2YWx1ZQkJTnVtZXJpYyB2YWx1ZS4KKyAqLworI2RlZmluZSBOTEFfUFVUX1U4KG1zZywgYXR0cnR5cGUsIHZhbHVlKSBcCisJTkxBX1BVVF9UWVBFKG1zZywgdWludDhfdCwgYXR0cnR5cGUsIHZhbHVlKQorCisvKioKKyAqIEFkZCAxNiBiaXQgaW50ZWdlciBhdHRyaWJ1dGUgdG8gbmV0bGluayBtZXNzYWdlLgorICogQGFyZyBtc2cJCU5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgYXR0cnR5cGUJQXR0cmlidXRlIHR5cGUuCisgKiBAYXJnIHZhbHVlCQlOdW1lcmljIHZhbHVlLgorICovCisjZGVmaW5lIE5MQV9QVVRfVTE2KG1zZywgYXR0cnR5cGUsIHZhbHVlKSBcCisJTkxBX1BVVF9UWVBFKG1zZywgdWludDE2X3QsIGF0dHJ0eXBlLCB2YWx1ZSkKKworLyoqCisgKiBBZGQgMzIgYml0IGludGVnZXIgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyB2YWx1ZQkJTnVtZXJpYyB2YWx1ZS4KKyAqLworI2RlZmluZSBOTEFfUFVUX1UzMihtc2csIGF0dHJ0eXBlLCB2YWx1ZSkgXAorCU5MQV9QVVRfVFlQRShtc2csIHVpbnQzMl90LCBhdHRydHlwZSwgdmFsdWUpCisKKy8qKgorICogQWRkIDY0IGJpdCBpbnRlZ2VyIGF0dHJpYnV0ZSB0byBuZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIG1zZwkJTmV0bGluayBtZXNzYWdlLgorICogQGFyZyBhdHRydHlwZQlBdHRyaWJ1dGUgdHlwZS4KKyAqIEBhcmcgdmFsdWUJCU51bWVyaWMgdmFsdWUuCisgKi8KKyNkZWZpbmUgTkxBX1BVVF9VNjQobXNnLCBhdHRydHlwZSwgdmFsdWUpIFwKKwlOTEFfUFVUX1RZUEUobXNnLCB1aW50NjRfdCwgYXR0cnR5cGUsIHZhbHVlKQorCisvKioKKyAqIEFkZCBzdHJpbmcgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyB2YWx1ZQkJTlVMIHRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZy4KKyAqLworI2RlZmluZSBOTEFfUFVUX1NUUklORyhtc2csIGF0dHJ0eXBlLCB2YWx1ZSkgXAorCU5MQV9QVVQobXNnLCBhdHRydHlwZSwgc3RybGVuKHZhbHVlKSArIDEsIHZhbHVlKQorCisvKioKKyAqIEFkZCBmbGFnIGF0dHJpYnV0ZSB0byBuZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIG1zZwkJTmV0bGluayBtZXNzYWdlLgorICogQGFyZyBhdHRydHlwZQlBdHRyaWJ1dGUgdHlwZS4KKyAqLworI2RlZmluZSBOTEFfUFVUX0ZMQUcobXNnLCBhdHRydHlwZSkgXAorCU5MQV9QVVQobXNnLCBhdHRydHlwZSwgMCwgTlVMTCkKKworLyoqCisgKiBBZGQgbXNlY3MgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyBtc2VjcwkJTnVtZXJpYyB2YWx1ZSBpbiBtaWNybyBzZWNvbmRzLgorICovCisjZGVmaW5lIE5MQV9QVVRfTVNFQ1MobXNnLCBhdHRydHlwZSwgbXNlY3MpIFwKKwlOTEFfUFVUX1U2NChtc2csIGF0dHJ0eXBlLCBtc2VjcykKKworLyoqCisgKiBBZGQgYWRkcmVzcyBhdHRyaWJ1dGUgdG8gbmV0bGluayBtZXNzYWdlLgorICogQGFyZyBtc2cJCU5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgYXR0cnR5cGUJQXR0cmlidXRlIHR5cGUuCisgKiBAYXJnIGFkZHIJCUFic3RyYWN0IGFkZHJlc3Mgb2JqZWN0LgorICovCisjZGVmaW5lIE5MQV9QVVRfQUREUihtc2csIGF0dHJ0eXBlLCBhZGRyKSBcCisJTkxBX1BVVChtc2csIGF0dHJ0eXBlLCBubF9hZGRyX2dldF9sZW4oYWRkciksIFwKKwkJbmxfYWRkcl9nZXRfYmluYXJ5X2FkZHIoYWRkcikpCisKKy8qKgorICogQWRkIGFic3RyYWN0IGRhdGEgYXR0cmlidXRlIHRvIG5ldGxpbmsgbWVzc2FnZS4KKyAqIEBhcmcgbXNnCQlOZXRsaW5rIG1lc3NhZ2UuCisgKiBAYXJnIGF0dHJ0eXBlCUF0dHJpYnV0ZSB0eXBlLgorICogQGFyZyBkYXRhCQlBYnN0cmFjdCBkYXRhIG9iamVjdC4KKyAqLworI2RlZmluZSBOTEFfUFVUX0RBVEEobXNnLCBhdHRydHlwZSwgZGF0YSkgXAorCU5MQV9QVVQobXNnLCBhdHRydHlwZSwgbmxfZGF0YV9nZXRfc2l6ZShkYXRhKSwgXAorCQlubF9kYXRhX2dldChkYXRhKSkKKworLyoqIEB9ICovCisKKy8qKgorICogQG5hbWUgSXRlcmF0b3JzCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgYXR0cgorICogSXRlcmF0ZSBvdmVyIGEgc3RyZWFtIG9mIGF0dHJpYnV0ZXMKKyAqIEBhcmcgcG9zCWxvb3AgY291bnRlciwgc2V0IHRvIGN1cnJlbnQgYXR0cmlidXRlCisgKiBAYXJnIGhlYWQJaGVhZCBvZiBhdHRyaWJ1dGUgc3RyZWFtCisgKiBAYXJnIGxlbglsZW5ndGggb2YgYXR0cmlidXRlIHN0cmVhbQorICogQGFyZyByZW0JaW5pdGlhbGl6ZWQgdG8gbGVuLCBob2xkcyBieXRlcyBjdXJyZW50bHkgcmVtYWluaW5nIGluIHN0cmVhbQorICovCisjZGVmaW5lIG5sYV9mb3JfZWFjaF9hdHRyKHBvcywgaGVhZCwgbGVuLCByZW0pIFwKKwlmb3IgKHBvcyA9IGhlYWQsIHJlbSA9IGxlbjsgXAorCSAgICAgbmxhX29rKHBvcywgcmVtKTsgXAorCSAgICAgcG9zID0gbmxhX25leHQocG9zLCAmKHJlbSkpKQorCisvKioKKyAqIEBpbmdyb3VwIGF0dHIKKyAqIEl0ZXJhdGUgb3ZlciBhIHN0cmVhbSBvZiBuZXN0ZWQgYXR0cmlidXRlcworICogQGFyZyBwb3MJbG9vcCBjb3VudGVyLCBzZXQgdG8gY3VycmVudCBhdHRyaWJ1dGUKKyAqIEBhcmcgbmxhCWF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBuZXN0ZWQgYXR0cmlidXRlcworICogQGFyZyByZW0JaW5pdGlhbGl6ZWQgdG8gbGVuLCBob2xkcyBieXRlcyBjdXJyZW50bHkgcmVtYWluaW5nIGluIHN0cmVhbQorICovCisjZGVmaW5lIG5sYV9mb3JfZWFjaF9uZXN0ZWQocG9zLCBubGEsIHJlbSkgXAorCWZvciAocG9zID0gbmxhX2RhdGEobmxhKSwgcmVtID0gbmxhX2xlbihubGEpOyBcCisJICAgICBubGFfb2socG9zLCByZW0pOyBcCisJICAgICBwb3MgPSBubGFfbmV4dChwb3MsICYocmVtKSkpCisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NhY2hlLWFwaS5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvY2FjaGUtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmYzQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NhY2hlLWFwaS5oCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogbmV0bGluay9jYWNoZS1hcGkuaAkJQ2FjaGluZyBBUEkKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfQ0FDSEVfQVBJX0hfCisjZGVmaW5lIE5FVExJTktfQ0FDSEVfQVBJX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBpbmdyb3VwIGNhY2hlCisgKiBAZGVmZ3JvdXAgY2FjaGVfYXBpIENhY2hlIEltcGxlbWVudGF0aW9uCisgKiBAYnJpZWYKKyAqCisgKiBAcGFyIDEpIENhY2hlIERlZmluaXRpb24KKyAqIEBjb2RlCisgKiBzdHJ1Y3QgbmxfY2FjaGVfb3BzIG15X2NhY2hlX29wcyA9IHsKKyAqIAkuY29fbmFtZQkJPSAicm91dGUvbGluayIsCisgKiAJLmNvX3Byb3RvY29sCQk9IE5FVExJTktfUk9VVEUsCisgKiAJLmNvX2hkcnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpLAorICogCS5jb19vYmpfb3BzCQk9ICZteV9vYmpfb3BzLAorICogfTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhciAyKSAKKyAqIEBjb2RlCisgKiAvLyBUaGUgc2ltcGxlc3Qgd2F5IHRvIGZpbGwgYSBjYWNoZSBpcyBieSBwcm92aWRpbmcgYSByZXF1ZXN0LXVwZGF0ZQorICogLy8gZnVuY3Rpb24gd2hpY2ggbXVzdCB0cmlnZ2VyIGEgY29tcGxldGUgZHVtcCBvbiB0aGUga2VybmVsLXNpZGUgb2YKKyAqIC8vIHdoYXRldmVyIHRoZSBjYWNoZSBjb3ZlcnMuCisgKiBzdGF0aWMgaW50IG15X3JlcXVlc3RfdXBkYXRlKHN0cnVjdCBubF9jYWNoZSAqY2FjaGUsCisgKiAJCQkJc3RydWN0IG5sX3NvY2sgKnNvY2tldCkKKyAqIHsKKyAqIAkvLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHJlcXVlc3QgYSBmdWxsIGR1bXAgb2YgdGhlIGludGVyZmFjZSB0YWJsZQorICogCXJldHVybiBubF9ydGdlbl9yZXF1ZXN0KHNvY2tldCwgUlRNX0dFVExJTkssIEFGX1VOU1BFQywgTkxNX0ZfRFVNUCk7CisgKiB9CisgKgorICogLy8gVGhlIHJlc3VsdGluZyBuZXRsaW5rIG1lc3NhZ2VzIHNlbnQgYmFjayB3aWxsIGJlIGZlZCBpbnRvIGEgbWVzc2FnZQorICogLy8gcGFyc2VyIG9uZSBhdCBhIHRpbWUuIFRoZSBtZXNzYWdlIHBhcnNlciBoYXMgdG8gZXh0cmFjdCBhbGwgcmVsZXZhbnQKKyAqIC8vIGluZm9ybWF0aW9uIGZyb20gdGhlIG1lc3NhZ2UgYW5kIGNyZWF0ZSBhbiBvYmplY3QgcmVmbGVjdGluZyB0aGUKKyAqIC8vIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFuZCBwYXNzIGl0IG9uIHRvIHRoZSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIC8vIHByb3ZpZGUgd2hpY2ggd2lsbCBhZGQgdGhlIG9iamVjdCB0byB0aGUgY2FjaGUuCisgKiBzdGF0aWMgaW50IG15X21zZ19wYXJzZXIoc3RydWN0IG5sX2NhY2hlX29wcyAqb3BzLCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKyAqIAkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5sX3BhcnNlcl9wYXJhbSAqcHApCisgKiB7CisgKiAJc3RydWN0IG15X29iaiAqb2JqOworICoKKyAqIAlvYmogPSBteV9vYmpfYWxsb2MoKTsKKyAqIAlvYmotPmNlX21zZ3R5cGUgPSBubGgtPm5sbXNnX3R5cGU7CisgKgorICogCS8vIFBhcnNlIHRoZSBuZXRsaW5rIG1lc3NhZ2UgYW5kIGNvbnRpbnVlIGNyZWF0aW5nIHRoZSBvYmplY3QuCisgKgorICogCWVyciA9IHBwLT5wcF9jYigoc3RydWN0IG5sX29iamVjdCAqKSBvYmosIHBwKTsKKyAqIAlpZiAoZXJyIDwgMCkKKyAqIAkJZ290byBlcnJvdXQ7CisgKiB9CisgKgorICogc3RydWN0IG5sX2NhY2hlX29wcyBteV9jYWNoZV9vcHMgPSB7CisgKiAJLi4uCisgKiAJLmNvX3JlcXVlc3RfdXBkYXRlCT0gbXlfcmVxdWVzdF91cGRhdGUsCisgKiAJLmNvX21zZ19wYXJzZXIJCT0gbXlfbXNnX3BhcnNlciwKKyAqIH07CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXIgMykgTm90aWZpY2F0aW9uIGJhc2VkIFVwZGF0ZXMKKyAqIEBjb2RlCisgKiAvLyBDYWNoZXMgY2FuIGJlIGtlcHQgdXAtdG8tZGF0ZSBiYXNlZCBvbiBub3RpZmljYXRpb25zIGlmIHRoZSBrZXJuZWwKKyAqIC8vIHNlbmRzIG91dCBub3RpZmljYXRpb25zIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBhZGRlZC9yZW1vdmVkL2NoYW5nZWQuCisgKiAvLworICogLy8gSXQgaXMgdHJpdmlhbCB0byBzdXBwb3J0IHRoaXMsIGZpcnN0IGEgbGlzdCBvZiBncm91cHMgbmVlZHMgdG8gYmUKKyAqIC8vIGRlZmluZWQgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGpvaW4gaW4gb3JkZXIgdG8gcmVjZWl2ZSBhbGwgbmVjZXNzYXJ5CisgKiAvLyBub3RpZmljYXRpb25zLiBUaGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYWRkcmVzcyBmYW1pbHkgdG8gc3VwcG9ydAorICogLy8gdGhlIGNvbW1vbiBzaXR1YXRpb24gd2hlcmUgYSBzZXBhcmF0ZSBncm91cCBpcyB1c2VkIGZvciBlYWNoIGFkZHJlc3MKKyAqIC8vIGZhbWlseS4gSWYgdGhlcmUgaXMgb25seSBvbmUgZ3JvdXAsIHNpbXBseSBzcGVjaWZ5IEFGX1VOU1BFQy4KKyAqIHN0YXRpYyBzdHJ1Y3QgbmxfYWZfZ3JvdXAgYWRkcl9ncm91cHNbXSA9IHsKKyAqIAl7IEFGX0lORVQsCVJUTkxHUlBfSVBWNF9JRkFERFIgfSwKKyAqIAl7IEFGX0lORVQ2LAlSVE5MR1JQX0lQVjZfSUZBRERSIH0sCisgKiAJeyBFTkRfT0ZfR1JPVVBfTElTVCB9LAorICogfTsKKyAqCisgKiAvLyBJbiBvcmRlciBmb3IgdGhlIGNhY2hpbmcgc3lzdGVtIHRvIGtub3cgdGhlIG1lYW5pbmcgb2YgZWFjaCBtZXNzYWdlCisgKiAvLyB0eXBlIGl0IHJlcXVpcmVzIGEgdGFibGUgd2hpY2ggbWFwcyBlYWNoIHN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgdG8KKyAqIC8vIGEgY2FjaGUgYWN0aW9uLCBlLmcuIFJUTV9ORVdBRERSIG1lYW5zIGFkZHJlc3MgaGFzIGJlZW4gYWRkZWQgb3IKKyAqIC8vIHVwZGF0ZWQsIFJUTV9ERUxBRERSIG1lYW5zIGFkZHJlc3MgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqIHN0YXRpYyBzdHJ1Y3QgbmxfY2FjaGVfb3BzIHJ0bmxfYWRkcl9vcHMgPSB7CisgKiAJLi4uCisgKiAJLmNvX21zZ3R5cGVzCQk9IHsKKyAqIAkJCQkJeyBSVE1fTkVXQUREUiwgTkxfQUNUX05FVywgIm5ldyIgfSwKKyAqIAkJCQkJeyBSVE1fREVMQUREUiwgTkxfQUNUX0RFTCwgImRlbCIgfSwKKyAqIAkJCQkJeyBSVE1fR0VUQUREUiwgTkxfQUNUX0dFVCwgImdldCIgfSwKKyAqIAkJCQkJRU5EX09GX01TR1RZUEVTX0xJU1QsCisgKiAJCQkJfSwKKyAqIAkuY29fZ3JvdXBzCQk9IGFkZHJfZ3JvdXBzLAorICogfTsKKyAqCisgKiAvLyBJdCBpcyBub3cgcG9zc2libGUgdG8ga2VlcCB0aGUgY2FjaGUgdXAtdG8tZGF0ZSB1c2luZyB0aGUgY2FjaGUgbWFuYWdlci4KKyAqIEBlbmRjb2RlCisgKiBAeworICovCisKK2VudW0geworCU5MX0FDVF9VTlNQRUMsCisJTkxfQUNUX05FVywKKwlOTF9BQ1RfREVMLAorCU5MX0FDVF9HRVQsCisJTkxfQUNUX1NFVCwKKwlOTF9BQ1RfQ0hBTkdFLAorCV9fTkxfQUNUX01BWCwKK307CisKKyNkZWZpbmUgTkxfQUNUX01BWCAoX19OTF9BQ1RfTUFYIC0gMSkKKworI2RlZmluZSBFTkRfT0ZfTVNHVFlQRVNfTElTVAl7IC0xLCAtMSwgTlVMTCB9CisKKy8qKgorICogTWVzc2FnZSB0eXBlIHRvIGNhY2hlIGFjdGlvbiBhc3NvY2lhdGlvbgorICovCitzdHJ1Y3QgbmxfbXNndHlwZQoreworCS8qKiBOZXRsaW5rIG1lc3NhZ2UgdHlwZSAqLworCWludAkJCW10X2lkOworCisJLyoqIENhY2hlIGFjdGlvbiB0byB0YWtlICovCisJaW50CQkJbXRfYWN0OworCisJLyoqIE5hbWUgb2Ygb3BlcmF0aW9uIGZvciBodW1hbi1yZWFkYWJsZSBwcmludGluZyAqLworCWNoYXIgKgkJCW10X25hbWU7Cit9OworCisvKioKKyAqIEFkZHJlc3MgZmFtaWx5IHRvIG5ldGxpbmsgZ3JvdXAgYXNzb2NpYXRpb24KKyAqLworc3RydWN0IG5sX2FmX2dyb3VwCit7CisJLyoqIEFkZHJlc3MgZmFtaWx5ICovCisJaW50CQkJYWdfZmFtaWx5OworCisJLyoqIE5ldGxpbmsgZ3JvdXAgaWRlbnRpZmllciAqLworCWludAkJCWFnX2dyb3VwOworfTsKKworI2RlZmluZSBFTkRfT0ZfR1JPVVBfTElTVCBBRl9VTlNQRUMsIDAKKworc3RydWN0IG5sX3BhcnNlcl9wYXJhbQoreworCWludCAgICAgICAgICAgICAoKnBwX2NiKShzdHJ1Y3Qgbmxfb2JqZWN0ICosIHN0cnVjdCBubF9wYXJzZXJfcGFyYW0gKik7CisJdm9pZCAqICAgICAgICAgICAgcHBfYXJnOworfTsKKworLyoqCisgKiBDYWNoZSBPcGVyYXRpb25zCisgKi8KK3N0cnVjdCBubF9jYWNoZV9vcHMKK3sKKwljaGFyICAqCQkJY29fbmFtZTsKKworCWludAkJCWNvX2hkcnNpemU7CisJaW50CQkJY29fcHJvdG9jb2w7CisJc3RydWN0IG5sX2FmX2dyb3VwICoJY29fZ3JvdXBzOworCQorCS8qKgorCSAqIENhbGxlZCB3aGVuZXZlciBhbiB1cGRhdGUgb2YgdGhlIGNhY2hlIGlzIHJlcXVpcmVkLiBNdXN0IHNlbmQKKwkgKiBhIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUga2VybmVsIHJlcXVlc3RpbmcgYSBjb21wbGV0ZSBkdW1wLgorCSAqLworCWludCAgICgqY29fcmVxdWVzdF91cGRhdGUpKHN0cnVjdCBubF9jYWNoZSAqLCBzdHJ1Y3Qgbmxfc29jayAqKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuZXZlciBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLgorCSAqIE11c3QgcGFyc2UgdGhlIG1lc3NhZ2UgYW5kIGNhbGwgdGhlIHBhc2VyIGNhbGxiYWNrIGZ1bmN0aW9uCisJICogKG5sX3BhcnNlcl9wYXJhbSkgcHJvdmlkZWQgdmlhIHRoZSBhcmd1bWVudC4KKwkgKi8KKwlpbnQgICAoKmNvX21zZ19wYXJzZXIpKHN0cnVjdCBubF9jYWNoZV9vcHMgKiwgc3RydWN0IHNvY2thZGRyX25sICosCisJCQkgICAgICAgc3RydWN0IG5sbXNnaGRyICosIHN0cnVjdCBubF9wYXJzZXJfcGFyYW0gKik7CisKKwlzdHJ1Y3Qgbmxfb2JqZWN0X29wcyAqCWNvX29ial9vcHM7CisKKwlzdHJ1Y3QgbmxfY2FjaGVfb3BzICpjb19uZXh0OworCXN0cnVjdCBubF9jYWNoZSAqY29fbWFqb3JfY2FjaGU7CisJc3RydWN0IGdlbmxfb3BzICoJY29fZ2VubDsKKwlzdHJ1Y3QgbmxfbXNndHlwZQljb19tc2d0eXBlc1tdOworfTsKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvY2FjaGUuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1MjkyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NhY2hlLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBuZXRsaW5rL2NhY2hlLmgJCUNhY2hpbmcgTW9kdWxlCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0NBQ0hFX0hfCisjZGVmaW5lIE5FVExJTktfQ0FDSEVfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisjaW5jbHVkZSA8bmV0bGluay91dGlscy5oPgorI2luY2x1ZGUgPG5ldGxpbmsvb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9jYWNoZS1hcGkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgbmxfY2FjaGU7CisKK3R5cGVkZWYgdm9pZCAoKmNoYW5nZV9mdW5jX3QpKHN0cnVjdCBubF9jYWNoZSAqLCBzdHJ1Y3Qgbmxfb2JqZWN0ICosIGludCwgdm9pZCAqKTsKKworLyogQWNjZXNzIEZ1bmN0aW9ucyAqLworZXh0ZXJuIGludAkJCW5sX2NhY2hlX25pdGVtcyhzdHJ1Y3QgbmxfY2FjaGUgKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfbml0ZW1zX2ZpbHRlcihzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJCSAgICAgICBzdHJ1Y3Qgbmxfb2JqZWN0ICopOworZXh0ZXJuIHN0cnVjdCBubF9jYWNoZV9vcHMgKglubF9jYWNoZV9nZXRfb3BzKHN0cnVjdCBubF9jYWNoZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0ICoJbmxfY2FjaGVfZ2V0X2ZpcnN0KHN0cnVjdCBubF9jYWNoZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0ICoJbmxfY2FjaGVfZ2V0X2xhc3Qoc3RydWN0IG5sX2NhY2hlICopOworZXh0ZXJuIHN0cnVjdCBubF9vYmplY3QgKglubF9jYWNoZV9nZXRfbmV4dChzdHJ1Y3Qgbmxfb2JqZWN0ICopOworZXh0ZXJuIHN0cnVjdCBubF9vYmplY3QgKglubF9jYWNoZV9nZXRfcHJldihzdHJ1Y3Qgbmxfb2JqZWN0ICopOworCitleHRlcm4gc3RydWN0IG5sX2NhY2hlICoJbmxfY2FjaGVfYWxsb2Moc3RydWN0IG5sX2NhY2hlX29wcyAqKTsKK2V4dGVybiBpbnQJCQlubF9jYWNoZV9hbGxvY19hbmRfZmlsbChzdHJ1Y3QgbmxfY2FjaGVfb3BzICosCisJCQkJCQkJc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCQlzdHJ1Y3QgbmxfY2FjaGUgKiopOworZXh0ZXJuIGludAkJCW5sX2NhY2hlX2FsbG9jX25hbWUoY29uc3QgY2hhciAqLAorCQkJCQkJICAgIHN0cnVjdCBubF9jYWNoZSAqKik7CitleHRlcm4gc3RydWN0IG5sX2NhY2hlICoJbmxfY2FjaGVfc3Vic2V0KHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJc3RydWN0IG5sX29iamVjdCAqKTsKK2V4dGVybiB2b2lkCQkJbmxfY2FjaGVfY2xlYXIoc3RydWN0IG5sX2NhY2hlICopOworZXh0ZXJuIHZvaWQJCQlubF9jYWNoZV9mcmVlKHN0cnVjdCBubF9jYWNoZSAqKTsKKworLyogQ2FjaGUgbW9kaWZpY2F0aW9uICovCitleHRlcm4gaW50CQkJbmxfY2FjaGVfYWRkKHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkgICAgIHN0cnVjdCBubF9vYmplY3QgKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfcGFyc2VfYW5kX2FkZChzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgbmxfbXNnICopOworZXh0ZXJuIHZvaWQJCQlubF9jYWNoZV9yZW1vdmUoc3RydWN0IG5sX29iamVjdCAqKTsKK2V4dGVybiBpbnQJCQlubF9jYWNoZV9yZWZpbGwoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCXN0cnVjdCBubF9jYWNoZSAqKTsKK2V4dGVybiBpbnQJCQlubF9jYWNoZV9waWNrdXAoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCXN0cnVjdCBubF9jYWNoZSAqKTsKK2V4dGVybiBpbnQJCQlubF9jYWNoZV9yZXN5bmMoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCXN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJY2hhbmdlX2Z1bmNfdCwKKwkJCQkJCXZvaWQgKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfaW5jbHVkZShzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJCSBzdHJ1Y3Qgbmxfb2JqZWN0ICosCisJCQkJCQkgY2hhbmdlX2Z1bmNfdCwKKwkJCQkJCSB2b2lkICopOworCisvKiBHZW5lcmFsICovCitleHRlcm4gaW50CQkJbmxfY2FjaGVfaXNfZW1wdHkoc3RydWN0IG5sX2NhY2hlICopOworZXh0ZXJuIHZvaWQJCQlubF9jYWNoZV9tYXJrX2FsbChzdHJ1Y3QgbmxfY2FjaGUgKik7CisKKy8qIER1bXBpbmcgKi8KK2V4dGVybiB2b2lkCQkJbmxfY2FjaGVfZHVtcChzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJICAgICAgc3RydWN0IG5sX2R1bXBfcGFyYW1zICopOworZXh0ZXJuIHZvaWQJCQlubF9jYWNoZV9kdW1wX2ZpbHRlcihzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJCSAgICAgc3RydWN0IG5sX2R1bXBfcGFyYW1zICosCisJCQkJCQkgICAgIHN0cnVjdCBubF9vYmplY3QgKik7CisKKy8qIEl0ZXJhdG9ycyAqLworZXh0ZXJuIHZvaWQJCQlubF9jYWNoZV9mb3JlYWNoKHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJIHZvaWQgKCpjYikoc3RydWN0IG5sX29iamVjdCAqLAorCQkJCQkJCSAgICB2b2lkICopLAorCQkJCQkJIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZAkJCW5sX2NhY2hlX2ZvcmVhY2hfZmlsdGVyKHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJCXN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJCQl2b2lkICgqY2IpKHN0cnVjdAorCQkJCQkJCQkgICBubF9vYmplY3QgKiwKKwkJCQkJCQkJICAgdm9pZCAqKSwKKwkJCQkJCQl2b2lkICphcmcpOworCisvKiAtLS0gY2FjaGUgbWFuYWdlbWVudCAtLS0gKi8KKworLyogQ2FjaGUgdHlwZSBtYW5hZ2VtZW50ICovCitleHRlcm4gc3RydWN0IG5sX2NhY2hlX29wcyAqCW5sX2NhY2hlX29wc19sb29rdXAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfY2FjaGVfb3BzICoJbmxfY2FjaGVfb3BzX2Fzc29jaWF0ZShpbnQsIGludCk7CitleHRlcm4gc3RydWN0IG5sX21zZ3R5cGUgKglubF9tc2d0eXBlX2xvb2t1cChzdHJ1Y3QgbmxfY2FjaGVfb3BzICosIGludCk7CitleHRlcm4gdm9pZAkJCW5sX2NhY2hlX29wc19mb3JlYWNoKHZvaWQgKCpjYikoc3RydWN0IG5sX2NhY2hlX29wcyAqLCB2b2lkICopLCB2b2lkICopOworZXh0ZXJuIGludAkJCW5sX2NhY2hlX21uZ3RfcmVnaXN0ZXIoc3RydWN0IG5sX2NhY2hlX29wcyAqKTsKK2V4dGVybiBpbnQJCQlubF9jYWNoZV9tbmd0X3VucmVnaXN0ZXIoc3RydWN0IG5sX2NhY2hlX29wcyAqKTsKKworLyogR2xvYmFsIGNhY2hlIHByb3Zpc2lvbmluZy9yZXF1aXJpbmcgKi8KK2V4dGVybiB2b2lkCQkJbmxfY2FjaGVfbW5ndF9wcm92aWRlKHN0cnVjdCBubF9jYWNoZSAqKTsKK2V4dGVybiB2b2lkCQkJbmxfY2FjaGVfbW5ndF91bnByb3ZpZGUoc3RydWN0IG5sX2NhY2hlICopOworZXh0ZXJuIHN0cnVjdCBubF9jYWNoZSAqCW5sX2NhY2hlX21uZ3RfcmVxdWlyZShjb25zdCBjaGFyICopOworCitzdHJ1Y3QgbmxfY2FjaGVfbW5ncjsKKworI2RlZmluZSBOTF9BVVRPX1BST1ZJREUJCTEKKworZXh0ZXJuIGludAkJCW5sX2NhY2hlX21uZ3JfYWxsb2Moc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCSAgICBpbnQsIGludCwKKwkJCQkJCSAgICBzdHJ1Y3QgbmxfY2FjaGVfbW5nciAqKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfbW5ncl9hZGQoc3RydWN0IG5sX2NhY2hlX21uZ3IgKiwKKwkJCQkJCSAgY29uc3QgY2hhciAqLAorCQkJCQkJICBjaGFuZ2VfZnVuY190LAorCQkJCQkJICB2b2lkICosCisJCQkJCQkgIHN0cnVjdCBubF9jYWNoZSAqKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfbW5ncl9nZXRfZmQoc3RydWN0IG5sX2NhY2hlX21uZ3IgKik7CitleHRlcm4gaW50CQkJbmxfY2FjaGVfbW5ncl9wb2xsKHN0cnVjdCBubF9jYWNoZV9tbmdyICosCisJCQkJCQkgICBpbnQpOworZXh0ZXJuIGludAkJCW5sX2NhY2hlX21uZ3JfZGF0YV9yZWFkeShzdHJ1Y3QgbmxfY2FjaGVfbW5nciAqKTsKK2V4dGVybiB2b2lkCQkJbmxfY2FjaGVfbW5ncl9mcmVlKHN0cnVjdCBubF9jYWNoZV9tbmdyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NsaS91dGlscy5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvY2xpL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyMzIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2NsaS91dGlscy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBzcmMvdXRpbHMuaAkJVXRpbGl0aWVzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDkgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBfX05FVExJTktfQ0xJX1VUSUxTX0hfCisjZGVmaW5lIF9fTkVUTElOS19DTElfVVRJTFNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3V0aWxzLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9saXN0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9ydG5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9saW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL25laWdodGJsLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvcm91dGUvcnVsZS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvcm91dGUvcWRpc2MuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL2NsYXNzLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9jbGFzc2lmaWVyLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9jbHMvZW1hdGNoLmg+CisjaW5jbHVkZSA8bmV0bGluay9maWJfbG9va3VwL2xvb2t1cC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZmliX2xvb2t1cC9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2dlbmwuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvY3RybC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9tbmd0Lmg+CisjaW5jbHVkZSA8bmV0bGluay9uZXRmaWx0ZXIvY3QuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIF9faW5pdAorI2RlZmluZSBfX2luaXQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQorI2VuZGlmCisKKyNpZm5kZWYgX19leGl0CisjZGVmaW5lIF9fZXhpdCBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkKKyNlbmRpZgorCitleHRlcm4gdWludDMyX3QJCW5sX2NsaV9wYXJzZV91MzIoY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkCQlubF9jbGlfcHJpbnRfdmVyc2lvbih2b2lkKTsKK2V4dGVybiB2b2lkCQlubF9jbGlfZmF0YWwoaW50LCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKglubF9jbGlfYWRkcl9wYXJzZShjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50CQlubF9jbGlfY29ubmVjdChzdHJ1Y3Qgbmxfc29jayAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBubF9zb2NrICoJbmxfY2xpX2FsbG9jX3NvY2tldCh2b2lkKTsKK2V4dGVybiBpbnQJCW5sX2NsaV9wYXJzZV9kdW1wdHlwZShjb25zdCBjaGFyICopOworZXh0ZXJuIGludAkJbmxfY2xpX2NvbmZpcm0oc3RydWN0IG5sX29iamVjdCAqLAorCQkJCSAgICAgICBzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKiwgaW50KTsKKworZXh0ZXJuIHN0cnVjdCBubF9jYWNoZSAqbmxfY2xpX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgaW50ICgqYWMpKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9jYWNoZSAqKikpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2RhdGEuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzExNTllCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZGF0YS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBuZXRsaW5rL2RhdGEuaAlBYnN0cmFjdCBEYXRhCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0RBVEFfSF8KKyNkZWZpbmUgTkVUTElOS19EQVRBX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgbmxfZGF0YTsKKworLyogR2VuZXJhbCAqLworZXh0ZXJuIHN0cnVjdCBubF9kYXRhICoJbmxfZGF0YV9hbGxvYyh2b2lkICosIHNpemVfdCk7CitleHRlcm4gc3RydWN0IG5sX2RhdGEgKiBubF9kYXRhX2FsbG9jX2F0dHIoc3RydWN0IG5sYXR0ciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfZGF0YSAqCW5sX2RhdGFfY2xvbmUoc3RydWN0IG5sX2RhdGEgKik7CitleHRlcm4gaW50CQlubF9kYXRhX2FwcGVuZChzdHJ1Y3QgbmxfZGF0YSAqLCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZAkJbmxfZGF0YV9mcmVlKHN0cnVjdCBubF9kYXRhICopOworCisvKiBBY2Nlc3MgRnVuY3Rpb25zICovCitleHRlcm4gdm9pZCAqCQlubF9kYXRhX2dldChzdHJ1Y3QgbmxfZGF0YSAqKTsKK2V4dGVybiBzaXplX3QJCW5sX2RhdGFfZ2V0X3NpemUoc3RydWN0IG5sX2RhdGEgKik7CisKKy8qIE1pc2MgKi8KK2V4dGVybiBpbnQJCW5sX2RhdGFfY21wKHN0cnVjdCBubF9kYXRhICosIHN0cnVjdCBubF9kYXRhICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2Vycm5vLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTM3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9lcnJuby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBuZXRsaW5rL2Vycm5vLmgJCUVycm9yIE51bWJlcnMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0VSUk5PX0hfCisjZGVmaW5lIE5FVExJTktfRVJSTk9fSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE5MRV9TVUNDRVNTCQkwCisjZGVmaW5lIE5MRV9GQUlMVVJFCQkxCisjZGVmaW5lIE5MRV9JTlRSCQkyCisjZGVmaW5lIE5MRV9CQURfU09DSwkJMworI2RlZmluZSBOTEVfQUdBSU4JCTQKKyNkZWZpbmUgTkxFX05PTUVNCQk1CisjZGVmaW5lIE5MRV9FWElTVAkJNgorI2RlZmluZSBOTEVfSU5WQUwJCTcKKyNkZWZpbmUgTkxFX1JBTkdFCQk4CisjZGVmaW5lIE5MRV9NU0dTSVpFCQk5CisjZGVmaW5lIE5MRV9PUE5PVFNVUFAJCTEwCisjZGVmaW5lIE5MRV9BRl9OT1NVUFBPUlQJMTEKKyNkZWZpbmUgTkxFX09CSl9OT1RGT1VORAkxMgorI2RlZmluZSBOTEVfTk9BVFRSCQkxMworI2RlZmluZSBOTEVfTUlTU0lOR19BVFRSCTE0CisjZGVmaW5lIE5MRV9BRl9NSVNNQVRDSAkJMTUKKyNkZWZpbmUgTkxFX1NFUV9NSVNNQVRDSAkxNgorI2RlZmluZSBOTEVfTVNHX09WRVJGTE9XCTE3CisjZGVmaW5lIE5MRV9NU0dfVFJVTkMJCTE4CisjZGVmaW5lIE5MRV9OT0FERFIJCTE5CisjZGVmaW5lIE5MRV9TUkNSVF9OT1NVUFBPUlQJMjAKKyNkZWZpbmUgTkxFX01TR19UT09TSE9SVAkyMQorI2RlZmluZSBOTEVfTVNHVFlQRV9OT1NVUFBPUlQJMjIKKyNkZWZpbmUgTkxFX09CSl9NSVNNQVRDSAkyMworI2RlZmluZSBOTEVfTk9DQUNIRQkJMjQKKyNkZWZpbmUgTkxFX0JVU1kJCTI1CisjZGVmaW5lIE5MRV9QUk9UT19NSVNNQVRDSAkyNgorI2RlZmluZSBOTEVfTk9BQ0NFU1MJCTI3CisjZGVmaW5lIE5MRV9QRVJNCQkyOAorI2RlZmluZSBOTEVfUEtUTE9DX0ZJTEUJCTI5CisKKyNkZWZpbmUgTkxFX01BWAkJCU5MRV9QS1RMT0NfRklMRQorCitleHRlcm4gY29uc3QgY2hhciAqCW5sX2dldGVycm9yKGludCk7CitleHRlcm4gdm9pZAkJbmxfcGVycm9yKGludCwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQJCW5sX3N5c2VycjJubGVycihpbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2ZpYl9sb29rdXAvbG9va3VwLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9maWJfbG9va3VwL2xvb2t1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9maWJfbG9va3VwL2xvb2t1cC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBuZXRsaW5rL2ZpYl9sb29rdXAvZmliX2xvb2t1cC5oCUZJQiBMb29rdXAKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfRklCX0xPT0tVUF9IXworI2RlZmluZSBORVRMSU5LX0ZJQl9MT09LVVBfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2FkZHIuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2ZpYl9sb29rdXAvcmVxdWVzdC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBmbG5sX3Jlc3VsdDsKKworZXh0ZXJuIHN0cnVjdCBmbG5sX3Jlc3VsdCAqCWZsbmxfcmVzdWx0X2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQJCQlmbG5sX3Jlc3VsdF9wdXQoc3RydWN0IGZsbmxfcmVzdWx0ICopOworCitleHRlcm4gc3RydWN0IG5sX2NhY2hlICoJZmxubF9yZXN1bHRfYWxsb2NfY2FjaGUodm9pZCk7CisKK2V4dGVybiBpbnQJCQlmbG5sX2xvb2t1cF9idWlsZF9yZXF1ZXN0KHN0cnVjdCBmbG5sX3JlcXVlc3QgKiwKKwkJCQkJCQkgIGludCwKKwkJCQkJCQkgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAkJCWZsbmxfbG9va3VwKHN0cnVjdCBubF9zb2NrICosCisJCQkJCSAgICBzdHJ1Y3QgZmxubF9yZXF1ZXN0ICosCisJCQkJCSAgICBzdHJ1Y3QgbmxfY2FjaGUgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZmliX2xvb2t1cC9yZXF1ZXN0LmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9maWJfbG9va3VwL3JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU4ODIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZmliX2xvb2t1cC9yZXF1ZXN0LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIG5ldGxpbmsvZmliX2xvb2t1cC9yZXF1ZXN0LmgJCUZJQiBMb29rdXAgUmVxdWVzdAkKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfRklCX0xPT0tVUF9SRVFVRVNUX0hfCisjZGVmaW5lIE5FVExJTktfRklCX0xPT0tVUF9SRVFVRVNUX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2FkZHIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZmxubF9yZXF1ZXN0OworCisjZGVmaW5lIFJFUVVFU1RfQ0FTVChwdHIpCSgoc3RydWN0IGZsbmxfcmVxdWVzdCAqKSAocHRyKSkKKworZXh0ZXJuIHN0cnVjdCBmbG5sX3JlcXVlc3QgKglmbG5sX3JlcXVlc3RfYWxsb2Modm9pZCk7CisKK2V4dGVybiB2b2lkCQkJZmxubF9yZXF1ZXN0X3NldF9md21hcmsoc3RydWN0IGZsbmxfcmVxdWVzdCAqLAorCQkJCQkJCXVpbnQ2NF90KTsKK2V4dGVybiB1aW50NjRfdAkJCWZsbmxfcmVxdWVzdF9nZXRfZndtYXJrKHN0cnVjdCBmbG5sX3JlcXVlc3QgKik7CitleHRlcm4gdm9pZAkJCWZsbmxfcmVxdWVzdF9zZXRfdG9zKHN0cnVjdCBmbG5sX3JlcXVlc3QgKiwKKwkJCQkJCSAgICAgaW50KTsKK2V4dGVybiBpbnQJCQlmbG5sX3JlcXVlc3RfZ2V0X3RvcyhzdHJ1Y3QgZmxubF9yZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQJCQlmbG5sX3JlcXVlc3Rfc2V0X3Njb3BlKHN0cnVjdCBmbG5sX3JlcXVlc3QgKiwKKwkJCQkJCSAgICAgICBpbnQpOworZXh0ZXJuIGludAkJCWZsbmxfcmVxdWVzdF9nZXRfc2NvcGUoc3RydWN0IGZsbmxfcmVxdWVzdCAqKTsKK2V4dGVybiB2b2lkCQkJZmxubF9yZXF1ZXN0X3NldF90YWJsZShzdHJ1Y3QgZmxubF9yZXF1ZXN0ICosCisJCQkJCQkgICAgICAgaW50KTsKK2V4dGVybiBpbnQJCQlmbG5sX3JlcXVlc3RfZ2V0X3RhYmxlKHN0cnVjdCBmbG5sX3JlcXVlc3QgKik7CitleHRlcm4gaW50CQkJZmxubF9yZXF1ZXN0X3NldF9hZGRyKHN0cnVjdCBmbG5sX3JlcXVlc3QgKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJCWZsbmxfcmVxdWVzdF9nZXRfYWRkcihzdHJ1Y3QgZmxubF9yZXF1ZXN0ICopOworCitleHRlcm4gaW50CQkJZmxubF9yZXF1ZXN0X2NtcChzdHJ1Y3QgZmxubF9yZXF1ZXN0ICosCisJCQkJCQkgc3RydWN0IGZsbmxfcmVxdWVzdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay9nZW5sL2N0cmwuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2dlbmwvY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTYyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9nZW5sL2N0cmwuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogbmV0bGluay9nZW5sL2N0cmwuaAkJR2VuZXJpYyBOZXRsaW5rIENvbnRyb2xsZXIKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfR0VOTF9DVFJMX0hfCisjZGVmaW5lIE5FVExJTktfR0VOTF9DVFJMX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGdlbmxfZmFtaWx5OworCitleHRlcm4gaW50CQkJZ2VubF9jdHJsX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosCisJCQkJCQkgICAgICBzdHJ1Y3QgbmxfY2FjaGUgKiopOworZXh0ZXJuIHN0cnVjdCBnZW5sX2ZhbWlseSAqCWdlbmxfY3RybF9zZWFyY2goc3RydWN0IG5sX2NhY2hlICosIGludCk7CitleHRlcm4gc3RydWN0IGdlbmxfZmFtaWx5ICoJZ2VubF9jdHJsX3NlYXJjaF9ieV9uYW1lKHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJCSBjb25zdCBjaGFyICopOworZXh0ZXJuIGludAkJCWdlbmxfY3RybF9yZXNvbHZlKHN0cnVjdCBubF9zb2NrICosCisJCQkJCQkgIGNvbnN0IGNoYXIgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZ2VubC9mYW1pbHkuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2dlbmwvZmFtaWx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzMTllNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2dlbmwvZmFtaWx5LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIG5ldGxpbmsvZ2VubC9mYW1pbHkuaAlHZW5lcmljIE5ldGxpbmsgRmFtaWx5CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0dFTkxfRkFNSUxZX0hfCisjZGVmaW5lIE5FVExJTktfR0VOTF9GQU1JTFlfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvY2FjaGUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZ2VubF9mYW1pbHk7CisKK2V4dGVybiBzdHJ1Y3QgZ2VubF9mYW1pbHkgKglnZW5sX2ZhbWlseV9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkCQkJZ2VubF9mYW1pbHlfcHV0KHN0cnVjdCBnZW5sX2ZhbWlseSAqKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludAkJZ2VubF9mYW1pbHlfZ2V0X2lkKHN0cnVjdCBnZW5sX2ZhbWlseSAqKTsKK2V4dGVybiB2b2lkCQkJZ2VubF9mYW1pbHlfc2V0X2lkKHN0cnVjdCBnZW5sX2ZhbWlseSAqLAorCQkJCQkJICAgdW5zaWduZWQgaW50KTsKK2V4dGVybiBjaGFyICoJCQlnZW5sX2ZhbWlseV9nZXRfbmFtZShzdHJ1Y3QgZ2VubF9mYW1pbHkgKik7CitleHRlcm4gdm9pZAkJCWdlbmxfZmFtaWx5X3NldF9uYW1lKHN0cnVjdCBnZW5sX2ZhbWlseSAqLAorCQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB1aW50OF90CQkJZ2VubF9mYW1pbHlfZ2V0X3ZlcnNpb24oc3RydWN0IGdlbmxfZmFtaWx5ICopOworZXh0ZXJuIHZvaWQJCQlnZW5sX2ZhbWlseV9zZXRfdmVyc2lvbihzdHJ1Y3QgZ2VubF9mYW1pbHkgKiwKKwkJCQkJCQl1aW50OF90KTsKK2V4dGVybiB1aW50MzJfdAkJCWdlbmxfZmFtaWx5X2dldF9oZHJzaXplKHN0cnVjdCBnZW5sX2ZhbWlseSAqKTsKK2V4dGVybiB2b2lkCQkJZ2VubF9mYW1pbHlfc2V0X2hkcnNpemUoc3RydWN0IGdlbmxfZmFtaWx5ICosCisJCQkJCQkJdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CQkJZ2VubF9mYW1pbHlfZ2V0X21heGF0dHIoc3RydWN0IGdlbmxfZmFtaWx5ICopOworZXh0ZXJuIHZvaWQJCQlnZW5sX2ZhbWlseV9zZXRfbWF4YXR0cihzdHJ1Y3QgZ2VubF9mYW1pbHkgKiwKKwkJCQkJCQl1aW50MzJfdCk7CisKK2V4dGVybiBpbnQJCQlnZW5sX2ZhbWlseV9hZGRfb3Aoc3RydWN0IGdlbmxfZmFtaWx5ICosCisJCQkJCQkgICBpbnQsIGludCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZ2VubC9nZW5sLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9nZW5sL2dlbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMzNDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZ2VubC9nZW5sLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIG5ldGxpbmsvZ2VubC9nZW5sLmgJCUdlbmVyaWMgTmV0bGluaworICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19HRU5MX0hfCisjZGVmaW5lIE5FVExJTktfR0VOTF9IXworCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9tc2cuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2F0dHIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50CQlnZW5sX2Nvbm5lY3Qoc3RydWN0IG5sX3NvY2sgKik7CisKK2V4dGVybiBpbnQJCWdlbmxfc2VuZF9zaW1wbGUoc3RydWN0IG5sX3NvY2sgKiwgaW50LCBpbnQsCisJCQkJCSBpbnQsIGludCk7CisKK2V4dGVybiB2b2lkICoJCWdlbmxtc2dfcHV0KHN0cnVjdCBubF9tc2cgKiwgdWludDMyX3QsIHVpbnQzMl90LAorCQkJCSAgICBpbnQsIGludCwgaW50LCB1aW50OF90LCB1aW50OF90KTsKKworZXh0ZXJuIGludAkJZ2VubG1zZ192YWxpZF9oZHIoc3RydWN0IG5sbXNnaGRyICosIGludCk7CitleHRlcm4gaW50CQlnZW5sbXNnX3ZhbGlkYXRlKHN0cnVjdCBubG1zZ2hkciAqLCBpbnQsIGludCwKKwkJCQkJIHN0cnVjdCBubGFfcG9saWN5ICopOworZXh0ZXJuIGludAkJZ2VubG1zZ19wYXJzZShzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50LCBzdHJ1Y3QgbmxhdHRyICoqLAorCQkJCSAgICAgIGludCwgc3RydWN0IG5sYV9wb2xpY3kgKik7CitleHRlcm4gdm9pZCAqCQlnZW5sbXNnX2RhdGEoY29uc3Qgc3RydWN0IGdlbmxtc2doZHIgKik7CitleHRlcm4gaW50CQlnZW5sbXNnX2xlbihjb25zdCBzdHJ1Y3QgZ2VubG1zZ2hkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJZ2VubG1zZ19hdHRyZGF0YShjb25zdCBzdHJ1Y3QgZ2VubG1zZ2hkciAqLCBpbnQpOworZXh0ZXJuIGludAkJZ2VubG1zZ19hdHRybGVuKGNvbnN0IHN0cnVjdCBnZW5sbXNnaGRyICosIGludCk7CisKK2V4dGVybiBjaGFyICoJCWdlbmxfb3AybmFtZShpbnQsIGludCwgY2hhciAqLCBzaXplX3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2dlbmwvbW5ndC5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvZ2VubC9tbmd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwMjQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2dlbmwvbW5ndC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBuZXRsaW5rL2dlbmwvbW5ndC5oCQlHZW5lcmljIE5ldGxpbmsgTWFuYWdlbWVudAorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19HRU5MX01OR1RfSF8KKyNkZWZpbmUgTkVUTElOS19HRU5MX01OR1RfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvYXR0ci5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbGlzdC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBubF9jYWNoZV9vcHM7CisKK3N0cnVjdCBnZW5sX2luZm8KK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgKiAgICB3aG87CisJc3RydWN0IG5sbXNnaGRyICogICAgICAgbmxoOworCXN0cnVjdCBnZW5sbXNnaGRyICogICAgIGdlbmxoZHI7CisJdm9pZCAqICAgICAgICAgICAgICAgICAgdXNlcmhkcjsKKwlzdHJ1Y3QgbmxhdHRyICoqICAgICAgICBhdHRyczsKK307CisKKy8qKgorICogQGluZ3JvdXAgZ2VubF9tbmd0CisgKiBHZW5lcmljIE5ldGxpbmsgQ29tbWFuZAorICovCitzdHJ1Y3QgZ2VubF9jbWQKK3sKKwkvKiogVW5pcXVlIGNvbW1hbmQgaWRlbnRpZmllciAqLworCWludAkJCWNfaWQ7CisKKwkvKiogTmFtZS9kZXNjcmlwdGlvbiBvZiBjb21tYW5kICovCisJY2hhciAqCQkJY19uYW1lOworCisJLyoqCisJICogTWF4aW11bSBhdHRyaWJ1dGUgaWRlbnRpZmllciwgbXVzdCBiZSBwcm92aWRlZCBpZgorCSAqIGEgbWVzc2FnZSBwYXJzZXIgaXMgYXZhaWxhYmxlLgorCSAqLworCWludAkJCWNfbWF4YXR0cjsKKworCWludAkJICAgICAgKCpjX21zZ19wYXJzZXIpKHN0cnVjdCBubF9jYWNoZV9vcHMgKiwKKwkJCQkJICAgICAgc3RydWN0IGdlbmxfY21kICosCisJCQkJCSAgICAgIHN0cnVjdCBnZW5sX2luZm8gKiwgdm9pZCAqKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSB2YWxpZGF0aW9uIHBvbGljeSAob3B0aW9uYWwpCisJICovCisJc3RydWN0IG5sYV9wb2xpY3kgKgljX2F0dHJfcG9saWN5OworfTsKKworLyoqCisgKiBAaW5ncm91cCBnZW5sX21uZ3QKKyAqIEdlbmVyaWMgTmV0bGluayBPcGVyYXRpb25zCisgKi8KK3N0cnVjdCBnZW5sX29wcworeworCWludAkJCW9fZmFtaWx5OworCWludAkJCW9faWQ7CisJY2hhciAqCQkJb19uYW1lOworCXN0cnVjdCBubF9jYWNoZV9vcHMgKglvX2NhY2hlX29wczsKKwlzdHJ1Y3QgZ2VubF9jbWQJKglvX2NtZHM7CisJaW50CQkJb19uY21kczsKKworCS8qIGxpbmtlZCBsaXN0IG9mIGFsbCBnZW5sIGNhY2hlIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgbmxfbGlzdF9oZWFkCW9fbGlzdDsKK307CisKKworZXh0ZXJuIGludAkJZ2VubF9yZWdpc3RlcihzdHJ1Y3QgbmxfY2FjaGVfb3BzICopOworZXh0ZXJuIHZvaWQJCWdlbmxfdW5yZWdpc3RlcihzdHJ1Y3QgbmxfY2FjaGVfb3BzICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL2hhbmRsZXJzLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9oYW5kbGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzNmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9oYW5kbGVycy5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogbmV0bGluay9oYW5kbGVycy5jCWRlZmF1bHQgbmV0bGluayBtZXNzYWdlIGhhbmRsZXJzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0hBTkRMRVJTX0hfCisjZGVmaW5lIE5FVExJTktfSEFORExFUlNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLWNvbXBhdC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay1rZXJuZWwuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgbmxfY2I7CitzdHJ1Y3Qgbmxfc29jazsKK3N0cnVjdCBubF9tc2c7CitzdHJ1Y3QgdWNyZWQ7CisKKy8qKgorICogQG5hbWUgQ2FsbGJhY2sgVHlwZWRlZnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBubF9yZWN2bXNncygpIGNhbGxiYWNrIGZvciBtZXNzYWdlIHByb2Nlc3NpbmcgY3VzdG9taXphdGlvbgorICogQGluZ3JvdXAgY2IKKyAqIEBhcmcgbXNnCQluZXRsaW5rIG1lc3NhZ2UgYmVpbmcgcHJvY2Vzc2VkCisgKiBAYXJnIGFyZwkJYXJndW1lbnQgcGFzc3dkIG9uIHRocm91Z2ggY2FsbGVyCisgKi8KK3R5cGVkZWYgaW50ICgqbmxfcmVjdm1zZ19tc2dfY2JfdCkoc3RydWN0IG5sX21zZyAqbXNnLCB2b2lkICphcmcpOworCisvKioKKyAqIG5sX3JlY3Ztc2dzKCkgY2FsbGJhY2sgZm9yIGVycm9yIG1lc3NhZ2UgcHJvY2Vzc2luZyBjdXN0b21pemF0aW9uCisgKiBAaW5ncm91cCBjYgorICogQGFyZyBubGEJCW5ldGxpbmsgYWRkcmVzcyBvZiB0aGUgcGVlcgorICogQGFyZyBubGVycgkJbmV0bGluayBlcnJvciBtZXNzYWdlIGJlaW5nIHByb2Nlc3NlZAorICogQGFyZyBhcmcJCWFyZ3VtZW50IHBhc3NlZCBvbiB0aHJvdWdoIGNhbGxlcgorICovCit0eXBlZGVmIGludCAoKm5sX3JlY3Ztc2dfZXJyX2NiX3QpKHN0cnVjdCBzb2NrYWRkcl9ubCAqbmxhLAorCQkJCSAgIHN0cnVjdCBubG1zZ2VyciAqbmxlcnIsIHZvaWQgKmFyZyk7CisKKy8qKiBAfSAqLworCisvKioKKyAqIENhbGxiYWNrIGFjdGlvbnMKKyAqIEBpbmdyb3VwIGNiCisgKi8KK2VudW0gbmxfY2JfYWN0aW9uIHsKKwkvKiogUHJvY2VlZCB3aXRoIHdhdGhldmVyIHdvdWxkIGNvbWUgbmV4dCAqLworCU5MX09LLAorCS8qKiBTa2lwIHRoaXMgbWVzc2FnZSAqLworCU5MX1NLSVAsCisJLyoqIFN0b3AgcGFyc2luZyBhbHRvZ2V0aGVyIGFuZCBkaXNjYXJkIHJlbWFpbmluZyBtZXNzYWdlcyAqLworCU5MX1NUT1AsCit9OworCisvKioKKyAqIENhbGxiYWNrIGtpbmRzCisgKiBAaW5ncm91cCBjYgorICovCitlbnVtIG5sX2NiX2tpbmQgeworCS8qKiBEZWZhdWx0IGhhbmRsZXJzIChxdWlldCkgKi8KKwlOTF9DQl9ERUZBVUxULAorCS8qKiBWZXJib3NlIGRlZmF1bHQgaGFuZGxlcnMgKGVycm9yIG1lc3NhZ2VzIHByaW50ZWQpICovCisJTkxfQ0JfVkVSQk9TRSwKKwkvKiogRGVidWcgaGFuZGxlcnMgZm9yIGRlYnVnZ2luZyAqLworCU5MX0NCX0RFQlVHLAorCS8qKiBDdXN0b21pemVkIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCisJTkxfQ0JfQ1VTVE9NLAorCV9fTkxfQ0JfS0lORF9NQVgsCit9OworCisjZGVmaW5lIE5MX0NCX0tJTkRfTUFYIChfX05MX0NCX0tJTkRfTUFYIC0gMSkKKworLyoqCisgKiBDYWxsYmFjayB0eXBlcworICogQGluZ3JvdXAgY2IKKyAqLworZW51bSBubF9jYl90eXBlIHsKKwkvKiogTWVzc2FnZSBpcyB2YWxpZCAqLworCU5MX0NCX1ZBTElELAorCS8qKiBMYXN0IG1lc3NhZ2UgaW4gYSBzZXJpZXMgb2YgbXVsdGkgcGFydCBtZXNzYWdlcyByZWNlaXZlZCAqLworCU5MX0NCX0ZJTklTSCwKKwkvKiogUmVwb3J0IHJlY2VpdmVkIHRoYXQgZGF0YSB3YXMgbG9zdCAqLworCU5MX0NCX09WRVJSVU4sCisJLyoqIE1lc3NhZ2Ugd2FudHMgdG8gYmUgc2tpcHBlZCAqLworCU5MX0NCX1NLSVBQRUQsCisJLyoqIE1lc3NhZ2UgaXMgYW4gYWNrbm93bGVkZ2UgKi8KKwlOTF9DQl9BQ0ssCisJLyoqIENhbGxlZCBmb3IgZXZlcnkgbWVzc2FnZSByZWNlaXZlZCAqLworCU5MX0NCX01TR19JTiwKKwkvKiogQ2FsbGVkIGZvciBldmVyeSBtZXNzYWdlIHNlbnQgb3V0IGV4Y2VwdCBmb3Igbmxfc2VuZHRvKCkgKi8KKwlOTF9DQl9NU0dfT1VULAorCS8qKiBNZXNzYWdlIGlzIG1hbGZvcm1lZCBhbmQgaW52YWxpZCAqLworCU5MX0NCX0lOVkFMSUQsCisJLyoqIENhbGxlZCBpbnN0ZWFkIG9mIGludGVybmFsIHNlcXVlbmNlIG51bWJlciBjaGVja2luZyAqLworCU5MX0NCX1NFUV9DSEVDSywKKwkvKiogU2VuZGluZyBvZiBhbiBhY2tub3dsZWRnZSBtZXNzYWdlIGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCU5MX0NCX1NFTkRfQUNLLAorCV9fTkxfQ0JfVFlQRV9NQVgsCit9OworCisjZGVmaW5lIE5MX0NCX1RZUEVfTUFYIChfX05MX0NCX1RZUEVfTUFYIC0gMSkKKworZXh0ZXJuIHN0cnVjdCBubF9jYiAqCW5sX2NiX2FsbG9jKGVudW0gbmxfY2Jfa2luZCk7CitleHRlcm4gc3RydWN0IG5sX2NiICoJbmxfY2JfY2xvbmUoc3RydWN0IG5sX2NiICopOworZXh0ZXJuIHN0cnVjdCBubF9jYiAqCW5sX2NiX2dldChzdHJ1Y3QgbmxfY2IgKik7CitleHRlcm4gdm9pZAkJbmxfY2JfcHV0KHN0cnVjdCBubF9jYiAqKTsKKworZXh0ZXJuIGludCAgbmxfY2Jfc2V0KHN0cnVjdCBubF9jYiAqLCBlbnVtIG5sX2NiX3R5cGUsIGVudW0gbmxfY2Jfa2luZCwKKwkJICAgICAgbmxfcmVjdm1zZ19tc2dfY2JfdCwgdm9pZCAqKTsKK2V4dGVybiBpbnQgIG5sX2NiX3NldF9hbGwoc3RydWN0IG5sX2NiICosIGVudW0gbmxfY2Jfa2luZCwKKwkJCSAgbmxfcmVjdm1zZ19tc2dfY2JfdCwgdm9pZCAqKTsKK2V4dGVybiBpbnQgIG5sX2NiX2VycihzdHJ1Y3QgbmxfY2IgKiwgZW51bSBubF9jYl9raW5kLCBubF9yZWN2bXNnX2Vycl9jYl90LAorCQkgICAgICB2b2lkICopOworCitleHRlcm4gdm9pZCBubF9jYl9vdmVyd3JpdGVfcmVjdm1zZ3Moc3RydWN0IG5sX2NiICosCisJCQkJICAgICBpbnQgKCpmdW5jKShzdHJ1Y3Qgbmxfc29jayAqLAorCQkJCQkJIHN0cnVjdCBubF9jYiAqKSk7CitleHRlcm4gdm9pZCBubF9jYl9vdmVyd3JpdGVfcmVjdihzdHJ1Y3QgbmxfY2IgKiwKKwkJCQkgaW50ICgqZnVuYykoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwKKwkJCQkJICAgICB1bnNpZ25lZCBjaGFyICoqLAorCQkJCQkgICAgIHN0cnVjdCB1Y3JlZCAqKikpOworZXh0ZXJuIHZvaWQgbmxfY2Jfb3ZlcndyaXRlX3NlbmQoc3RydWN0IG5sX2NiICosCisJCQkJIGludCAoKmZ1bmMpKHN0cnVjdCBubF9zb2NrICosCisJCQkJCSAgICAgc3RydWN0IG5sX21zZyAqKSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbGlzdC5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzEyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9saXN0LmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIG5ldGxpbmsvbGlzdC5oCU5ldGxpbmsgTGlzdCBVdGlsaXRpZXMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfTElTVF9IXworI2RlZmluZSBORVRMSU5LX0xJU1RfSF8KKworc3RydWN0IG5sX2xpc3RfaGVhZAoreworCXN0cnVjdCBubF9saXN0X2hlYWQgKgluZXh0OworCXN0cnVjdCBubF9saXN0X2hlYWQgKglwcmV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIE5MX0lOSVRfTElTVF9IRUFEKHN0cnVjdCBubF9saXN0X2hlYWQgKmxpc3QpCit7CisJbGlzdC0+bmV4dCA9IGxpc3Q7CisJbGlzdC0+cHJldiA9IGxpc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX25sX2xpc3RfYWRkKHN0cnVjdCBubF9saXN0X2hlYWQgKm9iaiwKKwkJCQkgc3RydWN0IG5sX2xpc3RfaGVhZCAqcHJldiwKKwkJCQkgc3RydWN0IG5sX2xpc3RfaGVhZCAqbmV4dCkKK3sKKwlwcmV2LT5uZXh0ID0gb2JqOworCW9iai0+cHJldiA9IHByZXY7CisJbmV4dC0+cHJldiA9IG9iajsKKwlvYmotPm5leHQgPSBuZXh0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmxfbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbmxfbGlzdF9oZWFkICpvYmosCisJCQkJICAgIHN0cnVjdCBubF9saXN0X2hlYWQgKmhlYWQpCit7CisJX19ubF9saXN0X2FkZChvYmosIGhlYWQtPnByZXYsIGhlYWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmxfbGlzdF9hZGRfaGVhZChzdHJ1Y3QgbmxfbGlzdF9oZWFkICpvYmosCisJCQkJICAgIHN0cnVjdCBubF9saXN0X2hlYWQgKmhlYWQpCit7CisJX19ubF9saXN0X2FkZChvYmosIGhlYWQsIGhlYWQtPm5leHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmxfbGlzdF9kZWwoc3RydWN0IG5sX2xpc3RfaGVhZCAqb2JqKQoreworCW9iai0+bmV4dC0+cHJldiA9IG9iai0+cHJldjsKKwlvYmotPnByZXYtPm5leHQgPSBvYmotPm5leHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5sX2xpc3RfZW1wdHkoc3RydWN0IG5sX2xpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisjZGVmaW5lIG5sX2NvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCisgICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSAoKHNpemVfdCkgJigodHlwZSAqKTApLT5tZW1iZXIpKTt9KQorCisjZGVmaW5lIG5sX2xpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwlubF9jb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisKKyNkZWZpbmUgbmxfbGlzdF9hdF90YWlsKHBvcywgaGVhZCwgbWVtYmVyKSBcCisJKChwb3MpLT5tZW1iZXIubmV4dCA9PSAoaGVhZCkpCisKKyNkZWZpbmUgbmxfbGlzdF9hdF9oZWFkKHBvcywgaGVhZCwgbWVtYmVyKSBcCisJKChwb3MpLT5tZW1iZXIucHJldiA9PSAoaGVhZCkpCisKKyNkZWZpbmUgTkxfTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbmxfbGlzdF9oZWFkIG5hbWUgPSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIG5sX2xpc3RfZmlyc3RfZW50cnkoaGVhZCwgdHlwZSwgbWVtYmVyKQkJCVwKKwlubF9saXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZSwgbWVtYmVyKQorCisjZGVmaW5lIG5sX2xpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IG5sX2xpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICYocG9zKS0+bWVtYmVyICE9IChoZWFkKTsgCVwKKwkgICAgIChwb3MpID0gbmxfbGlzdF9lbnRyeSgocG9zKS0+bWVtYmVyLm5leHQsIHR5cGVvZigqKHBvcykpLCBtZW1iZXIpKQorCisjZGVmaW5lIG5sX2xpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sIGhlYWQsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBubF9saXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBubF9saXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJihwb3MpLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IG4sIG4gPSBubF9saXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQorCisjZGVmaW5lIG5sX2luaXRfbGlzdF9oZWFkKGhlYWQpIFwKKwlkbyB7IChoZWFkKS0+bmV4dCA9IChoZWFkKTsgKGhlYWQpLT5wcmV2ID0gKGhlYWQpOyB9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL21zZy5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliZTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL21zZy5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogbmV0bGluay9tc2cuYwkJTmV0bGluayBNZXNzYWdlcyBJbnRlcmZhY2UKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfTVNHX0hfCisjZGVmaW5lIE5FVExJTktfTVNHX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL29iamVjdC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvYXR0ci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTkxfRE9OVFBBRAkwCisKKy8qKgorICogQGluZ3JvdXAgbXNnCisgKiBAYnJpZWYKKyAqIFdpbGwgY2F1c2UgdGhlIG5ldGxpbmsgcGlkIHRvIGJlIHNldCB0byB0aGUgcGlkIGFzc2lnbmVkIHRvCisgKiB0aGUgbmV0bGluayBoYW5kbGUgKHNvY2tldCkganVzdCBiZWZvcmUgc2VuZGluZyB0aGUgbWVzc2FnZSBvZmYuCisgKiBAbm90ZSBSZXF1aXJlcyB0aGUgdXNlIG9mIG5sX3NlbmRfYXV0b19jb21wbGV0ZSgpIQorICovCisjZGVmaW5lIE5MX0FVVE9fUElECTAKKworLyoqCisgKiBAaW5ncm91cCBtc2cKKyAqIEBicmllZgorICogTWF5IGJlIHVzZWQgdG8gcmVmZXIgdG8gYSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggc2hvdWxkIGJlCisgKiBhdXRvbWF0aWNhbGx5IHNldCBqdXN0IGJlZm9yZSBzZW5kaW5nIHRoZSBtZXNzYWdlIG9mZi4KKyAqIEBub3RlIFJlcXVpcmVzIHRoZSB1c2Ugb2Ygbmxfc2VuZF9hdXRvX2NvbXBsZXRlKCkhCisgKi8KKyNkZWZpbmUgTkxfQVVUT19TRVEJMAorCitzdHJ1Y3QgbmxfbXNnOworc3RydWN0IG5sX3RyZWU7CitzdHJ1Y3QgdWNyZWQ7CisKKy8qIHNpemUgY2FsY3VsYXRpb25zICovCitleHRlcm4gaW50CQkgIG5sbXNnX21zZ19zaXplKGludCk7CitleHRlcm4gaW50CQkgIG5sbXNnX3RvdGFsX3NpemUoaW50KTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfcGFkbGVuKGludCk7CisKKy8qIHBheWxvYWQgYWNjZXNzICovCitleHRlcm4gdm9pZCAqCQkgIG5sbXNnX2RhdGEoY29uc3Qgc3RydWN0IG5sbXNnaGRyICopOworZXh0ZXJuIGludAkJICBubG1zZ19kYXRhbGVuKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqKTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfbGVuKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqKTsKK2V4dGVybiB2b2lkICoJCSAgbmxtc2dfdGFpbChjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKik7CisKKy8qIGF0dHJpYnV0ZSBhY2Nlc3MgKi8KK2V4dGVybiBzdHJ1Y3QgbmxhdHRyICoJICBubG1zZ19hdHRyZGF0YShjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50KTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfYXR0cmxlbihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50KTsKKworLyogbWVzc2FnZSBwYXJzaW5nICovCitleHRlcm4gaW50CQkgIG5sbXNnX3ZhbGlkX2hkcihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50KTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfb2soY29uc3Qgc3RydWN0IG5sbXNnaGRyICosIGludCk7CitleHRlcm4gc3RydWN0IG5sbXNnaGRyICogIG5sbXNnX25leHQoc3RydWN0IG5sbXNnaGRyICosIGludCAqKTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfcGFyc2Uoc3RydWN0IG5sbXNnaGRyICosIGludCwgc3RydWN0IG5sYXR0ciAqKiwKKwkJCQkgICAgICBpbnQsIHN0cnVjdCBubGFfcG9saWN5ICopOworZXh0ZXJuIHN0cnVjdCBubGF0dHIgKgkgIG5sbXNnX2ZpbmRfYXR0cihzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludAkJICBubG1zZ192YWxpZGF0ZShzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50LCBpbnQsCisJCQkJCSBzdHJ1Y3QgbmxhX3BvbGljeSAqKTsKKworZXh0ZXJuIHN0cnVjdCBubF9tc2cgKgkgIG5sbXNnX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBubF9tc2cgKgkgIG5sbXNnX2FsbG9jX3NpemUoc2l6ZV90KTsKK2V4dGVybiBzdHJ1Y3QgbmxfbXNnICoJICBubG1zZ19hbGxvY19zaW1wbGUoaW50LCBpbnQpOworZXh0ZXJuIHZvaWQJCSAgbmxtc2dfc2V0X2RlZmF1bHRfc2l6ZShzaXplX3QpOworZXh0ZXJuIHN0cnVjdCBubF9tc2cgKgkgIG5sbXNnX2luaGVyaXQoc3RydWN0IG5sbXNnaGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9tc2cgKgkgIG5sbXNnX2NvbnZlcnQoc3RydWN0IG5sbXNnaGRyICopOworZXh0ZXJuIHZvaWQgKgkJICBubG1zZ19yZXNlcnZlKHN0cnVjdCBubF9tc2cgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIGludAkJICBubG1zZ19hcHBlbmQoc3RydWN0IG5sX21zZyAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQJCSAgbmxtc2dfZXhwYW5kKHN0cnVjdCBubF9tc2cgKiwgc2l6ZV90KTsKKworZXh0ZXJuIHN0cnVjdCBubG1zZ2hkciAqICBubG1zZ19wdXQoc3RydWN0IG5sX21zZyAqLCB1aW50MzJfdCwgdWludDMyX3QsCisJCQkJICAgIGludCwgaW50LCBpbnQpOworZXh0ZXJuIHN0cnVjdCBubG1zZ2hkciAqICBubG1zZ19oZHIoc3RydWN0IG5sX21zZyAqKTsKK2V4dGVybiB2b2lkCQkgIG5sbXNnX2dldChzdHJ1Y3QgbmxfbXNnICopOworZXh0ZXJuIHZvaWQJCSAgbmxtc2dfZnJlZShzdHJ1Y3QgbmxfbXNnICopOworCisvKiBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uICovCitleHRlcm4gdm9pZAkJICBubG1zZ19zZXRfcHJvdG8oc3RydWN0IG5sX21zZyAqLCBpbnQpOworZXh0ZXJuIGludAkJICBubG1zZ19nZXRfcHJvdG8oc3RydWN0IG5sX21zZyAqKTsKK2V4dGVybiBzaXplX3QJCSAgbmxtc2dfZ2V0X21heF9zaXplKHN0cnVjdCBubF9tc2cgKik7CitleHRlcm4gdm9pZAkJICBubG1zZ19zZXRfc3JjKHN0cnVjdCBubF9tc2cgKiwgc3RydWN0IHNvY2thZGRyX25sICopOworZXh0ZXJuIHN0cnVjdCBzb2NrYWRkcl9ubCAqbmxtc2dfZ2V0X3NyYyhzdHJ1Y3QgbmxfbXNnICopOworZXh0ZXJuIHZvaWQJCSAgbmxtc2dfc2V0X2RzdChzdHJ1Y3QgbmxfbXNnICosIHN0cnVjdCBzb2NrYWRkcl9ubCAqKTsKK2V4dGVybiBzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sbXNnX2dldF9kc3Qoc3RydWN0IG5sX21zZyAqKTsKK2V4dGVybiB2b2lkCQkgIG5sbXNnX3NldF9jcmVkcyhzdHJ1Y3QgbmxfbXNnICosIHN0cnVjdCB1Y3JlZCAqKTsKK2V4dGVybiBzdHJ1Y3QgdWNyZWQgKgkgIG5sbXNnX2dldF9jcmVkcyhzdHJ1Y3QgbmxfbXNnICopOworCitleHRlcm4gY2hhciAqCQkgIG5sX25sbXNndHlwZTJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CQkgIG5sX3N0cjJubG1zZ3R5cGUoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGNoYXIgKgkJICBubF9ubG1zZ19mbGFnczJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CisKK2V4dGVybiBpbnQJCSAgbmxfbXNnX3BhcnNlKHN0cnVjdCBubF9tc2cgKiwKKwkJCQkgICAgICAgdm9pZCAoKmNiKShzdHJ1Y3Qgbmxfb2JqZWN0ICosIHZvaWQgKiksCisJCQkJICAgICAgIHZvaWQgKik7CisKK2V4dGVybiB2b2lkCQlubF9tc2dfZHVtcChzdHJ1Y3QgbmxfbXNnICosIEZJTEUgKik7CisKKy8qKgorICogQG5hbWUgSXRlcmF0b3JzCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgbXNnCisgKiBJdGVyYXRlIG92ZXIgYSBzdHJlYW0gb2YgYXR0cmlidXRlcyBpbiBhIG1lc3NhZ2UKKyAqIEBhcmcgcG9zCWxvb3AgY291bnRlciwgc2V0IHRvIGN1cnJlbnQgYXR0cmlidXRlCisgKiBAYXJnIG5saAluZXRsaW5rIG1lc3NhZ2UgaGVhZGVyCisgKiBAYXJnIGhkcmxlbglsZW5ndGggb2YgZmFtaWx5IGhlYWRlcgorICogQGFyZyByZW0JaW5pdGlhbGl6ZWQgdG8gbGVuLCBob2xkcyBieXRlcyBjdXJyZW50bHkgcmVtYWluaW5nIGluIHN0cmVhbQorICovCisjZGVmaW5lIG5sbXNnX2Zvcl9lYWNoX2F0dHIocG9zLCBubGgsIGhkcmxlbiwgcmVtKSBcCisJbmxhX2Zvcl9lYWNoX2F0dHIocG9zLCBubG1zZ19hdHRyZGF0YShubGgsIGhkcmxlbiksIFwKKwkJCSAgbmxtc2dfYXR0cmxlbihubGgsIGhkcmxlbiksIHJlbSkKKworLyoqCisgKiBJdGVyYXRlIG92ZXIgYSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAqIEBhcmcgcG9zCWxvb3AgY291bnRlciwgc2V0IHRvIGN1cnJlbnQgbWVzc2FnZQorICogQGFyZyBoZWFkCWhlYWQgb2YgbWVzc2FnZSBzdHJlYW0KKyAqIEBhcmcgbGVuCWxlbmd0aCBvZiBtZXNzYWdlIHN0cmVhbQorICogQGFyZyByZW0JaW5pdGlhbGl6ZWQgdG8gbGVuLCBob2xkcyBieXRlcyBjdXJyZW50bHkgcmVtYWluaW5nIGluIHN0cmVhbQorICovCisjZGVmaW5lIG5sbXNnX2Zvcl9lYWNoX21zZyhwb3MsIGhlYWQsIGxlbiwgcmVtKSBcCisJZm9yIChwb3MgPSBoZWFkLCByZW0gPSBsZW47IFwKKwkgICAgIG5sbXNnX29rKHBvcywgcmVtKTsgXAorCSAgICAgcG9zID0gbmxtc2dfbmV4dChwb3MsICYocmVtKSkpCisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGZpbHRlci9jdC5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbmV0ZmlsdGVyL2N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0MDJiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGZpbHRlci9jdC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogbmV0bGluay9uZXRmaWx0ZXIvY3QuaAlDb25udHJhY2sKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBQaGlsaXAgQ3JhaWcgPHBoaWxpcGNAc25hcGdlYXIuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3IFNlY3VyZSBDb21wdXRpbmcgQ29ycG9yYXRpb24KKyAqLworCisjaWZuZGVmIE5FVExJTktfQ1RfSF8KKyNkZWZpbmUgTkVUTElOS19DVF9IXworCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9jYWNoZS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IG5mbmxfY3Q7CisKK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0X29wcyBjdF9vYmpfb3BzOworCitleHRlcm4gc3RydWN0IG5mbmxfY3QgKgluZm5sX2N0X2FsbG9jKHZvaWQpOworZXh0ZXJuIGludAluZm5sX2N0X2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9jYWNoZSAqKik7CisKK2V4dGVybiBpbnQJbmZubG1zZ19jdF9ncm91cChzdHJ1Y3Qgbmxtc2doZHIgKik7CitleHRlcm4gaW50CW5mbmxtc2dfY3RfcGFyc2Uoc3RydWN0IG5sbXNnaGRyICosIHN0cnVjdCBuZm5sX2N0ICoqKTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9nZXQoc3RydWN0IG5mbmxfY3QgKik7CitleHRlcm4gdm9pZAluZm5sX2N0X3B1dChzdHJ1Y3QgbmZubF9jdCAqKTsKKworZXh0ZXJuIGludAluZm5sX2N0X2R1bXBfcmVxdWVzdChzdHJ1Y3Qgbmxfc29jayAqKTsKKworZXh0ZXJuIGludAluZm5sX2N0X2J1aWxkX2FkZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCwKKwkJCQkJICBzdHJ1Y3QgbmxfbXNnICoqKTsKK2V4dGVybiBpbnQJbmZubF9jdF9hZGQoc3RydWN0IG5sX3NvY2sgKiwgY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIGludAluZm5sX2N0X2J1aWxkX2RlbGV0ZV9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCwKKwkJCQkJICAgICBzdHJ1Y3QgbmxfbXNnICoqKTsKK2V4dGVybiBpbnQJbmZubF9jdF9kZWxldGUoc3RydWN0IG5sX3NvY2sgKiwgY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIGludAluZm5sX2N0X2J1aWxkX3F1ZXJ5X3JlcXVlc3QoY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50LAorCQkJCQkgICAgc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CW5mbmxfY3RfcXVlcnkoc3RydWN0IG5sX3NvY2sgKiwgY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfZmFtaWx5KHN0cnVjdCBuZm5sX2N0ICosIHVpbnQ4X3QpOworZXh0ZXJuIHVpbnQ4X3QJbmZubF9jdF9nZXRfZmFtaWx5KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICopOworCitleHRlcm4gdm9pZAluZm5sX2N0X3NldF9wcm90byhzdHJ1Y3QgbmZubF9jdCAqLCB1aW50OF90KTsKK2V4dGVybiBpbnQJbmZubF9jdF90ZXN0X3Byb3RvKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICopOworZXh0ZXJuIHVpbnQ4X3QJbmZubF9jdF9nZXRfcHJvdG8oY29uc3Qgc3RydWN0IG5mbmxfY3QgKik7CisKK2V4dGVybiB2b2lkCW5mbmxfY3Rfc2V0X3RjcF9zdGF0ZShzdHJ1Y3QgbmZubF9jdCAqLCB1aW50OF90KTsKK2V4dGVybiBpbnQJbmZubF9jdF90ZXN0X3RjcF9zdGF0ZShjb25zdCBzdHJ1Y3QgbmZubF9jdCAqKTsKK2V4dGVybiB1aW50OF90CW5mbmxfY3RfZ2V0X3RjcF9zdGF0ZShjb25zdCBzdHJ1Y3QgbmZubF9jdCAqKTsKK2V4dGVybiBjaGFyICoJbmZubF9jdF90Y3Bfc3RhdGUyc3RyKHVpbnQ4X3QsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJbmZubF9jdF9zdHIydGNwX3N0YXRlKGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gdm9pZAluZm5sX2N0X3NldF9zdGF0dXMoc3RydWN0IG5mbmxfY3QgKiwgdWludDMyX3QpOworZXh0ZXJuIHZvaWQJbmZubF9jdF91bnNldF9zdGF0dXMoc3RydWN0IG5mbmxfY3QgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CW5mbmxfY3RfZ2V0X3N0YXR1cyhjb25zdCBzdHJ1Y3QgbmZubF9jdCAqKTsKK2V4dGVybiBjaGFyICoJbmZubF9jdF9zdGF0dXMyc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAluZm5sX2N0X3N0cjJzdGF0dXMoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfdGltZW91dChzdHJ1Y3QgbmZubF9jdCAqLCB1aW50MzJfdCk7CitleHRlcm4gaW50CW5mbmxfY3RfdGVzdF90aW1lb3V0KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICopOworZXh0ZXJuIHVpbnQzMl90CW5mbmxfY3RfZ2V0X3RpbWVvdXQoY29uc3Qgc3RydWN0IG5mbmxfY3QgKik7CisKK2V4dGVybiB2b2lkCW5mbmxfY3Rfc2V0X21hcmsoc3RydWN0IG5mbmxfY3QgKiwgdWludDMyX3QpOworZXh0ZXJuIGludAluZm5sX2N0X3Rlc3RfbWFyayhjb25zdCBzdHJ1Y3QgbmZubF9jdCAqKTsKK2V4dGVybiB1aW50MzJfdAluZm5sX2N0X2dldF9tYXJrKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICopOworCitleHRlcm4gdm9pZAluZm5sX2N0X3NldF91c2Uoc3RydWN0IG5mbmxfY3QgKiwgdWludDMyX3QpOworZXh0ZXJuIGludAluZm5sX2N0X3Rlc3RfdXNlKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICopOworZXh0ZXJuIHVpbnQzMl90CW5mbmxfY3RfZ2V0X3VzZShjb25zdCBzdHJ1Y3QgbmZubF9jdCAqKTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfaWQoc3RydWN0IG5mbmxfY3QgKiwgdWludDMyX3QpOworZXh0ZXJuIGludAluZm5sX2N0X3Rlc3RfaWQoY29uc3Qgc3RydWN0IG5mbmxfY3QgKik7CitleHRlcm4gdWludDMyX3QJbmZubF9jdF9nZXRfaWQoY29uc3Qgc3RydWN0IG5mbmxfY3QgKik7CisKK2V4dGVybiBpbnQJbmZubF9jdF9zZXRfc3JjKHN0cnVjdCBuZm5sX2N0ICosIGludCwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKgluZm5sX2N0X2dldF9zcmMoY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIGludAluZm5sX2N0X3NldF9kc3Qoc3RydWN0IG5mbmxfY3QgKiwgaW50LCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqCW5mbmxfY3RfZ2V0X2RzdChjb25zdCBzdHJ1Y3QgbmZubF9jdCAqLCBpbnQpOworCitleHRlcm4gdm9pZAluZm5sX2N0X3NldF9zcmNfcG9ydChzdHJ1Y3QgbmZubF9jdCAqLCBpbnQsIHVpbnQxNl90KTsKK2V4dGVybiBpbnQJbmZubF9jdF90ZXN0X3NyY19wb3J0KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CitleHRlcm4gdWludDE2X3QJbmZubF9jdF9nZXRfc3JjX3BvcnQoY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfZHN0X3BvcnQoc3RydWN0IG5mbmxfY3QgKiwgaW50LCB1aW50MTZfdCk7CitleHRlcm4gaW50CW5mbmxfY3RfdGVzdF9kc3RfcG9ydChjb25zdCBzdHJ1Y3QgbmZubF9jdCAqLCBpbnQpOworZXh0ZXJuIHVpbnQxNl90CW5mbmxfY3RfZ2V0X2RzdF9wb3J0KGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CisKK2V4dGVybiB2b2lkCW5mbmxfY3Rfc2V0X2ljbXBfaWQoc3RydWN0IG5mbmxfY3QgKiwgaW50LCB1aW50MTZfdCk7CitleHRlcm4gaW50CW5mbmxfY3RfdGVzdF9pY21wX2lkKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CitleHRlcm4gdWludDE2X3QJbmZubF9jdF9nZXRfaWNtcF9pZChjb25zdCBzdHJ1Y3QgbmZubF9jdCAqLCBpbnQpOworCitleHRlcm4gdm9pZAluZm5sX2N0X3NldF9pY21wX3R5cGUoc3RydWN0IG5mbmxfY3QgKiwgaW50LCB1aW50OF90KTsKK2V4dGVybiBpbnQJbmZubF9jdF90ZXN0X2ljbXBfdHlwZShjb25zdCBzdHJ1Y3QgbmZubF9jdCAqLCBpbnQpOworZXh0ZXJuIHVpbnQ4X3QJbmZubF9jdF9nZXRfaWNtcF90eXBlKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CisKK2V4dGVybiB2b2lkCW5mbmxfY3Rfc2V0X2ljbXBfY29kZShzdHJ1Y3QgbmZubF9jdCAqLCBpbnQsIHVpbnQ4X3QpOworZXh0ZXJuIGludAluZm5sX2N0X3Rlc3RfaWNtcF9jb2RlKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CitleHRlcm4gdWludDhfdAluZm5sX2N0X2dldF9pY21wX2NvZGUoY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfcGFja2V0cyhzdHJ1Y3QgbmZubF9jdCAqLCBpbnQsIHVpbnQ2NF90KTsKK2V4dGVybiBpbnQJbmZubF9jdF90ZXN0X3BhY2tldHMoY29uc3Qgc3RydWN0IG5mbmxfY3QgKiwgaW50KTsKK2V4dGVybiB1aW50NjRfdAluZm5sX2N0X2dldF9wYWNrZXRzKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosaW50KTsKKworZXh0ZXJuIHZvaWQJbmZubF9jdF9zZXRfYnl0ZXMoc3RydWN0IG5mbmxfY3QgKiwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gaW50CW5mbmxfY3RfdGVzdF9ieXRlcyhjb25zdCBzdHJ1Y3QgbmZubF9jdCAqLCBpbnQpOworZXh0ZXJuIHVpbnQ2NF90CW5mbmxfY3RfZ2V0X2J5dGVzKGNvbnN0IHN0cnVjdCBuZm5sX2N0ICosIGludCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbmV0bGluay1jb21wYXQuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGxpbmstY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlYzlmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGxpbmstY29tcGF0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIG5ldGxpbmsvbmV0bGluay1jb21wYXQuaAlOZXRsaW5rIENvbXBhdGFiaWxpdHkKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfQ09NUEFUX0hfCisjZGVmaW5lIE5FVExJTktfQ09NUEFUX0hfCisKKyNpZiAhZGVmaW5lZCBfTElOVVhfU09DS0VUX0ggJiYgIWRlZmluZWQgX0JJVFNfU09DS0FERFJfSAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgc2FfZmFtaWx5X3Q7CisjZW5kaWYKKworI2lmbmRlZiBJRk5BTVNJWiAKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBhIGludGVyZmFjZSBuYW1lICovCisjZGVmaW5lIElGTkFNU0laIDE2CisjZW5kaWYKKworLyogcGF0Y2ggMi40LnggaWZfYXJwICovCisjaWZuZGVmIEFSUEhSRF9JTkZJTklCQU5ECisjZGVmaW5lIEFSUEhSRF9JTkZJTklCQU5EIDMyCisjZW5kaWYKKworLyogcGF0Y2ggMi40LnggZXRoIGhlYWRlciBmaWxlICovCisjaWZuZGVmIEVUSF9QX01QTFNfVUMKKyNkZWZpbmUgRVRIX1BfTVBMU19VQyAgMHg4ODQ3IAorI2VuZGlmCisKKyNpZm5kZWYgRVRIX1BfTVBMU19NQworI2RlZmluZSBFVEhfUF9NUExTX01DICAgMHg4ODQ4CisjZW5kaWYKKworI2lmbmRlZiAgRVRIX1BfRURQMgorI2RlZmluZSBFVEhfUF9FRFAyICAgICAgMHg4OEEyCisjZW5kaWYKKworI2lmbmRlZiBFVEhfUF9IRExDCisjZGVmaW5lIEVUSF9QX0hETEMgICAgICAweDAwMTkgCisjZW5kaWYKKworI2lmbmRlZiBBRl9MTEMKKyNkZWZpbmUgQUZfTExDCQkyNgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbmV0bGluay1rZXJuZWwuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGxpbmsta2VybmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNTUzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL25ldGxpbmsta2VybmVsLmgKQEAgLTAsMCArMSwxOTYgQEAKKyNpZm5kZWYgX19MSU5VWF9ORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9ORVRMSU5LX0gKKworLyoqCisgKiBOZXRsaW5rIHNvY2tldCBhZGRyZXNzCisgKiBAaW5ncm91cCBubAorICovCitzdHJ1Y3Qgc29ja2FkZHJfbmwKK3sKKwkvKiogc29ja2V0IGZhbWlseSAoQUZfTkVUTElOSykgKi8KKwlzYV9mYW1pbHlfdCAgICAgbmxfZmFtaWx5OworCisJLyoqIFBhZGRpbmcgKHVudXNlZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgbmxfcGFkOworCisJLyoqIFVuaXF1ZSBwcm9jZXNzIElEICAqLworCXVpbnQzMl90ICAgICAgICBubF9waWQ7CisKKwkvKiogTXVsdGljYXN0IGdyb3VwIHN1YnNjcmlwdGlvbnMgKi8KKwl1aW50MzJfdCAgICAgICAgbmxfZ3JvdXBzOworfTsKKworLyoqCisgKiBOZXRsaW5rIG1lc3NhZ2UgaGVhZGVyCisgKiBAaW5ncm91cCBtc2cKKyAqLworc3RydWN0IG5sbXNnaGRyCit7CisJLyoqCisJICogTGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nIGhlYWRlci4KKwkgKi8KKwl1aW50MzJfdAlubG1zZ19sZW47CisKKwkvKioKKwkgKiBNZXNzYWdlIHR5cGUgKGNvbnRlbnQgdHlwZSkKKwkgKi8KKwl1aW50MTZfdAlubG1zZ190eXBlOworCisJLyoqCisJICogTWVzc2FnZSBmbGFncworCSAqLworCXVpbnQxNl90CW5sbXNnX2ZsYWdzOworCisJLyoqCisJICogU2VxdWVuY2UgbnVtYmVyCisJICovCisJdWludDMyX3QJbmxtc2dfc2VxOworCisJLyoqCisJICogTmV0bGluayBQSUQgb2YgdGhlIHByb2NjZXNzIHNlbmRpbmcgdGhlIG1lc3NhZ2UuCisJICovCisJdWludDMyX3QJbmxtc2dfcGlkOworfTsKKworLyoqCisgKiBAbmFtZSBTdGFuZGFyZCBtZXNzYWdlIGZsYWdzCisgKiBAeworICovCisKKy8qKgorICogTXVzdCBiZSBzZXQgb24gYWxsIHJlcXVlc3QgbWVzc2FnZXMgKHR5cGljYWxseSBmcm9tIHVzZXIgc3BhY2UgdG8KKyAqIGtlcm5lbCBzcGFjZSkuCisgKiBAaW5ncm91cCBtc2cKKyAqLworI2RlZmluZSBOTE1fRl9SRVFVRVNUCQkxCisKKy8qKgorICogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHBhcnQgb2YgYSBtdWx0aXBhcnQgbWVzc2FnZSB0ZXJtaW5hdGVkCisgKiBieSBOTE1TR19ET05FLgorICovCisjZGVmaW5lIE5MTV9GX01VTFRJCQkyCisKKy8qKgorICogUmVxdWVzdCBmb3IgYW4gYWNrbm93bGVkZ21lbnQgb24gc3VjY2Vzcy4KKyAqLworI2RlZmluZSBOTE1fRl9BQ0sJCTQKKworLyoqCisgKiBFY2hvIHRoaXMgcmVxdWVzdAorICovCisjZGVmaW5lIE5MTV9GX0VDSE8JCTgKKworLyoqIEB9ICovCisKKy8qKgorICogQG5hbWUgQWRkaXRpb25hbCBtZXNzYWdlIGZsYWdzIGZvciBHRVQgcmVxdWVzdHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBSZXR1cm4gdGhlIGNvbXBsZXRlIHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgZW50cnkuCisgKiBAaW5ncm91cCBtc2cKKyAqLworI2RlZmluZSBOTE1fRl9ST09UCTB4MTAwCisKKy8qKgorICogUmV0dXJuIGFsbCBlbnRyaWVzIG1hdGNoaW5nIGNyaXRlcmlhIHBhc3NlZCBpbiBtZXNzYWdlIGNvbnRlbnQuCisgKi8KKyNkZWZpbmUgTkxNX0ZfTUFUQ0gJMHgyMDAKKworLyoqCisgKiBSZXR1cm4gYW4gYXRvbWljIHNuYXBzaG90IG9mIHRoZSB0YWJsZSBiZWluZyByZWZlcmVuY2VkLiBUaGlzCisgKiBtYXkgcmVxdWlyZSBzcGVjaWFsIHByaXZpbGVnZXMgYmVjYXVzZSBpdCBoYXMgdGhlIHBvdGVudGlhbCB0bworICogaW50ZXJydXB0IHNlcnZpY2UgaW4gdGhlIEZFIGZvciBhIGxvbmdlciB0aW1lLgorICovCisjZGVmaW5lIE5MTV9GX0FUT01JQwkweDQwMAorCisvKioKKyAqIER1bXAgYWxsIGVudHJpZXMKKyAqLworI2RlZmluZSBOTE1fRl9EVU1QCShOTE1fRl9ST09UfE5MTV9GX01BVENIKQorCisvKiogQH0gKi8KKworLyoqCisgKiBAbmFtZSBBZGRpdGlvbmFsIG1lc3NzYWdlIGZsYWdzIGZvciBORVcgcmVxdWVzdHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBSZXBsYWNlIGV4aXN0aW5nIG1hdGNoaW5nIGNvbmZpZyBvYmplY3Qgd2l0aCB0aGlzIHJlcXVlc3QuCisgKiBAaW5ncm91cCBtc2cKKyAqLworI2RlZmluZSBOTE1fRl9SRVBMQUNFCTB4MTAwCisKKy8qKgorICogRG9uJ3QgcmVwbGFjZSB0aGUgY29uZmlnIG9iamVjdCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqLworI2RlZmluZSBOTE1fRl9FWENMCTB4MjAwCisKKy8qKgorICogQ3JlYXRlIGNvbmZpZyBvYmplY3QgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICovCisjZGVmaW5lIE5MTV9GX0NSRUFURQkweDQwMAorCisvKioKKyAqIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBvYmplY3QgbGlzdC4KKyAqLworI2RlZmluZSBOTE1fRl9BUFBFTkQJMHg4MDAKKworLyoqIEB9ICovCisKKy8qKgorICogQG5hbWUgU3RhbmRhcmQgTWVzc2FnZSB0eXBlcworICogQHsKKyAqLworCisvKioKKyAqIE5vIG9wZXJhdGlvbiwgbWVzc2FnZSBtdXN0IGJlIGlnbm9yZWQKKyAqIEBpbmdyb3VwIG1zZworICovCisjZGVmaW5lIE5MTVNHX05PT1AJCTB4MQorCisvKioKKyAqIFRoZSBtZXNzYWdlIHNpZ25hbHMgYW4gZXJyb3IgYW5kIHRoZSBwYXlsb2FkIGNvbnRhaW5zIGEgbmxtc2dlcnIKKyAqIHN0cnVjdHVyZS4gVGhpcyBjYW4gYmUgbG9va2VkIGF0IGFzIGEgTkFDSyBhbmQgdHlwaWNhbGx5IGl0IGlzCisgKiBmcm9tIEZFQyB0byBDUEMuCisgKi8KKyNkZWZpbmUgTkxNU0dfRVJST1IJCTB4MgorCisvKioKKyAqIE1lc3NhZ2UgdGVybWluYXRlcyBhIG11bHRpcGFydCBtZXNzYWdlLgorICovCisjZGVmaW5lIE5MTVNHX0RPTkUJCTB4MworCisvKioKKyAqIFRoZSBtZXNzYWdlIHNpZ25hbHMgdGhhdCBkYXRhIGdvdCBsb3N0CisgKi8KKyNkZWZpbmUgTkxNU0dfT1ZFUlJVTgkJMHg0CisKKy8qKgorICogTG93ZXIgbGltaXQgb2YgcmVzZXJ2ZWQgbWVzc2FnZSB0eXBlcworICovCisjZGVmaW5lIE5MTVNHX01JTl9UWVBFCQkweDEwCisKKy8qKiBAfSAqLworCisvKioKKyAqIE5ldGxpbmsgZXJyb3IgbWVzc2FnZQorICogQGluZ3JvdXAgbXNnCisgKi8KK3N0cnVjdCBubG1zZ2VycgoreworCS8qKiBFcnJvciBjb2RlIChlcnJubyBudW1iZXIpICovCisJaW50CQllcnJvcjsKKworCS8qKiBPcmlnaW5hbCBuZXRsaW5rIG1lc3NhZ2UgY2F1c2luZyB0aGUgZXJyb3IgKi8KKwlzdHJ1Y3Qgbmxtc2doZHIJbXNnOworfTsKKworc3RydWN0IG5sX3BrdGluZm8KK3sKKwlfX3UzMglncm91cDsKK307CisKKyNlbmRpZgkvKiBfX0xJTlVYX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbmV0bGluay5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmUyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9uZXRsaW5rLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIG5ldGxpbmsvbmV0bGluay5oCQlOZXRsaW5rIEludGVyZmFjZQorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19ORVRMSU5LX0hfCisjZGVmaW5lIE5FVExJTktfTkVUTElOS19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLWNvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bmV0bGluay9lcnJuby5oPgorI2luY2x1ZGUgPG5ldGxpbmsvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2hhbmRsZXJzLmg+CisjaW5jbHVkZSA8bmV0bGluay9zb2NrZXQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgdWNyZWQ7CisKK2V4dGVybiBpbnQgbmxfZGVidWc7CitleHRlcm4gc3RydWN0IG5sX2R1bXBfcGFyYW1zIG5sX2RlYnVnX2RwOworCisvKiBDb25uZWN0aW9uIE1hbmFnZW1lbnQgKi8KK2V4dGVybiBpbnQJCQlubF9jb25uZWN0KHN0cnVjdCBubF9zb2NrICosIGludCk7CitleHRlcm4gdm9pZAkJCW5sX2Nsb3NlKHN0cnVjdCBubF9zb2NrICopOworCisvKiBTZW5kICovCitleHRlcm4gaW50CQkJbmxfc2VuZHRvKHN0cnVjdCBubF9zb2NrICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCQlubF9zZW5kbXNnKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9tc2cgKiwKKwkJCQkJICAgc3RydWN0IG1zZ2hkciAqKTsKK2V4dGVybiBpbnQJCQlubF9zZW5kKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9tc2cgKik7CitleHRlcm4gaW50CQkJbmxfc2VuZF9pb3ZlYyhzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgbmxfbXNnICosCisJCQkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCk7CitleHRlcm4gdm9pZAkJCW5sX2F1dG9fY29tcGxldGUoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBubF9tc2cgKik7CitleHRlcm4gaW50CQkJbmxfc2VuZF9hdXRvX2NvbXBsZXRlKHN0cnVjdCBubF9zb2NrICosCisJCQkJCQkgICAgICBzdHJ1Y3QgbmxfbXNnICopOworZXh0ZXJuIGludAkJCW5sX3NlbmRfc2ltcGxlKHN0cnVjdCBubF9zb2NrICosIGludCwgaW50LAorCQkJCQkgICAgICAgdm9pZCAqLCBzaXplX3QpOworCisvKiBSZWNlaXZlICovCitleHRlcm4gaW50CQkJbmxfcmVjdihzdHJ1Y3Qgbmxfc29jayAqLAorCQkJCQlzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgdW5zaWduZWQgY2hhciAqKiwKKwkJCQkJc3RydWN0IHVjcmVkICoqKTsKKworZXh0ZXJuIGludAkJCW5sX3JlY3Ztc2dzKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9jYiAqKTsKKworZXh0ZXJuIGludAkJCW5sX3JlY3Ztc2dzX2RlZmF1bHQoc3RydWN0IG5sX3NvY2sgKik7CisKK2V4dGVybiBpbnQJCQlubF93YWl0X2Zvcl9hY2soc3RydWN0IG5sX3NvY2sgKik7CisKKy8qIE5ldGxpbmsgRmFtaWx5IFRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGNoYXIgKgkJCW5sX25sZmFtaWx5MnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCQlubF9zdHIybmxmYW1pbHkoY29uc3QgY2hhciAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay9vYmplY3QtYXBpLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9vYmplY3QtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzMzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL29iamVjdC1hcGkuaApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIG5ldGxpbmsvb2JqZWN0LWFwaS5jCQlPYmplY3QgQVBJCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX09CSkVDVF9BUElfSF8KKyNkZWZpbmUgTkVUTElOS19PQkpFQ1RfQVBJX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3V0aWxzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAaW5ncm91cCBvYmplY3QKKyAqIEBkZWZncm91cCBvYmplY3RfYXBpIE9iamVjdCBBUEkKKyAqIEBicmllZgorICoKKyAqIEBwYXIgMSkgT2JqZWN0IERlZmluaXRpb24KKyAqIEBjb2RlCisgKiAvLyBEZWZpbmUgeW91ciBvYmplY3Qgc3RhcnRpbmcgd2l0aCB0aGUgY29tbW9uIG9iamVjdCBoZWFkZXIKKyAqIHN0cnVjdCBteV9vYmogeworICogCU5MSERSX0NPTU1PTgorICogCWludAkJbXlfZGF0YTsKKyAqIH07CisgKgorICogLy8gRmlsbCBvdXQgdGhlIG9iamVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZQorICogc3RydWN0IG5sX29iamVjdF9vcHMgbXlfb3BzID0geworICogCS5vb19uYW1lCT0gIm15X29iaiIsCisgKiAJLm9vX3NpemUJPSBzaXplb2Yoc3RydWN0IG15X29iaiksCisgKiB9OworICoKKyAqIC8vIEF0IHRoaXMgcG9pbnQgdGhlIG9iamVjdCBjYW4gYmUgYWxsb2NhdGVkLCB5b3UgbWF5IHdhbnQgdG8gcHJvdmlkZSBhCisgKiAvLyBzZXBhcmF0ZSBfYWxsb2MoKSBmdW5jdGlvbiB0byBlYXNlIGFsbG9jdGluZyBvYmplY3RzIG9mIHRoaXMga2luZC4KKyAqIHN0cnVjdCBubF9vYmplY3QgKm9iaiA9IG5sX29iamVjdF9hbGxvYygmbXlfb3BzKTsKKyAqCisgKiAvLyBBbmQgcmVsZWFzZSBpdCBhZ2Fpbi4uLgorICogbmxfb2JqZWN0X3B1dChvYmopOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyIDIpIEFsbG9jYXRpbmcgYWRkaXRpb25hbCBkYXRhCisgKiBAY29kZQorICogLy8gWW91IG1heSByZXF1aXJlIHRvIGFsbG9jYXRlIGFkZGl0aW9uYWwgZGF0YSBhbmQgc3RvcmUgaXQgaW5zaWRlCisgKiAvLyBvYmplY3QsIGYuZS4gYXNzdW1pbmcgdGhlcmUgaXMgYSBmaWVsZCBgcHRyJy4KKyAqIHN0cnVjdCBteV9vYmogeworICogCU5MSERSX0NPTU1PTgorICogCXZvaWQgKgkJcHRyOworICogfTsKKyAqCisgKiAvLyBBbmQgYXQgc29tZSBwb2ludCB5b3UgbWF5IGFzc2lnbiBhbGxvY2F0ZWQgZGF0YSB0byB0aGlzIGZpZWxkOgorICogbXlfb2JqLT5wdHIgPSBjYWxsb2MoMSwgLi4uKTsKKyAqCisgKiAvLyBJbiBvcmRlciB0byBub3QgaW50cm9kdWNlIGFueSBtZW1vcnkgbGVha3MgeW91IGhhdmUgdG8gcmVsZWFzZQorICogLy8gdGhpcyBkYXRhIGFnYWluIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGdpdmVuIGJhY2suCisgKiBzdGF0aWMgdm9pZCBteV9vYmpfZnJlZV9kYXRhKHN0cnVjdCBubF9vYmplY3QgKm9iaikKKyAqIHsKKyAqIAlzdHJ1Y3QgbXlfb2JqICpteV9vYmogPSBubF9vYmplY3RfcHJpdihvYmopOworICoKKyAqIAlmcmVlKG15X29iai0+cHRyKTsKKyAqIH0KKyAqCisgKiAvLyBBbHNvIHdoZW4gdGhlIG9iamVjdCBpcyBjbG9uZWQsIHlvdSBtdXN0IGVuc3VyZSBmb3IgeW91ciBwb2ludGVyCisgKiAvLyBzdGF5IHZhbGlkIGV2ZW4gaWYgb25lIG9mIHRoZSBjbG9uZXMgaXMgZnJlZWQgYnkgZWl0aGVyIG1ha2luZworICogLy8gYSBjbG9uZSBhcyB3ZWxsIG9yIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQuCisgKiBzdGF0aWMgaW50IG15X29ial9jbG9uZShzdHJ1Y3Qgbmxfb2JqZWN0ICpzcmMsIHN0cnVjdCBubF9vYmplY3QgKmRzdCkKKyAqIHsKKyAqIAlzdHJ1Y3QgbXlfb2JqICpteV9zcmMgPSBubF9vYmplY3RfcHJpdihzcmMpOworICogCXN0cnVjdCBteV9vYmogKm15X2RzdCA9IG5sX29iamVjdF9wcml2KGRzdCk7CisgKgorICogCWlmIChzcmMtPnB0cikgeworICogCQlkc3QtPnB0ciA9IGNhbGxvYygxLCAuLi4pOworICogCQltZW1jcHkoZHN0LT5wdHIsIHNyYy0+cHRyLCAuLi4pOworICogCX0KKyAqIH0KKyAqCisgKiBzdHJ1Y3Qgbmxfb2JqZWN0X29wcyBteV9vcHMgPSB7CisgKiAJLi4uCisgKiAJLm9vX2ZyZWVfZGF0YQk9IG15X29ial9mcmVlX2RhdGEsCisgKiAJLm9vX2Nsb25lCT0gbXlfb2JqX2Nsb25lLAorICogfTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhciAzKSBPYmplY3QgRHVtcGluZworICogQGNvZGUKKyAqIHN0YXRpYyBpbnQgbXlfb2JqX2R1bXBfZGV0YWlsZWQoc3RydWN0IG5sX29iamVjdCAqb2JqLAorICogCQkJCSAgIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqcGFyYW1zKQorICogeworICogCXN0cnVjdCBteV9vYmogKm15X29iaiA9IG5sX29iamVjdF9wcml2KG9iaik7CisgKgorICogCS8vIEl0IGlzIGFic29sdXRlbHkgZXNzZW50aWFsIHRvIHVzZSBubF9kdW1wKCkgd2hlbiBwcmludGluZworICoJLy8gYW55IHRleHQgdG8gbWFrZSBzdXJlIHRoZSBkdW1waW5nIHBhcmFtZXRlcnMgYXJlIHJlc3BlY3RlZC4KKyAqIAlubF9kdW1wKHBhcmFtcywgIk9iaiBJbnRlZ2VyOiAlZFxuIiwgbXlfb2JqLT5teV9pbnQpOworICoKKyAqIAkvLyBCZWZvcmUgd2UgY2FuIGR1bXAgdGhlIG5leHQgbGluZSwgbWFrZSBzdXJlIHRvIHByZWZpeAorICoJLy8gdGhpcyBsaW5lIGNvcnJlY3RseS4KKyAqIAlubF9uZXdfbGluZShwYXJhbXMpOworICoKKyAqIAkvLyBZb3UgbWF5IGFsc28gc3BsaXQgYSBsaW5lIGludG8gbXVsdGlwbGUgbmxfZHVtcCgpIGNhbGxzLgorICogCW5sX2R1bXAocGFyYW1zLCAiU3RyaW5nOiAlcyAiLCBteV9vYmotPm15X3N0cmluZyk7CisgKiAJbmxfZHVtcChwYXJhbXMsICJTdHJpbmctMjogJXNcbiIsIG15X29iai0+YW5vdGhlcl9zdHJpbmcpOworICogfQorICoKKyAqIHN0cnVjdCBubF9vYmplY3Rfb3BzIG15X29wcyA9IHsKKyAqIAkuLi4KKyAqIAkub29fZHVtcFtOTF9EVU1QX0ZVTExdCT0gbXlfb2JqX2R1bXBfZGV0YWlsZWQsCisgKiB9OworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyIDQpIE9iamVjdCBBdHRyaWJ1dGVzCisgKiBAY29kZQorICogLy8gVGhlIGNvbmNlcHQgb2Ygb2JqZWN0IGF0dHJpYnV0ZXMgaXMgb3B0aW9uYWwgYnV0IGNhbiBlYXNlIHRoZSB0eXBpY2FsCisgKiAvLyBjYXNlIG9mIG9iamVjdHMgdGhhdCBoYXZlIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGUuZy4gYSByb3V0ZSBtYXkgaGF2ZSBhCisgKiAvLyBuZXh0aG9wIGFzc2lnbmVkIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQgdG8uCisgKgorICogLy8gVGhlIGZpcnN0IHN0ZXAgdG8gZGVmaW5lIHlvdXIgb2JqZWN0IHNwZWNpZmljIGJpdG1hc2sgbGlzdGluZyBhbGwKKyAqIC8vIGF0dHJpYnV0ZXMKKyAqICNkZWZpbmUgTVlfQVRUUl9GT08JCSgxPDwwKQorICogI2RlZmluZSBNWV9BVFRSX0JBUgkJKDE8PDEpCisgKgorICogLy8gV2hlbiBhc3NpZ25pbmcgYW4gb3B0aW9uYWwgYXR0cmlidXRlIHRvIHRoZSBvYmplY3QsIG1ha2Ugc3VyZQorICogLy8gdG8gbWFyayBpdHMgYXZhaWxhYmlsaXR5LgorICogbXlfb2JqLT5mb28gPSAxMjMxMjM7CisgKiBteV9vYmotPmNlX21hc2sgfD0gTVlfQVRUUl9GT087CisgKgorICogLy8gQXQgYW55IHRpbWUgeW91IG1heSB1c2UgdGhpcyBtYXNrIHRvIGNoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5CisgKiAvLyBvZiB0aGUgYXR0cmlidXRlLCBlLmcuIHdoaWxlIGR1bXBpbmcKKyAqIGlmIChteV9vYmotPmNlX21hc2sgJiBNWV9BVFRSX0ZPTykKKyAqIAlubF9kdW1wKHBhcmFtcywgImZvbyAlZCAiLCBteV9vYmotPmZvbyk7CisgKgorICogLy8gT25lIG9mIHRoZSBiaWcgYWR2YW50YWdlcyBvZiB0aGlzIGNvbmNlcHQgaXMgdGhhdCBpdCBhbGxvd3MgZm9yCisgKiAvLyBzdGFuZGFyZGl6ZWQgY29tcGFyaXNvbnMgd2hpY2ggbWFrZSBpdCB0cml2aWFsIGZvciBjYWNoZXMgdG8KKyAqIC8vIGlkZW50aWZ5IHVuaXF1ZSBvYmplY3RzIGJ5IHVzZSBvZiB1bmlmaWVkIGNvbXBhcmlzb24gZnVuY3Rpb25zLgorICogLy8gSW4gb3JkZXIgZm9yIGl0IHRvIHdvcmssIHlvdXIgb2JqZWN0IGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZQorICogLy8gYSBjb21wYXJpc29uIGZ1bmN0aW9uIGFuZCBkZWZpbmUgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgd2hpY2gKKyAqIC8vIGNvbWJpbmVkIHRvZ2V0aGVyIG1ha2UgYW4gb2JqZWN0IHVuaXF1ZS4KKyAqCisgKiBzdGF0aWMgaW50IG15X29ial9jb21wYXJlKHN0cnVjdCBubF9vYmplY3QgKl9hLCBzdHJ1Y3Qgbmxfb2JqZWN0ICpfYiwKKyAqIAkJCSAgICAgdWludDMyX3QgYXR0cnMsIGludCBmbGFncykKKyAqIHsKKyAqIAlzdHJ1Y3QgbXlfb2JqICphID0gbmxfb2JqZWN0X3ByaXYoX2EpOgorICogCXN0cnVjdCBteV9vYmogKmIgPSBubF9vYmplY3RfcHJpdihfYik6CisgKiAJaW50IGRpZmYgPSAwOworICoKKyAqIAkvLyBXZSBoZWxwIG91cnNlbHZlcyBpbiBkZWZpbmluZyBvdXIgb3duIERJRkYgbWFjcm8gd2hpY2ggd2lsbAorICoJLy8gY2FsbCBBVFRSX0RJRkYoKSBvbiBib3RoIG9iamVjdHMgd2hpY2ggd2lsbCBtYWtlIHN1cmUgdG8gb25seQorICoJLy8gY29tcGFyZSB0aGUgYXR0cmlidXRlcyBpZiByZXF1aXJlZC4KKyAqIAkjZGVmaW5lIE1ZX0RJRkYoQVRUUiwgRVhQUikgQVRUUl9ESUZGKGF0dHJzLCBNWV9BVFRSXyMjQVRUUiwgYSwgYiwgRVhQUikKKyAqCisgKiAJLy8gQ2FsbCBvdXIgb3duIGRpZmYgbWFjcm8gZm9yIGVhY2ggYXR0cmlidXRlIHRvIGJ1aWxkIGEgYml0bWFzaworICoJLy8gcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGVzIHdoaWNoIG1pc21hdGNoLgorICogCWRpZmYgfD0gTVlfRElGRihGT08sIGEtPmZvbyAhPSBiLT5mb28pCisgKiAJZGlmZiB8PSBNWV9ESUZGKEJBUiwgc3RyY21wKGEtPmJhciwgYi0+YmFyKSkKKyAqCisgKiAJcmV0dXJuIGRpZmY7CisgKiB9CisgKgorICogLy8gSW4gb3JkZXIgdG8gaWRlbnRpZnkgaWRlbnRpY2FsIG9iamVjdHMgd2l0aCBkaWZmZXJpbmcgYXR0cmlidXRlcworICogLy8geW91IG11c3Qgc3BlY2lmeSB0aGUgYXR0cmlidXRlcyByZXF1aXJlZCB0byB1bmlxdWVseSBpZGVudGlmeQorICogLy8geW91ciBvYmplY3QuIE1ha2Ugc3VyZSB0byBub3QgaW5jbHVkZSB0b28gbWFueSBhdHRyaWJ1dGVzLCB0aGlzCisgKiAvLyBsaXN0IGlzIHVzZWQgd2hlbiBjYWNoZXMgbG9vayBmb3IgYW4gb2xkIHZlcnNpb24gb2YgYW4gb2JqZWN0LgorICogc3RydWN0IG5sX29iamVjdF9vcHMgbXlfb3BzID0geworICogCS4uLgorICogCS5vb19pZF9hdHRycwkJPSBNWV9BVFRSX0ZPTywKKyAqIAkub29fY29tcGFyZQkJPSBteV9vYmpfY29tcGFyZSwKKyAqIH07CisgKiBAZW5kY29kZQorICogQHsKKyAqLworCisvKioKKyAqIENvbW1vbiBPYmplY3QgSGVhZGVyCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIGluY2x1ZGVkIGFzIGZpcnN0IG1lbWJlciBpbiBldmVyeSBvYmplY3QKKyAqIGRlZmluaXRpb24gdG8gYWxsb3cgb2JqZWN0cyB0byBiZSBjYWNoZWQuCisgKi8KKyNkZWZpbmUgTkxIRFJfQ09NTU9OCQkJCVwKKwlpbnQJCQljZV9yZWZjbnQ7CVwKKwlzdHJ1Y3Qgbmxfb2JqZWN0X29wcyAqCWNlX29wczsJCVwKKwlzdHJ1Y3QgbmxfY2FjaGUgKgljZV9jYWNoZTsJXAorCXN0cnVjdCBubF9saXN0X2hlYWQJY2VfbGlzdDsJXAorCWludAkJCWNlX21zZ3R5cGU7CVwKKwlpbnQJCQljZV9mbGFnczsJXAorCXVpbnQzMl90CQljZV9tYXNrOworCisvKioKKyAqIFJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgaW4gYm90aCBvYmplY3RzCisgKiBAYXJnIEEJCWFuIG9iamVjdAorICogQGFyZyBCCQlhbm90aGVyIG9iamVjdAorICogQGFyZyBBVFRSCQlhdHRyaWJ1dGUgYml0CisgKgorICogQHJldHVybiBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCisgKi8KKyNkZWZpbmUgQVZBSUxBQkxFKEEsIEIsIEFUVFIpCQkoKChBKS0+Y2VfbWFzayAmIChCKS0+Y2VfbWFzaykgJiAoQVRUUikpCisKKy8qKgorICogUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGlzIGF2YWlsYWJsZSBpbiBvbmx5IG9uZSBvZiBib3RoIG9iamVjdHMKKyAqIEBhcmcgQQkJYW4gb2JqZWN0CisgKiBAYXJnIEIJCWFub3RoZXIgb2JqZWN0CisgKiBAYXJnIEFUVFIJCWF0dHJpYnV0ZSBiaXQKKyAqCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgaW4gb25seSBvbmUgb2YgYm90aCBvYmplY3RzLAorICogb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgorICovCisjZGVmaW5lIEFWQUlMQUJMRV9NSVNNQVRDSChBLCBCLCBBVFRSKQkoKChBKS0+Y2VfbWFzayBeIChCKS0+Y2VfbWFzaykgJiAoQVRUUikpCisKKy8qKgorICogUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlcyBtaXNtYXRjaAorICogQGFyZyBBCQlhbiBvYmplY3QKKyAqIEBhcmcgQgkJYW5vdGhlciBvYmplY3QKKyAqIEBhcmcgQVRUUgkJYXR0cmlidXRlIGJpdAorICogQGFyZyBFWFBSCQlDb21wYXJpc29uIGV4cHJlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbiBpcyBhdmFpbGFibGUKKyAqIGluIGJvdGggb2JqZWN0cywgaWYgbm90IHRoaXMgd2lsbCBjb3VudCBhcyBhIG1pc21hdGNoLgorICoKKyAqIElmIGF2YWlsYWJsZSB0aGUgZnVuY3Rpb24gd2lsbCBleGVjdXRlIHRoZSBleHByZXNzaW9uIHdoaWNoIG11c3QKKyAqIHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGVzIG1pc21hdGNoLgorICoKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIG1pc21hdGNoLCBvciBmYWxzZSBpZiB0aGV5IG1hdGNoLgorICovCisjZGVmaW5lIEFUVFJfTUlTTUFUQ0goQSwgQiwgQVRUUiwgRVhQUikJKEFWQUlMQUJMRV9NSVNNQVRDSChBLCBCLCBBVFRSKSB8fCBcCisJCQkJCSAoQVZBSUxBQkxFKEEsIEIsIEFUVFIpICYmIChFWFBSKSkpCisKKy8qKgorICogUmV0dXJuIGF0dHJpYnV0ZSBiaXQgaWYgYXR0cmlidXRlIGRvZXMgbm90IG1hdGNoCisgKiBAYXJnIExJU1QJCWxpc3Qgb2YgYXR0cmlidXRlcyB0byBiZSBjb21wYXJlZAorICogQGFyZyBBVFRSCQlhdHRyaWJ1dGUgYml0CisgKiBAYXJnIEEJCWFuIG9iamVjdAorICogQGFyZyBCCQlhbm90aGVyIG9iamVjdAorICogQGFyZyBFWFBSCQlDb21wYXJpc29uIGV4cHJlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbiBpcyBhdmFpbGFibGUKKyAqIGluIGJvdGggb2JqZWN0cywgaWYgbm90IHRoaXMgd2lsbCBjb3VudCBhcyBhIG1pc21hdGNoLgorICoKKyAqIElmIGF2YWlsYWJsZSB0aGUgZnVuY3Rpb24gd2lsbCBleGVjdXRlIHRoZSBleHByZXNzaW9uIHdoaWNoIG11c3QKKyAqIHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGVzIG1pc21hdGNoLgorICoKKyAqIEluIGNhc2UgdGhlIGF0dHJpYnV0ZXMgbWlzbWF0Y2gsIHRoZSBhdHRyaWJ1dGUgaXMgcmV0dXJuZWQsIG90aGVyd2lzZQorICogMCBpcyByZXR1cm5lZC4KKyAqCisgKiBAY29kZQorICogZGlmZiB8PSBBVFRSX0RJRkYoYXR0cnMsIE1ZX0FUVFJfRk9PLCBhLCBiLCBhLT5mb28gIT0gYi0+Zm9vKTsKKyAqIEBlbmRjb2RlCisgKi8KKyNkZWZpbmUgQVRUUl9ESUZGKExJU1QsIEFUVFIsIEEsIEIsIEVYUFIpIFwKKyh7CWludCBkaWZmID0gMDsgXAorCWlmICgoKExJU1QpICYgKEFUVFIpKSAmJiBBVFRSX01JU01BVENIKEEsIEIsIEFUVFIsIEVYUFIpKSBcCisJCWRpZmYgPSBBVFRSOyBcCisJZGlmZjsgfSkKKworLyoqCisgKiBPYmplY3QgT3BlcmF0aW9ucworICovCitzdHJ1Y3Qgbmxfb2JqZWN0X29wcworeworCS8qKgorCSAqIFVuaXF1ZSBuYW1lIG9mIG9iamVjdCB0eXBlCisJICoKKwkgKiBNdXN0IGJlIGluIHRoZSBmb3JtIGZhbWlseS9uYW1lLCBlLmcuICJyb3V0ZS9hZGRyIgorCSAqLworCWNoYXIgKgkJb29fbmFtZTsKKworCS8qKiBTaXplIG9mIG9iamVjdCBpbmNsdWRpbmcgaXRzIGhlYWRlciAqLworCXNpemVfdAkJb29fc2l6ZTsKKworCS8qIExpc3Qgb2YgYXR0cmlidXRlcyBuZWVkZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIG9iamVjdCAqLworCXVpbnQzMl90CW9vX2lkX2F0dHJzOworCisJLyoqCisJICogQ29uc3RydWN0b3IgZnVuY3Rpb24KKwkgKgorCSAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSBpcyBhbGxvY2F0ZWQuCisJICogQ2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBtZW1iZXJzIHN1Y2ggYXMgbGlzdHMgZXRjLgorCSAqLworCXZvaWQgICgqb29fY29uc3RydWN0b3IpKHN0cnVjdCBubF9vYmplY3QgKik7CisKKwkvKioKKwkgKiBEZXN0cnVjdG9yIGZ1bmN0aW9uCisJICoKKwkgKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBmcmVlZC4gTXVzdCBmcmVlIGFsbAorCSAqIHJlc291cmNlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoaXMKKwkgKiBvYmplY3QuCisJICovCisJdm9pZCAgKCpvb19mcmVlX2RhdGEpKHN0cnVjdCBubF9vYmplY3QgKik7CisKKwkvKioKKwkgKiBDbG9uaW5nIGZ1bmN0aW9uCisJICoKKwkgKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBuZWVkcyB0byBiZSBjbG9uZWQuIFBsZWFzZQorCSAqIG5vdGUgdGhhdCB0aGUgZ2VuZXJpYyBvYmplY3QgY29kZSB3aWxsIG1ha2UgYW4gZXhhY3QKKwkgKiBjb3B5IG9mIHRoZSBvYmplY3QgZmlyc3QsIHRoZXJlZm9yZSB5b3Ugb25seSBuZWVkIHRvIHRha2UKKwkgKiBjYXJlIG9mIG1lbWJlcnMgd2hpY2ggcmVxdWlyZSByZWZlcmVuY2UgY291bnRpbmcgZXRjLgorCSAqCisJICogTWF5IHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgdG8gYWJvcnQgY2xvbmluZy4KKwkgKi8KKwlpbnQgICgqb29fY2xvbmUpKHN0cnVjdCBubF9vYmplY3QgKiwgc3RydWN0IG5sX29iamVjdCAqKTsKKworCS8qKgorCSAqIER1bXBpbmcgZnVuY3Rpb25zCisJICoKKwkgKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBkdW1wZWQuIFRoZSBpbXBsZW1lbnRhdGlvbnMKKwkgKiBoYXZlIHRvIHVzZSBubF9kdW1wKCksIG5sX2R1bXBfbGluZSgpLCBhbmQgbmxfbmV3X2xpbmUoKSB0bworCSAqIGR1bXAgb2JqZWN0cy4KKwkgKgorCSAqIFRoZSBmdW5jdGlvbnMgbXVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBwcmludGVkLgorCSAqLworCXZvaWQgKCpvb19kdW1wW05MX0RVTVBfTUFYKzFdKShzdHJ1Y3Qgbmxfb2JqZWN0ICosCisJCQkJICAgICAgIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKKworCS8qKgorCSAqIENvbXBhcmlzb24gZnVuY3Rpb24KKwkgKgorCSAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gdHdvIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKKwkgKiBjb21wYXJlZC4gSXQgdGFrZXMgdGhlIHR3byBvYmplY3RzIGluIHF1ZXN0aW9uLCBhbiBvYmplY3QKKwkgKiBzcGVjaWZpYyBiaXRtYXNrIGRlZmluaW5nIHdoaWNoIGF0dHJpYnV0ZXMgc2hvdWxkIGJlCisJICogY29tcGFyZWQgYW5kIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW91ci4KKwkgKgorCSAqIFRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGJpdG1hc2sgd2l0aCB0aGUgcmVsZXZhbnQgYml0CisJICogc2V0IGZvciBlYWNoIGF0dHJpYnV0ZSB0aGF0IG1pc21hdGNoZXMuCisJICovCisJaW50ICAgKCpvb19jb21wYXJlKShzdHJ1Y3Qgbmxfb2JqZWN0ICosIHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCSAgICB1aW50MzJfdCwgaW50KTsKKworCisJY2hhciAqKCpvb19hdHRyczJzdHIpKGludCwgY2hhciAqLCBzaXplX3QpOworfTsKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvb2JqZWN0LmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvb2JqZWN0LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIG5ldGxpbmsvb2JqZWN0LmMJR2VuZXJpYyBDYWNoZWFibGUgT2JqZWN0CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX09CSkVDVF9IXworI2RlZmluZSBORVRMSU5LX09CSkVDVF9IXworCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay91dGlscy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBubF9jYWNoZTsKK3N0cnVjdCBubF9vYmplY3Q7CitzdHJ1Y3Qgbmxfb2JqZWN0X29wczsKKworI2RlZmluZSBPQkpfQ0FTVChwdHIpCQkoKHN0cnVjdCBubF9vYmplY3QgKikgKHB0cikpCisKKy8qIEdlbmVyYWwgKi8KK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0ICoJbmxfb2JqZWN0X2FsbG9jKHN0cnVjdCBubF9vYmplY3Rfb3BzICopOworZXh0ZXJuIGludAkJCW5sX29iamVjdF9hbGxvY19uYW1lKGNvbnN0IGNoYXIgKiwKKwkJCQkJCSAgICAgc3RydWN0IG5sX29iamVjdCAqKik7CitleHRlcm4gdm9pZAkJCW5sX29iamVjdF9mcmVlKHN0cnVjdCBubF9vYmplY3QgKik7CitleHRlcm4gc3RydWN0IG5sX29iamVjdCAqCW5sX29iamVjdF9jbG9uZShzdHJ1Y3Qgbmxfb2JqZWN0ICpvYmopOworZXh0ZXJuIHZvaWQJCQlubF9vYmplY3RfZ2V0KHN0cnVjdCBubF9vYmplY3QgKik7CitleHRlcm4gdm9pZAkJCW5sX29iamVjdF9wdXQoc3RydWN0IG5sX29iamVjdCAqKTsKK2V4dGVybiBpbnQJCQlubF9vYmplY3Rfc2hhcmVkKHN0cnVjdCBubF9vYmplY3QgKik7CitleHRlcm4gdm9pZAkJCW5sX29iamVjdF9kdW1wKHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKK2V4dGVybiBpbnQJCQlubF9vYmplY3RfaWRlbnRpY2FsKHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJCSAgICBzdHJ1Y3Qgbmxfb2JqZWN0ICopOworZXh0ZXJuIHVpbnQzMl90CQkJbmxfb2JqZWN0X2RpZmYoc3RydWN0IG5sX29iamVjdCAqLAorCQkJCQkgICAgICAgc3RydWN0IG5sX29iamVjdCAqKTsKK2V4dGVybiBpbnQJCQlubF9vYmplY3RfbWF0Y2hfZmlsdGVyKHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJCSAgICAgICBzdHJ1Y3Qgbmxfb2JqZWN0ICopOworZXh0ZXJuIGNoYXIgKgkJCW5sX29iamVjdF9hdHRyczJzdHIoc3RydWN0IG5sX29iamVjdCAqLAorCQkJCQkJICAgIHVpbnQzMl90IGF0dHJzLCBjaGFyICpidWYsCisJCQkJCQkgICAgc2l6ZV90KTsKK2V4dGVybiBjaGFyICoJCQlubF9vYmplY3RfYXR0cl9saXN0KHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJCSAgICBjaGFyICosIHNpemVfdCk7CisKKy8qIE1hcmtzICovCitleHRlcm4gdm9pZAkJCW5sX29iamVjdF9tYXJrKHN0cnVjdCBubF9vYmplY3QgKik7CitleHRlcm4gdm9pZAkJCW5sX29iamVjdF91bm1hcmsoc3RydWN0IG5sX29iamVjdCAqKTsKK2V4dGVybiBpbnQJCQlubF9vYmplY3RfaXNfbWFya2VkKHN0cnVjdCBubF9vYmplY3QgKik7CisKKy8qIEFjY2VzcyBGdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQJCQlubF9vYmplY3RfZ2V0X3JlZmNudChzdHJ1Y3Qgbmxfb2JqZWN0ICopOworZXh0ZXJuIHN0cnVjdCBubF9jYWNoZSAqCW5sX29iamVjdF9nZXRfY2FjaGUoc3RydWN0IG5sX29iamVjdCAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCQlubF9vYmplY3RfcHJpdihzdHJ1Y3Qgbmxfb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIG9iajsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL2FkZHIuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzgxNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvYWRkci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL2FkZHIuYwkJcnRuZXRsaW5rIGFkZHIgbGF5ZXIKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IEJhcnVjaCBFdmVuIDxiYXJ1Y2hAZXYtZW4ub3JnPiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhdHJpeCBUZWxlY29tLCBpbmMuIDxlcmljYkBtZWRpYXRyaXguY29tPgorICovCisKKyNpZm5kZWYgTkVUQUREUl9BRERSX0hfCisjZGVmaW5lIE5FVEFERFJfQUREUl9IXworCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9jYWNoZS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvYWRkci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBydG5sX2FkZHI7CisKKy8qIEdlbmVyYWwgKi8KK2V4dGVybiBzdHJ1Y3QgcnRubF9hZGRyICpydG5sX2FkZHJfYWxsb2Modm9pZCk7CitleHRlcm4gdm9pZAlydG5sX2FkZHJfcHV0KHN0cnVjdCBydG5sX2FkZHIgKik7CisKK2V4dGVybiBpbnQJcnRubF9hZGRyX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9jYWNoZSAqKik7CisKK2V4dGVybiBpbnQJcnRubF9hZGRyX2J1aWxkX2FkZF9yZXF1ZXN0KHN0cnVjdCBydG5sX2FkZHIgKiwgaW50LAorCQkJCQkgICAgc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CXJ0bmxfYWRkcl9hZGQoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IHJ0bmxfYWRkciAqLCBpbnQpOworCitleHRlcm4gaW50CXJ0bmxfYWRkcl9idWlsZF9kZWxldGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9hZGRyICosIGludCwKKwkJCQkJICAgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAlydG5sX2FkZHJfZGVsZXRlKHN0cnVjdCBubF9zb2NrICosCisJCQkJIHN0cnVjdCBydG5sX2FkZHIgKiwgaW50KTsKKworZXh0ZXJuIGNoYXIgKglydG5sX2FkZHJfZmxhZ3Myc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX2FkZHJfc3RyMmZsYWdzKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQJcnRubF9hZGRyX3NldF9sYWJlbChzdHJ1Y3QgcnRubF9hZGRyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqCXJ0bmxfYWRkcl9nZXRfbGFiZWwoc3RydWN0IHJ0bmxfYWRkciAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9hZGRyX3NldF9pZmluZGV4KHN0cnVjdCBydG5sX2FkZHIgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9hZGRyX2dldF9pZmluZGV4KHN0cnVjdCBydG5sX2FkZHIgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfYWRkcl9zZXRfZmFtaWx5KHN0cnVjdCBydG5sX2FkZHIgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9hZGRyX2dldF9mYW1pbHkoc3RydWN0IHJ0bmxfYWRkciAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9hZGRyX3NldF9wcmVmaXhsZW4oc3RydWN0IHJ0bmxfYWRkciAqLCBpbnQpOworZXh0ZXJuIGludAlydG5sX2FkZHJfZ2V0X3ByZWZpeGxlbihzdHJ1Y3QgcnRubF9hZGRyICopOworCitleHRlcm4gdm9pZAlydG5sX2FkZHJfc2V0X3Njb3BlKHN0cnVjdCBydG5sX2FkZHIgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9hZGRyX2dldF9zY29wZShzdHJ1Y3QgcnRubF9hZGRyICopOworCitleHRlcm4gdm9pZAlydG5sX2FkZHJfc2V0X2ZsYWdzKHN0cnVjdCBydG5sX2FkZHIgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkCXJ0bmxfYWRkcl91bnNldF9mbGFncyhzdHJ1Y3QgcnRubF9hZGRyICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IHJ0bmxfYWRkcl9nZXRfZmxhZ3Moc3RydWN0IHJ0bmxfYWRkciAqKTsKKworZXh0ZXJuIGludAlydG5sX2FkZHJfc2V0X2xvY2FsKHN0cnVjdCBydG5sX2FkZHIgKiwKKwkJCQkJICAgIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICpydG5sX2FkZHJfZ2V0X2xvY2FsKHN0cnVjdCBydG5sX2FkZHIgKik7CisKK2V4dGVybiBpbnQJcnRubF9hZGRyX3NldF9wZWVyKHN0cnVjdCBydG5sX2FkZHIgKiwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKnJ0bmxfYWRkcl9nZXRfcGVlcihzdHJ1Y3QgcnRubF9hZGRyICopOworCitleHRlcm4gaW50CXJ0bmxfYWRkcl9zZXRfYnJvYWRjYXN0KHN0cnVjdCBydG5sX2FkZHIgKiwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKnJ0bmxfYWRkcl9nZXRfYnJvYWRjYXN0KHN0cnVjdCBydG5sX2FkZHIgKik7CisKK2V4dGVybiBpbnQJcnRubF9hZGRyX3NldF9tdWx0aWNhc3Qoc3RydWN0IHJ0bmxfYWRkciAqLCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqcnRubF9hZGRyX2dldF9tdWx0aWNhc3Qoc3RydWN0IHJ0bmxfYWRkciAqKTsKKworZXh0ZXJuIGludAlydG5sX2FkZHJfc2V0X2FueWNhc3Qoc3RydWN0IHJ0bmxfYWRkciAqLCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqcnRubF9hZGRyX2dldF9hbnljYXN0KHN0cnVjdCBydG5sX2FkZHIgKik7CisKK2V4dGVybiB1aW50MzJfdCBydG5sX2FkZHJfZ2V0X3ZhbGlkX2xpZmV0aW1lKHN0cnVjdCBydG5sX2FkZHIgKik7CitleHRlcm4gdm9pZAlydG5sX2FkZHJfc2V0X3ZhbGlkX2xpZmV0aW1lKHN0cnVjdCBydG5sX2FkZHIgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90IHJ0bmxfYWRkcl9nZXRfcHJlZmVycmVkX2xpZmV0aW1lKHN0cnVjdCBydG5sX2FkZHIgKik7CitleHRlcm4gdm9pZAlydG5sX2FkZHJfc2V0X3ByZWZlcnJlZF9saWZldGltZShzdHJ1Y3QgcnRubF9hZGRyICosIHVpbnQzMl90KTsKK2V4dGVybiB1aW50MzJfdCBydG5sX2FkZHJfZ2V0X2NyZWF0ZV90aW1lKHN0cnVjdCBydG5sX2FkZHIgKik7CitleHRlcm4gdWludDMyX3QgcnRubF9hZGRyX2dldF9sYXN0X3VwZGF0ZV90aW1lKHN0cnVjdCBydG5sX2FkZHIgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvY2xhc3MuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL2NsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwMDk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL2NsYXNzLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIG5ldGxpbmsvcm91dGUvY2xhc3MuaCAgICAgICBDbGFzc2VzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0NMQVNTX0hfCisjZGVmaW5lIE5FVExJTktfQ0xBU1NfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvcm91dGUvdGMuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL3FkaXNjLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJ0bmxfY2xhc3M7CisKK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0X29wcyBjbGFzc19vYmpfb3BzOworCitleHRlcm4gc3RydWN0IHJ0bmxfY2xhc3MgKglydG5sX2NsYXNzX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQJCXJ0bmxfY2xhc3NfcHV0KHN0cnVjdCBydG5sX2NsYXNzICopOworZXh0ZXJuIGludAkJcnRubF9jbGFzc19hbGxvY19jYWNoZShzdHJ1Y3Qgbmxfc29jayAqLCBpbnQsCisJCQkJCSAgICAgICBzdHJ1Y3QgbmxfY2FjaGUgKiopOworZXh0ZXJuIHN0cnVjdCBydG5sX2NsYXNzICpydG5sX2NsYXNzX2dldChzdHJ1Y3QgbmxfY2FjaGUgKiwgaW50LCB1aW50MzJfdCk7CisKKy8qIGxlYWYgcWRpc2MgYWNjZXNzICovCitleHRlcm4gc3RydWN0IHJ0bmxfcWRpc2MgKglydG5sX2NsYXNzX2xlYWZfcWRpc2Moc3RydWN0IHJ0bmxfY2xhc3MgKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBubF9jYWNoZSAqKTsKKworZXh0ZXJuIGludAkJcnRubF9jbGFzc19idWlsZF9hZGRfcmVxdWVzdChzdHJ1Y3QgcnRubF9jbGFzcyAqLCBpbnQsCisJCQkJCQkgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAkJcnRubF9jbGFzc19hZGQoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IHJ0bmxfY2xhc3MgKiwKKwkJCQkgICAgICAgaW50KTsKKworZXh0ZXJuIGludAlydG5sX2NsYXNzX2J1aWxkX2RlbGV0ZV9yZXF1ZXN0KHN0cnVjdCBydG5sX2NsYXNzICosCisJCQkJCQkJCQkJCXN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAlydG5sX2NsYXNzX2RlbGV0ZShzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgcnRubF9jbGFzcyAqKTsKKworZXh0ZXJuIHZvaWQJCXJ0bmxfY2xhc3Nfc2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfY2xhc3MgKiwgaW50KTsKK2V4dGVybiBpbnQJCXJ0bmxfY2xhc3NfZ2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfY2xhc3MgKik7CitleHRlcm4gdm9pZAkJcnRubF9jbGFzc19zZXRfaGFuZGxlKHN0cnVjdCBydG5sX2NsYXNzICosIHVpbnQzMl90KTsKK2V4dGVybiB1aW50MzJfdAkJcnRubF9jbGFzc19nZXRfaGFuZGxlKHN0cnVjdCBydG5sX2NsYXNzICopOworZXh0ZXJuIHZvaWQJCXJ0bmxfY2xhc3Nfc2V0X3BhcmVudChzdHJ1Y3QgcnRubF9jbGFzcyAqLCB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QJCXJ0bmxfY2xhc3NfZ2V0X3BhcmVudChzdHJ1Y3QgcnRubF9jbGFzcyAqKTsKK2V4dGVybiB2b2lkCQlydG5sX2NsYXNzX3NldF9raW5kKHN0cnVjdCBydG5sX2NsYXNzICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqCQlydG5sX2NsYXNzX2dldF9raW5kKHN0cnVjdCBydG5sX2NsYXNzICopOworZXh0ZXJuIHVpbnQ2NF90CQlydG5sX2NsYXNzX2dldF9zdGF0KHN0cnVjdCBydG5sX2NsYXNzICosCisJCQkJCSAgICBlbnVtIHJ0bmxfdGNfc3RhdHNfaWQpOworCisvKiBpdGVyYXRvcnMgKi8KK2V4dGVybiB2b2lkCQlydG5sX2NsYXNzX2ZvcmVhY2hfY2hpbGQoc3RydWN0IHJ0bmxfY2xhc3MgKiwKKwkJCQkJCSBzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJCSB2b2lkICgqY2IpKHN0cnVjdCBubF9vYmplY3QgKiwKKwkJCQkJCSAJICAgIHZvaWQgKiksCisJCQkJCQkgdm9pZCAqKTsKK2V4dGVybiB2b2lkCQlydG5sX2NsYXNzX2ZvcmVhY2hfY2xzKHN0cnVjdCBydG5sX2NsYXNzICosCisJCQkJCSAgICAgICBzdHJ1Y3QgbmxfY2FjaGUgKiwKKwkJCQkJICAgICAgIHZvaWQgKCpjYikoc3RydWN0IG5sX29iamVjdCAqLAorCQkJCQkJCSAgdm9pZCAqKSwKKwkJCQkJICAgICAgIHZvaWQgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvY2xhc3NpZmllci5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvY2xhc3NpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzNkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9jbGFzc2lmaWVyLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIG5ldGxpbmsvcm91dGUvY2xhc3NpZmllci5oICAgICAgIENsYXNzaWZpZXJzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDkgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0NMQVNTSUZJRVJfSF8KKyNkZWZpbmUgTkVUTElOS19DTEFTU0lGSUVSX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS90Yy5oPgorI2luY2x1ZGUgPG5ldGxpbmsvdXRpbHMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IG5sX29iamVjdF9vcHMgY2xzX29ial9vcHM7CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9jbHMgKnJ0bmxfY2xzX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQJcnRubF9jbHNfcHV0KHN0cnVjdCBydG5sX2NscyAqKTsKKworZXh0ZXJuIGludAlydG5sX2Nsc19hbGxvY19jYWNoZShzdHJ1Y3Qgbmxfc29jayAqLCBpbnQsIHVpbnQzMl90LAorCQkJCSAgICAgc3RydWN0IG5sX2NhY2hlICoqKTsKKworZXh0ZXJuIGludAlydG5sX2Nsc19idWlsZF9hZGRfcmVxdWVzdChzdHJ1Y3QgcnRubF9jbHMgKiwgaW50LAorCQkJCQkgICBzdHJ1Y3QgbmxfbXNnICoqKTsKK2V4dGVybiBpbnQJcnRubF9jbHNfYWRkKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX2NscyAqLCBpbnQpOworCitleHRlcm4gaW50CXJ0bmxfY2xzX2J1aWxkX2NoYW5nZV9yZXF1ZXN0KHN0cnVjdCBydG5sX2NscyAqLCBpbnQsCisJCQkJCSAgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAlydG5sX2Nsc19idWlsZF9kZWxldGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9jbHMgKiwgaW50LAorCQkJCQkgICAgICBzdHJ1Y3QgbmxfbXNnICoqKTsKK2V4dGVybiBpbnQJcnRubF9jbHNfZGVsZXRlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX2NscyAqLCBpbnQpOworCitleHRlcm4gdm9pZCBydG5sX2Nsc19zZXRfaWZpbmRleChzdHJ1Y3QgcnRubF9jbHMgKiwgaW50KTsKK2V4dGVybiBpbnQgcnRubF9jbHNfZ2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfY2xzICopOworZXh0ZXJuIHZvaWQgcnRubF9jbHNfc2V0X2hhbmRsZShzdHJ1Y3QgcnRubF9jbHMgKiwgdWludDMyX3QpOworZXh0ZXJuIHZvaWQgcnRubF9jbHNfc2V0X3BhcmVudChzdHJ1Y3QgcnRubF9jbHMgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90IHJ0bmxfY2xzX2dldF9wYXJlbnQoc3RydWN0IHJ0bmxfY2xzICopOworZXh0ZXJuIGludCBydG5sX2Nsc19zZXRfa2luZChzdHJ1Y3QgcnRubF9jbHMgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9jbHNfb3BzICpydG5sX2Nsc19nZXRfb3BzKHN0cnVjdCBydG5sX2NscyAqKTsKKworZXh0ZXJuIHZvaWQgcnRubF9jbHNfc2V0X3ByaW8oc3RydWN0IHJ0bmxfY2xzICosIHVpbnQxNl90KTsKK2V4dGVybiB1aW50MTZfdCBydG5sX2Nsc19nZXRfcHJpbyhzdHJ1Y3QgcnRubF9jbHMgKik7CisKK2V4dGVybiB2b2lkIHJ0bmxfY2xzX3NldF9wcm90b2NvbChzdHJ1Y3QgcnRubF9jbHMgKiwgdWludDE2X3QpOworZXh0ZXJuIHVpbnQxNl90IHJ0bmxfY2xzX2dldF9wcm90b2NvbChzdHJ1Y3QgcnRubF9jbHMgKik7CisKK2V4dGVybiB2b2lkICpydG5sX2Nsc19kYXRhKHN0cnVjdCBydG5sX2NscyAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9jbHMvZW1hdGNoLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9jbHMvZW1hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyOTJiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL2Nscy9lbWF0Y2guaApAQCAtMCwwICsxLDczIEBACisvKgorICogbmV0bGluay9yb3V0ZS9jbHMvZW1hdGNoLmgJCUV4dGVuZGVkIE1hdGNoZXMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0NMU19FTUFUQ0hfSF8KKyNkZWZpbmUgTkVUTElOS19DTFNfRU1BVENIX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL2NsYXNzaWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJ0bmxfZW1hdGNoOworc3RydWN0IHJ0bmxfZW1hdGNoX3RyZWU7CisKK3N0cnVjdCBydG5sX2VtYXRjaF9vcHMKK3sKKwlpbnQJCQkJZW9fa2luZDsKKwljb25zdCBjaGFyICoJCQllb19uYW1lOworCXNpemVfdAkJCQllb19kYXRhbGVuOworCisJaW50CQkJICAgICAgKCplb19wYXJzZSkoc3RydWN0IHJ0bmxfZW1hdGNoICosCisJCQkJCQkgIHZvaWQgKiwgc2l6ZV90KTsKKwl2b2lkCQkJICAgICAgKCplb19kdW1wKShzdHJ1Y3QgcnRubF9lbWF0Y2ggKiwKKwkJCQkJCSBzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKik7CisJc3RydWN0IG5sX2xpc3RfaGVhZAkJZW9fbGlzdDsKK307CisKK2V4dGVybiBpbnQJcnRubF9lbWF0Y2hfcmVnaXN0ZXIoc3RydWN0IHJ0bmxfZW1hdGNoX29wcyAqKTsKK2V4dGVybiBpbnQJcnRubF9lbWF0Y2hfdW5yZWdpc3RlcihzdHJ1Y3QgcnRubF9lbWF0Y2hfb3BzICopOworCitleHRlcm4gc3RydWN0IHJ0bmxfZW1hdGNoX29wcyAqCisJCXJ0bmxfZW1hdGNoX2xvb2t1cF9vcHMoaW50KTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9lbWF0Y2hfb3BzICoKKwkJcnRubF9lbWF0Y2hfbG9va3VwX29wc19uYW1lKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9lbWF0Y2ggKgorCQlydG5sX2VtYXRjaF9hbGxvYyhzdHJ1Y3QgcnRubF9lbWF0Y2hfb3BzICopOworZXh0ZXJuIHZvaWQJcnRubF9lbWF0Y2hfYWRkX2NoaWxkKHN0cnVjdCBydG5sX2VtYXRjaCAqLAorCQkJCSAgICAgIHN0cnVjdCBydG5sX2VtYXRjaCAqKTsKK2V4dGVybiB2b2lkCXJ0bmxfZW1hdGNoX3VubGluayhzdHJ1Y3QgcnRubF9lbWF0Y2ggKik7CitleHRlcm4gdm9pZAlydG5sX2VtYXRjaF9mcmVlKHN0cnVjdCBydG5sX2VtYXRjaCAqKTsKKworZXh0ZXJuIHZvaWQgKglydG5sX2VtYXRjaF9kYXRhKHN0cnVjdCBydG5sX2VtYXRjaCAqKTsKK2V4dGVybiB2b2lkCXJ0bmxfZW1hdGNoX3NldF9mbGFncyhzdHJ1Y3QgcnRubF9lbWF0Y2ggKiwgdWludDE2X3QpOworZXh0ZXJuIHZvaWQJcnRubF9lbWF0Y2hfdW5zZXRfZmxhZ3Moc3RydWN0IHJ0bmxfZW1hdGNoICosIHVpbnQxNl90KTsKK2V4dGVybiB1aW50MTZfdAlydG5sX2VtYXRjaF9nZXRfZmxhZ3Moc3RydWN0IHJ0bmxfZW1hdGNoICopOworCitleHRlcm4gc3RydWN0IHJ0bmxfZW1hdGNoX3RyZWUgKgorCQlydG5sX2VtYXRjaF90cmVlX2FsbG9jKHVpbnQxNl90KTsKK2V4dGVybiB2b2lkCXJ0bmxfZW1hdGNoX3RyZWVfZnJlZShzdHJ1Y3QgcnRubF9lbWF0Y2hfdHJlZSAqKTsKKworZXh0ZXJuIGludAlydG5sX2VtYXRjaF9wYXJzZShzdHJ1Y3QgbmxhdHRyICosIHN0cnVjdCBydG5sX2VtYXRjaF90cmVlICoqKTsKK2V4dGVybiB2b2lkCXJ0bmxfZW1hdGNoX3RyZWVfYWRkX3RhaWwoc3RydWN0IHJ0bmxfZW1hdGNoX3RyZWUgKiwKKwkJCQkJICBzdHJ1Y3QgcnRubF9lbWF0Y2ggKik7CitleHRlcm4gdm9pZAlydG5sX2VtYXRjaF90cmVlX2R1bXAoc3RydWN0IHJ0bmxfZW1hdGNoX3RyZWUgKiwKKwkJCQkgICAgICBzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvbGluay5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjMwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9saW5rLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL2xpbmsuaAkJTGlua3MgKEludGVyZmFjZXMpCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX0xJTktfSF8KKyNkZWZpbmUgTkVUTElOS19MSU5LX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJ0bmxfbGluazsKKworZW51bSBydG5sX2xpbmtfc3QgeworCVJUTkxfTElOS19SWF9QQUNLRVRTLAorCVJUTkxfTElOS19UWF9QQUNLRVRTLAorCVJUTkxfTElOS19SWF9CWVRFUywKKwlSVE5MX0xJTktfVFhfQllURVMsCisJUlROTF9MSU5LX1JYX0VSUk9SUywKKwlSVE5MX0xJTktfVFhfRVJST1JTLAorCVJUTkxfTElOS19SWF9EUk9QUEVELAorCVJUTkxfTElOS19UWF9EUk9QUEVELAorCVJUTkxfTElOS19SWF9DT01QUkVTU0VELAorCVJUTkxfTElOS19UWF9DT01QUkVTU0VELAorCVJUTkxfTElOS19SWF9GSUZPX0VSUiwKKwlSVE5MX0xJTktfVFhfRklGT19FUlIsCisJUlROTF9MSU5LX1JYX0xFTl9FUlIsCisJUlROTF9MSU5LX1JYX09WRVJfRVJSLAorCVJUTkxfTElOS19SWF9DUkNfRVJSLAorCVJUTkxfTElOS19SWF9GUkFNRV9FUlIsCisJUlROTF9MSU5LX1JYX01JU1NFRF9FUlIsCisJUlROTF9MSU5LX1RYX0FCT1JUX0VSUiwKKwlSVE5MX0xJTktfVFhfQ0FSUklFUl9FUlIsCisJUlROTF9MSU5LX1RYX0hCRUFUX0VSUiwKKwlSVE5MX0xJTktfVFhfV0lOX0VSUiwKKwlSVE5MX0xJTktfVFhfQ09MTElTSU9OUywKKwlSVE5MX0xJTktfTVVMVElDQVNULAorCV9fUlROTF9MSU5LX1NUQVRTX01BWCwKK307CisKKyNkZWZpbmUgUlROTF9MSU5LX1NUQVRTX01BWCAoX19SVE5MX0xJTktfU1RBVFNfTUFYIC0gMSkKKworLyogbGluayBvYmplY3QgYWxsb2NhdGlvbi9mcmVlYWdlICovCitleHRlcm4gc3RydWN0IHJ0bmxfbGluayAqcnRubF9saW5rX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3B1dChzdHJ1Y3QgcnRubF9saW5rICopOworZXh0ZXJuIHZvaWQJcnRubF9saW5rX2ZyZWUoc3RydWN0IHJ0bmxfbGluayAqKTsKKworLyogbGluayBjYWNoZSBtYW5hZ2VtZW50ICovCitleHRlcm4gaW50CXJ0bmxfbGlua19hbGxvY19jYWNoZShzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgbmxfY2FjaGUgKiopOworZXh0ZXJuIHN0cnVjdCBydG5sX2xpbmsgKnJ0bmxfbGlua19nZXQoc3RydWN0IG5sX2NhY2hlICosIGludCk7CitleHRlcm4gc3RydWN0IHJ0bmxfbGluayAqcnRubF9saW5rX2dldF9ieV9uYW1lKHN0cnVjdCBubF9jYWNoZSAqLCBjb25zdCBjaGFyICopOworCisKK2V4dGVybiBpbnQJcnRubF9saW5rX2J1aWxkX2NoYW5nZV9yZXF1ZXN0KHN0cnVjdCBydG5sX2xpbmsgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBydG5sX2xpbmsgKiwgaW50LAorCQkJCQkgICAgICAgc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CXJ0bmxfbGlua19jaGFuZ2Uoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IHJ0bmxfbGluayAqLAorCQkJCSBzdHJ1Y3QgcnRubF9saW5rICosIGludCk7CisKKy8qIE5hbWUgPC0+IEluZGV4IFRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGNoYXIgKiAJcnRubF9saW5rX2kybmFtZShzdHJ1Y3QgbmxfY2FjaGUgKiwgaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CXJ0bmxfbGlua19uYW1lMmkoc3RydWN0IG5sX2NhY2hlICosIGNvbnN0IGNoYXIgKik7CisKKy8qIE5hbWUgPC0+IFN0YXRpc3RpYyBUcmFuc2xhdGlvbnMgKi8KK2V4dGVybiBjaGFyICoJcnRubF9saW5rX3N0YXQyc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX2xpbmtfc3RyMnN0YXQoY29uc3QgY2hhciAqKTsKKworLyogTGluayBGbGFncyBUcmFuc2xhdGlvbnMgKi8KK2V4dGVybiBjaGFyICoJcnRubF9saW5rX2ZsYWdzMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX3N0cjJmbGFncyhjb25zdCBjaGFyICopOworCitleHRlcm4gY2hhciAqCXJ0bmxfbGlua19vcGVyc3RhdGUyc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX2xpbmtfc3RyMm9wZXJzdGF0ZShjb25zdCBjaGFyICopOworCitleHRlcm4gY2hhciAqCXJ0bmxfbGlua19tb2RlMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX3N0cjJtb2RlKGNvbnN0IGNoYXIgKik7CisKKy8qIEFjY2VzcyBGdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfcWRpc2Moc3RydWN0IHJ0bmxfbGluayAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKglydG5sX2xpbmtfZ2V0X3FkaXNjKHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfbmFtZShzdHJ1Y3QgcnRubF9saW5rICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqCXJ0bmxfbGlua19nZXRfbmFtZShzdHJ1Y3QgcnRubF9saW5rICopOworCitleHRlcm4gdm9pZAlydG5sX2xpbmtfc2V0X2ZsYWdzKHN0cnVjdCBydG5sX2xpbmsgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkCXJ0bmxfbGlua191bnNldF9mbGFncyhzdHJ1Y3QgcnRubF9saW5rICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IHJ0bmxfbGlua19nZXRfZmxhZ3Moc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9tdHUoc3RydWN0IHJ0bmxfbGluayAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBydG5sX2xpbmtfZ2V0X210dShzdHJ1Y3QgcnRubF9saW5rICopOworCitleHRlcm4gdm9pZAlydG5sX2xpbmtfc2V0X3R4cWxlbihzdHJ1Y3QgcnRubF9saW5rICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IHJ0bmxfbGlua19nZXRfdHhxbGVuKHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfd2VpZ2h0KHN0cnVjdCBydG5sX2xpbmsgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnRubF9saW5rX2dldF93ZWlnaHQoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9pZmluZGV4KHN0cnVjdCBydG5sX2xpbmsgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX2dldF9pZmluZGV4KHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfZmFtaWx5KHN0cnVjdCBydG5sX2xpbmsgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX2dldF9mYW1pbHkoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9hcnB0eXBlKHN0cnVjdCBydG5sX2xpbmsgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnRubF9saW5rX2dldF9hcnB0eXBlKHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfYWRkcihzdHJ1Y3QgcnRubF9saW5rICosIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICpydG5sX2xpbmtfZ2V0X2FkZHIoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9icm9hZGNhc3Qoc3RydWN0IHJ0bmxfbGluayAqLCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqcnRubF9saW5rX2dldF9icm9hZGNhc3Qoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9saW5rKHN0cnVjdCBydG5sX2xpbmsgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX2dldF9saW5rKHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfbWFzdGVyKHN0cnVjdCBydG5sX2xpbmsgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9saW5rX2dldF9tYXN0ZXIoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9saW5rX3NldF9vcGVyc3RhdGUoc3RydWN0IHJ0bmxfbGluayAqLCB1aW50OF90KTsKK2V4dGVybiB1aW50OF90CXJ0bmxfbGlua19nZXRfb3BlcnN0YXRlKHN0cnVjdCBydG5sX2xpbmsgKik7CisKK2V4dGVybiB2b2lkCXJ0bmxfbGlua19zZXRfbGlua21vZGUoc3RydWN0IHJ0bmxfbGluayAqLCB1aW50OF90KTsKK2V4dGVybiB1aW50OF90CXJ0bmxfbGlua19nZXRfbGlua21vZGUoc3RydWN0IHJ0bmxfbGluayAqKTsKKworZXh0ZXJuIHVpbnQ2NF90IHJ0bmxfbGlua19nZXRfc3RhdChzdHJ1Y3QgcnRubF9saW5rICosIGludCk7CisKK2V4dGVybiBpbnQJcnRubF9saW5rX3NldF9pbmZvX3R5cGUoc3RydWN0IHJ0bmxfbGluayAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKglydG5sX2xpbmtfZ2V0X2luZm9fdHlwZShzdHJ1Y3QgcnRubF9saW5rICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25laWdoYm91ci5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvbmVpZ2hib3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4NTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25laWdoYm91ci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL25laWdoYm91ci5oCU5laWdoYm91cnMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfTkVJR0hCT1VSX0hfCisjZGVmaW5lIE5FVExJTktfTkVJR0hCT1VSX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJ0bmxfbmVpZ2g7CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9uZWlnaCAqcnRubF9uZWlnaF9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkCXJ0bmxfbmVpZ2hfcHV0KHN0cnVjdCBydG5sX25laWdoICopOworCitleHRlcm4gaW50CXJ0bmxfbmVpZ2hfYWxsb2NfY2FjaGUoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IG5sX2NhY2hlICoqKTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9uZWlnaCAqcnRubF9uZWlnaF9nZXQoc3RydWN0IG5sX2NhY2hlICosIGludCwKKwkJCQkJICAgICAgIHN0cnVjdCBubF9hZGRyICopOworCitleHRlcm4gY2hhciAqCXJ0bmxfbmVpZ2hfc3RhdGUyc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX25laWdoX3N0cjJzdGF0ZShjb25zdCBjaGFyICopOworCitleHRlcm4gY2hhciAqCXJ0bmxfbmVpZ2hfZmxhZ3Myc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX25laWdoX3N0cjJmbGFnKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQJcnRubF9uZWlnaF9hZGQoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IHJ0bmxfbmVpZ2ggKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9uZWlnaF9idWlsZF9hZGRfcmVxdWVzdChzdHJ1Y3QgcnRubF9uZWlnaCAqLCBpbnQsCisJCQkJCSAgICAgc3RydWN0IG5sX21zZyAqKik7CisKK2V4dGVybiBpbnQJcnRubF9uZWlnaF9kZWxldGUoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IHJ0bmxfbmVpZ2ggKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9uZWlnaF9idWlsZF9kZWxldGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9uZWlnaCAqLCBpbnQsCisJCQkJCQlzdHJ1Y3QgbmxfbXNnICoqKTsKKworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3NldF9zdGF0ZShzdHJ1Y3QgcnRubF9uZWlnaCAqLCBpbnQpOworZXh0ZXJuIGludAkJCXJ0bmxfbmVpZ2hfZ2V0X3N0YXRlKHN0cnVjdCBydG5sX25laWdoICopOworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3Vuc2V0X3N0YXRlKHN0cnVjdCBydG5sX25laWdoICosCisJCQkJCQkgICAgICAgaW50KTsKKworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3NldF9mbGFncyhzdHJ1Y3QgcnRubF9uZWlnaCAqLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3Vuc2V0X2ZsYWdzKHN0cnVjdCBydG5sX25laWdoICosCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQJCXJ0bmxfbmVpZ2hfZ2V0X2ZsYWdzKHN0cnVjdCBydG5sX25laWdoICopOworCitleHRlcm4gdm9pZAkJCXJ0bmxfbmVpZ2hfc2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfbmVpZ2ggKiwKKwkJCQkJCSAgICAgICBpbnQpOworZXh0ZXJuIGludAkJCXJ0bmxfbmVpZ2hfZ2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfbmVpZ2ggKik7CisKK2V4dGVybiB2b2lkCQkJcnRubF9uZWlnaF9zZXRfbGxhZGRyKHN0cnVjdCBydG5sX25laWdoICosCisJCQkJCQkgICAgICBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqCQlydG5sX25laWdoX2dldF9sbGFkZHIoc3RydWN0IHJ0bmxfbmVpZ2ggKik7CisKK2V4dGVybiBpbnQJCQlydG5sX25laWdoX3NldF9kc3Qoc3RydWN0IHJ0bmxfbmVpZ2ggKiwKKwkJCQkJCSAgIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJCXJ0bmxfbmVpZ2hfZ2V0X2RzdChzdHJ1Y3QgcnRubF9uZWlnaCAqKTsKKworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3NldF90eXBlKHN0cnVjdCBydG5sX25laWdoICosIGludCk7CitleHRlcm4gaW50CQkJcnRubF9uZWlnaF9nZXRfdHlwZShzdHJ1Y3QgcnRubF9uZWlnaCAqKTsKKworZXh0ZXJuIHZvaWQJCQlydG5sX25laWdoX3NldF9mYW1pbHkoc3RydWN0IHJ0bmxfbmVpZ2ggKiwgaW50KTsKK2V4dGVybiBpbnQJCQlydG5sX25laWdoX2dldF9mYW1pbHkoc3RydWN0IHJ0bmxfbmVpZ2ggKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvbmVpZ2h0YmwuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25laWdodGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyYzNlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25laWdodGJsLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIG5ldGxpbmsvcm91dGUvbmVpZ2h0YmwuaAlOZWlnaGJvdXIgVGFibGVzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX05FSUdIVEJMX0hfCisjZGVmaW5lIE5FVExJTktfTkVJR0hUQkxfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2FkZHIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgcnRubF9uZWlnaHRibDsKKworZXh0ZXJuIHN0cnVjdCBydG5sX25laWdodGJsICpydG5sX25laWdodGJsX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9wdXQoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKik7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX2ZyZWUoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKik7CitleHRlcm4gaW50IHJ0bmxfbmVpZ2h0YmxfYWxsb2NfY2FjaGUoc3RydWN0IG5sX3NvY2sgKiwgc3RydWN0IG5sX2NhY2hlICoqKTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9uZWlnaHRibCAqcnRubF9uZWlnaHRibF9nZXQoc3RydWN0IG5sX2NhY2hlICosCisJCQkJCSAgICAgICBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX2R1bXAoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgRklMRSAqLAorCQkJICAgICAgIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKKworZXh0ZXJuIGludCBydG5sX25laWdodGJsX2J1aWxkX2NoYW5nZV9yZXF1ZXN0KHN0cnVjdCBydG5sX25laWdodGJsICosCisJCQkJCSAgICAgIHN0cnVjdCBydG5sX25laWdodGJsICosCisJCQkJCSAgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludCBydG5sX25laWdodGJsX2NoYW5nZShzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgcnRubF9uZWlnaHRibCAqLAorCQkJCXN0cnVjdCBydG5sX25laWdodGJsICopOworCitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX3NldF9mYW1pbHkoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgaW50KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X2djX3RyZXNoMShzdHJ1Y3QgcnRubF9uZWlnaHRibCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9zZXRfZ2NfdHJlc2gyKHN0cnVjdCBydG5sX25laWdodGJsICosIGludCk7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX3NldF9nY190cmVzaDMoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgaW50KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X25hbWUoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X2RldihzdHJ1Y3QgcnRubF9uZWlnaHRibCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9zZXRfcXVldWVfbGVuKHN0cnVjdCBydG5sX25laWdodGJsICosIGludCk7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX3NldF9wcm94eV9xdWV1ZV9sZW4oc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgaW50KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X2FwcF9wcm9iZXMoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgaW50KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X3VjYXN0X3Byb2JlcyhzdHJ1Y3QgcnRubF9uZWlnaHRibCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9zZXRfbWNhc3RfcHJvYmVzKHN0cnVjdCBydG5sX25laWdodGJsICosIGludCk7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX3NldF9iYXNlX3JlYWNoYWJsZV90aW1lKHN0cnVjdCBydG5sX25laWdodGJsICosCisJCQkJCQkgIHVpbnQ2NF90KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X3JldHJhbnNfdGltZShzdHJ1Y3QgcnRubF9uZWlnaHRibCAqLCB1aW50NjRfdCk7CitleHRlcm4gdm9pZCBydG5sX25laWdodGJsX3NldF9nY19zdGFsZV90aW1lKHN0cnVjdCBydG5sX25laWdodGJsICosIHVpbnQ2NF90KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X2RlbGF5X3Byb2JlX3RpbWUoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwKKwkJCQkJICAgICAgIHVpbnQ2NF90KTsKK2V4dGVybiB2b2lkIHJ0bmxfbmVpZ2h0Ymxfc2V0X2FueWNhc3RfZGVsYXkoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgdWludDY0X3QpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9zZXRfcHJveHlfZGVsYXkoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgdWludDY0X3QpOworZXh0ZXJuIHZvaWQgcnRubF9uZWlnaHRibF9zZXRfbG9ja3RpbWUoc3RydWN0IHJ0bmxfbmVpZ2h0YmwgKiwgdWludDY0X3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25leHRob3AuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL25leHRob3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE0NGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvbmV4dGhvcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL25leHRob3AuaAlSb3V0aW5nIE5leHRob3AKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfUk9VVEVfTkVYVEhPUF9IXworI2RlZmluZSBORVRMSU5LX1JPVVRFX05FWFRIT1BfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvYWRkci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBydG5sX25leHRob3A7CisKK2VudW0geworCU5IX0RVTVBfRlJPTV9PTkVMSU5FID0gLTIsCisJTkhfRFVNUF9GUk9NX0RFVEFJTFMgPSAtMSwKKwlOSF9EVU1QX0ZST01fRU5WID0gMCwKKwkvKiA+IDAgcmVzZXJ2ZWQgZm9yIG5leHRob3AgaW5kZXggKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9uZXh0aG9wICogcnRubF9yb3V0ZV9uaF9hbGxvYyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9uZXh0aG9wICogcnRubF9yb3V0ZV9uaF9jbG9uZShzdHJ1Y3QgcnRubF9uZXh0aG9wICopOworZXh0ZXJuIHZvaWQJCXJ0bmxfcm91dGVfbmhfZnJlZShzdHJ1Y3QgcnRubF9uZXh0aG9wICopOworCitleHRlcm4gaW50CQlydG5sX3JvdXRlX25oX2NvbXBhcmUoc3RydWN0IHJ0bmxfbmV4dGhvcCAqLAorCQkJCQkgICAgICBzdHJ1Y3QgcnRubF9uZXh0aG9wICosCisJCQkJCSAgICAgIHVpbnQzMl90LCBpbnQpOworCitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF9kdW1wKHN0cnVjdCBydG5sX25leHRob3AgKiwKKwkJCQkJICAgc3RydWN0IG5sX2R1bXBfcGFyYW1zICopOworCitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF9zZXRfd2VpZ2h0KHN0cnVjdCBydG5sX25leHRob3AgKiwgdWludDhfdCk7CitleHRlcm4gdWludDhfdAkJcnRubF9yb3V0ZV9uaF9nZXRfd2VpZ2h0KHN0cnVjdCBydG5sX25leHRob3AgKik7CitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF9zZXRfaWZpbmRleChzdHJ1Y3QgcnRubF9uZXh0aG9wICosIGludCk7CitleHRlcm4gaW50CQlydG5sX3JvdXRlX25oX2dldF9pZmluZGV4KHN0cnVjdCBydG5sX25leHRob3AgKik7CitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF9zZXRfZ2F0ZXdheShzdHJ1Y3QgcnRubF9uZXh0aG9wICosCisJCQkJCQkgIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJcnRubF9yb3V0ZV9uaF9nZXRfZ2F0ZXdheShzdHJ1Y3QgcnRubF9uZXh0aG9wICopOworZXh0ZXJuIHZvaWQJCXJ0bmxfcm91dGVfbmhfc2V0X2ZsYWdzKHN0cnVjdCBydG5sX25leHRob3AgKiwKKwkJCQkJCXVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF91bnNldF9mbGFncyhzdHJ1Y3QgcnRubF9uZXh0aG9wICosCisJCQkJCQkgIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50CXJ0bmxfcm91dGVfbmhfZ2V0X2ZsYWdzKHN0cnVjdCBydG5sX25leHRob3AgKik7CitleHRlcm4gdm9pZAkJcnRubF9yb3V0ZV9uaF9zZXRfcmVhbG1zKHN0cnVjdCBydG5sX25leHRob3AgKiwKKwkJCQkJCSB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QJCXJ0bmxfcm91dGVfbmhfZ2V0X3JlYWxtcyhzdHJ1Y3QgcnRubF9uZXh0aG9wICopOworCitleHRlcm4gY2hhciAqCQlydG5sX3JvdXRlX25oX2ZsYWdzMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCXJ0bmxfcm91dGVfbmhfc3RyMmZsYWdzKGNvbnN0IGNoYXIgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvcWRpc2MuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3FkaXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZDZlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3FkaXNjLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIG5ldGxpbmsvcm91dGUvcWRpc2MuaCAgICAgICAgIFF1ZXVlaW5nIERpc2NpcGxpbmVzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX1FESVNDX0hfCisjZGVmaW5lIE5FVExJTktfUURJU0NfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL3JvdXRlL3RjLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJ0bmxfcWRpc2M7CisKK2V4dGVybiBzdHJ1Y3Qgbmxfb2JqZWN0X29wcyBxZGlzY19vYmpfb3BzOworCitleHRlcm4gc3RydWN0IHJ0bmxfcWRpc2MgKnJ0bmxfcWRpc2NfYWxsb2Modm9pZCk7CitleHRlcm4gdm9pZAlydG5sX3FkaXNjX3B1dChzdHJ1Y3QgcnRubF9xZGlzYyAqKTsKKworZXh0ZXJuIGludAlydG5sX3FkaXNjX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBubF9jYWNoZSAqKik7CitleHRlcm4gc3RydWN0IHJ0bmxfcWRpc2MgKnJ0bmxfcWRpc2NfZ2V0KHN0cnVjdCBubF9jYWNoZSAqLCBpbnQsIHVpbnQzMl90KTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9xZGlzYyAqcnRubF9xZGlzY19nZXRfYnlfcGFyZW50KHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkJICAgaW50LCB1aW50MzJfdCk7CisKK2V4dGVybiBpbnQJcnRubF9xZGlzY19idWlsZF9hZGRfcmVxdWVzdChzdHJ1Y3QgcnRubF9xZGlzYyAqLCBpbnQsCisJCQkJCSAgICAgc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CXJ0bmxfcWRpc2NfYWRkKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX3FkaXNjICosIGludCk7CisKK2V4dGVybiBpbnQJcnRubF9xZGlzY19idWlsZF9jaGFuZ2VfcmVxdWVzdChzdHJ1Y3QgcnRubF9xZGlzYyAqLAorCQkJCQkJc3RydWN0IHJ0bmxfcWRpc2MgKiwKKwkJCQkJCXN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAlydG5sX3FkaXNjX2NoYW5nZShzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgcnRubF9xZGlzYyAqLAorCQkJCSAgc3RydWN0IHJ0bmxfcWRpc2MgKik7CisKK2V4dGVybiBpbnQJcnRubF9xZGlzY19idWlsZF9kZWxldGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9xZGlzYyAqLAorCQkJCQkJc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CXJ0bmxfcWRpc2NfZGVsZXRlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX3FkaXNjICopOworCitleHRlcm4gdm9pZAlydG5sX3FkaXNjX3NldF9pZmluZGV4KHN0cnVjdCBydG5sX3FkaXNjICosIGludCk7CitleHRlcm4gaW50CXJ0bmxfcWRpc2NfZ2V0X2lmaW5kZXgoc3RydWN0IHJ0bmxfcWRpc2MgKik7CitleHRlcm4gdm9pZAlydG5sX3FkaXNjX3NldF9oYW5kbGUoc3RydWN0IHJ0bmxfcWRpc2MgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CXJ0bmxfcWRpc2NfZ2V0X2hhbmRsZShzdHJ1Y3QgcnRubF9xZGlzYyAqKTsKK2V4dGVybiB2b2lkCXJ0bmxfcWRpc2Nfc2V0X3BhcmVudChzdHJ1Y3QgcnRubF9xZGlzYyAqLCB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QJcnRubF9xZGlzY19nZXRfcGFyZW50KHN0cnVjdCBydG5sX3FkaXNjICopOworZXh0ZXJuIHZvaWQJcnRubF9xZGlzY19zZXRfa2luZChzdHJ1Y3QgcnRubF9xZGlzYyAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKglydG5sX3FkaXNjX2dldF9raW5kKHN0cnVjdCBydG5sX3FkaXNjICopOworZXh0ZXJuIHVpbnQ2NF90CXJ0bmxfcWRpc2NfZ2V0X3N0YXQoc3RydWN0IHJ0bmxfcWRpc2MgKiwgZW51bSBydG5sX3RjX3N0YXRzX2lkKTsKKworZXh0ZXJuIHZvaWQJcnRubF9xZGlzY19mb3JlYWNoX2NoaWxkKHN0cnVjdCBydG5sX3FkaXNjICosIHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCQkgdm9pZCAoKmNiKShzdHJ1Y3Qgbmxfb2JqZWN0ICosIHZvaWQgKiksCisJCQkJCSB2b2lkICopOworCitleHRlcm4gdm9pZAlydG5sX3FkaXNjX2ZvcmVhY2hfY2xzKHN0cnVjdCBydG5sX3FkaXNjICosIHN0cnVjdCBubF9jYWNoZSAqLAorCQkJCSAgICAgICB2b2lkICgqY2IpKHN0cnVjdCBubF9vYmplY3QgKiwgdm9pZCAqKSwKKwkJCQkgICAgICAgdm9pZCAqKTsKKworZXh0ZXJuIHN0cnVjdCBubF9tc2cgKglydG5sX3FkaXNjX2dldF9vcHRzKHN0cnVjdCBydG5sX3FkaXNjICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3JvdXRlLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjljZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9yb3V0ZS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogbmV0bGluay9yb3V0ZS9yb3V0ZS5oCVJvdXRlcworICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19ST1VURV9IXworI2RlZmluZSBORVRMSU5LX1JPVVRFX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9kYXRhLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9uZXh0aG9wLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9ydG5sLmg+CisjaW5jbHVkZSA8bGludXgvaW5fcm91dGUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBmbGFncyAqLworI2RlZmluZSBST1VURV9DQUNIRV9DT05URU5UCTEKKworc3RydWN0IHJ0bmxfcm91dGU7CisKK3N0cnVjdCBydG5sX3J0Y2FjaGVpbmZvCit7CisJdWludDMyX3QJcnRjaV9jbG50cmVmOworCXVpbnQzMl90CXJ0Y2lfbGFzdF91c2U7CisJdWludDMyX3QJcnRjaV9leHBpcmVzOworCWludDMyX3QJCXJ0Y2lfZXJyb3I7CisJdWludDMyX3QJcnRjaV91c2VkOworCXVpbnQzMl90CXJ0Y2lfaWQ7CisJdWludDMyX3QJcnRjaV90czsKKwl1aW50MzJfdAlydGNpX3RzYWdlOworfTsKKworZXh0ZXJuIHN0cnVjdCBubF9vYmplY3Rfb3BzIHJvdXRlX29ial9vcHM7CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9yb3V0ZSAqCXJ0bmxfcm91dGVfYWxsb2Modm9pZCk7CitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3B1dChzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9hbGxvY19jYWNoZShzdHJ1Y3Qgbmxfc29jayAqLCBpbnQsIGludCwKKwkJCQkgICAgICAgc3RydWN0IG5sX2NhY2hlICoqKTsKKworZXh0ZXJuIHZvaWQJcnRubF9yb3V0ZV9nZXQoc3RydWN0IHJ0bmxfcm91dGUgKik7CitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3B1dChzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKKworZXh0ZXJuIGludAlydG5sX3JvdXRlX3BhcnNlKHN0cnVjdCBubG1zZ2hkciAqLCBzdHJ1Y3QgcnRubF9yb3V0ZSAqKik7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfYnVpbGRfbXNnKHN0cnVjdCBubF9tc2cgKiwgc3RydWN0IHJ0bmxfcm91dGUgKik7CisKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9idWlsZF9hZGRfcmVxdWVzdChzdHJ1Y3QgcnRubF9yb3V0ZSAqLCBpbnQsCisJCQkJCSAgICAgc3RydWN0IG5sX21zZyAqKik7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfYWRkKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX3JvdXRlICosIGludCk7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfYnVpbGRfZGVsX3JlcXVlc3Qoc3RydWN0IHJ0bmxfcm91dGUgKiwgaW50LAorCQkJCQkgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX2RlbGV0ZShzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgcnRubF9yb3V0ZSAqLCBpbnQpOworCitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3NldF90YWJsZShzdHJ1Y3QgcnRubF9yb3V0ZSAqLCB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QJcnRubF9yb3V0ZV9nZXRfdGFibGUoc3RydWN0IHJ0bmxfcm91dGUgKik7CitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3NldF9zY29wZShzdHJ1Y3QgcnRubF9yb3V0ZSAqLCB1aW50OF90KTsKK2V4dGVybiB1aW50OF90CXJ0bmxfcm91dGVfZ2V0X3Njb3BlKHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIHZvaWQJcnRubF9yb3V0ZV9zZXRfdG9zKHN0cnVjdCBydG5sX3JvdXRlICosIHVpbnQ4X3QpOworZXh0ZXJuIHVpbnQ4X3QJcnRubF9yb3V0ZV9nZXRfdG9zKHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIHZvaWQJcnRubF9yb3V0ZV9zZXRfcHJvdG9jb2woc3RydWN0IHJ0bmxfcm91dGUgKiwgdWludDhfdCk7CitleHRlcm4gdWludDhfdAlydG5sX3JvdXRlX2dldF9wcm90b2NvbChzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKK2V4dGVybiB2b2lkCXJ0bmxfcm91dGVfc2V0X3ByaW9yaXR5KHN0cnVjdCBydG5sX3JvdXRlICosIHVpbnQzMl90KTsKK2V4dGVybiB1aW50MzJfdAlydG5sX3JvdXRlX2dldF9wcmlvcml0eShzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9zZXRfZmFtaWx5KHN0cnVjdCBydG5sX3JvdXRlICosIHVpbnQ4X3QpOworZXh0ZXJuIHVpbnQ4X3QJcnRubF9yb3V0ZV9nZXRfZmFtaWx5KHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3NldF90eXBlKHN0cnVjdCBydG5sX3JvdXRlICosIHVpbnQ4X3QpOworZXh0ZXJuIHVpbnQ4X3QJcnRubF9yb3V0ZV9nZXRfdHlwZShzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKK2V4dGVybiB2b2lkCXJ0bmxfcm91dGVfc2V0X2ZsYWdzKHN0cnVjdCBydG5sX3JvdXRlICosIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkCXJ0bmxfcm91dGVfdW5zZXRfZmxhZ3Moc3RydWN0IHJ0bmxfcm91dGUgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CXJ0bmxfcm91dGVfZ2V0X2ZsYWdzKHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3NldF9tZXRyaWMoc3RydWN0IHJ0bmxfcm91dGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3Vuc2V0X21ldHJpYyhzdHJ1Y3QgcnRubF9yb3V0ZSAqLCBpbnQpOworZXh0ZXJuIGludAlydG5sX3JvdXRlX2dldF9tZXRyaWMoc3RydWN0IHJ0bmxfcm91dGUgKiwgaW50LCB1aW50MzJfdCAqKTsKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9zZXRfZHN0KHN0cnVjdCBydG5sX3JvdXRlICosIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICpydG5sX3JvdXRlX2dldF9kc3Qoc3RydWN0IHJ0bmxfcm91dGUgKik7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfc2V0X3NyYyhzdHJ1Y3QgcnRubF9yb3V0ZSAqLCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqcnRubF9yb3V0ZV9nZXRfc3JjKHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3NldF9wcmVmX3NyYyhzdHJ1Y3QgcnRubF9yb3V0ZSAqLCBzdHJ1Y3QgbmxfYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfYWRkciAqcnRubF9yb3V0ZV9nZXRfcHJlZl9zcmMoc3RydWN0IHJ0bmxfcm91dGUgKik7CitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3NldF9paWYoc3RydWN0IHJ0bmxfcm91dGUgKiwgaW50KTsKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9nZXRfaWlmKHN0cnVjdCBydG5sX3JvdXRlICopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX2dldF9zcmNfbGVuKHN0cnVjdCBydG5sX3JvdXRlICopOworCitleHRlcm4gdm9pZAlydG5sX3JvdXRlX2FkZF9uZXh0aG9wKHN0cnVjdCBydG5sX3JvdXRlICosCisJCQkJICAgICAgIHN0cnVjdCBydG5sX25leHRob3AgKik7CitleHRlcm4gdm9pZAlydG5sX3JvdXRlX3JlbW92ZV9uZXh0aG9wKHN0cnVjdCBydG5sX3JvdXRlICosCisJCQkJCSAgc3RydWN0IHJ0bmxfbmV4dGhvcCAqKTsKK2V4dGVybiBzdHJ1Y3QgbmxfbGlzdF9oZWFkICpydG5sX3JvdXRlX2dldF9uZXh0aG9wcyhzdHJ1Y3QgcnRubF9yb3V0ZSAqKTsKK2V4dGVybiBpbnQJcnRubF9yb3V0ZV9nZXRfbm5leHRob3BzKHN0cnVjdCBydG5sX3JvdXRlICopOworCitleHRlcm4gdm9pZAlydG5sX3JvdXRlX2ZvcmVhY2hfbmV4dGhvcChzdHJ1Y3QgcnRubF9yb3V0ZSAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYikoc3RydWN0IHJ0bmxfbmV4dGhvcCAqLCB2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKKworZXh0ZXJuIHN0cnVjdCBydG5sX25leHRob3AgKiBydG5sX3JvdXRlX25leHRob3BfbihzdHJ1Y3QgcnRubF9yb3V0ZSAqciwgaW50IG4pOworCitleHRlcm4gaW50CXJ0bmxfcm91dGVfZ3Vlc3Nfc2NvcGUoc3RydWN0IHJ0bmxfcm91dGUgKik7CisKK2V4dGVybiBjaGFyICoJcnRubF9yb3V0ZV90YWJsZTJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfc3RyMnRhYmxlKGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfcmVhZF90YWJsZV9uYW1lcyhjb25zdCBjaGFyICopOworCitleHRlcm4gY2hhciAqCXJ0bmxfcm91dGVfcHJvdG8yc3RyKGludCwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3N0cjJwcm90byhjb25zdCBjaGFyICopOworZXh0ZXJuIGludAlydG5sX3JvdXRlX3JlYWRfcHJvdG9jb2xfbmFtZXMoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGNoYXIgKglydG5sX3JvdXRlX21ldHJpYzJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CXJ0bmxfcm91dGVfc3RyMm1ldHJpYyhjb25zdCBjaGFyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3J0bmwuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3J0bmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUxYTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvcm91dGUvcnRubC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL3J0bmwuaAkJUm91dGluZyBOZXRsaW5rCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX1JUTkxfSF8KKyNkZWZpbmUgTkVUTElOS19SVE5MX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBuYW1lIFJlYWxtcworICogQHsKKyAqLworCisvKioKKyAqIE1hc2sgc3BlY3lpbmcgdGhlIHNpemUgb2YgZWFjaCByZWFsbSBwYXJ0CisgKiBAaW5ncm91cCBydG5sCisgKi8KKyNkZWZpbmUgUlROTF9SRUFMTV9NQVNLICgweEZGRkYpCisKKy8qKgorICogRXh0cmFjdCBGUk9NIHJlYWxtIGZyb20gYSByZWFsbXMgZmllbGQKKyAqLworI2RlZmluZSBSVE5MX1JFQUxNX0ZST00ocmVhbG0pICgocmVhbG0pID4+IDE2KQorCisvKioKKyAqIEV4dHJhY3QgVE8gcmVhbG0gZnJvbSBhIHJlYWxtcyBmaWVsZAorICovCisjZGVmaW5lIFJUTkxfUkVBTE1fVE8ocmVhbG0pICgocmVhbG0pICYgUlROTF9SRUFMTV9NQVNLKQorCisvKioKKyAqIEJ1aWxkIGEgcmVhbG1zIGZpZWxkCisgKi8KKyNkZWZpbmUgUlROTF9NQUtFX1JFQUxNKGZyb20sIHRvKSBcCisJKChSVE5MX1JFQUxNX1RPKGZyb20pIDw8IDE2KSAmIFJUTkxfUkVBTE1fVE8odG8pKQorCisvKiogQH0gKi8KKworCisvKiBHZW5lcmFsICovCitleHRlcm4gaW50CQlubF9ydGdlbl9yZXF1ZXN0KHN0cnVjdCBubF9zb2NrICosIGludCwgaW50LCBpbnQpOworCisvKiBSb3V0aW5nIFR5cGUgVHJhbnNsYXRpb25zICovCitleHRlcm4gY2hhciAqCQlubF9ydG50eXBlMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCW5sX3N0cjJydG50eXBlKGNvbnN0IGNoYXIgKik7CisKKy8qIFNjb3BlIFRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGNoYXIgKgkJcnRubF9zY29wZTJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CQlydG5sX3N0cjJzY29wZShjb25zdCBjaGFyICopOworCisvKiBSZWFsbXMgVHJhbnNsYXRpb25zICovCitleHRlcm4gY2hhciAqCQlydG5sX3JlYWxtczJzdHIodWludDMyX3QsIGNoYXIgKiwgc2l6ZV90KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9ydWxlLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS9ydWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4ZGMwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3J1bGUuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogbmV0bGluay9yb3V0ZS9ydWxlLmgJCVJ1bGVzCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuMQorICoJb2YgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2lmbmRlZiBORVRMSU5LX1JVTEVfSF8KKyNkZWZpbmUgTkVUTElOS19SVUxFX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9hZGRyLmg+CisjaW5jbHVkZSA8bmV0bGluay9yb3V0ZS9yb3V0ZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBydG5sX3J1bGU7CisKKy8qIEdlbmVyYWwgKi8KK2V4dGVybiBzdHJ1Y3QgcnRubF9ydWxlICoJcnRubF9ydWxlX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQJCQlydG5sX3J1bGVfcHV0KHN0cnVjdCBydG5sX3J1bGUgKik7CisKK2V4dGVybiBpbnQJcnRubF9ydWxlX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICosIGludCwKKwkJCQkgICAgICBzdHJ1Y3QgbmxfY2FjaGUgKiopOworZXh0ZXJuIHZvaWQgcnRubF9ydWxlX2R1bXAoc3RydWN0IHJ0bmxfcnVsZSAqLCBGSUxFICosIHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKKworZXh0ZXJuIGludAlydG5sX3J1bGVfYnVpbGRfYWRkX3JlcXVlc3Qoc3RydWN0IHJ0bmxfcnVsZSAqLCBpbnQsCisJCQkJCSAgICBzdHJ1Y3QgbmxfbXNnICoqKTsKK2V4dGVybiBpbnQgcnRubF9ydWxlX2FkZChzdHJ1Y3Qgbmxfc29jayAqLCBzdHJ1Y3QgcnRubF9ydWxlICosIGludCk7CitleHRlcm4gaW50CXJ0bmxfcnVsZV9idWlsZF9kZWxldGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9ydWxlICosIGludCwKKwkJCQkJICAgICAgIHN0cnVjdCBubF9tc2cgKiopOworZXh0ZXJuIGludCBydG5sX3J1bGVfZGVsZXRlKHN0cnVjdCBubF9zb2NrICosIHN0cnVjdCBydG5sX3J1bGUgKiwgaW50KTsKKworCisvKiBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uICovCitleHRlcm4gdm9pZAkJcnRubF9ydWxlX3NldF9mYW1pbHkoc3RydWN0IHJ0bmxfcnVsZSAqLCBpbnQpOworZXh0ZXJuIGludAkJcnRubF9ydWxlX2dldF9mYW1pbHkoc3RydWN0IHJ0bmxfcnVsZSAqKTsKK2V4dGVybiB2b2lkCQlydG5sX3J1bGVfc2V0X3ByaW8oc3RydWN0IHJ0bmxfcnVsZSAqLCBpbnQpOworZXh0ZXJuIGludAkJcnRubF9ydWxlX2dldF9wcmlvKHN0cnVjdCBydG5sX3J1bGUgKik7CitleHRlcm4gdm9pZAkJcnRubF9ydWxlX3NldF9tYXJrKHN0cnVjdCBydG5sX3J1bGUgKiwgdWludDY0X3QpOworZXh0ZXJuIHVpbnQ2NF90CQlydG5sX3J1bGVfZ2V0X21hcmsoc3RydWN0IHJ0bmxfcnVsZSAqKTsKK2V4dGVybiB2b2lkCQlydG5sX3J1bGVfc2V0X3RhYmxlKHN0cnVjdCBydG5sX3J1bGUgKiwgaW50KTsKK2V4dGVybiBpbnQJCXJ0bmxfcnVsZV9nZXRfdGFibGUoc3RydWN0IHJ0bmxfcnVsZSAqKTsKK2V4dGVybiB2b2lkCQlydG5sX3J1bGVfc2V0X2RzZmllbGQoc3RydWN0IHJ0bmxfcnVsZSAqLCBpbnQpOworZXh0ZXJuIGludAkJcnRubF9ydWxlX2dldF9kc2ZpZWxkKHN0cnVjdCBydG5sX3J1bGUgKik7CitleHRlcm4gaW50CQlydG5sX3J1bGVfc2V0X3NyYyhzdHJ1Y3QgcnRubF9ydWxlICosIHN0cnVjdCBubF9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBubF9hZGRyICoJcnRubF9ydWxlX2dldF9zcmMoc3RydWN0IHJ0bmxfcnVsZSAqKTsKK2V4dGVybiBpbnQJCXJ0bmxfcnVsZV9zZXRfZHN0KHN0cnVjdCBydG5sX3J1bGUgKiwgc3RydWN0IG5sX2FkZHIgKik7CitleHRlcm4gc3RydWN0IG5sX2FkZHIgKglydG5sX3J1bGVfZ2V0X2RzdChzdHJ1Y3QgcnRubF9ydWxlICopOworZXh0ZXJuIHZvaWQJCXJ0bmxfcnVsZV9zZXRfc3JjX2xlbihzdHJ1Y3QgcnRubF9ydWxlICosIGludCk7CitleHRlcm4gaW50CQlydG5sX3J1bGVfZ2V0X3NyY19sZW4oc3RydWN0IHJ0bmxfcnVsZSAqKTsKK2V4dGVybiB2b2lkCQlydG5sX3J1bGVfc2V0X2RzdF9sZW4oc3RydWN0IHJ0bmxfcnVsZSAqLCBpbnQpOworZXh0ZXJuIGludAkJcnRubF9ydWxlX2dldF9kc3RfbGVuKHN0cnVjdCBydG5sX3J1bGUgKik7CisKK2V4dGVybiB2b2lkCQlydG5sX3J1bGVfc2V0X2FjdGlvbihzdHJ1Y3QgcnRubF9ydWxlICosIGludCk7CitleHRlcm4gaW50CQlydG5sX3J1bGVfZ2V0X2FjdGlvbihzdHJ1Y3QgcnRubF9ydWxlICopOworCitleHRlcm4gaW50CQlydG5sX3J1bGVfc2V0X2lpZihzdHJ1Y3QgcnRubF9ydWxlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqCQlydG5sX3J1bGVfZ2V0X2lpZihzdHJ1Y3QgcnRubF9ydWxlICopOworCitleHRlcm4gdm9pZAkJcnRubF9ydWxlX3NldF9jbGFzc2lkKHN0cnVjdCBydG5sX3J1bGUgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CQlydG5sX3J1bGVfZ2V0X2NsYXNzaWQoc3RydWN0IHJ0bmxfcnVsZSAqKTsKKworZXh0ZXJuIHZvaWQJCXJ0bmxfcnVsZV9zZXRfcmVhbG1zKHN0cnVjdCBydG5sX3J1bGUgKiwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90CQlydG5sX3J1bGVfZ2V0X3JlYWxtcyhzdHJ1Y3QgcnRubF9ydWxlICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3JvdXRlL3RjLmggYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS90Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjg3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL2luY2x1ZGUvbmV0bGluay9yb3V0ZS90Yy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBuZXRsaW5rL3JvdXRlL3RjLmgJCVRyYWZmaWMgQ29udHJvbAorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19UQ19IXworI2RlZmluZSBORVRMSU5LX1RDX0hfCisKKyNpbmNsdWRlIDxuZXRsaW5rL25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2NhY2hlLmg+CisjaW5jbHVkZSA8bmV0bGluay9kYXRhLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBUQyBzdGF0aXN0aWNzIGlkZW50aWZpZXJzCisgKiBAaW5ncm91cCB0YworICovCitlbnVtIHJ0bmxfdGNfc3RhdHNfaWQgeworCVJUTkxfVENfUEFDS0VUUywJLyoqPCBQYWNrZXRzIHNlZW4gKi8KKwlSVE5MX1RDX0JZVEVTLAkJLyoqPCBCeXRlcyBzZWVuICovCisJUlROTF9UQ19SQVRFX0JQUywJLyoqPCBDdXJyZW50IGJpdHMvcyAocmF0ZSBlc3RpbWF0b3IpICovCisJUlROTF9UQ19SQVRFX1BQUywJLyoqPCBDdXJyZW50IHBhY2tldC9zIChyYXRlIGVzdGltYXRvcikgKi8KKwlSVE5MX1RDX1FMRU4sCQkvKio8IFF1ZXVlIGxlbmd0aCAqLworCVJUTkxfVENfQkFDS0xPRywJLyoqPCBCYWNrbG9nIGxlbmd0aCAqLworCVJUTkxfVENfRFJPUFMsCQkvKio8IFBhY2tldHMgZHJvcHBlZCAqLworCVJUTkxfVENfUkVRVUVVRVMsCS8qKjwgTnVtYmVyIG9mIHJlcXVldWVzICovCisJUlROTF9UQ19PVkVSTElNSVRTLAkvKio8IE51bWJlciBvZiBvdmVybGltaXRzICovCisJX19SVE5MX1RDX1NUQVRTX01BWCwKK307CisKKyNkZWZpbmUgUlROTF9UQ19TVEFUU19NQVggKF9fUlROTF9UQ19TVEFUU19NQVggLSAxKQorCitleHRlcm4gaW50IHJ0bmxfdGNfY2FsY190eHRpbWUoaW50LCBpbnQpOworZXh0ZXJuIGludCBydG5sX3RjX2NhbGNfYnVmc2l6ZShpbnQsIGludCk7CitleHRlcm4gaW50IHJ0bmxfdGNfY2FsY19jZWxsX2xvZyhpbnQpOworCisvKioKKyAqIE51bWJlciBvZiBlbnRyaWVzIGluIGEgdHJhbnNtaXNzaW9uIHRpbWUgbG9va3VwIHRhYmxlCisgKiBAaW5ncm91cCB0YworICovCisjZGVmaW5lIFJUTkxfVENfUlRBQkxFX1NJWkUJMjU2CisKK2V4dGVybiBpbnQgcnRubF90Y19idWlsZF9yYXRlX3RhYmxlKHVpbnQzMl90ICosIHVpbnQ4X3QsIHVpbnQ4X3QsIGludCwgaW50KTsKKworCisvKiBUQyBIYW5kbGUgVHJhbnNsYXRpb25zICovCitleHRlcm4gY2hhciAqCQlydG5sX3RjX2hhbmRsZTJzdHIodWludDMyX3QsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJCXJ0bmxfdGNfc3RyMmhhbmRsZShjb25zdCBjaGFyICosIHVpbnQzMl90ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3NvY2tldC5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3MWFlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3NvY2tldC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBuZXRsaW5rL3NvY2tldC5oCQlOZXRsaW5rIFNvY2tldAorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpZm5kZWYgTkVUTElOS19TT0NLRVRfSF8KKyNkZWZpbmUgTkVUTElOS19TT0NLRVRfSF8KKworI2luY2x1ZGUgPG5ldGxpbmsvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2hhbmRsZXJzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBubF9zb2NrICoJbmxfc29ja2V0X2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBubF9zb2NrICoJbmxfc29ja2V0X2FsbG9jX2NiKHN0cnVjdCBubF9jYiAqKTsKK2V4dGVybiB2b2lkCQlubF9zb2NrZXRfZnJlZShzdHJ1Y3Qgbmxfc29jayAqKTsKKworZXh0ZXJuIHVpbnQzMl90CQlubF9zb2NrZXRfZ2V0X2xvY2FsX3BvcnQoc3RydWN0IG5sX3NvY2sgKik7CitleHRlcm4gdm9pZAkJbmxfc29ja2V0X3NldF9sb2NhbF9wb3J0KHN0cnVjdCBubF9zb2NrICosIHVpbnQzMl90KTsKKworZXh0ZXJuIGludAkJbmxfc29ja2V0X2FkZF9tZW1iZXJzaGlwcyhzdHJ1Y3Qgbmxfc29jayAqLCBpbnQsIC4uLik7CitleHRlcm4gaW50CQlubF9zb2NrZXRfYWRkX21lbWJlcnNoaXAoc3RydWN0IG5sX3NvY2sgKiwgaW50KTsKK2V4dGVybiBpbnQJCW5sX3NvY2tldF9kcm9wX21lbWJlcnNoaXBzKHN0cnVjdCBubF9zb2NrICosIGludCwgLi4uKTsKK2V4dGVybiBpbnQJCW5sX3NvY2tldF9kcm9wX21lbWJlcnNoaXAoc3RydWN0IG5sX3NvY2sgKiwKKwkJCQkJCQkgIGludCk7CitleHRlcm4gdm9pZAkJbmxfam9pbl9ncm91cHMoc3RydWN0IG5sX3NvY2sgKiwgaW50KTsKKworCitleHRlcm4gdWludDMyX3QJCW5sX3NvY2tldF9nZXRfcGVlcl9wb3J0KHN0cnVjdCBubF9zb2NrICopOworZXh0ZXJuIHZvaWQJCW5sX3NvY2tldF9zZXRfcGVlcl9wb3J0KHN0cnVjdCBubF9zb2NrICosCisJCQkJCQkJdWludDMyX3QpOworCitleHRlcm4gc3RydWN0IG5sX2NiICoJbmxfc29ja2V0X2dldF9jYihzdHJ1Y3Qgbmxfc29jayAqKTsKK2V4dGVybiB2b2lkCQlubF9zb2NrZXRfc2V0X2NiKHN0cnVjdCBubF9zb2NrICosCisJCQkJCQkgc3RydWN0IG5sX2NiICopOworZXh0ZXJuIGludAkJbmxfc29ja2V0X21vZGlmeV9jYihzdHJ1Y3Qgbmxfc29jayAqLCBlbnVtIG5sX2NiX3R5cGUsCisJCQkJCSAgICBlbnVtIG5sX2NiX2tpbmQsCisJCQkJCSAgICBubF9yZWN2bXNnX21zZ19jYl90LCB2b2lkICopOworCitleHRlcm4gaW50CQlubF9zb2NrZXRfc2V0X2J1ZmZlcl9zaXplKHN0cnVjdCBubF9zb2NrICosIGludCwgaW50KTsKK2V4dGVybiBpbnQJCW5sX3NvY2tldF9zZXRfcGFzc2NyZWQoc3RydWN0IG5sX3NvY2sgKiwgaW50KTsKK2V4dGVybiBpbnQJCW5sX3NvY2tldF9yZWN2X3BrdGluZm8oc3RydWN0IG5sX3NvY2sgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQJCW5sX3NvY2tldF9kaXNhYmxlX3NlcV9jaGVjayhzdHJ1Y3Qgbmxfc29jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQJbmxfc29ja2V0X3VzZV9zZXEoc3RydWN0IG5sX3NvY2sgKik7CitleHRlcm4gdm9pZAkJbmxfc29ja2V0X2Rpc2FibGVfYXV0b19hY2soc3RydWN0IG5sX3NvY2sgKik7CitleHRlcm4gdm9pZAkJbmxfc29ja2V0X2VuYWJsZV9hdXRvX2FjayhzdHJ1Y3Qgbmxfc29jayAqKTsKKworZXh0ZXJuIGludAkJbmxfc29ja2V0X2dldF9mZChzdHJ1Y3Qgbmxfc29jayAqKTsKK2V4dGVybiBpbnQJCW5sX3NvY2tldF9zZXRfbm9uYmxvY2tpbmcoc3RydWN0IG5sX3NvY2sgKik7CitleHRlcm4gdm9pZAkJbmxfc29ja2V0X2VuYWJsZV9tc2dfcGVlayhzdHJ1Y3Qgbmxfc29jayAqKTsKK2V4dGVybiB2b2lkCQlubF9zb2NrZXRfZGlzYWJsZV9tc2dfcGVlayhzdHJ1Y3Qgbmxfc29jayAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJubF8yL2luY2x1ZGUvbmV0bGluay90eXBlcy5oIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBiOWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvdHlwZXMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIG5ldGxpbmsvbmV0bGluay10eXBlcy5oCU5ldGxpbmsgVHlwZXMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIF9fTkVUTElOS19UWVBFU19IXworI2RlZmluZSBfX05FVExJTktfVFlQRVNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qKgorICogRHVtcGluZyB0eXBlcyAoZHBfdHlwZSkKKyAqIEBpbmdyb3VwIHV0aWxzCisgKi8KK2VudW0gbmxfZHVtcF90eXBlIHsKKwlOTF9EVU1QX0xJTkUsCQkvKio8IER1bXAgb2JqZWN0IGJyaWVmbHkgb24gb25lIGxpbmUgKi8KKwlOTF9EVU1QX0RFVEFJTFMsCS8qKjwgRHVtcCBhbGwgYXR0cmlidXRlcyBidXQgbm8gc3RhdGlzdGljcyAqLworCU5MX0RVTVBfU1RBVFMsCQkvKio8IER1bXAgYWxsIGF0dHJpYnV0ZXMgaW5jbHVkaW5nIHN0YXRpc3RpY3MgKi8KKwlOTF9EVU1QX0VOViwJCS8qKjwgRHVtcCBhbGwgYXR0cmlidHVlcyBhcyBlbnYgdmFyaWFibGVzICovCisJX19OTF9EVU1QX01BWCwKK307CisjZGVmaW5lIE5MX0RVTVBfTUFYIChfX05MX0RVTVBfTUFYIC0gMSkKKworLyoqCisgKiBEdW1waW5nIHBhcmFtZXRlcnMKKyAqIEBpbmdyb3VwIHV0aWxzCisgKi8KK3N0cnVjdCBubF9kdW1wX3BhcmFtcworeworCS8qKgorCSAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBkdW1wIHRoYXQgaXMgcmVxdWVzdGVkLgorCSAqLworCWVudW0gbmxfZHVtcF90eXBlCWRwX3R5cGU7CisKKwkvKioKKwkgKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB3aGl0ZXNwYWNlcyB0byBiZSBwdXQgaW4gZnJvbnQKKwkgKiBvZiBldmVyeSBuZXcgbGluZSAoaW5kZW50YXRpb24pLgorCSAqLworCWludAkJCWRwX3ByZWZpeDsKKworCS8qKgorCSAqIENhdXNlcyB0aGUgY2FjaGUgaW5kZXggdG8gYmUgcHJpbnRlZCBmb3IgZWFjaCBlbGVtZW50LgorCSAqLworCWludAkJCWRwX3ByaW50X2luZGV4OworCisJLyoqCisJICogQ2F1c2VzIGVhY2ggZWxlbWVudCB0byBiZSBwcmVmaXhlZCB3aXRoIHRoZSBtZXNzYWdlIHR5cGUuCisJICovCisJaW50CQkJZHBfZHVtcF9tc2d0eXBlOworCisJLyoqCisJICogQSBjYWxsYmFjayBpbnZva2VkIGZvciBvdXRwdXQKKwkgKgorCSAqIFBhc3NlZCBhcmd1bWVudHMgYXJlOgorCSAqICAtIGR1bXBpbmcgcGFyYW1ldGVycworCSAqICAtIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIG91dHB1dAorCSAqLworCXZvaWQJCQkoKmRwX2NiKShzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKiwgY2hhciAqKTsKKworCS8qKgorCSAqIEEgY2FsbGJhY2sgaW52b2tlZCBmb3IgZXZlcnkgbmV3IGxpbmUsIGNhbiBiZSB1c2VkIHRvCisJICogY3VzdG9taXplIHRoZSBpbmRlbnRhdGlvbi4KKwkgKgorCSAqIFBhc3NlZCBhcmd1bWVudHMgYXJlOgorCSAqICAtIGR1bXBpbmcgcGFyYW1ldGVycworCSAqICAtIGxpbmUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gMAorCSAqLworCXZvaWQJCQkoKmRwX25sX2NiKShzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKiwgaW50KTsKKworCS8qKgorCSAqIFVzZXIgZGF0YSBwb2ludGVyLCBjYW4gYmUgdXNlZCB0byBwYXNzIGRhdGEgdG8gY2FsbGJhY2tzLgorCSAqLworCXZvaWQJCQkqZHBfZGF0YTsKKworCS8qKgorCSAqIEZpbGUgZGVzY3JpcHRvciB0aGUgZHVtcGluZyBvdXRwdXQgc2hvdWxkIGdvIHRvCisJICovCisJRklMRSAqCQkJZHBfZmQ7CisKKwkvKioKKwkgKiBBbHRlcm5hdGl2ZWx5IHRoZSBvdXRwdXQgbWF5IGJlIHJlZGlyZWN0ZWQgaW50byBhIGJ1ZmZlcgorCSAqLworCWNoYXIgKgkJCWRwX2J1ZjsKKworCS8qKgorCSAqIExlbmd0aCBvZiB0aGUgYnVmZmVyIGRwX2J1ZgorCSAqLworCXNpemVfdAkJCWRwX2J1ZmxlbjsKKworCS8qKgorCSAqIFBSSVZBVEUKKwkgKiBTZXQgaWYgYSBkdW1wIHdhcyBwZXJmb3JtZWQgcHJpb3IgdG8gdGhlIGFjdHVhbCBkdW1wIGhhbmRsZXIuCisJICovCisJaW50CQkJZHBfcHJlX2R1bXA7CisKKwkvKioKKwkgKiBQUklWQVRFCisJICogT3duZWQgYnkgdGhlIGN1cnJlbnQgY2FsbGVyCisJICovCisJaW50CQkJZHBfaXZhcjsKKworCXVuc2lnbmVkIGludAkJZHBfbGluZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvdXRpbHMuaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwYmFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3V0aWxzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIG5ldGxpbmsvdXRpbHMuaAkJVXRpbGl0eSBGdW5jdGlvbnMKKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4xCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUTElOS19VVElMU19IXworCisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0bGluay9saXN0Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAbmFtZSBQcm9iYWJpbGl0eSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBMb3dlciBwcm9iYWJpbGl0eSBsaW1pdAorICogQGluZ3JvdXAgdXRpbHMKKyAqLworI2RlZmluZSBOTF9QUk9CX01JTiAweDAKKworLyoqCisgKiBVcHBlciBwcm9iYWJpbGl0eSBsaW1pdAorICogQGluZ3JvdXAgdXRpbHMKKyAqLworI2RlZmluZSBOTF9QUk9CX01BWCAweGZmZmZmZmZmCisKKy8qKiBAfSAqLworCisvKiB1bml0IHByZXR0eS1wcmludGluZyAqLworZXh0ZXJuIGRvdWJsZQlubF9jYW5jZWxfZG93bl9ieXRlcyh1bnNpZ25lZCBsb25nIGxvbmcsIGNoYXIgKiopOworZXh0ZXJuIGRvdWJsZQlubF9jYW5jZWxfZG93bl9iaXRzKHVuc2lnbmVkIGxvbmcgbG9uZywgY2hhciAqKik7CitleHRlcm4gZG91YmxlCW5sX2NhbmNlbF9kb3duX3VzKHVpbnQzMl90LCBjaGFyICoqKTsKKworLyogZ2VuZXJpYyB1bml0IHRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGxvbmcJbmxfc2l6ZTJpbnQoY29uc3QgY2hhciAqKTsKK2V4dGVybiBsb25nCW5sX3Byb2IyaW50KGNvbnN0IGNoYXIgKik7CisKKy8qIHRpbWUgdHJhbnNsYXRpb25zICovCitleHRlcm4gaW50CW5sX2dldF9oeih2b2lkKTsKK2V4dGVybiB1aW50MzJfdAlubF91czJ0aWNrcyh1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QJbmxfdGlja3MydXModWludDMyX3QpOworZXh0ZXJuIGludAlubF9zdHIybXNlYyhjb25zdCBjaGFyICosIHVpbnQ2NF90ICopOworZXh0ZXJuIGNoYXIgKglubF9tc2VjMnN0cih1aW50NjRfdCwgY2hhciAqLCBzaXplX3QpOworCisvKiBsaW5rIGxheWVyIHByb3RvY29sIHRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGNoYXIgKglubF9sbHByb3RvMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJbmxfc3RyMmxscHJvdG8oY29uc3QgY2hhciAqKTsKKworLyogZXRoZXJuZXQgcHJvdG9jb2wgdHJhbnNsYXRpb25zICovCitleHRlcm4gY2hhciAqCW5sX2V0aGVyX3Byb3RvMnN0cihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQJbmxfc3RyMmV0aGVyX3Byb3RvKGNvbnN0IGNoYXIgKik7CisKKy8qIElQIHByb3RvY29sIHRyYW5zbGF0aW9ucyAqLworZXh0ZXJuIGNoYXIgKglubF9pcF9wcm90bzJzdHIoaW50LCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50CW5sX3N0cjJpcF9wcm90byhjb25zdCBjaGFyICopOworCisvKiBEdW1waW5nIGhlbHBlcnMgKi8KK2V4dGVybiB2b2lkCW5sX25ld19saW5lKHN0cnVjdCBubF9kdW1wX3BhcmFtcyAqKTsKK2V4dGVybiB2b2lkCW5sX2R1bXAoc3RydWN0IG5sX2R1bXBfcGFyYW1zICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiB2b2lkCW5sX2R1bXBfbGluZShzdHJ1Y3QgbmxfZHVtcF9wYXJhbXMgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3ZlcnNpb24uaCBiL2xpYm5sXzIvaW5jbHVkZS9uZXRsaW5rL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFmOGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibmxfMi9pbmNsdWRlL25ldGxpbmsvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBuZXRsaW5rL3ZlcnNpb24uaAlDb21waWxlIFRpbWUgVmVyc2lvbmluZyBJbmZvcm1hdGlvbgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLjEKKyAqCW9mIHRoZSBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaWZuZGVmIE5FVExJTktfVkVSU0lPTl9IXworI2RlZmluZSBORVRMSU5LX1ZFUlNJT05fSF8KKworI2RlZmluZSBMSUJOTF9TVFJJTkcgImxpYm5sIDIuMCIKKyNkZWZpbmUgTElCTkxfVkVSU0lPTiAiMi4wIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm5sXzIvbXNnLmMgYi9saWJubF8yL21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Mjc2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL21zZy5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIE5PVElDRTogVGhpcyBpcyBhIGNsZWFuIHJvb20gcmUtaW1wbGVtZW50YXRpb24gb2YgbGlibmwgKi8KKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlICJuZXRsaW5rLXR5cGVzLmgiCisKKy8qIEFsbG9jYXRlIGEgbmV3IG5ldGxpbmsgbWVzc2FnZSB3aXRoIHRoZSBkZWZhdWx0IG1heGltdW0gcGF5bG9hZCBzaXplLiAqLworc3RydWN0IG5sX21zZyAqbmxtc2dfYWxsb2Modm9pZCkKK3sKKwkvKiBXaG9sZSBwYWdlIHdpbGwgc3RvcmUgbmxfbXNnICsgbmxtc2doZHIgKyBnZW5sbXNnaGRyICsgcGF5bG9hZCAqLworCWNvbnN0IGludCBwYWdlX3N6ID0gZ2V0cGFnZXNpemUoKTsKKwlzdHJ1Y3QgbmxfbXNnICpubTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCS8qIE5ldGxpbmsgbWVzc2FnZSAqLworCW5tID0gKHN0cnVjdCBubF9tc2cgKikgbWFsbG9jKHBhZ2Vfc3opOworCWlmICghbm0pCisJCWdvdG8gZmFpbDsKKworCS8qIE5ldGxpbmsgbWVzc2FnZSBoZWFkZXIgcG9pbnRlciAqLworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgKChjaGFyICopIG5tICsgc2l6ZW9mKHN0cnVjdCBubF9tc2cpKTsKKworCS8qIEluaXRpYWxpemUgKi8KKwltZW1zZXQobm0sIDAsIHBhZ2Vfc3opOworCW5tLT5ubV9zaXplID0gcGFnZV9zejsKKworCW5tLT5ubV9zcmMubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwlubS0+bm1fc3JjLm5sX3BpZCA9IGdldHBpZCgpOworCisJbm0tPm5tX2RzdC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCW5tLT5ubV9kc3QubmxfcGlkID0gMDsgLyogS2VybmVsICovCisKKwkvKiBJbml0aWFsaXplIGFuZCBhZGQgdG8gbmV0bGluayBtZXNzYWdlICovCisJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19IRFJMRU47CisJbm0tPm5tX25saCA9IG5saDsKKworCS8qIEFkZCB0byByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybiBubF9tc2cgKi8KKwlubG1zZ19nZXQobm0pOworCXJldHVybiBubTsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiBwb2ludGVyIHRvIG1lc3NhZ2UgcGF5bG9hZC4gKi8KK3ZvaWQgKm5sbXNnX2RhdGEoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJcmV0dXJuIChjaGFyICopIG5saCArIE5MTVNHX0hEUkxFTjsKK30KKworLyogQWRkIHJlZmVyZW5jZSBjb3VudCB0byBubF9tc2cgKi8KK3ZvaWQgbmxtc2dfZ2V0KHN0cnVjdCBubF9tc2cgKm5tKQoreworCW5tLT5ubV9yZWZjbnQrKzsKK30KKworLyogUmVsZWFzZSBhIHJlZmVyZW5jZSBmcm9tIGFuIG5ldGxpbmsgbWVzc2FnZS4gKi8KK3ZvaWQgbmxtc2dfZnJlZShzdHJ1Y3QgbmxfbXNnICpubSkKK3sKKwlpZiAobm0pIHsKKwkJbm0tPm5tX3JlZmNudC0tOworCQlpZiAobm0tPm5tX3JlZmNudCA8PSAwKQorCQkJZnJlZShubSk7CisJfQorCit9CisKKy8qIFJldHVybiBhY3R1YWwgbmV0bGluayBtZXNzYWdlLiAqLworc3RydWN0IG5sbXNnaGRyICpubG1zZ19oZHIoc3RydWN0IG5sX21zZyAqbikKK3sKKwlyZXR1cm4gbi0+bm1fbmxoOworfQorCisvKiBSZXR1cm4gaGVhZCBvZiBhdHRyaWJ1dGVzIGRhdGEgLyBwYXlsb2FkIHNlY3Rpb24gKi8KK3N0cnVjdCBubGF0dHIgKm5sbXNnX2F0dHJkYXRhKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgaGRybGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBubG1zZ19kYXRhKG5saCk7CisJcmV0dXJuIChzdHJ1Y3QgbmxhdHRyICopIChkYXRhICsgTkxNU0dfQUxJR04oaGRybGVuKSk7Cit9CisKKy8qIFJldHVybnMgcG9pbnRlciB0byBlbmQgb2YgbmV0bGluayBtZXNzYWdlICovCit2b2lkICpubG1zZ190YWlsKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXJldHVybiAodm9pZCAqKSgoY2hhciAqKSBubGggKyBubGgtPm5sbXNnX2xlbik7Cit9CisKKy8qIE5leHQgbmV0bGluayBtZXNzYWdlIGluIG1lc3NhZ2Ugc3RyZWFtICovCitzdHJ1Y3Qgbmxtc2doZHIgKm5sbXNnX25leHQoc3RydWN0IG5sbXNnaGRyICpubGgsIGludCAqcmVtYWluaW5nKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmV4dF9ubGggPSBOVUxMOworCWlmICgqcmVtYWluaW5nID4gMCAmJgorCQlubG1zZ19sZW4obmxoKSA8PSAqcmVtYWluaW5nICYmCisJCW5sbXNnX2xlbihubGgpID49IChpbnQpIHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKSB7CisJCW5leHRfbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKSBcCisJCQkoKGNoYXIgKikgbmxoICsgbmxtc2dfbGVuKG5saCkpOworCisJCWlmIChuZXh0X25saCAmJiBubG1zZ19sZW4obmxoKSA8PSAqcmVtYWluaW5nKSB7CisJCQkqcmVtYWluaW5nIC09IG5sbXNnX2xlbihubGgpOworCQkJbmV4dF9ubGggPSAoc3RydWN0IG5sbXNnaGRyICopIFwKKwkJCQkoKGNoYXIgKikgbmxoICsgbmxtc2dfbGVuKG5saCkpOworCQl9CisJfQorCisJcmV0dXJuIG5leHRfbmxoOworfQorCisvKiBMZW5ndGggb2YgYXR0cmlidXRlcyBkYXRhICovCitpbnQgbmxtc2dfYXR0cmxlbihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50IGhkcmxlbikKK3sKKwlyZXR1cm4gbmxtc2dfbGVuKG5saCkgLSBOTE1TR19IRFJMRU4gLSBoZHJsZW47Cit9CisKKy8qIExlbmd0aCBvZiBuZXRsaW5rIG1lc3NhZ2UgKi8KK2ludCBubG1zZ19sZW4oY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJcmV0dXJuIG5saC0+bmxtc2dfbGVuOworfQorCisvKiBDaGVjayBpZiB0aGUgbmV0bGluayBtZXNzYWdlIGZpdHMgaW50byB0aGUgcmVtYWluaW5nIGJ5dGVzICovCitpbnQgbmxtc2dfb2soY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCByZW0pCit7CisJcmV0dXJuIHJlbSA+PSAoaW50KXNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpICYmCisJCXJlbSA+PSBubG1zZ19sZW4obmxoKSAmJgorCQlubG1zZ19sZW4obmxoKSA+PSAoaW50KSBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSAmJgorCQlubG1zZ19sZW4obmxoKSA8PSAocmVtKTsKK30KKworaW50IG5sbXNnX3BhZGxlbihpbnQgcGF5bG9hZCkKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04ocGF5bG9hZCkgLSBwYXlsb2FkOworfQorCitpbnQgbmxtc2dfZGF0YWxlbihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlyZXR1cm4gbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19IRFJMRU47Cit9CisKZGlmZiAtLWdpdCBhL2xpYm5sXzIvbmV0bGluay5jIGIvbGlibmxfMi9uZXRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyZjg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvbmV0bGluay5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIE5PVElDRTogVGhpcyBpcyBhIGNsZWFuIHJvb20gcmUtaW1wbGVtZW50YXRpb24gb2YgbGlibmwgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSAibmV0bGluay10eXBlcy5oIgorCisjZGVmaW5lIE5MX0JVRkZFUl9TWiAoMzI3NjhVKQorCisvKiBDaGVja3MgbWVzc2FnZSBmb3IgY29tcGxldGVuZXNzIGFuZCBzZW5kcyBpdCBvdXQgKi8KK2ludCBubF9zZW5kX2F1dG9fY29tcGxldGUoc3RydWN0IG5sX3NvY2sgKnNrLCBzdHJ1Y3QgbmxfbXNnICptc2cpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBtc2ctPm5tX25saDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWlmICghbmxoKSB7CisJCWludCBlcnJzdiA9IGVycm5vOworCQlmcHJpbnRmKHN0ZGVyciwgIk5ldGxpbmsgbWVzc2FnZSBoZWFkZXIgaXMgTlVMTCFcbiIpOworCQlyZXR1cm4gLWVycnN2OworCX0KKworCS8qIENvbXBsZXRlIHRoZSBubF9tc2cgaGVhZGVyICovCisJaWYgKGdldHRpbWVvZmRheSgmdHYsIE5VTEwpKQorCQlubGgtPm5sbXNnX3NlcSA9IDE7CisJZWxzZQorCQlubGgtPm5sbXNnX3NlcSA9IChpbnQpIHR2LnR2X3NlYzsKKwlubGgtPm5sbXNnX3BpZCA9IHNrLT5zX2xvY2FsLm5sX3BpZDsKKwlubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0s7CisKKwlyZXR1cm4gbmxfc2VuZChzaywgbXNnKTsKK30KKworLyogUmVjZWl2ZXMgYSBuZXRsaW5rIG1lc3NhZ2UsIGFsbG9jYXRlcyBhIGJ1ZmZlciBpbiAqYnVmIGFuZCBzdG9yZXMKKyAqIHRoZSBtZXNzYWdlIGNvbnRlbnQuIFRoZSBwZWVyJ3MgbmV0bGluayBhZGRyZXNzIGlzIHN0b3JlZCBpbgorICogKm5sYS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpbgorICogKmJ1ZiBpZiBhIHBvc2l0aXZlIHZhbHVlIGlzIHJldHVybmVkLiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbHMgYXJlCisgKiBoYW5kbGVkIGJ5IHJlcGVhdGluZyB0aGUgcmVhZC4gVGhlIGlucHV0IGJ1ZmZlciBzaXplIGlzIGRldGVybWluZWQKKyAqIGJ5IHBlZWtpbmcgYmVmb3JlIHRoZSBhY3R1YWwgcmVhZCBpcyBkb25lICovCitpbnQgbmxfcmVjdihzdHJ1Y3Qgbmxfc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9ubCAqbmxhLCBcCisJdW5zaWduZWQgY2hhciAqKmJ1Ziwgc3RydWN0IHVjcmVkICoqY3JlZHMpCit7CisJaW50IHJjID0gLTE7CisJaW50IHNrX2ZsYWdzOworCWludCBSRUNWX0JVRl9TSVpFOworCWludCBlcnJzdjsKKwlzdHJ1Y3QgaW92ZWMgcmVjdm1zZ19pb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgKi8KKwlSRUNWX0JVRl9TSVpFID0gZ2V0cGFnZXNpemUoKTsKKwkqYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKFJFQ1ZfQlVGX1NJWkUpOworCWlmICghYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIFByZXBhcmUgdG8gcmVjZWl2ZSBtZXNzYWdlICovCisJcmVjdm1zZ19pb3YuaW92X2Jhc2UgPSAqYnVmOworCXJlY3Ztc2dfaW92Lmlvdl9sZW4gPSBSRUNWX0JVRl9TSVpFOworCisJbXNnLm1zZ19uYW1lID0gKHZvaWQgKikgJnNrLT5zX3BlZXI7CisJbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNrLT5zX3BlZXIpOworCW1zZy5tc2dfaW92ID0gJnJlY3Ztc2dfaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IDA7CisKKwkvKiBNYWtlIG5vbiBibG9ja2luZyBhbmQgdGhlbiByZXN0b3JlIHByZXZpb3VzIHNldHRpbmcgKi8KKwlza19mbGFncyA9IGZjbnRsKHNrLT5zX2ZkLCBGX0dFVEZMLCAwKTsKKwlmY250bChzay0+c19mZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisJcmMgPSByZWN2bXNnKHNrLT5zX2ZkLCAmbXNnLCAwKTsKKwllcnJzdiA9IGVycm5vOworCWZjbnRsKHNrLT5zX2ZkLCBGX1NFVEZMLCBza19mbGFncyk7CisKKwlpZiAocmMgPCAwKQorCQlyYyA9IC1lcnJzdjsKKworZmFpbDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlY2VpdmUgYSBzZXQgb2YgbWVzc2FnZXMgZnJvbSBhIG5ldGxpbmsgc29ja2V0ICovCisvKiBOT1RFOiBEb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBjYWxsYmFjayByZXBsYWNlbWVudHMhISEgKi8KK2ludCBubF9yZWN2bXNncyhzdHJ1Y3Qgbmxfc29jayAqc2ssIHN0cnVjdCBubF9jYiAqY2IpCit7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYTsKKwlzdHJ1Y3QgdWNyZWQgKmNyZWRzOworCisJaW50IHJjLCBjYl9yYyA9IE5MX09LLCBkb25lID0gMDsKKworCWRvIHsKKworCQl1bnNpZ25lZCBjaGFyICpidWY7CisJCWludCBpLCByZW0sIGZsYWdzOworCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwkJc3RydWN0IG5sbXNnZXJyICpubG1lOworCQlzdHJ1Y3QgbmxfbXNnICptc2c7CisKKwkJZG9uZSA9IDA7CisJCXJjID0gbmxfcmVjdihzaywgJm5sYSwgJmJ1ZiwgJmNyZWRzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCW5sbXNnX2Zvcl9lYWNoX21zZyhubGgsIChzdHJ1Y3Qgbmxtc2doZHIgKikgYnVmLCByYywgcmVtKSB7CisKKwkJCWlmIChyYyA8PSAwIHx8IGNiX3JjID09IE5MX1NUT1ApCisJCQkJYnJlYWs7CisKKwkJCS8qIENoZWNrIGZvciBjYWxsYmFja3MgKi8KKworCQkJbXNnID0gKHN0cnVjdCBubF9tc2cgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBubF9tc2cpKTsKKwkJCW1lbXNldChtc2csIDAsIHNpemVvZigqbXNnKSk7CisJCQltc2ctPm5tX25saCA9IG5saDsKKworCQkJLyogQ2hlY2sgbmV0bGluayBtZXNzYWdlIHR5cGUgKi8KKworCQkJc3dpdGNoIChtc2ctPm5tX25saC0+bmxtc2dfdHlwZSkgeworCQkJY2FzZSBOTE1TR19FUlJPUjoJICAvKiBVc2VkIGZvciBBQ0sgdG9vICovCisJCQkJLyogQ2VydGFpbmx5IHdlIHNob3VsZCBiZSBkb2luZyBzb21lCisJCQkJICogY2hlY2tpbmcgaGVyZSB0byBtYWtlIHN1cmUgdGhpcworCQkJCSAqIG1lc3NhZ2UgaXMgaW50ZW5kZWQgZm9yIHVzICovCisJCQkJbmxtZSA9IG5sbXNnX2RhdGEobXNnLT5ubV9ubGgpOworCQkJCWlmIChubG1lLT5lcnJvciA9PSAwKQorCQkJCQltc2ctPm5tX25saC0+bmxtc2dfZmxhZ3MgfD0gTkxNX0ZfQUNLOworCisJCQkJcmMgPSBubG1lLT5lcnJvcjsKKwkJCQljYl9yYyA9IGNiLT5jYl9lcnIoJm5sYSwgbmxtZSwgY2ItPmNiX2Vycl9hcmcpOworCQkJCW5sbWUgPSBOVUxMOworCQkJCWJyZWFrOworCisJCQljYXNlIE5MTVNHX0RPTkU6CisJCQkJZG9uZSA9IDE7CisKKwkJCWNhc2UgTkxNU0dfT1ZFUlJVTjoKKwkJCWNhc2UgTkxNU0dfTk9PUDoKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9OworCisJCQlmb3IgKGkgPSAwOyBpIDw9IE5MX0NCX1RZUEVfTUFYOyBpKyspIHsKKworCQkJCWlmIChjYi0+Y2Jfc2V0W2ldKSB7CisJCQkJCXN3aXRjaCAoaSkgeworCQkJCQljYXNlIE5MX0NCX1ZBTElEOgorCQkJCQkJaWYgKHJjID4gMCkKKwkJCQkJCQljYl9yYyA9IGNiLT5jYl9zZXRbaV0obXNnLCBjYi0+Y2JfYXJnc1tpXSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE5MX0NCX0ZJTklTSDoKKwkJCQkJCWlmICgobXNnLT5ubV9ubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfTVVMVEkpICYmCisJCQkJCQkJKG1zZy0+bm1fbmxoLT5ubG1zZ190eXBlICYgTkxNU0dfRE9ORSkpCisJCQkJCQkJY2JfcmMgPSBjYi0+Y2Jfc2V0W2ldKG1zZywgY2ItPmNiX2FyZ3NbaV0pOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE5MX0NCX0FDSzoKKwkJCQkJCWlmIChtc2ctPm5tX25saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BQ0spCisJCQkJCQkJY2JfcmMgPSBjYi0+Y2Jfc2V0W2ldKG1zZywgY2ItPmNiX2FyZ3NbaV0pOworCisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmcmVlKG1zZyk7CisJCQlpZiAoZG9uZSkKKwkJCQlicmVhazsKKwkJfQorCisJCWZyZWUoYnVmKTsKKwkJYnVmID0gTlVMTDsKKworCQlpZiAoZG9uZSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKHJjID4gMCAmJiBjYl9yYyAhPSBOTF9TVE9QKTsKKworc3VjY2VzczoKK2ZhaWw6CisJcmV0dXJuCXJjOworfQorCisvKiBTZW5kIHJhdyBkYXRhIG92ZXIgbmV0bGluayBzb2NrZXQgKi8KK2ludCBubF9zZW5kKHN0cnVjdCBubF9zb2NrICpzaywgc3RydWN0IG5sX21zZyAqbXNnKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gbmxtc2dfaGRyKG1zZyk7CisJc3RydWN0IGlvdmVjIG1zZ19pb3Y7CisKKwkvKiBDcmVhdGUgSU8gdmVjdG9yIHdpdGggTmV0bGluayBtZXNzYWdlICovCisJbXNnX2lvdi5pb3ZfYmFzZSA9IG5saDsKKwltc2dfaW92Lmlvdl9sZW4gPSBubGgtPm5sbXNnX2xlbjsKKworCXJldHVybiBubF9zZW5kX2lvdmVjKHNrLCBtc2csICZtc2dfaW92LCAxKTsKK30KKworLyogU2VuZCBuZXRsaW5rIG1lc3NhZ2UgKi8KK2ludCBubF9zZW5kX2lvdmVjKHN0cnVjdCBubF9zb2NrICpzaywgc3RydWN0IG5sX21zZyAqbXNnLAorCQkgICBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgaW92bGVuKQoreworCWludCByYzsKKworCS8qIFNvY2tldCBtZXNzYWdlICovCisJc3RydWN0IG1zZ2hkciBtaCA9IHsKKwkJLm1zZ19uYW1lID0gKHZvaWQgKikgJnNrLT5zX3BlZXIsCisJCS5tc2dfbmFtZWxlbiA9IHNpemVvZihzay0+c19wZWVyKSwKKwkJLm1zZ19pb3YgPSBpb3YsCisJCS5tc2dfaW92bGVuID0gaW92bGVuLAorCQkubXNnX2NvbnRyb2wgPSBOVUxMLAorCQkubXNnX2NvbnRyb2xsZW4gPSAwLAorCQkubXNnX2ZsYWdzID0gMAorCX07CisKKwkvKiBTZW5kIG1lc3NhZ2UgYW5kIHZlcmlmeSBzZW50ICovCisJcmMgPSBubF9zZW5kbXNnKHNrLCAoc3RydWN0IG5sX21zZyAqKSAmbWgsIDApOworCWlmIChyYyA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igc2VuZGluZyBuZXRsaW5rIG1lc3NhZ2U6ICVkXG4iLCBlcnJubyk7CisJcmV0dXJuIHJjOworCit9CisKKy8qIFNlbmQgbmV0bGluayBtZXNzYWdlIHdpdGggY29udHJvbCBvdmVyIHNlbmRtc2coKSBtZXNzYWdlIGhlYWRlciAqLworaW50IG5sX3NlbmRtc2coc3RydWN0IG5sX3NvY2sgKnNrLCBzdHJ1Y3QgbmxfbXNnICptc2csIHN0cnVjdCBtc2doZHIgKmhkcikKK3sKKwlyZXR1cm4gc2VuZG1zZyhzay0+c19mZCwgKHN0cnVjdCBtc2doZHIgKikgbXNnLCAoaW50KSBoZHIpOworfQorCisvKiBDcmVhdGUgYW5kIGNvbm5lY3QgbmV0bGluayBzb2NrZXQgKi8KK2ludCBubF9jb25uZWN0KHN0cnVjdCBubF9zb2NrICpzaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuOworCWludCByYzsKKworCS8qIENyZWF0ZSBSWCBzb2NrZXQgKi8KKwlzay0+c19mZCA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX1JBVywgcHJvdG9jb2wpOworCWlmIChzay0+c19mZCA8IDApCisJCXJldHVybiAtZXJybm87CisKKwkvKiBTZXQgc2l6ZSBvZiBSWCBhbmQgVFggYnVmZmVycyAqLworCWlmIChubF9zb2NrZXRfc2V0X2J1ZmZlcl9zaXplKHNrLCBOTF9CVUZGRVJfU1osIE5MX0JVRkZFUl9TWikgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJLyogQmluZCBSWCBzb2NrZXQgKi8KKwlyYyA9IGJpbmQoc2stPnNfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2stPnNfbG9jYWwsIFwKKwkJc2l6ZW9mKHNrLT5zX2xvY2FsKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKwlhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworCWdldHNvY2tuYW1lKHNrLT5zX2ZkLCAmYWRkciwgJmFkZHJsZW4pOworCisJcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL2xpYm5sXzIvb2JqZWN0LmMgYi9saWJubF8yL29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2FjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJubF8yL29iamVjdC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICoJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogTk9USUNFOiBUaGlzIGlzIGEgY2xlYW4gcm9vbSByZS1pbXBsZW1lbnRhdGlvbiBvZiBsaWJubCAqLworCisjaW5jbHVkZSAibmV0bGluay10eXBlcy5oIgorCit2b2lkIG5sX29iamVjdF9wdXQoc3RydWN0IG5sX29iamVjdCAqb2JqKQoreworCW9iai0+Y2VfcmVmY250LS07CisJaWYgKCFvYmotPmNlX3JlZmNudCkKKwkJbmxfb2JqZWN0X2ZyZWUob2JqKTsKK30KKwordm9pZCBubF9vYmplY3RfZnJlZShzdHJ1Y3Qgbmxfb2JqZWN0ICpvYmopCit7CisJbmxfY2FjaGVfcmVtb3ZlKG9iaik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlibmxfMi9zb2NrZXQuYyBiL2xpYm5sXzIvc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjZjIxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm5sXzIvc29ja2V0LmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICoJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogTk9USUNFOiBUaGlzIGlzIGEgY2xlYW4gcm9vbSByZS1pbXBsZW1lbnRhdGlvbiBvZiBsaWJubCAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJuZXRsaW5rLXR5cGVzLmgiCisKKy8qIEpvaW4gZ3JvdXAgKi8KK2ludCBubF9zb2NrZXRfYWRkX21lbWJlcnNoaXAoc3RydWN0IG5sX3NvY2sgKnNrLCBpbnQgZ3JvdXApCit7CisJcmV0dXJuIHNldHNvY2tvcHQoc2stPnNfZmQsIFNPTF9ORVRMSU5LLAorCQkJTkVUTElOS19BRERfTUVNQkVSU0hJUCwgJmdyb3VwLCBzaXplb2YoZ3JvdXApKTsKK30KKworLyogQWxsb2NhdGUgbmV3IG5ldGxpbmsgc29ja2V0LiAqLworc3RydWN0IG5sX3NvY2sgKm5sX3NvY2tldF9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBubF9zb2NrICpzazsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgbmxfY2IgKmNiOworCisJc2sgPSAoc3RydWN0IG5sX3NvY2sgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbmxfc29jaykpOworCWlmICghc2spCisJCWdvdG8gZmFpbDsKKwltZW1zZXQoc2ssIDAsIHNpemVvZigqc2spKTsKKworCS8qIEdldCBjdXJyZW50IHRpbWUgKi8KKworCWlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlzay0+c19zZXFfbmV4dCA9IChpbnQpIHR2LnR2X3NlYzsKKworCS8qIENyZWF0ZSBsb2NhbCBzb2NrZXQgKi8KKwlzay0+c19sb2NhbC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCXNrLT5zX2xvY2FsLm5sX3BpZCA9IDA7IC8qIEtlcm5lbCBmaWxscyBpbiBwaWQgKi8KKwlzay0+c19sb2NhbC5ubF9ncm91cHMgPSAwOyAvKiBObyBncm91cHMgKi8KKworCS8qIENyZWF0ZSBwZWVyIHNvY2tldCAqLworCXNrLT5zX3BlZXIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwlzay0+c19wZWVyLm5sX3BpZCA9IDA7IC8qIEtlcm5lbCAqLworCXNrLT5zX3BlZXIubmxfZ3JvdXBzID0gMDsgLyogTm8gZ3JvdXBzICovCisKKwljYiA9IChzdHJ1Y3QgbmxfY2IgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmxfY2IpKTsKKwlpZiAoIWNiKQorCQlnb3RvIGNiX2ZhaWw7CisJbWVtc2V0KGNiLCAwLCBzaXplb2YoKmNiKSk7CisJc2stPnNfY2IgPSBubF9jYl9hbGxvYyhOTF9DQl9ERUZBVUxUKTsKKworCisJcmV0dXJuIHNrOworY2JfZmFpbDoKKwlmcmVlKHNrKTsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFsbG9jYXRlIG5ldyBzb2NrZXQgd2l0aCBjdXN0b20gY2FsbGJhY2tzLiAqLworc3RydWN0IG5sX3NvY2sgKm5sX3NvY2tldF9hbGxvY19jYihzdHJ1Y3QgbmxfY2IgKmNiKQoreworCXN0cnVjdCBubF9zb2NrICpzayA9IG5sX3NvY2tldF9hbGxvYygpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc2stPnNfY2IgPSBjYjsKKwlubF9jYl9nZXQoY2IpOworCisJcmV0dXJuIHNrOworCit9CisKKy8qIEZyZWUgYSBuZXRsaW5rIHNvY2tldC4gKi8KK3ZvaWQgbmxfc29ja2V0X2ZyZWUoc3RydWN0IG5sX3NvY2sgKnNrKQoreworCW5sX2NiX3B1dChzay0+c19jYik7CisJZnJlZShzayk7Cit9CisKKy8qIFNldHMgc29ja2V0IGJ1ZmZlciBzaXplIG9mIG5ldGxpbmsgc29ja2V0ICovCitpbnQgbmxfc29ja2V0X3NldF9idWZmZXJfc2l6ZShzdHJ1Y3Qgbmxfc29jayAqc2ssIGludCByeGJ1ZiwgaW50IHR4YnVmKQoreworCWlmIChzZXRzb2Nrb3B0KHNrLT5zX2ZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIFwKKwkJCSZyeGJ1ZiwgKHNvY2tsZW5fdCkgc2l6ZW9mKHJ4YnVmKSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoc2V0c29ja29wdChzay0+c19mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCBcCisJCQkmdHhidWYsIChzb2NrbGVuX3QpIHNpemVvZih0eGJ1ZikpKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwlyZXR1cm4gLWVycm5vOworCit9CisKK2ludCBubF9zb2NrZXRfZ2V0X2ZkKHN0cnVjdCBubF9zb2NrICpzaykKK3sKKwlyZXR1cm4gc2stPnNfZmQ7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlic3lzdXRpbHMvQW5kcm9pZC5tayBiL2xpYnN5c3V0aWxzL0FuZHJvaWQubWsKaW5kZXggM2IxZjYxOC4uY2NjZjQ4NCAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvQW5kcm9pZC5taworKysgYi9saWJzeXN1dGlscy9BbmRyb2lkLm1rCkBAIC0xLDEwICsxLDQgQEAKIGlmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKLUJVSUxEX0xJQlNZU1VUSUxTIDo9IGZhbHNlCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotICAgIEJVSUxEX0xJQlNZU1VUSUxTIDo9IHRydWUKLWVuZGlmCi0KLWlmZXEgKCQoQlVJTERfTElCU1lTVVRJTFMpLHRydWUpCiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCkBAIC0yNywxMSArMjEsNiBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscwogCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi0gIExPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKLWVuZGlmCi0KIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogZW5kaWYKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcCBiL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCmluZGV4IGM4ZDNiMWYuLmYyZWI2NjQgMTAwNjQ0Ci0tLSBhL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCkBAIC0yMSwxMCArMjEsMTcgQEAKIAogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtFdmVudC5oPgogCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKIGNvbnN0IGludCBOZXRsaW5rRXZlbnQ6Ok5sQWN0aW9uVW5rbm93biA9IDA7CiBjb25zdCBpbnQgTmV0bGlua0V2ZW50OjpObEFjdGlvbkFkZCA9IDE7CiBjb25zdCBpbnQgTmV0bGlua0V2ZW50OjpObEFjdGlvblJlbW92ZSA9IDI7CiBjb25zdCBpbnQgTmV0bGlua0V2ZW50OjpObEFjdGlvbkNoYW5nZSA9IDM7Citjb25zdCBpbnQgTmV0bGlua0V2ZW50OjpObEFjdGlvbkxpbmtVcCA9IDQ7Citjb25zdCBpbnQgTmV0bGlua0V2ZW50OjpObEFjdGlvbkxpbmtEb3duID0gNTsKIAogTmV0bGlua0V2ZW50OjpOZXRsaW5rRXZlbnQoKSB7CiAgICAgbUFjdGlvbiA9IE5sQWN0aW9uVW5rbm93bjsKQEAgLTU2LDYgKzYzLDUxIEBACiAgICAgfQogfQogCisvKgorICogUGFyc2UgYW4gYmluYXJ5IG1lc3NhZ2UgZnJvbSBhIE5FVExJTktfUk9VVEUgbmV0bGluayBzb2NrZXQuCisgKi8KK2Jvb2wgTmV0bGlua0V2ZW50OjpwYXJzZUJpbmFyeU5ldGxpbmtNZXNzYWdlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKKyAgICBzaXplX3Qgc3ogPSBzaXplOworICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmggPSAoc3RydWN0IG5sbXNnaGRyICopIGJ1ZmZlcjsKKworICAgIHdoaWxlIChOTE1TR19PSyhuaCwgc3opICYmIChuaC0+bmxtc2dfdHlwZSAhPSBOTE1TR19ET05FKSkgeworICAgICAgICBpZiAobmgtPm5sbXNnX3R5cGUgPT0gUlRNX05FV0xJTkspIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBuaC0+bmxtc2dfbGVuIC0gc2l6ZW9mKCpuaCk7CisgICAgICAgICAgICBzdHJ1Y3QgaWZpbmZvbXNnICppZmk7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoKmlmaSkgPD0gKHNpemVfdCkgbGVuKSB7CisgICAgICAgICAgICAgICAgaWZpID0gKGlmaW5mb21zZyAqKU5MTVNHX0RBVEEobmgpOworCisgICAgICAgICAgICAgICAgaWYgKChpZmktPmlmaV9mbGFncyAmIElGRl9MT09QQkFDSykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcnRhdHRyICpydGEgPSAoc3RydWN0IHJ0YXR0ciAqKQorICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKSBpZmkgKyBOTE1TR19BTElHTihzaXplb2YoKmlmaSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gTkxNU0dfUEFZTE9BRChuaCwgc2l6ZW9mKCppZmkpKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZShSVEFfT0socnRhLCBsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocnRhLT5ydGFfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJRkxBX0lGTkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxNiArIElGTkFNU0laXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiSU5URVJGQUNFPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBSVEFfREFUQShydGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zWzBdID0gc3RyZHVwKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbiA9IChpZmktPmlmaV9mbGFncyAmIElGRl9MT1dFUl9VUCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmxBY3Rpb25MaW5rVXAgOiBObEFjdGlvbkxpbmtEb3duOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJzeXN0ZW0gPSBzdHJkdXAoIm5ldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBydGEgPSBSVEFfTkVYVChydGEsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuaCA9IE5MTVNHX05FWFQobmgsIHNpemUpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiAvKiBJZiB0aGUgc3RyaW5nIGJldHdlZW4gJ3N0cicgYW5kICdlbmQnIGJlZ2lucyB3aXRoICdwcmVmaXhsZW4nIGNoYXJhY3RlcnMKICAqIGZyb20gdGhlICdwcmVmaXgnIGFycmF5LCB0aGVuIHJldHVybiAnc3RyICsgcHJlZml4bGVuJywgb3RoZXJ3aXNlIHJldHVybgogICogTlVMTC4KQEAgLTc2LDcgKzEyOCwxMSBAQAogI2RlZmluZSBIQVNfQ09OU1RfUFJFRklYKHN0cixlbmQscHJlZml4KSAgaGFzX3ByZWZpeCgoc3RyKSwoZW5kKSxwcmVmaXgsQ09OU1RfU1RSTEVOKHByZWZpeCkpCiAKIAotYm9vbCBOZXRsaW5rRXZlbnQ6OmRlY29kZShjaGFyICpidWZmZXIsIGludCBzaXplKSB7CisvKgorICogUGFyc2UgYW4gQVNDSUktZm9ybWF0dGVkIG1lc3NhZ2UgZnJvbSBhIE5FVExJTktfS09CSkVDVF9VRVZFTlQKKyAqIG5ldGxpbmsgc29ja2V0LgorICovCitib29sIE5ldGxpbmtFdmVudDo6cGFyc2VBc2NpaU5ldGxpbmtNZXNzYWdlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKICAgICBjb25zdCBjaGFyICpzID0gYnVmZmVyOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKICAgICBpbnQgcGFyYW1faWR4ID0gMDsKQEAgLTEyMyw2ICsxNzksMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBOZXRsaW5rRXZlbnQ6OmRlY29kZShjaGFyICpidWZmZXIsIGludCBzaXplLCBpbnQgZm9ybWF0KSB7CisgICAgaWYgKGZvcm1hdCA9PSBOZXRsaW5rTGlzdGVuZXI6Ok5FVExJTktfRk9STUFUX0JJTkFSWSkgeworICAgICAgICByZXR1cm4gcGFyc2VCaW5hcnlOZXRsaW5rTWVzc2FnZShidWZmZXIsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXJzZUFzY2lpTmV0bGlua01lc3NhZ2UoYnVmZmVyLCBzaXplKTsKKyAgICB9Cit9CisKIGNvbnN0IGNoYXIgKk5ldGxpbmtFdmVudDo6ZmluZFBhcmFtKGNvbnN0IGNoYXIgKnBhcmFtTmFtZSkgewogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocGFyYW1OYW1lKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5MX1BBUkFNU19NQVggJiYgbVBhcmFtc1tpXSAhPSBOVUxMOyArK2kpIHsKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rTGlzdGVuZXIuY3BwIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKaW5kZXggYjI0YTQ1ZS4uZTY3YjVjNiAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKQEAgLTI0LDExICsyNCwyMSBAQAogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvdWV2ZW50Lmg+CiAKLSNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KIAorI2lmIDEKKy8qIHRlbXBvcmFyeSB2ZXJzaW9uIHVudGlsIHdlIGNhbiBnZXQgTW90b3JvbGEgdG8gdXBkYXRlIHRoZWlyCisgKiByaWwuc28uICBUaGVpciBwcmVidWlsdCByaWwuc28gaXMgdXNpbmcgdGhpcyBwcml2YXRlIGNsYXNzCisgKiBzbyBjaGFuZ2luZyB0aGUgTmV0bGlua0xpc3RlbmVyKCkgY29uc3RydWN0b3IgYnJlYWtzIHRoZWlyIHJpbC4KKyAqLwogTmV0bGlua0xpc3RlbmVyOjpOZXRsaW5rTGlzdGVuZXIoaW50IHNvY2tldCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldExpc3RlbmVyKHNvY2tldCwgZmFsc2UpIHsKKyAgICBtRm9ybWF0ID0gTkVUTElOS19GT1JNQVRfQVNDSUk7Cit9CisjZW5kaWYKKworTmV0bGlua0xpc3RlbmVyOjpOZXRsaW5rTGlzdGVuZXIoaW50IHNvY2tldCwgaW50IGZvcm1hdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldExpc3RlbmVyKHNvY2tldCwgZmFsc2UpLCBtRm9ybWF0KGZvcm1hdCkgewogfQogCiBib29sIE5ldGxpbmtMaXN0ZW5lcjo6b25EYXRhQXZhaWxhYmxlKFNvY2tldENsaWVudCAqY2xpKQpAQCAtMzYsMjAgKzQ2LDE5IEBACiAgICAgaW50IHNvY2tldCA9IGNsaS0+Z2V0U29ja2V0KCk7CiAgICAgc3NpemVfdCBjb3VudDsKIAotICAgIGNvdW50ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHVldmVudF9jaGVja2VkX3JlY3Yoc29ja2V0LCBtQnVmZmVyLCBzaXplb2YobUJ1ZmZlcikpKTsKKyAgICBjb3VudCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2KHNvY2tldCwgbUJ1ZmZlciwgc2l6ZW9mKG1CdWZmZXIpKSk7CiAgICAgaWYgKGNvdW50IDwgMCkgewogICAgICAgICBTTE9HRSgicmVjdm1zZyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBOZXRsaW5rRXZlbnQgKmV2dCA9IG5ldyBOZXRsaW5rRXZlbnQoKTsKLSAgICBpZiAoIWV2dC0+ZGVjb2RlKG1CdWZmZXIsIGNvdW50KSkgeworICAgIGlmICghZXZ0LT5kZWNvZGUobUJ1ZmZlciwgY291bnQsIG1Gb3JtYXQpKSB7CiAgICAgICAgIFNMT0dFKCJFcnJvciBkZWNvZGluZyBOZXRsaW5rRXZlbnQiKTsKLSAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb25FdmVudChldnQpOwogICAgIH0KIAotICAgIG9uRXZlbnQoZXZ0KTsKLW91dDoKICAgICBkZWxldGUgZXZ0OwogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWtzaC9BbmRyb2lkLm1rIGIvbWtzaC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTNiODYzLi4wMDAwMDAwCi0tLSBhL21rc2gvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMgQ29weXJpZ2h0IMKpIDIwMTAKLSMJVGhvcnN0ZW4gR2xhc2VyIDx0LmdsYXNlckB0YXJlbnQuZGU+Ci0jIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBta3NoLgotCi1MT0NBTF9QQVRIOj0JCSQoY2FsbCBteS1kaXIpCi0KLQotIyAvc3lzdGVtL2V0Yy9ta3NocmMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9CQlta3NocmMKLUxPQ0FMX01PRFVMRV9UQUdTOj0Jc2hlbGxfbWtzaAotTE9DQUxfTU9EVUxFX0NMQVNTOj0JRVRDCi1MT0NBTF9NT0RVTEVfUEFUSDo9CSQoVEFSR0VUX09VVCkvZXRjCi1MT0NBTF9TUkNfRklMRVM6PQkkKExPQ0FMX01PRFVMRSkKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotCi0jIC9zeXN0ZW0vYmluL21rc2gKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9CQlta3NoCi1MT0NBTF9NT0RVTEVfVEFHUzo9CXNoZWxsX21rc2gKLQotIyBta3NoIHNvdXJjZSBmaWxlcwotTE9DQUxfU1JDX0ZJTEVTOj0Jc3JjL2xhbGxvYy5jIHNyYy9lZGl0LmMgc3JjL2V2YWwuYyBzcmMvZXhlYy5jIFwKLQkJCXNyYy9leHByLmMgc3JjL2Z1bmNzLmMgc3JjL2hpc3RyYXAuYyBzcmMvam9icy5jIFwKLQkJCXNyYy9sZXguYyBzcmMvbWFpbi5jIHNyYy9taXNjLmMgc3JjL3NoZi5jIFwKLQkJCXNyYy9zeW4uYyBzcmMvdHJlZS5jIHNyYy92YXIuYwotCi1MT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUzo9IGxpYmMKLQotTE9DQUxfQ19JTkNMVURFUzo9CSQoTE9DQUxfUEFUSCkvc3JjCi0jIGFkZGl0aW9uYWwgZmxhZ3MgZmlyc3QsIHRoZW4gZnJvbSBNYWtlZnJhZy5pbmM6IENGTEFHUywgQ1BQRkxBR1MKLUxPQ0FMX0NGTEFHUzo9CQktRE1LU0hfREVGQVVMVF9FWEVDU0hFTEw9XCIvc3lzdGVtL2Jpbi9zaFwiIFwKLQkJCS1ETUtTSF9ERUZBVUxUX1RNUERJUj1cIi9zcWxpdGVfc3RtdF9qb3VybmFsc1wiIFwKLQkJCS1ETUtTSFJDX1BBVEg9XCIvc3lzdGVtL2V0Yy9ta3NocmNcIiBcCi0JCQktZndyYXB2IFwKLQkJCS1ETUtTSF9BU1NVTUVfVVRGOD0wIC1ETUtTSF9OT1BXTkFNIFwKLQkJCS1EX0dOVV9TT1VSQ0UgXAotCQkJLURIQVZFX0FUVFJJQlVURV9CT1VOREVEPTAgLURIQVZFX0FUVFJJQlVURV9GT1JNQVQ9MSBcCi0JCQktREhBVkVfQVRUUklCVVRFX05PTk5VTEw9MSAtREhBVkVfQVRUUklCVVRFX05PUkVUVVJOPTEgXAotCQkJLURIQVZFX0FUVFJJQlVURV9VTlVTRUQ9MSAtREhBVkVfQVRUUklCVVRFX1VTRUQ9MSBcCi0JCQktREhBVkVfU1lTX1BBUkFNX0g9MSAtREhBVkVfU1lTX01LREVWX0g9MCBcCi0JCQktREhBVkVfU1lTX01NQU5fSD0xIC1ESEFWRV9TWVNfU1lTTUFDUk9TX0g9MSBcCi0JCQktREhBVkVfR1JQX0g9MSAtREhBVkVfTElCR0VOX0g9MSAtREhBVkVfTElCVVRJTF9IPTAgXAotCQkJLURIQVZFX1BBVEhTX0g9MSAtREhBVkVfU1REQk9PTF9IPTEgLURIQVZFX1NURElOVF9IPTEgXAotCQkJLURIQVZFX1NUUklOR1NfSD0xIC1ESEFWRV9VTElNSVRfSD0wIC1ESEFWRV9WQUxVRVNfSD0wIFwKLQkJCS1ESEFWRV9DQU5fSU5UVFlQRVM9MSAtREhBVkVfQ0FOX1VDQklOVFM9MSBcCi0JCQktREhBVkVfQ0FOX0lOVDhUWVBFPTEgLURIQVZFX0NBTl9VQ0JJTlQ4PTEgXAotCQkJLURIQVZFX1JMSU1fVD0xIC1ESEFWRV9TSUdfVD0xIC1ESEFWRV9TWVNfU0lHTkFNRT0xIFwKLQkJCS1ESEFWRV9TWVNfU0lHTElTVD0xIC1ESEFWRV9TVFJTSUdOQUw9MCBcCi0JCQktREhBVkVfR0VUUlVTQUdFPTEgLURIQVZFX0tJTExQRz0xIC1ESEFWRV9NS05PRD0wIFwKLQkJCS1ESEFWRV9NS1NURU1QPTEgLURIQVZFX05JQ0U9MSAtREhBVkVfUkVWT0tFPTAgXAotCQkJLURIQVZFX1NFVExPQ0FMRV9DVFlQRT0wIC1ESEFWRV9MQU5HSU5GT19DT0RFU0VUPTAgXAotCQkJLURIQVZFX1NFVE1PREU9MSAtREhBVkVfU0VUUkVTVUdJRD0xIFwKLQkJCS1ESEFWRV9TRVRHUk9VUFM9MSAtREhBVkVfU1RSQ0FTRVNUUj0xIFwKLQkJCS1ESEFWRV9TVFJMQ1BZPTEgLURIQVZFX0ZMT0NLX0RFQ0w9MSBcCi0JCQktREhBVkVfUkVWT0tFX0RFQ0w9MSAtREhBVkVfU1lTX1NJR0xJU1RfREVDTD0xIFwKLQkJCS1ESEFWRV9QRVJTSVNURU5UX0hJU1RPUlk9MAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21rc2gvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UgYi9ta3NoL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21rc2gvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWtzaC9OT1RJQ0UgYi9ta3NoL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwMDYxZi4uMDAwMDAwMAotLS0gYS9ta3NoL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLW1rc2ggaXMgY292ZXJlZCBieSBUaGUgTWlyT1MgTGljZW5jZToKLQotLyotCi0gKiBDb3B5cmlnaHQgwqkgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1buKAkAotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCDigJxBUyBJU+KAnSBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29u4oCZcyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9ta21mLnNoIGIvbWtzaC9ta21mLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQwNDMyLi4wMDAwMDAwCi0tLSBhL21rc2gvbWttZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIENvcHlyaWdodCDCqSAyMDEwCi0jCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgotIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KLSMtCi0jIEhlbHBlciBzY3JpcHQgdG8gbGV0IHNyYy9CdWlsZC5zaCBnZW5lcmF0ZSBNYWtlZnJhZy5pbmMKLSMgd2hpY2ggd2UgaW4gdHVybiB1c2UgaW4gdGhlIG1hbnVhbCBjcmVhdGlvbiBvZiBBbmRyb2lkLm1rCi0jCi0jIFRoaXMgc2NyaXB0IGlzIHN1cHBvc2VkIHRvIGJlIHJ1biBmcm9tL2luc2lkZSBBT1NQIGJ5IHRoZQotIyBwb3J0ZXIgb2YgbWtzaCB0byBBbmRyb2lkIChhbmQgb25seSBtYW51YWxseSkuCi0KLWNkICIkKGRpcm5hbWUgIiQwIikiCi1zcmNkaXI9JChwd2QpCi1ybSAtcmYgdG1wCi1ta2RpciB0bXAKLWNkIC4uLy4uLy4uCi1hb3NwZGlyPSQocHdkKQotY2QgJHNyY2Rpci90bXAKLQotYWRkdmFyKCkgewotCV92bj0kMTsgc2hpZnQKLQotCWV2YWwgJF92bj1cIlwkJF92biAnJCoiJwotfQotCi1DRkxBR1M9Ci1DUFBGTEFHUz0KLUxERkxBR1M9Ci1MSUJTPQotCi0jIFRoZSBkZWZpbml0aW9ucyBiZWxvdyB3ZXJlIGdlbmVyYXRlZCBieSBleGFtaW5pbmcgdGhlCi0jIG91dHB1dCBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0jIG1ha2Ugc2hvd2NvbW1hbmRzIG91dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL3N5c3RlbS9iaW4vbWtzaCAyPiYxIHwgdGVlIGxvZwotIwotIyBUaGV5IGFyZSBvbmx5IHVzZWQgdG8gbGV0IEJ1aWxkLnNoIGZpbmQgdGhlIGNvbXBpbGVyLCBoZWFkZXIKLSMgZmlsZXMsIGxpbmtlciBhbmQgbGlicmFyaWVzIHRvIGdlbmVyYXRlIE1ha2VmcmFnLmluYyAoc2ltaWxhcgotIyB0byB3aGF0IEdOVSBhdXRvdG9vbHPigJkgY29uZmlndXJlIHNjcmlwdHMgZG8pLCBhbmQgbmV2ZXIgdXNlZAotIyBkdXJpbmcgdGhlIHJlYWwgYnVpbGQgcHJvY2Vzcy4gV2UgbmVlZCB0aGlzIHRvIHBvcnQgbWtzaCB0bwotIyB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhbmQgaXQgaXMgY3J1Y2lhbCB0aGVzZSBhcmUgYXMgY2xvc2UgYXMKLSMgcG9zc2libGUgdG8gdGhlIHZhbHVlcyB1c2VkIGxhdGVyLiAoWW91IGFsc28gbXVzdCBleGFtcGxlIHRoZQotIyByZXN1bHRzIGdhdGhlcmVkIGZyb20gTWFrZWZyYWcuaW5jIHRvIHNlZSB0aGV5IGFyZSB0aGUgc2FtZQotIyBhY3Jvc3MgYWxsIEFuZHJvaWQgcGxhdGZvcm1zLCBvciBhZGQgYXBwcm9wcmlhdGUgaWZkZWZzLikKLSMgU2luY2Ugd2Ugbm8gbG9uZ2VyIHVzZSB0aGUgTkRLLCB0aGUgQU9TUCBoYXMgdG8gaGF2ZSBiZWVuCi0jIGJ1aWx0IGJlZm9yZSB1c2luZyB0aGlzIHNjcmlwdCAodGFyZ2V0dGluZyBnZW5lcmljL2VtdWxhdG9yKS4KLQotQ0M9JGFvc3BkaXIvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS00LjQuMC9iaW4vYXJtLWVhYmktZ2NjCi1hZGR2YXIgQ1BQRkxBR1MgLUkkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL3JpbC9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2RhbHZpay9saWJuYXRpdmVoZWxwZXIvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9mcmFtZXdvcmtzL2Jhc2Uvb3BlbmdsL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2FyY2gtYXJtL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9iaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMva2VybmVsL2NvbW1vbiBcCi0gICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYm0vaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9iaW9uaWMvbGlibS9pbmNsdWRlL2FyY2gvYXJtIFwKLSAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJ0aHJlYWRfZGIvaW5jbHVkZSBcCi0gICAgLURfX0FSTV9BUkNIXzVfXyAtRF9fQVJNX0FSQ0hfNVRfXyAtRF9fQVJNX0FSQ0hfNUVfXyAtRF9fQVJNX0FSQ0hfNVRFX18gXAotICAgIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZS9hcmNoL2xpbnV4LWFybS8gXAotICAgIC1pbmNsdWRlICRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vQW5kcm9pZENvbmZpZy5oIFwKLSAgICAtREFORFJPSUQgLUROREVCVUcgLVVERUJVRwotYWRkdmFyIENGTEFHUyAtZm5vLWV4Y2VwdGlvbnMgLVduby1tdWx0aWNoYXIgLW1zb2Z0LWZsb2F0IC1mcGljIFwKLSAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mdW53aW5kLXRhYmxlcyAtZnN0YWNrLXByb3RlY3RvciAtZm5vLXNob3J0LWVudW1zIFwKLSAgICAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9eHNjYWxlIC1tdGh1bWItaW50ZXJ3b3JrIC1mbWVzc2FnZS1sZW5ndGg9MCBcCi0gICAgLVcgLVdhbGwgLVduby11bnVzZWQgLVdpbml0LXNlbGYgLVdwb2ludGVyLWFyaXRoIC1XZXJyb3I9cmV0dXJuLXR5cGUgXAotICAgIC1XZXJyb3I9bm9uLXZpcnR1YWwtZHRvciAtV2Vycm9yPWFkZHJlc3MgLVdlcnJvcj1zZXF1ZW5jZS1wb2ludCBcCi0gICAgLVdzdHJpY3QtYWxpYXNpbmc9MiAtZmlubGluZS1mdW5jdGlvbnMgLWZuby1pbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIFwKLSAgICAtZmdjc2UtYWZ0ZXItcmVsb2FkIC1mcmVydW4tY3NlLWFmdGVyLWxvb3AgLWZyZW5hbWUtcmVnaXN0ZXJzIC1tdGh1bWIgXAotICAgIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZmlubGluZS1saW1pdD02NAotYWRkdmFyIExERkxBR1MgLW5vc3RkbGliIC1CZHluYW1pYyAtV2wsLVQsJGFvc3BkaXIvYnVpbGQvY29yZS9hcm1lbGYueCBcCi0gICAgLVdsLC1keW5hbWljLWxpbmtlciwvc3lzdGVtL2Jpbi9saW5rZXIgLVdsLC0tZ2Mtc2VjdGlvbnMgXAotICAgIC1XbCwteixub2NvcHlyZWxvYyAtV2wsLS1uby11bmRlZmluZWQgXAotICAgICRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIvY3J0YmVnaW5fZHluYW1pYy5vCi1hZGR2YXIgTElCUyAtTCRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIgXAotICAgIC1XbCwtcnBhdGgtbGluaz0kYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliIC1sYyBcCi0gICAgJGFvc3BkaXIvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS00LjQuMC9iaW4vLi4vbGliL2djYy9hcm0tZWFiaS80LjQuMC9pbnRlcndvcmsvbGliZ2NjLmEgXAotICAgICRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIvY3J0ZW5kX2FuZHJvaWQubwotCi0KLSMjIyBPdmVycmlkZSBmbGFncwotIyBXZSBkb27igJl0IGV2ZW4gKnN1cHBvcnQqIFVURi04IGJ5IGRlZmF1bHQg4pi5Ci1hZGR2YXIgQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4PTAKLSMgTm8gZ2V0cHduYW0oKSBjYWxscyAoYWZmZWN0cyAiY2QgfnVzZXJuYW1lLyIgb25seSkKLWFkZHZhciBDUFBGTEFHUyAtRE1LU0hfTk9QV05BTQotIyBDb21waWxlIGFuIGV4dHJhIHNtYWxsIG1rc2ggKG9wdGlvbmFsKQotI2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfU01BTEwKLSMgTGVhdmUgb3V0IHRoZSB1bGltaXQgYnVpbHRpbgotI2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfTk9fTElNSVRTCi0KLSMgU2V0IHRhcmdldCBwbGF0Zm9ybQotVEFSR0VUX09TPUxpbnV4Ci0jIEJ1aWxkaW5nIHdpdGggLXN0ZD1jOTkgb3IgLXN0ZD1nbnU5OSBjbGFzaGVzIHdpdGggQmlvbmljIGhlYWRlcnMKLUhBVkVfQ0FOX1NUREc5OT0wCi1IQVZFX0NBTl9TVERDOTk9MAotZXhwb3J0IEhBVkVfQ0FOX1NUREc5OSBIQVZFX0NBTl9TVERDOTkKLQotIyBBbmRyb2lkLXg4NiBkb2VzIG5vdCBoYXZlIGhlbHBlciBmdW5jdGlvbnMgZm9yIFByb1BvbGljZSBTU1AKLSMgYW5kIEFPU1AgYWRkcyB0aGUgZmxhZ3MgYnkgaXRzZWxmIChzYW1lIGZvciB3YXJuaW5nIGZsYWdzKQotSEFWRV9DQU5fRk5PU1RSSUNUQUxJQVNJTkc9MAotSEFWRV9DQU5fRlNUQUNLUFJPVEVDVE9SQUxMPTAKLUhBVkVfQ0FOX1dBTEw9MAotZXhwb3J0IEhBVkVfQ0FOX0ZOT1NUUklDVEFMSUFTSU5HIEhBVkVfQ0FOX0ZTVEFDS1BST1RFQ1RPUkFMTCBIQVZFX0NBTl9XQUxMCi0KLSMgZGlzYWJsZSB0aGUgbWtub2QoOCkgYnVpbHQtaW4gdG8gZ2V0IHJpZCBvZiBuZWVkaW5nIHNldG1vZGUuYwotSEFWRV9NS05PRD0wOyBleHBvcnQgSEFWRV9NS05PRAotCi0jIGV2ZW4gdGhlIGlkZWEgb2YgcGVyc2lzdGVudCBoaXN0b3J5IG9uIGEgcGhvbmUgaXMgZnVubnkKLUhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTA7IGV4cG9ydCBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCi0jIC4uLiBhbmQgcnVuIGl0IQotZXhwb3J0IENDIENQUEZMQUdTIENGTEFHUyBMREZMQUdTIExJQlMgVEFSR0VUX09TCi1zaCAuLi9zcmMvQnVpbGQuc2ggLU0KLXJ2PSQ/Ci10ZXN0IHgwID0geCIkcnYiICYmIG12IC1mIE1ha2VmcmFnLmluYyAuLi8KLWNkIC4uCi1ybSAtcmYgdG1wCi1leGl0ICRydgpkaWZmIC0tZ2l0IGEvbWtzaC9ta3NocmMgYi9ta3NoL21rc2hyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNWVhNi4uMDAwMDAwMAotLS0gYS9ta3NoL21rc2hyYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDEwCi0jCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgotIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KLSMtCi0jIE1pbmltYWwgL3N5c3RlbS9ldGMvbWtzaHJjIGZvciBBbmRyb2lkCi0KLTogJHtURVJNOj12dDEwMH0gJHtIT01FOj0vZGF0YX0gJHtNS1NIOj0vc3lzdGVtL2Jpbi9zaH0gJHtIT1NUTkFNRTo9YW5kcm9pZH0KLTogJHtTSEVMTDo9JE1LU0h9ICR7VVNFUjo9JCh0eXBlc2V0IHg9JChpZCk7IHg9JHt4IypcKH07IHByaW50IC1yIC0tICR7eCUlXCkqfSl9Ci1pZiAoKCBVU0VSX0lEICkpOyB0aGVuIFBTMT0nJCc7IGVsc2UgUFMxPScjJzsgZmkKLWZ1bmN0aW9uIHByZWNtZCB7Ci0JdHlwZXNldCBlPSQ/Ci0KLQkoKCBlICkpICYmIHByaW50IC1uICIkZXwiCi19Ci1QUzE9JyQocHJlY21kKSRVU0VSQCRIT1NUTkFNRToke1BXRDotP30gJyIkUFMxICIKLWV4cG9ydCBIT01FIEhPU1ROQU1FIE1LU0ggUFMxIFNIRUxMIFRFUk0gVVNFUgotYWxpYXMgbD0nbHMnCi1hbGlhcyBsYT0nbCAtYScKLWFsaWFzIGxsPSdsIC1sJwotYWxpYXMgbG89J2wgLWEgLWwnCi0KLWZvciBwIGluIH4vLmJpbjsgZG8KLQlbWyAtZCAkcC8uIF1dIHx8IGNvbnRpbnVlCi0JW1sgOiRQQVRIOiA9ICo6JHA6KiBdXSB8fCBQQVRIPSRwOiRQQVRICi1kb25lCi0KLXVuc2V0IHAKLQotOiBwbGFjZSBjdXN0b21pc2F0aW9ucyBhYm92ZSB0aGlzIGxpbmUKZGlmZiAtLWdpdCBhL21rc2gvc3JjLzAwLU5PVEUudHh0IGIvbWtzaC9zcmMvMDAtTk9URS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWQ1NDEuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvMDAtTk9URS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1UaGlzIGlzIG1rc2ggZnJvbSBBbm9uQ1ZTIG9uIDIwMTAtMDgtMjQgd2l0aCB0aGUKLWZvbGxvd2luZyBmaWxlcyByZW1vdmVkOgot4oCiIE1ha2VmaWxlCi0gIChub3QgcGFydCBvZiByZWd1bGFyIG1rc2ggcmVsZWFzZXMgYW55d2F5KQot4oCiIGRvdC5ta3NocmMKLSAgKG5vdCBuZWVkZWQsIHdlIHVzZSBvdXIgb3duIGZvciBBbmRyb2lkKQot4oCiIG1rc2guMQotICAobWFucGFnZTsgYWxzbyBhdmFpbGFibGUgZnJvbSB0aGUgd2ViKQot4oCiIHNldG1vZGUuYwotICAobm90IG5lZWRlZCwgd2UgZG9u4oCZdCB1c2UgdGhlIG1rbm9kIGJ1aWx0aW4pCi3igKIgc3RybGNweS5jCi0gIChub3QgbmVlZGVkLCBiaW9uaWMgcHJvdmlkZXMgdGhpcykKLQotVGhlIG1hbnVhbCBwYWdlIGNhbiBiZSBkb3dubG9hZGVkIGFzIFBERiAoSVNPIEE0IHBhcGVyKSBmcm9tCi1odHRwczovL3d3dy5taXJic2Qub3JnL01pck9TL2Rpc3QvbWlyL21rc2gvbWtzaC5wZGYgb3IgcmVhZAotb25saW5lIGF0IGh0dHBzOi8vd3d3Lm1pcmJzZC5vcmcvbWFuMS9ta3NoIChIVE1MKS4KLQotVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBkb25lIHRvIGNvZGUgaW4gdGhpcyBzdWJkaXJlY3RvcnkKLWF0IHRoZSBtb21lbnQ6Ci3igKIgY2hlY2sudCBtYWluLnNoOiByZW1vdmUgdGhlICdzdG9wJyBhbGlhcyB0byAna2lsbCAtU1RPUCcKLSAgc2luY2UgQW5kcm9pZCBoYXMgYSBidWlsdCBpbiBzdG9wIGNvbW1hbmQgdGhhdCB0aGUgYWxpYXMKLSAgb3ZlcnJpZGVzLCBjYXVzaW5nIHByb2JsZW1zIHdpdGggdGVzdGluZyB0b29scwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21rc2gvc3JjL0J1aWxkLnNoIGIvbWtzaC9zcmMvQnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGIxY2EuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvQnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAwICswLDAgQEAKLSMhL2Jpbi9zaAotc3JjdmVyc2lvbj0nJE1pck9TOiBzcmMvYmluL21rc2gvQnVpbGQuc2gsdiAxLjQ1OSAyMDEwLzA4LzI0IDE1OjQ2OjA2IHRnIEV4cCAkJwotIy0KLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0jCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSMKLSMgUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0jIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotIyBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSMgbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0jIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0jCi0jIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotIyB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSMgaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0jIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotIyBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSMgb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0jIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotIyBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotIy0KLSMgUGVvcGxlIGFuYWx5c2luZyB0aGUgb3V0cHV0IG11c3Qgd2hpdGVsaXN0IGNvbmZ0ZXN0LmMgZm9yIGFueSBraW5kCi0jIG9mIGNvbXBpbGVyIHdhcm5pbmcgY2hlY2tzIChtaXJ0b2NvbmYgaXMgYnkgZGVzaWduIG5vdCBxdWlldCkuCi0jCi0jIEVudmlyb25tZW50IHVzZWQ6CUNDIENGTEFHUyBDUFBGTEFHUyBMREZMQUdTIExJQlMgTk9XQVJOIE5ST0ZGCi0jCQkJVEFSR0VUX09TIFRBUkdFVF9PU1JFVgotIyBGZWF0dXJlIHNlbGVjdG9yczoJVVNFX1BSSU5URl9CVUlMVElOCi0jIENQUEZMQUdTIHJlY29nbmlzZWQ6CU1LU0hfQVNTVU1FX1VURjggTUtTSF9CSU5TSFJFRFVDRUQgTUtTSF9DTFNfU1RSSU5HCi0jCQkJTUtTSF9DT05TRVJWQVRJVkVfRkRTIE1LU0hfTUlETklHSFRCU0QwMUFTSF9DT01QQVQKLSMJCQlNS1NIX05PUFdOQU0gTUtTSF9OT19MSU1JVFMgTUtTSF9TTUFMTCBNS1NIX1NfTk9WSQotIwkJCU1LU0hfVU5FTVBMT1lFRCBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMIE1LU0hSQ19QQVRICi0jCQkJTUtTSF9ERUZBVUxUX1RNUERJUiBNS1NIX0NMUlRPRU9MX1NUUklORyBNS1NIX0E0UEIKLQotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLQotdigpIHsKLQkkZSAiJCoiCi0JZXZhbCAiJEAiCi19Ci0KLXZ2KCkgewotCV9jPSQxCi0Jc2hpZnQKLQkkZSAiXCQgJCoiIDI+JjEKLQlldmFsICIkQCIgPnZ2Lm91dCAyPiYxCi0Jc2VkICJzB14HJHtfY30gByIgPHZ2Lm91dAotfQotCi12cSgpIHsKLQlldmFsICIkQCIKLX0KLQotcm1mKCkgewotCWZvciBfZiBpbiAiJEAiOyBkbwotCQljYXNlICR7X2Z9IGluCi0JCW1rc2guMSkgOzsKLQkJKikgcm0gLWYgIiR7X2Z9IiA7OwotCQllc2FjCi0JZG9uZQotfQotCi1pZiB0ZXN0IC1kIC91c3IveHBnNC9iaW4vLiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkjIFNvbGFyaXM6IHNvbWUgb2YgdGhlIHRvb2xzIGhhdmUgd2VpcmQgYmVoYXZpb3VyLCB1c2UgcG9ydGFibGUgb25lcwotCVBBVEg9L3Vzci94cGc0L2JpbjokUEFUSAotCWV4cG9ydCBQQVRICi1maQotCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3h9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JZW11bGF0ZSBzaAotCU5VTExDTUQ9OgotZmkKLQotYWxsdT1RV0VSVFlVSU9QQVNERkdISktMWlhDVkJOTQotYWxsbD1xd2VydHl1aW9wYXNkZmdoamtsenhjdmJubQotYWxsbj0wMTIzNDU2Nzg5Ci1hbGxzPV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1ubD0nCi0nCi10Y2ZuPW5vCi1iaT0KLXVpPQotYW89Ci1meD0KLW1lPWBiYXNlbmFtZSAiJDAiYAotb3JpZ19DRkxBR1M9JENGTEFHUwotcGhhc2U9eAotb2xkaXNoX2VkPXN0ZG91dC1lZCxuby1zdGRlcnItZWQKLQotaWYgdGVzdCAtdCAxOyB0aGVuCi0JYmk9JxtbMW0nCi0JdWk9JxtbNG0nCi0JYW89JxtbMG0nCi1maQotCi11cHBlcigpIHsKLQllY2hvIDoiJEAiIHwgc2VkICdzL146Ly8nIHwgdHIgJGFsbGwgJGFsbHUKLX0KLQotIyBjbGVhbiB1cCBhZnRlciBhY190ZXN0cnVuKCkKLWFjX3Rlc3Rkb25lKCkgewotCWV2YWwgSEFWRV8kZnU9JGZ2Ci0JZnI9bm8KLQl0ZXN0IDAgPSAkZnYgfHwgZnI9eWVzCi0JJGUgIiRiaT09PiAkZmQuLi4kYW8gJHVpJGZyJGFvJGZ4IgotCWZ4PQotfQotCi0jIGFjX2NhY2hlIGxhYmVsOiBzZXRzIGYsIGZ1LCBmdj89MAotYWNfY2FjaGUoKSB7Ci0JZj0kMQotCWZ1PWB1cHBlciAkZmAKLQlldmFsIGZ2PVwkSEFWRV8kZnUKLQljYXNlICRmdiBpbgotCTB8MSkKLQkJZng9JyAoY2FjaGVkKScKLQkJcmV0dXJuIDAKLQkJOzsKLQllc2FjCi0JZnY9MAotCXJldHVybiAxCi19Ci0KLSMgYWNfdGVzdGluaXQgbGFiZWwgWyFdIGNoZWNraWZbIV0wIFtzZXRsYWJlbGlmY2hlY2tpc1shXTBdIHVzZXJvdXRwdXQKLSMgcmV0dXJucyAxIGlmIHZhbHVlIHdhcyBjYWNoZWQvaW1wbGllZCwgMCBvdGhlcndpc2U6IGNhbGwgYWNfdGVzdGRvbmUKLWFjX3Rlc3Rpbml0KCkgewotCWlmIGFjX2NhY2hlICQxOyB0aGVuCi0JCXRlc3QgeCIkMiIgPSB4IiEiICYmIHNoaWZ0Ci0JCXRlc3QgeCIkMiIgPSB4IiIgfHwgc2hpZnQKLQkJZmQ9JHszLSRmfQotCQlhY190ZXN0ZG9uZQotCQlyZXR1cm4gMQotCWZpCi0JZmM9MAotCWlmIHRlc3QgeCIkMiIgPSB4IiI7IHRoZW4KLQkJZnQ9MQotCWVsc2UKLQkJaWYgdGVzdCB4IiQyIiA9IHgiISI7IHRoZW4KLQkJCWZjPTEKLQkJCXNoaWZ0Ci0JCWZpCi0JCWV2YWwgZnQ9XCRIQVZFX2B1cHBlciAkMmAKLQkJc2hpZnQKLQlmaQotCWZkPSR7My0kZn0KLQlpZiB0ZXN0ICRmYyA9ICIkZnQiOyB0aGVuCi0JCWZ2PSQyCi0JCWZ4PScgKGltcGxpZWQpJwotCQlhY190ZXN0ZG9uZQotCQlyZXR1cm4gMQotCWZpCi0JJGUgLi4uICRmZAotCXJldHVybiAwCi19Ci0KLSMgcGlwZSAuYyB8IGFjX3Rlc3Rbbl0gWyFdIGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0Ci1hY190ZXN0bigpIHsKLQlpZiB0ZXN0IHgiJDEiID0geCIhIjsgdGhlbgotCQlmcj0xCi0JCXNoaWZ0Ci0JZWxzZQotCQlmcj0wCi0JZmkKLQlhY190ZXN0aW5pdCAiJEAiIHx8IHJldHVybgotCWNhdCA+Y29uZnRlc3QuYwotCXZ2ICddJyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gY29uZnRlc3QuYyAkTElCUyAkY2NwciIKLQl0ZXN0ICR0Y2ZuID0gbm8gJiYgdGVzdCAtZiBhLm91dCAmJiB0Y2ZuPWEub3V0Ci0JdGVzdCAkdGNmbiA9IG5vICYmIHRlc3QgLWYgYS5leGUgJiYgdGNmbj1hLmV4ZQotCXRlc3QgJHRjZm4gPSBubyAmJiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRjZm49Y29uZnRlc3QKLQlpZiB0ZXN0IC1mICR0Y2ZuOyB0aGVuCi0JCXRlc3QgMSA9ICRmciB8fCBmdj0xCi0JZWxzZQotCQl0ZXN0IDAgPSAkZnIgfHwgZnY9MQotCWZpCi0JdnNjYW49Ci0JaWYgdGVzdCAkcGhhc2UgPSB1OyB0aGVuCi0JCXRlc3QgJGN0ID0gZ2NjICYmIHZzY2FuPSd1bnJlY29nbmlbc3pdZWQnCi0JCXRlc3QgJGN0ID0gaHBjYyAmJiB2c2Nhbj0ndW5zdXBwb3J0ZWQnCi0JCXRlc3QgJGN0ID0gcGNjICYmIHZzY2FuPSd1bnN1cHBvcnRlZCcKLQkJdGVzdCAkY3QgPSBzdW5wcm8gJiYgdnNjYW49Jy1lIGlnbm9yZWQgLWUgdHVybmVkLm9mZicKLQlmaQotCXRlc3QgLW4gIiR2c2NhbiIgJiYgZ3JlcCAkdnNjYW4gdnYub3V0ID4vZGV2L251bGwgMj4mMSAmJiBmdj0kZnIKLQlybWYgY29uZnRlc3QuYyBjb25mdGVzdC5vICR7dGNmbn0qIHZ2Lm91dAotCWFjX3Rlc3Rkb25lCi19Ci0KLSMgYWNfaWZjcHAgY3BwZXhwciBbIV0gbGFiZWwgWyFdIGNoZWNraWZbIV0wIFtzZXRsYWJlbGlmY2hlY2tpc1shXTBdIHVzZXJvdXRwdXQKLWFjX2lmY3BwKCkgewotCWV4cHI9JDE7IHNoaWZ0Ci0JYWNfdGVzdG4gIiRAIiA8PC1FT0YKLQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKAotCQkjJGV4cHIKLQkJICAgIDAKLQkJI2Vsc2UKLQkJLyogZm9yY2UgYSBmYWlsdXJlOiBleHByIGlzIGZhbHNlICovCi0JCSAgICB0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKQotCQkjZW5kaWYKLQkJICAgICk7IH0KLUVPRgotCXRlc3QgeCIkMSIgPSB4IiEiICYmIHNoaWZ0Ci0JZj0kMQotCWZ1PWB1cHBlciAkZmAKLQlldmFsIGZ2PVwkSEFWRV8kZnUKLQl0ZXN0IHgiJGZ2IiA9IHgiMSIKLX0KLQotYWNfY3BwZmxhZ3MoKSB7Ci0JdGVzdCB4IiQxIiA9IHgiIiB8fCBmdT0kMQotCWZ2PSQyCi0JdGVzdCB4IiQyIiA9IHgiIiAmJiBldmFsIGZ2PVwkSEFWRV8kZnUKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV8kZnU9JGZ2IgotfQotCi1hY190ZXN0KCkgewotCWFjX3Rlc3RuICIkQCIKLQlhY19jcHBmbGFncwotfQotCi0jIGFjX2ZsYWdzIFstXSBhZGQgdmFybmFtZSBmbGFncyBbdGV4dF0KLWFjX2ZsYWdzKCkgewotCWlmIHRlc3QgeCIkMSIgPSB4Ii0iOyB0aGVuCi0JCXNoaWZ0Ci0JCWhmPTEKLQllbHNlCi0JCWhmPTAKLQlmaQotCWZhPSQxCi0Jdm49JDIKLQlmPSQzCi0JZnQ9JDQKLQl0ZXN0IHgiJGZ0IiA9IHgiIiAmJiBmdD0iaWYgJGYgY2FuIGJlIHVzZWQiCi0Jc2F2ZV9DRkxBR1M9JENGTEFHUwotCUNGTEFHUz0iJENGTEFHUyAkZiIKLQlpZiB0ZXN0IDEgPSAkaGY7IHRoZW4KLQkJYWNfdGVzdG4gY2FuXyR2biAnJyAiJGZ0IgotCWVsc2UKLQkJYWNfdGVzdG4gY2FuXyR2biAnJyAiJGZ0IiA8PC0nRU9GJwotCQkJLyogZXZpbCBhcG8nc3Ryb3BoIGluIGNvbW1lbnQgdGVzdCAqLwotCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9Ci0JCUVPRgotCWZpCi0JZXZhbCBmdj1cJEhBVkVfQ0FOX2B1cHBlciAkdm5gCi0JdGVzdCAxMSA9ICRmYSRmdiB8fCBDRkxBR1M9JHNhdmVfQ0ZMQUdTCi19Ci0KLSMgYWNfaGVhZGVyIFshXSBoZWFkZXIgW3ByZXJlcSAuLi5dCi1hY19oZWFkZXIoKSB7Ci0JaWYgdGVzdCB4IiQxIiA9IHgiISI7IHRoZW4KLQkJbmE9MQotCQlzaGlmdAotCWVsc2UKLQkJbmE9MAotCWZpCi0JaGY9JDE7IHNoaWZ0Ci0JaHY9YGVjaG8gIiRoZiIgfCB0ciAtZCAnXDAxMlwwMTUnIHwgdHIgLWMgJGFsbGwkYWxsdSRhbGxuICRhbGxzYAotCWZvciBpCi0JZG8KLQkJZWNobyAiI2luY2x1ZGUgPCRpPiIgPj54Ci0JZG9uZQotCWVjaG8gIiNpbmNsdWRlIDwkaGY+IiA+PngKLQllY2hvICdpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0nID4+eAotCWFjX3Rlc3RuICIkaHYiICIiICI8JGhmPiIgPHgKLQlybWYgeAotCXRlc3QgMSA9ICRuYSB8fCBhY19jcHBmbGFncwotfQotCi1hZGRzcmNzKCkgewotCWlmIHRlc3QgeCIkMSIgPSB4IiEiOyB0aGVuCi0JCWZyPTAKLQkJc2hpZnQKLQllbHNlCi0JCWZyPTEKLQlmaQotCWV2YWwgaT1cJCQxCi0JdGVzdCAkZnIgPSAiJGkiICYmIGNhc2UgIiAkU1JDUyAiIGluCi0JKlwgJDJcICopCTs7Ci0JKikJCVNSQ1M9IiRTUkNTICQyIiA7OwotCWVzYWMKLX0KLQotCi1pZiB0ZXN0IC1kIG1rc2ggfHwgdGVzdCAtZCBta3NoLmV4ZTsgdGhlbgotCWVjaG8gIiRtZTogRXJyb3I6IC4vbWtzaCBpcyBhIGRpcmVjdG9yeSEiID4mMgotCWV4aXQgMQotZmkKLXJtZiBhLmV4ZSogYS5vdXQqIGNvbmZ0ZXN0LmMgKmNvcmUgbGZ0IG1rc2gqIG5vICouYmMgKi5sbCAqLm8gXAotICAgIFJlYnVpbGQuc2ggc2lnbmFtZXMuaW5jIHRlc3Quc2ggeCB2di5vdXQKLQotY3VyZGlyPWBwd2RgIHNyY2Rpcj1gZGlybmFtZSAiJDAiYCBjaGVja19jYXRlZ29yaWVzPQotdGVzdCAtbiAiJGRpcm5hbWUiIHx8IGRpcm5hbWU9LgotZHN0dmVyc2lvbj1gc2VkIC1uICcvZGVmaW5lIE1LU0hfVkVSU0lPTi9zL14uKiJcKC4qXCkiLiokL1wxL3AnICRzcmNkaXIvc2guaGAKLQotZT1lY2hvCi1yPTAKLWVxPTAKLXBtPTAKLWNtPW5vcm1hbAotb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKLWxhc3Q9Ci0KLWZvciBpCi1kbwotCWNhc2UgJGxhc3Q6JGkgaW4KLQljOmNvbWJpbmV8YzpkcmFnb25lZ2d8YzpsbHZtKQotCQljbT0kaQotCQlsYXN0PQotCQk7OwotCWM6KikKLQkJZWNobyAiJG1lOiBVbmtub3duIG9wdGlvbiAtYyAnJGknISIgPiYyCi0JCWV4aXQgMQotCQk7OwotCW86KikKLQkJb3B0ZmxhZ3M9JGkKLQkJbGFzdD0KLQkJOzsKLQk6LWMpCi0JCWxhc3Q9YwotCQk7OwotCTotY29tYmluZSkKLQkJY209Y29tYmluZQotCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBjb21iaW5lJyBpbnN0ZWFkISIgPiYyCi0JCTs7Ci0JOi1nKQotCQkjIGNoZWNrZXIsIGRlYnVnLCB2YWxncmluZCBidWlsZAotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EREVCVUciCi0JCUNGTEFHUz0iJENGTEFHUyAtZzMgLWZuby1idWlsdGluIgotCQk7OwotCTotaikKLQkJcG09MQotCQk7OwotCTotbGx2bSkKLQkJY209bGx2bQotCQlvcHRmbGFncz0tc3RkLWNvbXBpbGUtb3B0cwotCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBsbHZtIC1PJyBpbnN0ZWFkISIgPiYyCi0JCTs7Ci0JOi1sbHZtPSopCi0JCWNtPWxsdm0KLQkJb3B0ZmxhZ3M9YGVjaG8gIngkaSIgfCBzZWQgJ3MvXngtbGx2bT0vLydgCi0JCWVjaG8gIiRtZTogV2FybmluZzogJyRpJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1jIGxsdm0gLW8gJGxsdm0nIGluc3RlYWQhIiA+JjIKLQkJOzsKLQk6LU0pCi0JCWNtPW1ha2VmaWxlCi0JCTs7Ci0JOi1PKQotCQlvcHRmbGFncz0tc3RkLWNvbXBpbGUtb3B0cwotCQk7OwotCTotbykKLQkJbGFzdD1vCi0JCTs7Ci0JOi1RKQotCQllcT0xCi0JCTs7Ci0JOi1yKQotCQlyPTEKLQkJOzsKLQk6LXYpCi0JCWVjaG8gIkJ1aWxkLnNoICRzcmN2ZXJzaW9uIgotCQllY2hvICJmb3IgbWtzaCAkZHN0dmVyc2lvbiIKLQkJZXhpdCAwCi0JCTs7Ci0JOiopCi0JCWVjaG8gIiRtZTogVW5rbm93biBvcHRpb24gJyRpJyEiID4mMgotCQlleGl0IDEKLQkJOzsKLQkqKQotCQllY2hvICIkbWU6IFVua25vd24gb3B0aW9uIC0nJGxhc3QnICckaSchIiA+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JZXNhYwotZG9uZQotaWYgdGVzdCAtbiAiJGxhc3QiOyB0aGVuCi0JZWNobyAiJG1lOiBPcHRpb24gLSckbGFzdCcgbm90IGZvbGxvd2VkIGJ5IGFyZ3VtZW50ISIgPiYyCi0JZXhpdCAxCi1maQotCi1TUkNTPSJsYWxsb2MuYyBlZGl0LmMgZXZhbC5jIGV4ZWMuYyBleHByLmMgZnVuY3MuYyBoaXN0cmFwLmMiCi1TUkNTPSIkU1JDUyBqb2JzLmMgbGV4LmMgbWFpbi5jIG1pc2MuYyBzaGYuYyBzeW4uYyB0cmVlLmMgdmFyLmMiCi0KLWlmIHRlc3QgeCIkc3JjZGlyIiA9IHgiLiI7IHRoZW4KLQlDUFBGTEFHUz0iLUkuICRDUFBGTEFHUyIKLWVsc2UKLQlDUFBGTEFHUz0iLUkuIC1JJyRzcmNkaXInICRDUFBGTEFHUyIKLWZpCi0KLXRlc3QgeCIkVEFSR0VUX09TIiA9IHgiIiAmJiBUQVJHRVRfT1M9YHVuYW1lIC1zIDI+L2Rldi9udWxsIHx8IHVuYW1lYAotb3N3YXJuPQotY2NwYz0tV2MsCi1jY3BsPS1XbCwKLXRzdHM9Ci1jY3ByPSd8fCBmb3IgX2YgaW4gJHt0Y2ZufSo7IGRvIHRlc3QgeCIke19mfSIgPSB4Im1rc2guMSIgfHwgcm0gLWYgIiR7X2Z9IjsgZG9uZScKLQotIyBDb25maWd1cmF0aW9uIGRlcGVuZGluZyBvbiBPUyByZXZpc2lvbiwgb24gT1NlcyB0aGF0IG5lZWQgdGhlbQotY2FzZSAkVEFSR0VUX09TIGluCi1RTlgpCi0JdGVzdCB4IiRUQVJHRVRfT1NSRVYiID0geCIiICYmIFRBUkdFVF9PU1JFVj1gdW5hbWUgLXJgCi0JOzsKLWVzYWMKLQotIyBDb25maWd1cmF0aW9uIGRlcGVuZGluZyBvbiBPUyBuYW1lCi1jYXNlICRUQVJHRVRfT1MgaW4KLUFJWCkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0FMTF9TT1VSQ0UiCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLUJlT1MpCi0Jb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJwotCTs7Ci1CU0QvT1MpCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLUNZR1dJTiopCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLURhcndpbikKLQk7OwotRHJhZ29uRmx5KQotCTs7Ci1GcmVlQlNEKQotCTs7Ci1HTlUpCi0JIyBkZWZpbmUgTk9fUEFUSF9NQVggdG8gdXNlIEh1cmQtb25seSBmdW5jdGlvbnMKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UgLUROT19QQVRIX01BWCIKLQk7OwotR05VL2tGcmVlQlNEKQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSIKLQk7OwotSGFpa3UpCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfQVNTVU1FX1VURjgiCi0JOzsKLUhQLVVYKQotCTs7Ci1JbnRlcml4KQotCWNjcGM9Jy1YICcKLQljY3BsPSctWSAnCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9BTExfU09VUkNFIgotCTogJHtMSUJTPSctbGNyeXB0J30KLQk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KLQk7OwotSVJJWCopCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLUxpbnV4KQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSIKLQk6ICR7SEFWRV9SRVZPS0U9MH0KLQk7OwotTWlkbmlnaHRCU0QpCi0JOzsKLU1pbml4KQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX1VORU1QTE9ZRUQgLURNS1NIX0NPTlNFUlZBVElWRV9GRFMiCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfMV9TT1VSQ0U9MiAtRF9NSU5JWCIKLQlvbGRpc2hfZWQ9bm8tc3RkZXJyLWVkCQkjIC91c3IvYmluL2VkKCEpIGlzIGJyb2tlbgotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1NaXJCU0QpCi0JOzsKLU5ldEJTRCkKLQk7OwotT3BlbkJTRCkKLQk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KLQk7OwotT1NGMSkKLQlIQVZFX1NJR19UPTAJIyBpbmNvbXBhdGlibGUKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX09TRl9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MjAwMTEyTCIKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX1hPUEVOX1NPVVJDRT02MDAgLURfWE9QRU5fU09VUkNFX0VYVEVOREVEIgotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1QbGFuOSkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX1BPU0lYX1NPVVJDRSAtRF9MSU1JVFNfRVhURU5TSU9OIgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQlNEX0VYVEVOU0lPTiAtRF9TVVNWMl9TT1VSQ0UiCi0Jb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJwotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4IC1ETUtTSF9VTkVNUExPWUVEIgotCTs7Ci1QVzMyKikKLQlIQVZFX1NJR19UPTAJIyBpbmNvbXBhdGlibGUKLQlvc3dhcm49JyBhbmQgd2lsbCBjdXJyZW50bHkgbm90IHdvcmsnCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLVFOWCkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX19OT19FWFRfUU5YIgotCWNhc2UgJFRBUkdFVF9PU1JFViBpbgotCVswMTIzNDVdLip8Ni5bMDEyM10uKnw2LjQuWzAxXSkKLQkJb2xkaXNoX2VkPW5vLXN0ZGVyci1lZAkJIyBvbGRpc2ggL2Jpbi9lZCBpcyBicm9rZW4KLQkJOzsKLQllc2FjCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLVN1bk9TKQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQlNEX1NPVVJDRSAtRF9fRVhURU5TSU9OU19fIgotCTs7Ci1zeWxsYWJsZSkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCi0Jb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJwotCTs7Ci1VTFRSSVgpCi0JOiAke0NDPWNjIC1ZUE9TSVh9Ci0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNzaXplX3Q9aW50IgotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1VV0lOKikKLQljY3BjPSctWWMsJwotCWNjcGw9Jy1ZbCwnCi0JdHN0cz0iIDM8Pi9kZXYvdHR5IgotCW9zd2Fybj0iOyBpdCB3aWxsIGNvbXBpbGUsIGJ1dCB0aGUgdGFyZ2V0IgotCW9zd2Fybj0iJG9zd2FybiR7bmx9cGxhdGZvcm0gaXRzZWxmIGlzIHZlcnkgZmxha2V5L3VucmVsaWFibGUiCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLSopCi0Jb3N3YXJuPSc7IGl0IG1heSBvciBtYXkgbm90IHdvcmsnCi0JOzsKLWVzYWMKLQotOiAke0NDPWNjfSAke05ST0ZGPW5yb2ZmfQotdGVzdCAwID0gJHIgJiYgZWNobyB8ICROUk9GRiAtdiAyPiYxIHwgZ3JlcCBHTlUgPi9kZXYvbnVsbCAyPiYxICYmIFwKLSAgICBOUk9GRj0iJE5ST0ZGIC1jIgotCi0jIHRoaXMgYWlkcyBtZSBpbiB0cmFjaW5nIEZUQkZTZW4gd2l0aG91dCBhY2Nlc3MgdG8gdGhlIGJ1aWxkZAotJGUgIkhpIGZyb20kYW8gJGJpJHNyY3ZlcnNpb24kYW8gb246IgotY2FzZSAkVEFSR0VUX09TIGluCi1EYXJ3aW4pCi0JdnYgJ3wnICJod3ByZWZzIG1hY2hpbmVfdHlwZSBvc190eXBlIG9zX2NsYXNzID4mMiIKLQl2diAnfCcgInVuYW1lIC1hID4mMiIKLQk7OwotSVJJWCopCi0JdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCi0JdnYgJ3wnICJoaW52IC12ID4mMiIKLQk7OwotT1NGMSkKLQl2diAnfCcgInVuYW1lIC1hID4mMiIKLQl2diAnfCcgIi91c3Ivc2Jpbi9zaXplciAtdiA+JjIiCi0JOzsKLSopCi0JdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCi0JOzsKLWVzYWMKLXRlc3QgLXogIiRvc3dhcm4iIHx8IGVjaG8gPiYyICIKLVdhcm5pbmc6IG1rc2ggaGFzIG5vdCB5ZXQgYmVlbiBwb3J0ZWQgdG8gb3IgdGVzdGVkIG9uIHlvdXIKLW9wZXJhdGluZyBzeXN0ZW0gJyRUQVJHRVRfT1MnJG9zd2Fybi4gSWYgeW91IGNhbiBwcm92aWRlCi1hIHNoZWxsIGFjY291bnQgdG8gdGhlIGRldmVsb3BlciwgdGhpcyBtYXkgaW1wcm92ZTsgcGxlYXNlCi1kcm9wIHVzIGEgc3VjY2VzcyBvciBmYWlsdXJlIG5vdGljZSBvciBldmVuIHNlbmQgaW4gZGlmZnMuCi0iCi0kZSAiJGJpJG1lOiBCdWlsZGluZyB0aGUgTWlyQlNEIEtvcm4gU2hlbGwkYW8gJHVpJGRzdHZlcnNpb24kYW8iCi0KLSMKLSMgQmVnaW4gb2YgbWlydG9jb25mIGNoZWNrcwotIwotJGUgJGJpJG1lOiBTY2FubmluZyBmb3IgZnVuY3Rpb25zLi4uIHBsZWFzZSBpZ25vcmUgYW55IGVycm9ycy4kYW8KLQotIwotIyBDb21waWxlcjogd2hpY2ggb25lPwotIwotIyBub3RlczoKLSMgLSBJQ0MgZGVmaW5lcyBfX0dOVUNfXyB0b28KLSMgLSBHQ0MgZGVmaW5lcyBfX2hwdXggdG9vCi0jIC0gTExWTStjbGFuZyBkZWZpbmVzIF9fR05VQ19fIHRvbwotIyAtIG53Y2MgZGVmaW5lcyBfX0dOVUNfXyB0b28KLUNQUD0iJENDIC1FIgotJGUgLi4uIHdoaWNoIGNvbXBpbGVyIHNlZW1zIHRvIGJlIHVzZWQKLWNhdCA+Y29uZnRlc3QuYyA8PCdFT0YnCi0jaWYgZGVmaW5lZChfX0lDQykgfHwgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQotY3Q9aWNjCi0jZWxpZiBkZWZpbmVkKF9feGxDX18pIHx8IGRlZmluZWQoX19JQk1DX18pCi1jdD14bGMKLSNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKLWN0PXN1bnBybwotI2VsaWYgZGVmaW5lZChfX0FDS19fKQotY3Q9YWNrCi0jZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKLWN0PWJjYwotI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKLWN0PXdhdGNvbQotI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKQotY3Q9bWV0cm93ZXJrcwotI2VsaWYgZGVmaW5lZChfX0hQX2NjKQotY3Q9aHBjYwotI2VsaWYgZGVmaW5lZChfX0RFQ0MpIHx8IChkZWZpbmVkKF9fb3NmX18pICYmICFkZWZpbmVkKF9fR05VQ19fKSkKLWN0PWRlYwotI2VsaWYgZGVmaW5lZChfX1BHSSkKLWN0PXBnaQotI2VsaWYgZGVmaW5lZChfX0RNQ19fKQotY3Q9ZG1jCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotY3Q9bXNjCi0jZWxpZiBkZWZpbmVkKF9fQURTUEJMQUNLRklOX18pIHx8IGRlZmluZWQoX19BRFNQVFNfXykgfHwgZGVmaW5lZChfX0FEU1AyMTAwMF9fKQotY3Q9YWRzcAotI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQotY3Q9aWFyCi0jZWxpZiBkZWZpbmVkKFNEQ0MpCi1jdD1zZGNjCi0jZWxpZiBkZWZpbmVkKF9fUENDX18pCi1jdD1wY2MKLSNlbGlmIGRlZmluZWQoX19UZW5EUkFfXykKLWN0PXRlbmRyYQotI2VsaWYgZGVmaW5lZChfX1RJTllDX18pCi1jdD10Y2MKLSNlbGlmIGRlZmluZWQoX19sbHZtX18pICYmIGRlZmluZWQoX19jbGFuZ19fKQotY3Q9Y2xhbmcKLSNlbGlmIGRlZmluZWQoX19OV0NDX18pCi1jdD1ud2NjCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQotY3Q9Z2NjCi0jZWxpZiBkZWZpbmVkKF9DT01QSUxFUl9WRVJTSU9OKQotY3Q9bWlwc3BybwotI2VsaWYgZGVmaW5lZChfX3NnaSkKLWN0PW1pcHNwcm8KLSNlbGlmIGRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9faHB1YSkKLWN0PWhwY2MKLSNlbGlmIGRlZmluZWQoX191bHRyaXgpCi1jdD11Y29kZQotI2Vsc2UKLWN0PXVua25vd24KLSNlbmRpZgotRU9GCi1jdD11bmtub3duCi12diAnXScgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIHwgZ3JlcCBjdD0gfCB0ciAtZCBcXFxcMDE1ID54Igotc2VkICdzL14vWyAvJyB4Ci1ldmFsIGBjYXQgeGAKLXJtZiB4IHZ2Lm91dAotZWNobyAnaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+Y29uZnRlc3QuYwotY2FzZSAkY3QgaW4KLWFjaykKLQkjIHdvcmsgYXJvdW5kICJ0aGUgZmFtb3VzIEFDSyBjb25zdCBidWciCi0JQ1BQRkxBR1M9Ii1EY29uc3Q9ICRDUFBGTEFHUyIKLQk7OwotYWRzcCkKLQllY2hvID4mMiAnV2FybmluZzogQW5hbG9nIERldmljZXMgQysrIGNvbXBpbGVyIGZvciBCbGFja2ZpbiwgVGlnZXJTSEFSQwotICAgIGFuZCBTSEFSQyAoMjEwMDApIERTUHMgZGV0ZWN0ZWQuIFRoaXMgY29tcGlsZXIgaGFzIG5vdCB5ZXQKLSAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKLSAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJwotCTs7Ci1iY2MpCi0JZWNobyA+JjIgIldhcm5pbmc6IEJvcmxhbmQgQysrIEJ1aWxkZXIgZGV0ZWN0ZWQuIFRoaXMgY29tcGlsZXIgbWlnaHQKLSAgICBwcm9kdWNlIGJyb2tlbiBleGVjdXRhYmxlcy4gQ29udGludWUgYXQgeW91ciBvd24gcmlzaywKLSAgICBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4iCi0JOzsKLWNsYW5nKQotCSMgZG9lcyBub3Qgd29yayB3aXRoIGN1cnJlbnQgImNjYyIgY29tcGlsZXIgZHJpdmVyCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdmVyc2lvbiIKLQkjIHRoaXMgd29ya3MsIGZvciBub3cKLQl2diAnfCcgIiR7Q0xBTkctY2xhbmd9IC12ZXJzaW9uIgotCSMgZW5zdXJlIGNvbXBpbGVyIGFuZCBsaW5rZXIgYXJlIGluIHN5bmMgdW5sZXNzIG92ZXJyaWRkZW4KLQljYXNlICRDQ0NfQ0M6JENDQ19MRCBpbgotCToqKQk7OwotCSo6KQlDQ0NfTEQ9JENDQ19DQzsgZXhwb3J0IENDQ19MRCA7OwotCWVzYWMKLQk7OwotZGVjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtV2wsLVYgY29uZnRlc3QuYyAkTElCUyIKLQk7OwotZG1jKQotCWVjaG8gPiYyICJXYXJuaW5nOiBEaWdpdGFsIE1hcnMgQ29tcGlsZXIgZGV0ZWN0ZWQuIFdoZW4gcnVubmluZyB1bmRlciIKLQllY2hvID4mMiAiICAgIFVXSU4sIG1rc2ggdGVuZHMgdG8gYmUgdW5zdGFibGUgZHVlIHRvIHRoZSBsaW1pdGF0aW9ucyIKLQllY2hvID4mMiAiICAgIG9mIHRoaXMgcGxhdGZvcm0uIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2ssIgotCWVjaG8gPiYyICIgICAgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuIgotCTs7Ci1nY2MpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtdiBjb25mdGVzdC5jICRMSUJTIgotCXZ2ICd8JyAnZWNobyBgJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgXAotCSAgICAtZHVtcG1hY2hpbmVgIGdjY2AkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiBcCi0JICAgICRMSUJTIC1kdW1wdmVyc2lvbmAnCi0JOzsKLWhwY2MpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtViBjb25mdGVzdC5jICRMSUJTIgotCTs7Ci1pYXIpCi0JZWNobyA+JjIgJ1dhcm5pbmc6IElBUiBTeXN0ZW1zIChodHRwOi8vd3d3Lmlhci5jb20pIGNvbXBpbGVyIGZvciBlbWJlZGRlZAotICAgIHN5c3RlbXMgZGV0ZWN0ZWQuIFRoaXMgdW5zdXBwb3J0ZWQgY29tcGlsZXIgaGFzIG5vdCB5ZXQKLSAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKLSAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJwotCTs7Ci1pY2MpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViIKLQk7OwotbWV0cm93ZXJrcykKLQllY2hvID4mMiAnV2FybmluZzogTWV0cm93ZXJrcyBDIGNvbXBpbGVyIGRldGVjdGVkLiBUaGlzIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7OwotbWlwc3BybykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12ZXJzaW9uIgotCTs7Ci1tc2MpCi0JY2Nwcj0JCSMgZXJyb3JsZXZlbHMgYXJlIG5vdCByZWxpYWJsZQotCWNhc2UgJFRBUkdFVF9PUyBpbgotCUludGVyaXgpCi0JCWlmIFtbIC1uICRDODlfQ09NUElMRVIgXV07IHRoZW4KLQkJCUM4OV9DT01QSUxFUj1gbnRwYXRoMnBvc2l4IC1jICIkQzg5X0NPTVBJTEVSImAKLQkJZWxzZQotCQkJQzg5X0NPTVBJTEVSPUNMLkVYRQotCQlmaQotCQlpZiBbWyAtbiAkQzg5X0xJTktFUiBdXTsgdGhlbgotCQkJQzg5X0xJTktFUj1gbnRwYXRoMnBvc2l4IC1jICIkQzg5X0xJTktFUiJgCi0JCWVsc2UKLQkJCUM4OV9MSU5LRVI9TElOSy5FWEUKLQkJZmkKLQkJdnYgJ3wnICIkQzg5X0NPTVBJTEVSIC9IRUxQID4mMiIKLQkJdnYgJ3wnICIkQzg5X0xJTktFUiAvTElOSyA+JjIiCi0JCTs7Ci0JZXNhYwotCTs7Ci1ud2NjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXZlcnNpb24iCi0JOzsKLXBjYykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12IgotCTs7Ci1wZ2kpCi0JZWNobyA+JjIgJ1dhcm5pbmc6IFBHSSBkZXRlY3RlZC4gVGhpcyB1bmtub3duIGNvbXBpbGVyIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7Owotc2RjYykKLQllY2hvID4mMiAnV2FybmluZzogc2RjYyAoaHR0cDovL3NkY2Muc291cmNlZm9yZ2UubmV0KSwgdGhlIHNtYWxsIGRldmljZXMKLSAgICBDIGNvbXBpbGVyIGZvciBlbWJlZGRlZCBzeXN0ZW1zIGRldGVjdGVkLiBUaGlzIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7Owotc3VucHJvKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVYgY29uZnRlc3QuYyAkTElCUyIKLQk7OwotdGNjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXYiCi0JOzsKLXRlbmRyYSkKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIDI+JjEgfCBcCi0JICAgIGZncmVwIC1pIC1lIHZlcnNpb24gLWUgcmVsZWFzZSIKLQk7OwotdWNvZGUpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViIKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1XbCwtViBjb25mdGVzdC5jICRMSUJTIgotCTs7Ci13YXRjb20pCi0JZWNobyA+JjIgJ1dhcm5pbmc6IFdhdGNvbSBDIENvbXBpbGVyIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7OwoteGxjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXF2ZXJzaW9uPXZlcmJvc2UiCi0JdnYgJ3wnICJsZCAtViIKLQk7OwotKikKLQljdD11bmtub3duCi0JOzsKLWVzYWMKLWNhc2UgJGNtIGluCi1kcmFnb25lZ2d8bGx2bSkKLQl2diAnfCcgImxsYyAtdmVyc2lvbiIKLQk7OwotZXNhYwotJGUgIiRiaT09PiB3aGljaCBjb21waWxlciBzZWVtcyB0byBiZSB1c2VkLi4uJGFvICR1aSRjdCRhbyIKLXJtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8gY29uZnRlc3QgYS5vdXQqIGEuZXhlKiB2di5vdXQKLQotIwotIyBDb21waWxlcjogd29ya3MgYXMtaXMsIHdpdGggLVduby1lcnJvciBhbmQgLVdlcnJvcgotIwotc2F2ZV9OT1dBUk49JE5PV0FSTgotTk9XQVJOPQotRE9XQVJOPQotYWNfZmxhZ3MgMCBjb21waWxlcl93b3JrcyAnJyAnaWYgdGhlIGNvbXBpbGVyIHdvcmtzJwotdGVzdCAxID0gJEhBVkVfQ0FOX0NPTVBJTEVSX1dPUktTIHx8IGV4aXQgMQotSEFWRV9DT01QSUxFUl9LTk9XTj0wCi10ZXN0ICRjdCA9IHVua25vd24gfHwgSEFWRV9DT01QSUxFUl9LTk9XTj0xCi1pZiBhY19pZmNwcCAnaWYgMCcgY29tcGlsZXJfZmFpbHMgJycgXAotICAgICdpZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgZmFpbCBjb3JyZWN0bHknOyB0aGVuCi0Jc2F2ZV9DRkxBR1M9JENGTEFHUwotCTogJHtIQVZFX0NBTl9ERUxFWEU9eH0KLQlpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgotCQlDRkxBR1M9IiRDRkxBR1MgJHtjY3BsfS9ERUxFWEVDVVRBQkxFIgotCQlhY190ZXN0biBjYW5fZGVsZXhlIGNvbXBpbGVyX2ZhaWxzIDAgJ2ZvciB0aGUgL0RFTEVYRUNVVEFCTEUgbGlua2VyIG9wdGlvbicgPDwtRU9GCi0JCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KLQkJRU9GCi0JZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgotCQlDRkxBR1M9IiRDRkxBR1MgJHtjY3BsfS1ub25fc2hhcmVkIgotCQlhY190ZXN0biBjYW5fZGVsZXhlIGNvbXBpbGVyX2ZhaWxzIDAgJ2ZvciB0aGUgLW5vbl9zaGFyZWQgbGlua2VyIG9wdGlvbicgPDwtRU9GCi0JCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KLQkJRU9GCi0JZWxzZQotCQlleGl0IDEKLQlmaQotCXRlc3QgMSA9ICRIQVZFX0NBTl9ERUxFWEUgfHwgQ0ZMQUdTPSRzYXZlX0NGTEFHUwotCWFjX3Rlc3RuIGNvbXBpbGVyX3N0aWxsX2ZhaWxzICcnICdpZiB0aGUgY29tcGlsZXIgc3RpbGwgZG9lcyBub3QgZmFpbCBjb3JyZWN0bHknIDw8LUVPRgotCUVPRgotCXRlc3QgMSA9ICRIQVZFX0NPTVBJTEVSX1NUSUxMX0ZBSUxTICYmIGV4aXQgMQotZmkKLWlmIGFjX2lmY3BwICdpZmRlZiBfX1RJTllDX18nIGNvdWxkYmVfdGNjICchJyBjb21waWxlcl9rbm93biAwIFwKLSAgICAnaWYgdGhpcyBjb3VsZCBiZSB0Y2MnOyB0aGVuCi0JY3Q9dGNjCi0JQ1BQPSdjcHAgLURfX1RJTllDX18nCi1maQotCi1pZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgotCXRlc3QgeCIkc2F2ZV9OT1dBUk4iID0geCIiICYmIHNhdmVfTk9XQVJOPSctZXJyd2Fybj0lbm9uZScKLQlhY19mbGFncyAwIGVycndhcm5ub25lICIkc2F2ZV9OT1dBUk4iCi0JdGVzdCAxID0gJEhBVkVfQ0FOX0VSUldBUk5OT05FIHx8IHNhdmVfTk9XQVJOPQotCWFjX2ZsYWdzIDAgZXJyd2FybmFsbCAiLWVycndhcm49JWFsbCIKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fRVJSV0FSTkFMTCAmJiBET1dBUk49Ii1lcnJ3YXJuPSVhbGwiCi1lbGlmIHRlc3QgJGN0ID0gaHBjYzsgdGhlbgotCXNhdmVfTk9XQVJOPQotCURPV0FSTj0rV2UKLWVsaWYgdGVzdCAkY3QgPSBtaXBzcHJvOyB0aGVuCi0Jc2F2ZV9OT1dBUk49Ci0JRE9XQVJOPSItZGlhZ19lcnJvciAxLTEwMDAwIgotZWxpZiB0ZXN0ICRjdCA9IG1zYzsgdGhlbgotCXNhdmVfTk9XQVJOPSIke2NjcGN9L3ciCi0JRE9XQVJOPSIke2NjcGN9L1dYIgotZWxpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgotCXNhdmVfTk9XQVJOPSIke2NjcGN9LXciCi0JRE9XQVJOPSIke2NjcGN9LXd4IgotZWxpZiB0ZXN0ICRjdCA9IGJjYzsgdGhlbgotCXNhdmVfTk9XQVJOPSIke2NjcGN9LXciCi0JRE9XQVJOPSIke2NjcGN9LXchIgotZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgotCTogLW1zZ18qIGZsYWdzIG5vdCB1c2VkIHlldCwgb3IgaXMgLXcyIGNvcnJlY3Q/Ci1lbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCi0Jc2F2ZV9OT1dBUk49LXFmbGFnPWk6ZQotCURPV0FSTj0tcWZsYWc9aTppCi1lbGlmIHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCi0Jc2F2ZV9OT1dBUk49LXcKLWVsaWYgdGVzdCAkY3QgPSB1Y29kZTsgdGhlbgotCXNhdmVfTk9XQVJOPQotCURPV0FSTj0tdzIKLWVsc2UKLQl0ZXN0IHgiJHNhdmVfTk9XQVJOIiA9IHgiIiAmJiBzYXZlX05PV0FSTj0tV25vLWVycm9yCi0JYWNfZmxhZ3MgMCB3bm9lcnJvciAiJHNhdmVfTk9XQVJOIgotCXRlc3QgMSA9ICRIQVZFX0NBTl9XTk9FUlJPUiB8fCBzYXZlX05PV0FSTj0KLQlhY19mbGFncyAwIHdlcnJvciAtV2Vycm9yCi0JdGVzdCAxID0gJEhBVkVfQ0FOX1dFUlJPUiAmJiBET1dBUk49LVdlcnJvcgotZmkKLQotdGVzdCAkY3QgPSBpY2MgJiYgRE9XQVJOPSIkRE9XQVJOIC13ZDE0MTkiCi1OT1dBUk49JHNhdmVfTk9XQVJOCi0KLSMKLSMgQ29tcGlsZXI6IGV4dHJhIGZsYWdzICgtTzIgLWYqIC1XKiBldGMuKQotIwotaT1gZWNobyA6IiRvcmlnX0NGTEFHUyIgfCBzZWQgJ3MvXjovLycgfCB0ciAtYyAtZCAkYWxsbCRhbGx1JGFsbG5gCi0jIG9wdGltaXNhdGlvbjogb25seSBpZiBvcmlnX0NGTEFHUyBpcyBlbXB0eQotdGVzdCB4IiRpIiA9IHgiIiAmJiBpZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgotCWNhdCA+eCA8PC0nRU9GJwotCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KLQkJI2RlZmluZSBfX0lEU1RSSU5HX0NPTkNBVChsLHApCV9fTElOVEVEX18gIyMgbCAjIyBfICMjIHAKLQkJI2RlZmluZSBfX0lEU1RSSU5HX0VYUEFORChsLHApCV9fSURTVFJJTkdfQ09OQ0FUKGwscCkKLQkJI2RlZmluZSBwYWQJCQl2b2lkIF9fSURTVFJJTkdfRVhQQU5EKF9fTElORV9fLHgpKHZvaWQpIHsgfQotCUVPRgotCXllcyBwYWQgfCBoZWFkIC1uIDI1NiA+PngKLQlhY19mbGFncyAtIDEgb3R3byAteE8yIDx4Ci0Jcm1mIHgKLWVsaWYgdGVzdCAkY3QgPSBocGNjOyB0aGVuCi0JcGhhc2U9dQotCWFjX2ZsYWdzIDEgb3R3byArTzIKLQlwaGFzZT14Ci1lbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCi0JYWNfZmxhZ3MgMSBvdGhyZWUgIi1PMyAtcXN0cmljdCIKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fT1RIUkVFIHx8IGFjX2ZsYWdzIDEgb3R3byAtTzIKLWVsaWYgdGVzdCAkY3QgPSB0Y2MgfHwgdGVzdCAkY3QgPSB0ZW5kcmE7IHRoZW4KLQk6IG5vIHNwZWNpYWwgb3B0aW1pc2F0aW9uCi1lbHNlCi0JYWNfZmxhZ3MgMSBvdHdvIC1PMgotCXRlc3QgMSA9ICRIQVZFX0NBTl9PVFdPIHx8IGFjX2ZsYWdzIDEgb3B0aW1pc2UgLU8KLWZpCi0jIG90aGVyIGZsYWdzOiBqdXN0IGFkZCB0aGVtIGlmIHRoZXkgYXJlIHN1cHBvcnRlZAotaT0wCi1pZiB0ZXN0ICRjdCA9IGdjYzsgdGhlbgotCSMgVGhlIGZvbGxvd2luZyB0ZXN0cyBydW4gd2l0aCAtV2Vycm9yIChnY2Mgb25seSkgaWYgcG9zc2libGUKLQlOT1dBUk49JERPV0FSTjsgcGhhc2U9dQotCWFjX2ZsYWdzIDEgZm5vc3RyaWN0YWxpYXNpbmcgLWZuby1zdHJpY3QtYWxpYXNpbmcKLQlhY19mbGFncyAxIGZzdGFja3Byb3RlY3RvcmFsbCAtZnN0YWNrLXByb3RlY3Rvci1hbGwKLQlhY19mbGFncyAxIGZ3cmFwdiAtZndyYXB2Ci0JdGVzdCAkY20gPSBjb21iaW5lICYmIGFjX2ZsYWdzIDAgY29tYmluZSBcCi0JICAgICctZndob2xlLXByb2dyYW0gLS1jb21iaW5lJyBcCi0JICAgICdpZiBnY2Mgc3VwcG9ydHMgLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZScKLQlpPTEKLWVsaWYgdGVzdCAkY3QgPSBpY2M7IHRoZW4KLQlhY19mbGFncyAxIGZub2J1aWx0aW5zZXRtb2RlIC1mbm8tYnVpbHRpbi1zZXRtb2RlCi0JYWNfZmxhZ3MgMSBmbm9zdHJpY3RhbGlhc2luZyAtZm5vLXN0cmljdC1hbGlhc2luZwotCWFjX2ZsYWdzIDEgZnN0YWNrc2VjdXJpdHljaGVjayAtZnN0YWNrLXNlY3VyaXR5LWNoZWNrCi0JaT0xCi1lbGlmIHRlc3QgJGN0ID0gc3VucHJvOyB0aGVuCi0JcGhhc2U9dQotCWFjX2ZsYWdzIDEgdiAtdgotCWFjX2ZsYWdzIDEgeGM5OSAteGM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKLQlhY19mbGFncyAxIGlwbyAteGlwbyAnZm9yIGNyb3NzLW1vZHVsZSBvcHRpbWlzYXRpb24nCi0JcGhhc2U9eAotZWxpZiB0ZXN0ICRjdCA9IGhwY2M7IHRoZW4KLQlwaGFzZT11Ci0JYWNfZmxhZ3MgMSBhZ2NjIC1BZ2NjICdmb3Igc3VwcG9ydCBvZiBHQ0MgZXh0ZW5zaW9ucycKLQlhY19mbGFncyAxIGFjOTkgLUFDOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCi0JcGhhc2U9eAotZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgotCWFjX2ZsYWdzIDAgdmVyYiAtdmVyYm9zZQotCWFjX2ZsYWdzIDEgcm9kYXRhIC1yZWFkb25seV9zdHJpbmdzCi1lbGlmIHRlc3QgJGN0ID0gZG1jOyB0aGVuCi0JYWNfZmxhZ3MgMSBkZWNsICIke2NjcGN9LXIiICdmb3Igc3RyaWN0IHByb3RvdHlwZSBjaGVja3MnCi0JYWNfZmxhZ3MgMSBzY2hrICIke2NjcGN9LXMiICdmb3Igc3RhY2sgb3ZlcmZsb3cgY2hlY2tpbmcnCi1lbGlmIHRlc3QgJGN0ID0gYmNjOyB0aGVuCi0JYWNfZmxhZ3MgMSBzdHJwb29sICIke2NjcGN9LWQiICdpZiBzdHJpbmcgcG9vbGluZyBjYW4gYmUgZW5hYmxlZCcKLWVsaWYgdGVzdCAkY3QgPSBtaXBzcHJvOyB0aGVuCi0JYWNfZmxhZ3MgMSB4Yzk5IC1jOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCi0JYWNfZmxhZ3MgMSBmdWxsd2FybiAtZnVsbHdhcm4gJ2ZvciByZW1hcmsgb3V0cHV0IHN1cHBvcnQnCi1lbGlmIHRlc3QgJGN0ID0gbXNjOyB0aGVuCi0JYWNfZmxhZ3MgMSBzdHJwb29sICIke2NjcGN9L0dGIiAnaWYgc3RyaW5nIHBvb2xpbmcgY2FuIGJlIGVuYWJsZWQnCi0JZWNobyAnaW50IG1haW4odm9pZCkgeyBjaGFyIHRlc3RbNjRdID0gIiI7IHJldHVybiAoKnRlc3QpOyB9JyA+eAotCWFjX2ZsYWdzIC0gMSBzdGFja29uICIke2NjcGN9L0daIiAnaWYgc3RhY2sgY2hlY2tzIGNhbiBiZSBlbmFibGVkJyA8eAotCWFjX2ZsYWdzIC0gMSBzdGNrYWxsICIke2NjcGN9L0dlIiAnc3RhY2sgY2hlY2tzIGZvciBhbGwgZnVuY3Rpb25zJyA8eAotCWFjX2ZsYWdzIC0gMSBzZWN1Y2hrICIke2NjcGN9L0dTIiAnZm9yIGNvbXBpbGVyIHNlY3VyaXR5IGNoZWNrcycgPHgKLQlybWYgeAotCWFjX2ZsYWdzIDEgd2FsbCAiJHtjY3BjfS9XYWxsIiAndG8gZW5hYmxlIGFsbCB3YXJuaW5ncycKLQlhY19mbGFncyAxIHdwNjQgIiR7Y2NwY30vV3A2NCIgJ3RvIGVuYWJsZSA2NC1iaXQgd2FybmluZ3MnCi1lbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCi0JYWNfZmxhZ3MgMSB4OTkgLXFsYW5nbHZsPWV4dGM5OQotCXRlc3QgMSA9ICRIQVZFX0NBTl9YOTkgfHwgYWNfZmxhZ3MgMSBjOTkgLXFsYW5nbHZsPXN0ZGM5OQotCWFjX2ZsYWdzIDEgcm9kYXRhICItcXJvIC1xcm9jb25zdCAtcXJvcHRyIgotCWFjX2ZsYWdzIDEgcnRjaGVjayAtcWNoZWNrPWFsbAotCWFjX2ZsYWdzIDEgcnRjaGtjIC1xZXh0Y2hrCi0JYWNfZmxhZ3MgMSB3Zm9ybWF0ICItcWZvcm1hdD1hbGwgLXFmb3JtYXQ9bm96bG4iCi0JI2FjX2ZsYWdzIDEgd3A2NCAtcXdhcm42NAkjIHRvbyB2ZXJib3NlIGZvciBub3cKLWVsaWYgdGVzdCAkY3QgPSB0ZW5kcmE7IHRoZW4KLQlhY19mbGFncyAwIHlzeXN0ZW0gLVlzeXN0ZW0KLQl0ZXN0IDEgPSAkSEFWRV9DQU5fWVNZU1RFTSAmJiBDUFBGTEFHUz0iLVlzeXN0ZW0gJENQUEZMQUdTIgotCWFjX2ZsYWdzIDEgZXh0YW5zaSAtWGEKLWVsaWYgdGVzdCAkY3QgPSB0Y2M7IHRoZW4KLQlhY19mbGFncyAxIGJvdW5kc2NoayAtYgotZWxpZiB0ZXN0ICRjdCA9IGNsYW5nOyB0aGVuCi0JaT0xCi1lbGlmIHRlc3QgJGN0ID0gbndjYzsgdGhlbgotCWk9MQotCSNicm9rZW4jIGFjX2ZsYWdzIDEgc3NwIC1zdGFja3Byb3RlY3QKLWZpCi0jIGZsYWdzIGNvbW1vbiB0byBhIHN1YnNldCBvZiBjb21waWxlcnMgKHJ1biB3aXRoIC1XZXJyb3Igb24gZ2NjKQotaWYgdGVzdCAxID0gJGk7IHRoZW4KLQlhY19mbGFncyAxIHN0ZGc5OSAtc3RkPWdudTk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5ICsgR0NDIGV4dGVuc2lvbnMnCi0JdGVzdCAxID0gJEhBVkVfQ0FOX1NUREc5OSB8fCBcCi0JICAgIGFjX2ZsYWdzIDEgc3RkYzk5IC1zdGQ9Yzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JwotCWFjX2ZsYWdzIDEgd2FsbCAtV2FsbAotZmkKLXBoYXNlPXgKLQotIyBUaGUgZm9sbG93aW5nIHRlc3RzIHJ1biB3aXRoIC1XZXJyb3Igb3Igc2ltaWxhciAoYWxsIGNvbXBpbGVycykgaWYgcG9zc2libGUKLU5PV0FSTj0kRE9XQVJOCi10ZXN0ICRjdCA9IHBjYyAmJiBwaGFzZT11Ci0KLSMKLSMgQ29tcGlsZXI6IGNoZWNrIGZvciBzdHVmZiB0aGF0IG9ubHkgZ2VuZXJhdGVzIHdhcm5pbmdzCi0jCi1hY190ZXN0IGF0dHJpYnV0ZV9ib3VuZGVkICcnICdmb3IgX19hdHRyaWJ1dGVfXygoYm91bmRlZCkpJyA8PC0nRU9GJwotCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQkjdW5kZWYgX19hdHRyaWJ1dGVfXwotCWludCB4Y29weShjb25zdCB2b2lkICosIHZvaWQgKiwgc2l6ZV90KQotCSAgICBfX2F0dHJpYnV0ZV9fKChib3VuZGVkIChidWZmZXIsIDEsIDMpKSkKLQkgICAgX19hdHRyaWJ1dGVfXygoYm91bmRlZCAoYnVmZmVyLCAyLCAzKSkpOwotCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKHhjb3B5KGF2WzBdLCBhdlstLWFjXSwgMSkpOyB9Ci0JaW50IHhjb3B5KGNvbnN0IHZvaWQgKnMsIHZvaWQgKmQsIHNpemVfdCBuKSB7Ci0JCW1lbW1vdmUoZCwgcywgbik7IHJldHVybiAoKGludCluKTsKLQl9Ci0JI2VuZGlmCi1FT0YKLWFjX3Rlc3QgYXR0cmlidXRlX2Zvcm1hdCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKGZvcm1hdCkpJyA8PC0nRU9GJwotCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCSNpbmNsdWRlIDxzdGRpby5oPgotCSN1bmRlZiBfX2F0dHJpYnV0ZV9fCi0JI3VuZGVmIHByaW50ZgotCWV4dGVybiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKHByaW50ZigiJXMlZCIsICphdiwgYWMpKTsgfQotCSNlbmRpZgotRU9GCi1hY190ZXN0IGF0dHJpYnV0ZV9ub25udWxsICcnICdmb3IgX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpJyA8PC0nRU9GJwotCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCWludCBmb28oY2hhciAqczEsIGNoYXIgKnMyKSBfX2F0dHJpYnV0ZV9fKChub25udWxsKSk7Ci0JaW50IGJhcihjaGFyICpzMSwgY2hhciAqczIpIF9fYXR0cmlidXRlX18oKG5vbm51bGwgKDEsIDIpKSk7Ci0JaW50IGJheihjaGFyICpzKSBfX2F0dHJpYnV0ZV9fKChub25udWxsICgxKSkpOwotCWludCBmb28oY2hhciAqczEsIGNoYXIgKnMyKSB7IHJldHVybiAoYmFyKHMyLCBzMSkpOyB9Ci0JaW50IGJhcihjaGFyICpzMSwgY2hhciAqczIpIHsgcmV0dXJuIChiYXooczEpIC0gYmF6KHMyKSk7IH0KLQlpbnQgYmF6KGNoYXIgKnMpIHsgcmV0dXJuICgqcyk7IH0KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKGFjID09IGZvbyhhdlswXSwgYXZbYWMtMV0pKTsgfQotCSNlbmRpZgotRU9GCi1hY190ZXN0IGF0dHJpYnV0ZV9ub3JldHVybiAnJyAnZm9yIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSknIDw8LSdFT0YnCi0JI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCi0JLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCi0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQotCSNlbHNlCi0JI2luY2x1ZGUgPHN0ZGxpYi5oPgotCSN1bmRlZiBfX2F0dHJpYnV0ZV9fCi0Jdm9pZCBmbm9yZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwotCWludCBtYWluKHZvaWQpIHsgZm5vcmQoKTsgfQotCXZvaWQgZm5vcmQodm9pZCkgeyBleGl0KDApOyB9Ci0JI2VuZGlmCi1FT0YKLWFjX3Rlc3QgYXR0cmlidXRlX3VudXNlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpJyA8PC0nRU9GJwotCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCWludCBtYWluKGludCBhYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgY2hhciAqKmF2Ci0JICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKSB7IHJldHVybiAoMCk7IH0KLQkjZW5kaWYKLUVPRgotYWNfdGVzdCBhdHRyaWJ1dGVfdXNlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKHVzZWQpKScgPDwtJ0VPRicKLQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKLQkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQlzdGF0aWMgY29uc3QgY2hhciBmbm9yZFtdIF9fYXR0cmlidXRlX18oKHVzZWQpKSA9ICI0MiI7Ci0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9Ci0JI2VuZGlmCi1FT0YKLQotIyBFbmQgb2YgdGVzdHMgcnVuIHdpdGggLVdlcnJvcgotTk9XQVJOPSRzYXZlX05PV0FSTgotcGhhc2U9eAotCi0jCi0jIG1rc2g6IGZsYXZvdXJzIChmdWxsL3NtYWxsIG1rc2gsIG9taXQgY2VydGFpbiBzdHVmZikKLSMKLWlmIGFjX2lmY3BwICdpZmRlZiBNS1NIX1NNQUxMJyBpc3NldF9NS1NIX1NNQUxMICcnIFwKLSAgICAiaWYgYSByZWR1Y2VkLWZlYXR1cmUgbWtzaCBpcyByZXF1ZXN0ZWQiOyB0aGVuCi0JI1hYWCB0aGlzIHN1Y2tzOyBmaXggaXQgZm9yICphbGwqIGNvbXBpbGVycwotCWNhc2UgJGN0IGluCi0JY2xhbmd8aWNjfG53Y2MpCi0JCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC1mbm8taW5saW5lCi0JCTs7Ci0JZ2NjKQotCQlOT1dBUk49JERPV0FSTjsgcGhhc2U9dQotCQlhY19mbGFncyAxIGZub2lubGluZSAtZm5vLWlubGluZQotCQlOT1dBUk49JHNhdmVfTk9XQVJOOyBwaGFzZT14Ci0JCTs7Ci0Jc3VucHJvKQotCQlhY19mbGFncyAxIGZub2lubGluZSAteGlubGluZT0KLQkJOzsKLQl4bGMpCi0JCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC1xbm9pbmxpbmUKLQkJOzsKLQllc2FjCi0KLQk6ICR7SEFWRV9NS05PRD0wfQotCTogJHtIQVZFX05JQ0U9MH0KLQk6ICR7SEFWRV9SRVZPS0U9MH0KLQk6ICR7SEFWRV9QRVJTSVNURU5UX0hJU1RPUlk9MH0KLQljaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLHNta3NoCi0JSEFWRV9JU1NFVF9NS1NIX0NPTlNFUlZBVElWRV9GRFM9MQkjIGZyb20gc2guaAotZmkKLWFjX2lmY3BwICdpZmRlZiBNS1NIX0JJTlNIUkVEVUNFRCcgaXNzZXRfTUtTSF9CSU5TSFJFRFVDRUQgJycgXAotICAgICJpZiBhIHJlZHVjZWQtZmVhdHVyZSBzaCBpcyByZXF1ZXN0ZWQiICYmIFwKLSAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGJpbnNoCi1hY19pZmNwcCAnaWZkZWYgTUtTSF9VTkVNUExPWUVEJyBpc3NldF9NS1NIX1VORU1QTE9ZRUQgJycgXAotICAgICJpZiBta3NoIHdpbGwgYmUgYnVpbHQgd2l0aG91dCBqb2IgY29udHJvbCIgJiYgXAotICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsYXJnZQotYWNfaWZjcHAgJ2lmZGVmIE1LU0hfQVNTVU1FX1VURjgnIGlzc2V0X01LU0hfQVNTVU1FX1VURjggJycgXAotICAgICdpZiB0aGUgZGVmYXVsdCBVVEYtOCBtb2RlIGlzIHNwZWNpZmllZCcgJiYgOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci1hY19pZmNwcCAnaWZkZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTJyBpc3NldF9NS1NIX0NPTlNFUlZBVElWRV9GRFMgJycgXAotICAgICdpZiB0cmFkaXRpb25hbC9jb25zZXJ2YXRpdmUgZmQgdXNlIGlzIHJlcXVlc3RlZCcgJiYgXAotICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsY29udmZkcwotCi0jCi0jIEVudmlyb25tZW50OiBoZWFkZXJzCi0jCi1hY19oZWFkZXIgc3lzL3BhcmFtLmgKLWFjX2hlYWRlciBzeXMvbWtkZXYuaCBzeXMvdHlwZXMuaAotYWNfaGVhZGVyIHN5cy9tbWFuLmggc3lzL3R5cGVzLmgKLWFjX2hlYWRlciBzeXMvc3lzbWFjcm9zLmgKLWFjX2hlYWRlciBncnAuaCBzeXMvdHlwZXMuaAotYWNfaGVhZGVyIGxpYmdlbi5oCi1hY19oZWFkZXIgbGlidXRpbC5oIHN5cy90eXBlcy5oCi1hY19oZWFkZXIgcGF0aHMuaAotYWNfaGVhZGVyIHN0ZGJvb2wuaAotYWNfaGVhZGVyIHN0ZGludC5oIHN0ZGFyZy5oCi1hY19oZWFkZXIgc3RyaW5ncy5oIHN5cy90eXBlcy5oCi1hY19oZWFkZXIgdWxpbWl0Lmggc3lzL3R5cGVzLmgKLWFjX2hlYWRlciB2YWx1ZXMuaAotCi0jCi0jIEVudmlyb25tZW50OiBkZWZpbml0aW9ucwotIwotZWNobyAnI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLyogY2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDJeNjMtMSBjb3JyZWN0bHksIHRoeCBGU0YgKi8KLSNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpMSA8PCA2MikgLSAxICsgKChvZmZfdCkxIDw8IDYyKSkKLWludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMSAmJgotICAgIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKSA/IDEgOiAtMV07Ci1pbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0nID5sZnQuYwotYWNfdGVzdG4gY2FuX2xmcyAnJyAiZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCIgPGxmdC5jCi1zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUwotQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgotYWNfdGVzdG4gY2FuX2xmc19zdXMgJyEnIGNhbl9sZnMgMCAiLi4uIHdpdGggLURfRklMRV9PRkZTRVRfQklUUz02NCIgPGxmdC5jCi1pZiB0ZXN0IDAgPSAkSEFWRV9DQU5fTEZTX1NVUzsgdGhlbgotCUNQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyAtRF9MQVJHRV9GSUxFUz0xIgotCWFjX3Rlc3RuIGNhbl9sZnNfYWl4ICchJyBjYW5fbGZzIDAgIi4uLiB3aXRoIC1EX0xBUkdFX0ZJTEVTPTEiIDxsZnQuYwotCXRlc3QgMSA9ICRIQVZFX0NBTl9MRlNfQUlYIHx8IENQUEZMQUdTPSRzYXZlX0NQUEZMQUdTCi1maQotcm1mIGxmdCoJIyBlbmQgb2YgbGFyZ2UgZmlsZSBzdXBwb3J0IHRlc3QKLQotIwotIyBFbnZpcm9ubWVudDogdHlwZXMKLSMKLWFjX3Rlc3QgY2FuX2ludHR5cGVzICchJyBzdGRpbnRfaCAxICJmb3Igc3RhbmRhcmQgMzItYml0IGludGVnZXIgdHlwZXMiIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1aW50MzJfdCkocHRyZGlmZl90KSphdiArIChpbnQzMl90KWFjKTsgfQotRU9GCi1hY190ZXN0IGNhbl91Y2JpbnRzICchJyBjYW5faW50dHlwZXMgMSAiZm9yIFVDQiAzMi1iaXQgaW50ZWdlciB0eXBlcyIgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVfaW50MzJfdCkocHRyZGlmZl90KSphdiArIChpbnQzMl90KWFjKTsgfQotRU9GCi1hY190ZXN0IGNhbl9pbnQ4dHlwZSAnIScgc3RkaW50X2ggMSAiZm9yIHN0YW5kYXJkIDgtYml0IGludGVnZXIgdHlwZSIgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVpbnQ4X3QpKHB0cmRpZmZfdClhdlthY10pOyB9Ci1FT0YKLWFjX3Rlc3QgY2FuX3VjYmludDggJyEnIGNhbl9pbnQ4dHlwZSAxICJmb3IgVUNCIDgtYml0IGludGVnZXIgdHlwZSIgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVfaW50OF90KShwdHJkaWZmX3QpYXZbYWNdKTsgfQotRU9GCi0KLWFjX3Rlc3QgcmxpbV90IDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHJsaW1fdCkwKTsgfQotRU9GCi0KLSMgb25seSB0ZXN0bjogYWRkZWQgbGF0ZXIgYmVsb3cKLWFjX3Rlc3RuIHNpZ190IDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzaWduYWwuaD4KLQkjaW5jbHVkZSA8c3RkZGVmLmg+Ci0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkoc2lnX3Qpa2lsbCgwLDApKTsgfQotRU9GCi0KLWFjX3Rlc3RuIHNpZ2hhbmRsZXJfdCAnIScgc2lnX3QgMCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c2lnbmFsLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHNpZ2hhbmRsZXJfdClraWxsKDAsMCkpOyB9Ci1FT0YKLWlmIHRlc3QgMSA9ICRIQVZFX1NJR0hBTkRMRVJfVDsgdGhlbgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzaWdfdD1zaWdoYW5kbGVyX3QiCi0JSEFWRV9TSUdfVD0xCi1maQotCi1hY190ZXN0biBfX3NpZ2hhbmRsZXJfdCAnIScgc2lnX3QgMCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c2lnbmFsLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKF9fc2lnaGFuZGxlcl90KWtpbGwoMCwwKSk7IH0KLUVPRgotaWYgdGVzdCAxID0gJEhBVkVfX19TSUdIQU5ETEVSX1Q7IHRoZW4KLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9X19zaWdoYW5kbGVyX3QiCi0JSEFWRV9TSUdfVD0xCi1maQotCi10ZXN0IDEgPSAkSEFWRV9TSUdfVCB8fCBDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9bm9zaWdfdCIKLWFjX2NwcGZsYWdzIFNJR19UCi0KLSMKLSMgRW52aXJvbm1lbnQ6IHNpZ25hbHMKLSMKLXRlc3QgeCJOZXRCU0QiID0geCIkVEFSR0VUX09TIiAmJiAkZSBJZ25vcmUgdGhlIGNvbXBhdGliaWxpdHkgd2FybmluZy4KLQotZm9yIHdoYXQgaW4gbmFtZSBsaXN0OyBkbwotCXV3aGF0PWB1cHBlciAkd2hhdGAKLQlhY190ZXN0biBzeXNfc2lnJHdoYXQgJycgInRoZSBzeXNfc2lnJHt3aGF0fVtdIGFycmF5IiA8PC1FT0YKLQkJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWcke3doYXR9W107Ci0JCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzeXNfc2lnJHt3aGF0fVswXVswXSk7IH0KLQlFT0YKLQlhY190ZXN0biBfc3lzX3NpZyR3aGF0ICchJyBzeXNfc2lnJHdoYXQgMCAidGhlIF9zeXNfc2lnJHt3aGF0fVtdIGFycmF5IiA8PC1FT0YKLQkJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IF9zeXNfc2lnJHt3aGF0fVtdOwotCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoX3N5c19zaWcke3doYXR9WzBdWzBdKTsgfQotCUVPRgotCWlmIGV2YWwgInRlc3QgMSA9IFwkSEFWRV9fU1lTX1NJRyR1d2hhdCI7IHRoZW4KLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHN5c19zaWckd2hhdD1fc3lzX3NpZyR3aGF0IgotCQlldmFsICJIQVZFX1NZU19TSUckdXdoYXQ9MSIKLQlmaQotCWFjX2NwcGZsYWdzIFNZU19TSUckdXdoYXQKLWRvbmUKLQotYWNfdGVzdCBzdHJzaWduYWwgJyEnIHN5c19zaWdsaXN0IDAgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JI2luY2x1ZGUgPHNpZ25hbC5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzdHJzaWduYWwoMSlbMF0pOyB9Ci1FT0YKLQotIwotIyBFbnZpcm9ubWVudDogbGlicmFyeSBmdW5jdGlvbnMKLSMKLWFjX3Rlc3RuIGZsb2NrX2V4ICcnICdmbG9jayBhbmQgbW1hcCcgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0JI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0JI2luY2x1ZGUgPGZjbnRsLmg+Ci0JI2luY2x1ZGUgPHN0ZGxpYi5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgodm9pZCAqKW1tYXAoTlVMTCwgKHNpemVfdClmbG9jaygwLCBMT0NLX0VYKSwKLQkgICAgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgMCwgKG9mZl90KTApID09ICh2b2lkICopTlVMTCA/IDEgOgotCSAgICBtdW5tYXAoTlVMTCwgMCkpOyB9Ci1FT0YKLQotYWNfdGVzdCBnZXRydXNhZ2UgPDwtJ0VPRicKLQkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQotCSNpbmNsdWRlICJzaC5oIgotCWludCBtYWluKHZvaWQpIHsKLQkJc3RydWN0IHJ1c2FnZSBydTsKLQkJcmV0dXJuIChnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydSkgKwotCQkgICAgZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnJ1KSk7Ci0JfQotRU9GCi0KLWFjX3Rlc3Qga2lsbHBnIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHNpZ25hbC5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGF2WzBdW2tpbGxwZygxMjMsIGFjKV0pOyB9Ci1FT0YKLQotYWNfdGVzdCBta25vZCAnJyAnaWYgdG8gdXNlIG1rbm9kKCksIG1ha2VkZXYoKSBhbmQgZnJpZW5kcycgPDwtJ0VPRicKLQkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQotCSNpbmNsdWRlICJzaC5oIgotCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgewotCQlkZXZfdCBkdjsKLQkJZHYgPSBtYWtlZGV2KCh1bnNpZ25lZCBpbnQpYWMsICh1bnNpZ25lZCBpbnQpYXZbMF1bMF0pOwotCQlyZXR1cm4gKG1rbm9kKGF2WzBdLCAobW9kZV90KTAsIGR2KSA/IChpbnQpbWFqb3IoZHYpIDoKLQkJICAgIChpbnQpbWlub3IoZHYpKTsKLQl9Ci1FT0YKLQotYWNfdGVzdCBta3N0ZW1wIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN0ZGxpYi5oPgotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQgbWFpbih2b2lkKSB7IGNoYXIgdG1wbFtdID0gIlgiOyByZXR1cm4gKG1rc3RlbXAodG1wbCkpOyB9Ci1FT0YKLQotYWNfdGVzdCBuaWNlIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChuaWNlKDQpKTsgfQotRU9GCi0KLWFjX3Rlc3QgcmV2b2tlIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpZiBIQVZFX0xJQlVUSUxfSAotCSNpbmNsdWRlIDxsaWJ1dGlsLmg+Ci0JI2VuZGlmCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGFjICsgcmV2b2tlKGF2WzBdKSk7IH0KLUVPRgotCi1hY190ZXN0IHNldGxvY2FsZV9jdHlwZSAnJyAnc2V0bG9jYWxlKExDX0NUWVBFLCAiIiknIDw8LSdFT0YnCi0JI2luY2x1ZGUgPGxvY2FsZS5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KSh2b2lkICopc2V0bG9jYWxlKExDX0NUWVBFLCAiIikpOyB9Ci1FT0YKLQotYWNfdGVzdCBsYW5naW5mb19jb2Rlc2V0IHNldGxvY2FsZV9jdHlwZSAwICdubF9sYW5naW5mbyhDT0RFU0VUKScgPDwtJ0VPRicKLQkjaW5jbHVkZSA8bGFuZ2luZm8uaD4KLQkjaW5jbHVkZSA8c3RkZGVmLmg+Ci0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkodm9pZCAqKW5sX2xhbmdpbmZvKENPREVTRVQpKTsgfQotRU9GCi0KLWFjX3Rlc3Qgc2V0bW9kZSBta25vZCAxIDw8LSdFT0YnCi0JLyogWFhYIGltYWtlIHN0eWxlICovCi0JLyogWFhYIGNvbmRpdGlvbnMgY29ycmVjdD8gKi8KLQkjaWYgZGVmaW5lZChfX01TVkNSVF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0JLyogZm9yY2UgYSBmYWlsdXJlOiBXaW4zMiBzZXRtb2RlKCkgaXMgbm90IHdoYXQgd2Ugd2FudC4uLiAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoZ2V0bW9kZShzZXRtb2RlKGF2WzBdKSwKLQkgICAgKG1vZGVfdClhYykpOyB9Ci0JI2VuZGlmCi1FT0YKLQotYWNfdGVzdCBzZXRyZXN1Z2lkIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHNldHJlc3VpZCgwLDAsMCk7IHJldHVybiAoc2V0cmVzZ2lkKDAsMCwwKSk7IH0KLUVPRgotCi1hY190ZXN0IHNldGdyb3VwcyBzZXRyZXN1Z2lkIDAgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2lmIEhBVkVfR1JQX0gKLQkjaW5jbHVkZSA8Z3JwLmg+Ci0JI2VuZGlmCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludCBtYWluKHZvaWQpIHsgZ2lkX3QgZ2lkID0gMDsgcmV0dXJuIChzZXRncm91cHMoMCwgJmdpZCkpOyB9Ci1FT0YKLQotYWNfdGVzdCBzdHJjYXNlc3RyIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JI2lmIEhBVkVfU1RSSU5HU19ICi0JI2luY2x1ZGUgPHN0cmluZ3MuaD4KLQkjZW5kaWYKLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsKLQkJcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHZvaWQgKilzdHJjYXNlc3RyKCphdiwgYXZbYWNdKSk7Ci0JfQotRU9GCi0KLWFjX3Rlc3Qgc3RybGNweSA8PC0nRU9GJwotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChzdHJsY3B5KCphdiwgYXZbMV0sCi0JICAgIChzaXplX3QpYWMpKTsgfQotRU9GCi0KLSMKLSMgY2hlY2sgaGVhZGVycyBmb3IgZGVjbGFyYXRpb25zCi0jCi1zYXZlX0NDPSRDQzsgc2F2ZV9MREZMQUdTPSRMREZMQUdTOyBzYXZlX0xJQlM9JExJQlMKLUNDPSIkQ0MgLWMgLW8gJHRjZm4iOyBMREZMQUdTPTsgTElCUz0KLWFjX3Rlc3QgJyEnIGZsb2NrX2RlY2wgZmxvY2tfZXggMSAnaWYgZmxvY2soKSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkJyA8PC0nRU9GJwotCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCi0JI2luY2x1ZGUgInNoLmgiCi0JbG9uZyBmbG9jayh2b2lkKTsJCS8qIHRoaXMgY2xhc2hlcyBpZiBkZWZpbmVkIGJlZm9yZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KWZsb2NrKCkpOyB9Ci1FT0YKLWFjX3Rlc3QgJyEnIHJldm9rZV9kZWNsIHJldm9rZSAxICdpZiByZXZva2UoKSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkJyA8PC0nRU9GJwotCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCi0JI2luY2x1ZGUgInNoLmgiCi0JbG9uZyByZXZva2Uodm9pZCk7CQkvKiB0aGlzIGNsYXNoZXMgaWYgZGVmaW5lZCBiZWZvcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludClyZXZva2UoKSk7IH0KLUVPRgotYWNfdGVzdCBzeXNfc2lnbGlzdF9kZWNsIHN5c19zaWdsaXN0IDEgJ2lmIHN5c19zaWdsaXN0W10gZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKLQkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQotCSNpbmNsdWRlICJzaC5oIgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzeXNfc2lnbGlzdFswXVswXSk7IH0KLUVPRgotQ0M9JHNhdmVfQ0M7IExERkxBR1M9JHNhdmVfTERGTEFHUzsgTElCUz0kc2F2ZV9MSUJTCi0KLSMKLSMgb3RoZXIgY2hlY2tzCi0jCi1mZD0naWYgdG8gdXNlIHBlcnNpc3RlbnQgaGlzdG9yeScKLWFjX2NhY2hlIFBFUlNJU1RFTlRfSElTVE9SWSB8fCB0ZXN0IDAgPSAkSEFWRV9GTE9DS19FWCB8fCBmdj0xCi10ZXN0IDEgPSAkZnYgfHwgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxuby1oaXN0ZmlsZQotYWNfdGVzdGRvbmUKLWFjX2NwcGZsYWdzCi0KLSMKLSMgQ29tcGlsZXI6IFByYWVwcm9jZXNzb3IgKG9ubHkgaWYgbmVlZGVkKQotIwotdGVzdCAwID0gJEhBVkVfU1lTX1NJR05BTUUgJiYgaWYgYWNfdGVzdGluaXQgY3BwX2RkICcnIFwKLSAgICAnY2hlY2tpbmcgaWYgdGhlIEMgUHJlcHJvY2Vzc29yIHN1cHBvcnRzIC1kRCc7IHRoZW4KLQllY2hvICcjZGVmaW5lIGZvbyBiYXInID5jb25mdGVzdC5jCi0JdnYgJ10nICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gLWREIGNvbmZ0ZXN0LmMgPngiCi0JZ3JlcCAnI2RlZmluZSBmb28gYmFyJyB4ID4vZGV2L251bGwgMj4mMSAmJiBmdj0xCi0Jcm1mIGNvbmZ0ZXN0LmMgeCB2di5vdXQKLQlhY190ZXN0ZG9uZQotZmkKLQotIwotIyBFbmQgb2YgbWlydG9jb25mIGNoZWNrcwotIwotJGUgLi4uIGRvbmUuCi0KLSMgU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGFuY2llbnQgdmVyc2lvbnMgb2YgZWQoMSkgd3JpdGluZwotIyB0aGUgY2hhcmFjdGVyIGNvdW50IHRvIHN0YW5kYXJkIG91dHB1dDsgY29wZSBmb3IgdGhhdAotZWNobyB3cSA+eAotZWQgeCA8eCAyPi9kZXYvbnVsbCB8IGdyZXAgMyA+L2Rldi9udWxsIDI+JjEgJiYgXAotICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsJG9sZGlzaF9lZAotcm1mIHggdnYub3V0Ci0KLWlmIHRlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FOyB0aGVuCi0JaWYgdGVzdCAxID0gJEhBVkVfQ1BQX0REOyB0aGVuCi0JCSRlIEdlbmVyYXRpbmcgbGlzdCBvZiBzaWduYWwgbmFtZXMuLi4KLQllbHNlCi0JCSRlIE5vIGxpc3Qgb2Ygc2lnbmFsIG5hbWVzIGF2YWlsYWJsZSB2aWEgY3BwLiBGYWxsaW5nIGJhY2suLi4KLQlmaQotCXNpZ3NlZW49OgotCWVjaG8gJyNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZm5kZWYgTlNJRwotI2lmIGRlZmluZWQoX05TSUcpCi0jZGVmaW5lIE5TSUcgX05TSUcKLSNlbGlmIGRlZmluZWQoU0lHTUFYKQotI2RlZmluZSBOU0lHIChTSUdNQVgrMSkKLSNlbmRpZgotI2VuZGlmCi1ta3NoX2NmZzogTlNJRycgPmNvbmZ0ZXN0LmMKLQlOU0lHPWB2cSAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMiIHwgXAotCSAgICBncmVwIG1rc2hfY2ZnOiB8IHNlZCAncy9ebWtzaF9jZmc6WwkgXSpcKFswLTl4ICgpKy1dKlwpLiokL1wxLydgCi0JY2FzZSAkTlNJRyBpbgotCSpbXCBcKFwpKy1dKikgTlNJRz1gYXdrICJCRUdJTiB7IHByaW50ICROU0lHIH0iYCA7OwotCWVzYWMKLQlwcmludGY9cHJpbnRmCi0JKHByaW50ZiBoYWxsbykgPi9kZXYvbnVsbCAyPiYxIHx8IHByaW50Zj1lY2hvCi0JdGVzdCAkcHJpbnRmID0gZWNobyB8fCBOU0lHPWBwcmludGYgJWQgIiROU0lHIiAyPi9kZXYvbnVsbGAKLQkkcHJpbnRmICJOU0lHPSROU0lHIC4uLiAiCi0Jc2lncz0iQUJSVCBBTFJNIEJVUyBDSExEIENMRCBDT05UIERJTCBFTVQgRlBFIEhVUCBJTEwgSU5GTyBJTlQgSU8gSU9UIgotCXNpZ3M9IiRzaWdzIEtJTEwgTE9TVCBQSVBFIFBST0YgUFdSIFFVSVQgUkVTViBTQUsgU0VHViBTVE9QIFNZUyBURVJNIgotCXNpZ3M9IiRzaWdzIFRSQVAgVFNUUCBUVElOIFRUT1UgVVJHIFVTUjEgVVNSMiBWVEFMUk0gV0lOQ0ggWENQVSBYRlNaIgotCXRlc3QgMSA9ICRIQVZFX0NQUF9ERCAmJiB0ZXN0ICROU0lHIC1ndCAxICYmIHNpZ3M9IiRzaWdzICJgdnEgXAotCSAgICAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIC1kRCBjb25mdGVzdC5jIiB8IFwKLQkgICAgZ3JlcCAnWwkgXVNJR1tBLVowLTldKlsJIF0nIHwgXAotCSAgICBzZWQgJ3MvXlwoLipbCSBdU0lHXClcKFtBLVowLTldKlwpXChbCSBdLipcKSQvXDIvJyB8IHNvcnRgCi0JdGVzdCAkTlNJRyAtZ3QgMSB8fCBzaWdzPQotCWZvciBuYW1lIGluICRzaWdzOyBkbwotCQllY2hvICcjaW5jbHVkZSA8c2lnbmFsLmg+JyA+Y29uZnRlc3QuYwotCQllY2hvIG1rc2hfY2ZnOiBTSUckbmFtZSA+PmNvbmZ0ZXN0LmMKLQkJdnEgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIiB8IFwKLQkJICAgIGdyZXAgbWtzaF9jZmc6IHwgXAotCQkgICAgc2VkICdzL15ta3NoX2NmZzpbCSBdKlwoWzAtOXhdKlwpLiokL1wxOickbmFtZS8KLQlkb25lIHwgZ3JlcCAtdiAnXjonIHwgd2hpbGUgSUZTPTogcmVhZCBuciBuYW1lOyBkbwotCQl0ZXN0ICRwcmludGYgPSBlY2hvIHx8IG5yPWBwcmludGYgJWQgIiRuciIgMj4vZGV2L251bGxgCi0JCXRlc3QgJG5yIC1ndCAwICYmIHRlc3QgJG5yIC1sZSAkTlNJRyB8fCBjb250aW51ZQotCQljYXNlICRzaWdzZWVuIGluCi0JCSo6JG5yOiopIDs7Ci0JCSopCWVjaG8gIgkJeyBcIiRuYW1lXCIsICRuciB9LCIKLQkJCXNpZ3NlZW49JHNpZ3NlZW4kbnI6Ci0JCQkkcHJpbnRmICIkbmFtZT0kbnIgIiA+JjIKLQkJCTs7Ci0JCWVzYWMKLQlkb25lIDI+JjEgPnNpZ25hbWVzLmluYwotCXJtZiBjb25mdGVzdC5jCi0JJGUgZG9uZS4KLWZpCi0KLWFkZHNyY3MgJyEnIEhBVkVfU0VUTU9ERSBzZXRtb2RlLmMKLWFkZHNyY3MgJyEnIEhBVkVfU1RSTENQWSBzdHJsY3B5LmMKLWFkZHNyY3MgVVNFX1BSSU5URl9CVUlMVElOIHByaW50Zi5jCi10ZXN0IDEgPSAiJFVTRV9QUklOVEZfQlVJTFRJTiIgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfUFJJTlRGX0JVSUxUSU4iCi10ZXN0IDAgPSAiJEhBVkVfU0VUTU9ERSIgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfQ09ORklHX0ggLURDT05GSUdfSF9GSUxFTkFNRT1cXFwic2guaFxcXCIiCi10ZXN0IDEgPSAiJEhBVkVfQ0FOX1ZFUkIiICYmIENGTEFHUz0iJENGTEFHUyAtdmVyYm9zZSIKLQotJGUgJGJpJG1lOiBGaW5pc2hlZCBjb25maWd1cmF0aW9uIHRlc3RpbmcsIG5vdyBwcm9kdWNpbmcgb3V0cHV0LiRhbwotCi1maWxlcz0KLW9ianM9Ci1zcD0KLWNhc2UgJGN1cmRpciBpbgotKlwgKikJZWNobyAiIyEuL21rc2giID50ZXN0LnNoIDs7Ci0qKQllY2hvICIjISRjdXJkaXIvbWtzaCIgPnRlc3Quc2ggOzsKLWVzYWMKLWNhdCA+PnRlc3Quc2ggPDwtRU9GCi0JTENfQUxMPUMgUEFUSD0nJFBBVEgnOyBleHBvcnQgTENfQUxMIFBBVEgKLQl0ZXN0IC1uICJcJEtTSF9WRVJTSU9OIiB8fCBleGl0IDEKLQljaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzCi0JcHJpbnQgVGVzdGluZyBta3NoIGZvciBjb25mb3JtYW5jZToKLQlmZ3JlcCBNaXJPUzogJyRzcmNkaXIvY2hlY2sudCcKLQlmZ3JlcCBNSVJCU0QgJyRzcmNkaXIvY2hlY2sudCcKLQlwcmludCAiVGhpcyBzaGVsbCBpcyBhY3R1YWxseTpcXG5cXHRcJEtTSF9WRVJTSU9OIgotCXByaW50ICd0ZXN0LnNoIGJ1aWx0IGZvciBta3NoICRkc3R2ZXJzaW9uJwotCWNzdHI9J1wkb3MgPSBkZWZpbmVkIFwkXk8gPyBcJF5PIDogInVua25vd24iOycKLQljc3RyPSJcJGNzdHIiJ3ByaW50IFwkb3MgLiAiLCBQZXJsIHZlcnNpb24gIiAuIFwkXTsnCi0JZm9yIHBlcmxpIGluIFwkUEVSTCBwZXJsNSBwZXJsIG5vOyBkbwotCQlbWyBcJHBlcmxpID0gbm8gXV0gJiYgZXhpdCAxCi0JCXBlcmxvcz1cJChcJHBlcmxpIC1lICJcJGNzdHIiKSAyPiYtIHx8IGNvbnRpbnVlCi0JCXByaW50ICJQZXJsIGludGVycHJldGVyICdcJHBlcmxpJyBydW5uaW5nIG9uICdcJHBlcmxvcyciCi0JCVtbIC1uIFwkcGVybG9zIF1dICYmIGJyZWFrCi0JZG9uZQotCWV4ZWMgXCRwZXJsaSAnJHNyY2Rpci9jaGVjay5wbCcgLXMgJyRzcmNkaXIvY2hlY2sudCcgLXAgJyRjdXJkaXIvbWtzaCcgXCR7Y2hlY2tfY2F0ZWdvcmllczorLUN9IFwke2NoZWNrX2NhdGVnb3JpZXMjLH0gXCQqJHRzdHMKLUVPRgotY2htb2QgNzU1IHRlc3Quc2gKLXRlc3QgJEhBVkVfQ0FOX0NPTUJJTkUkY20gPSAwY29tYmluZSAmJiBjbT1ub3JtYWwKLWlmIHRlc3QgJGNtID0gbGx2bTsgdGhlbgotCWVtaXRiYz0iLWVtaXQtbGx2bSAtYyIKLWVsaWYgdGVzdCAkY20gPSBkcmFnb25lZ2c7IHRoZW4KLQllbWl0YmM9Ii1TIC1mbHRvIgotZWxzZQotCWVtaXRiYz0tYwotZmkKLWVjaG8gc2V0IC14ID5SZWJ1aWxkLnNoCi1mb3IgZmlsZSBpbiAkU1JDUzsgZG8KLQlvcD1gZWNobyB4IiRmaWxlIiB8IHNlZCAncy9eeFwoLipcKVwuYyQvXDEuLydgCi0JdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKLQlmaWxlcz0iJGZpbGVzJHNwJGZpbGUiCi0Jc3A9JyAnCi0JZWNobyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRlbWl0YmMgJGZpbGUgfHwgZXhpdCAxIiA+PlJlYnVpbGQuc2gKLQlpZiB0ZXN0ICRjbSA9IGRyYWdvbmVnZzsgdGhlbgotCQllY2hvICJtdiAke29wfXMgJHtvcH1sbCIgPj5SZWJ1aWxkLnNoCi0JCWVjaG8gImxsdm0tYXMgJHtvcH1sbCB8fCBleGl0IDEiID4+UmVidWlsZC5zaAotCQlvYmpzPSIkb2JqcyRzcCR7b3B9YmMiCi0JZWxzZQotCQlvYmpzPSIkb2JqcyRzcCR7b3B9byIKLQlmaQotZG9uZQotY2FzZSAkY20gaW4KLWRyYWdvbmVnZ3xsbHZtKQotCWVjaG8gInJtIC1mIG1rc2gucyIgPj5SZWJ1aWxkLnNoCi0JZWNobyAibGx2bS1saW5rIC1vIC0gJG9ianMgfCBvcHQgJG9wdGZsYWdzIHwgbGxjIC1vIG1rc2gucyIgPj5SZWJ1aWxkLnNoCi0JbG9ianM9bWtzaC5zCi0JOzsKLSopCi0JbG9ianM9JG9ianMKLQk7OwotZXNhYwotY2FzZSAkdGNmbiBpbgotYS5leGUpCW1rc2hleGU9bWtzaC5leGUgOzsKLSopCW1rc2hleGU9bWtzaCA7OwotZXNhYwotZWNobyB0Y2ZuPSRta3NoZXhlID4+UmVidWlsZC5zaAotZWNobyAiJENDICRDRkxBR1MgJExERkxBR1MgLW8gXCR0Y2ZuICRsb2JqcyAkTElCUyAkY2NwciIgPj5SZWJ1aWxkLnNoCi1lY2hvICd0ZXN0IC1mICR0Y2ZuIHx8IGV4aXQgMTsgc2l6ZSAkdGNmbicgPj5SZWJ1aWxkLnNoCi1pZiB0ZXN0ICRjbSA9IG1ha2VmaWxlOyB0aGVuCi0JZXh0cmFzPSdlbWFjc2ZuLmggc2guaCBzaF9mbGFncy5oIHZhcl9zcGVjLmgnCi0JdGVzdCAwID0gJEhBVkVfU1lTX1NJR05BTUUgJiYgZXh0cmFzPSIkZXh0cmFzIHNpZ25hbWVzLmluYyIKLQljYXQgPk1ha2VmcmFnLmluYyA8PEVPRgotIyBNYWtlZmlsZSBmcmFnbWVudCBmb3IgYnVpbGRpbmcgbWtzaCAkZHN0dmVyc2lvbgotCi1QUk9HPQkJJG1rc2hleGUKLU1BTj0JCW1rc2guMQotU1JDUz0JCSRTUkNTCi1TUkNTX0ZQPQkkZmlsZXMKLU9CSlNfQlA9CSRvYmpzCi1JTkRTUkNTPQkkZXh0cmFzCi1OT05TUkNTX0lOU1Q9CWRvdC5ta3NocmMgXCQoTUFOKQotTk9OU1JDU19OT0lOU1Q9CUJ1aWxkLnNoIE1ha2VmaWxlIFJlYnVpbGQuc2ggY2hlY2sucGwgY2hlY2sudCB0ZXN0LnNoCi1DQz0JCSRDQwotQ0ZMQUdTPQkJJENGTEFHUwotQ1BQRkxBR1M9CSRDUFBGTEFHUwotTERGTEFHUz0JJExERkxBR1MKLUxJQlM9CQkkTElCUwotCi0jIG5vdCBCU0QgbWFrZSBvbmx5OgotI1ZQQVRIPQkJJHNyY2RpcgotI2FsbDogXCQoUFJPRykKLSNcJChQUk9HKTogXCQoT0JKU19CUCkKLSMJXCQoQ0MpIFwkKENGTEFHUykgXCQoTERGTEFHUykgLW8gXCRAIFwkKE9CSlNfQlApIFwkKExJQlMpCi0jXCQoT0JKU19CUCk6IFwkKFNSQ1NfRlApIFwkKE5PTlNSQ1MpCi0jLmMubzoKLSMJXCQoQ0MpIFwkKENGTEFHUykgXCQoQ1BQRkxBR1MpIC1jIFwkPAotCi0jIGZvciBhbGwgbWFrZSB2YXJpYW50czoKLSNSRUdSRVNTX0ZMQUdTPQktdgotI3JlZ3Jlc3M6Ci0jCS4vdGVzdC5zaCBcJChSRUdSRVNTX0ZMQUdTKQotCi0jIGZvciBCU0QgbWFrZSBvbmx5OgotIy5QQVRIOiAkc3JjZGlyCi0jLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgotRU9GCi0JJGUKLQkkZSBHZW5lcmF0ZWQgTWFrZWZyYWcuaW5jIHN1Y2Nlc3NmdWxseS4KLQlleGl0IDAKLWZpCi1pZiB0ZXN0ICRjbSA9IGNvbWJpbmU7IHRoZW4KLQlvYmpzPSItbyAkbWtzaGV4ZSIKLQlmb3IgZmlsZSBpbiAkU1JDUzsgZG8KLQkJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKLQkJb2Jqcz0iJG9ianMgJGZpbGUiCi0JZG9uZQotCWVtaXRiYz0iLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZSIKLQl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJGVtaXRiYyAkb2JqcyAkTElCUyAkY2NwciIKLWVsaWYgdGVzdCAxID0gJHBtOyB0aGVuCi0JZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCi0JCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCi0JCXYgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkZW1pdGJjICRmaWxlIiAmCi0JZG9uZQotCXdhaXQKLWVsc2UKLQlmb3IgZmlsZSBpbiAkU1JDUzsgZG8KLQkJdGVzdCAkY20gPSBkcmFnb25lZ2cgJiYgXAotCQkgICAgb3A9YGVjaG8geCIkZmlsZSIgfCBzZWQgJ3MvXnhcKC4qXClcLmMkL1wxLi8nYAotCQl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQotCQl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJGVtaXRiYyAkZmlsZSIgfHwgZXhpdCAxCi0JCWlmIHRlc3QgJGNtID0gZHJhZ29uZWdnOyB0aGVuCi0JCQl2ICJtdiAke29wfXMgJHtvcH1sbCIKLQkJCXYgImxsdm0tYXMgJHtvcH1sbCIgfHwgZXhpdCAxCi0JCWZpCi0JZG9uZQotZmkKLWNhc2UgJGNtIGluCi1kcmFnb25lZ2d8bGx2bSkKLQlybWYgbWtzaC5zCi0JdiAibGx2bS1saW5rIC1vIC0gJG9ianMgfCBvcHQgJG9wdGZsYWdzIHwgbGxjIC1vIG1rc2gucyIKLQk7OwotZXNhYwotdGNmbj0kbWtzaGV4ZQotdGVzdCAkY20gPSBjb21iaW5lIHx8IHYgIiRDQyAkQ0ZMQUdTICRMREZMQUdTIC1vICR0Y2ZuICRsb2JqcyAkTElCUyAkY2NwciIKLXRlc3QgLWYgJHRjZm4gfHwgZXhpdCAxCi10ZXN0IDEgPSAkciB8fCB2ICIkTlJPRkYgLW1kb2MgPCckc3JjZGlyL21rc2guMScgPm1rc2guY2F0MSIgfHwgXAotICAgIHJtZiBta3NoLmNhdDEKLXRlc3QgMCA9ICRlcSAmJiB2IHNpemUgJHRjZm4KLWk9aW5zdGFsbAotdGVzdCAtZiAvdXNyL3VjYi8kaSAmJiBpPS91c3IvdWNiLyRpCi10ZXN0IDEgPSAkZXEgJiYgZT06Ci0kZQotJGUgSW5zdGFsbGluZyB0aGUgc2hlbGw6Ci0kZSAiIyAkaSAtYyAtcyAtbyByb290IC1nIGJpbiAtbSA1NTUgbWtzaCAvYmluL21rc2giCi0kZSAiIyBncmVwIC14IC9iaW4vbWtzaCAvZXRjL3NoZWxscyA+L2Rldi9udWxsIHx8IGVjaG8gL2Jpbi9ta3NoID4+L2V0Yy9zaGVsbHMiCi0kZSAiIyAkaSAtYyAtbyByb290IC1nIGJpbiAtbSA0NDQgZG90Lm1rc2hyYyAvdXNyL3NoYXJlL2RvYy9ta3NoL2V4YW1wbGVzLyIKLSRlCi0kZSBJbnN0YWxsaW5nIHRoZSBtYW51YWw6Ci1pZiB0ZXN0IC1mIG1rc2guY2F0MTsgdGhlbgotCSRlICIjICRpIC1jIC1vIHJvb3QgLWcgYmluIC1tIDQ0NCBta3NoLmNhdDEiIFwKLQkgICAgIi91c3Ivc2hhcmUvbWFuL2NhdDEvbWtzaC4wIgotCSRlIG9yCi1maQotJGUgIiMgJGkgLWMgLW8gcm9vdCAtZyBiaW4gLW0gNDQ0IG1rc2guMSAvdXNyL3NoYXJlL21hbi9tYW4xL21rc2guMSIKLSRlCi0kZSBSdW4gdGhlIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTogLi90ZXN0LnNoCi0kZSBQbGVhc2UgYWxzbyByZWFkIHRoZSBzYW1wbGUgZmlsZSBkb3QubWtzaHJjIGFuZCB0aGUgZmluZSBtYW51YWwuCi1leGl0IDAKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2NoZWNrLnBsIGIvbWtzaC9zcmMvY2hlY2sucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTNlOTUuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvY2hlY2sucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQxICswLDAgQEAKLSMgJE1pck9TOiBzcmMvYmluL21rc2gvY2hlY2sucGwsdiAxLjIzIDIwMDkvMDYvMTAgMTg6MTI6NDMgdGcgUmVsICQKLSMgJE9wZW5CU0Q6IHRoLHYgMS4xMyAyMDA2LzA1LzE4IDIxOjI3OjIzIG1pb2QgRXhwICQKLSMtCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQotIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0jCi0jIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0jIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotIwotIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0jIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0jIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSMgb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSMtCi0jIEV4YW1wbGUgdGVzdDoKLSMJCW5hbWU6IGEtdGVzdAotIwkJZGVzY3JpcHRpb246Ci0jCQkJYSB0ZXN0IHRvIHNob3cgaG93IHRlc3RzIGFyZSBkb25lCi0jCQlhcmd1bWVudHM6ICEteCEtZiEKLSMJCXN0ZGluOgotIwkJCWVjaG8gLW4gKgotIwkJCWZhbHNlCi0jCQlleHBlY3RlZC1zdGRvdXQ6ICEKLSMJCQkqCi0jCQlleHBlY3RlZC1zdGRlcnI6Ci0jCQkJKyBlY2hvIC1uICoKLSMJCQkrIGZhbHNlCi0jCQlleHBlY3RlZC1leGl0OiAxCi0jCQktLS0KLSMJVGhpcyBydW5zIHRoZSB0ZXN0LXByb2dyYW0gKGVnLCBta3NoKSB3aXRoIHRoZSBhcmd1bWVudHMgLXggYW5kIC1mLAotIwlzdGFuZGFyZCBpbnB1dCBpcyBhIGZpbGUgY29udGFpbmluZyAiZWNobyBoaSpcbmZhbHNlXG4iLiBUaGUgcHJvZ3JhbQotIwlpcyBleHBlY3RlZCB0byBwcm9kdWNlICJoaSoiIChubyB0cmFpbGluZyBuZXdsaW5lKSBvbiBzdGFuZGFyZCBvdXRwdXQsCi0jCSIrIGVjaG8gaGkqXG4rZmFsc2VcbiIgb24gc3RhbmRhcmQgZXJyb3IsIGFuZCBhbiBleGl0IGNvZGUgb2YgMS4KLSMKLSMKLSMgRm9ybWF0IG9mIHRlc3QgZmlsZXM6Ci0jIC0gYmxhbmsgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggIyBhcmUgaWdub3JlZAotIyAtIGEgdGVzdCBmaWxlIGNvbnRhaW5zIGEgc2VyaWVzIG9mIHRlc3RzCi0jIC0gYSB0ZXN0IGlzIGEgc2VyaWVzIG9mIHRhZzp2YWx1ZSBwYWlycyBlbmRlZCB3aXRoIGEgIi0tLSIgbGluZQotIyAgIChsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZmlyc3QgbGluZSBvZiB2YWx1ZSkKLSMgLSB0ZXN0IHRhZ3MgYXJlOgotIwlUYWcJCQlGbGFnCURlc2NyaXB0aW9uCi0jCS0tLS0tCQkJLS0tLQktLS0tLS0tLS0tLQotIwluYW1lCQkJcglUaGUgbmFtZSBvZiB0aGUgdGVzdDsgc2hvdWxkIGJlIHVuaXF1ZQotIwlkZXNjcmlwdGlvbgkJbQlXaGF0IHRlc3QgZG9lcwotIwlhcmd1bWVudHMJCU0JQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHByb2dyYW07Ci0jCQkJCQlkZWZhdWx0IGlzIG5vIGFyZ3VtZW50cy4KLSMJc2NyaXB0CQkJbQlWYWx1ZSBpcyB3cml0dGVuIHRvIGEgZmlsZSB3aGljaAotIwkJCQkJaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9ncmFtCi0jCQkJCQkoYWZ0ZXIgdGhlIGFyZ3VtZW50cyBhcmd1bWVudHMpCi0jCXN0ZGluCQkJbQlWYWx1ZSBpcyB3cml0dGVuIHRvIGEgZmlsZSB3aGljaCBpcwotIwkJCQkJdXNlZCBhcyBzdGFuZGFyZC1pbnB1dCBmb3IgdGhlIHByb2dyYW07Ci0jCQkJCQlkZWZhdWx0IGlzIHRvIHVzZSAvZGV2L251bGwuCi0jCXBlcmwtc2V0dXAJCW0JVmFsdWUgaXMgYSBwZXJsIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZAotIwkJCQkJanVzdCBiZWZvcmUgdGhlIHRlc3QgaXMgcnVuLiBUcnkgdG8KLSMJCQkJCWF2b2lkIHVzaW5nIHRoaXMuLi4KLSMJcGVybC1jbGVhbnVwCQltCVZhbHVlIGlzIGEgcGVybCBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQKLSMJCQkJCWp1c3QgYWZ0ZXIgdGhlIHRlc3QgaXMgcnVuLiBUcnkgdG8KLSMJCQkJCWF2b2lkIHVzaW5nIHRoaXMuLi4KLSMJZW52LXNldHVwCQlNCVZhbHVlIGlzIGEgbGlzdCBvZiBOQU1FPVZBTFVFIGVsZW1lbnRzCi0jCQkJCQl3aGljaCBhcmUgcHV0IGluIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUKLSMJCQkJCXRoZSB0ZXN0IGlzIHJ1bi4gSWYgdGhlID1WQUxVRSBpcwotIwkJCQkJbWlzc2luZywgTkFNRSBpcyByZW1vdmVkIGZyb20gdGhlCi0jCQkJCQllbnZpcm9ubWVudC4gUHJvZ3JhbXMgYXJlIHJ1biB3aXRoCi0jCQkJCQl0aGUgZm9sbG93aW5nIG1pbmltYWwgZW52aXJvbm1lbnQ6Ci0jCQkJCQkgICAgSE9NRSwgTERfTElCUkFSWV9QQVRILCBMT0NQQVRILAotIwkJCQkJICAgIExPR05BTUUsIFBBVEgsIFNIRUxMLCBVU0VSCi0jCQkJCQkodmFsdWVzIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50IG9mCi0jCQkJCQl0aGUgdGVzdCBoYXJuZXNzKS4KLSMJCQkJCUVOViBpcyBzZXQgdG8gL25vbmV4aXN0YW50LgotIwkJCQkJX19wcm9nbmFtZSBpcyBzZXQgdG8gdGhlIC1wIGFyZ3VtZW50LgotIwkJCQkJX19wZXJsbmFtZSBpcyBzZXQgdG8gJF5YIChwZXJsZXhlKS4KLSMJZmlsZS1zZXR1cAkJbXBzCVVzZWQgdG8gY3JlYXRlIGZpbGVzLCBkaXJlY3RvcmllcwotIwkJCQkJYW5kIHN5bWxpbmtzLiBGaXJzdCB3b3JkIGlzIGVpdGhlcgotIwkJCQkJZmlsZSwgZGlyIG9yIHN5bWxpbms7IHNlY29uZCB3b3JkIGlzCi0jCQkJCQlwZXJtaXNzaW9uczsgdGhpcyBpcyBmb2xsb3dlZCBieSBhCi0jCQkJCQlxdW90ZWQgd29yZCB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZQotIwkJCQkJZmlsZTsgdGhlIGVuZC1xdW90ZSBzaG91bGQgYmUgZm9sbG93ZWQKLSMJCQkJCWJ5IGEgbmV3bGluZSwgdGhlbiB0aGUgZmlsZSBkYXRhCi0jCQkJCQkoaWYgYW55KS4gVGhlIGZpcnN0IHdvcmQgbWF5IGJlCi0jCQkJCQlwcmVjZWRlZCBieSBhICEgdG8gc3RyaXAgdGhlIHRyYWlsaW5nCi0jCQkJCQluZXdsaW5lIGluIGEgc3ltbGluay4KLSMJZmlsZS1yZXN1bHQJCW1wcwlVc2VkIHRvIHZlcmlmeSBhIGZpbGUsIHN5bWxpbmsgb3IKLSMJCQkJCWRpcmVjdG9yeSBpcyBjcmVhdGVkIGNvcnJlY3RseS4KLSMJCQkJCVRoZSBmaXJzdCB3b3JkIGlzIGVpdGhlcgotIwkJCQkJZmlsZSwgZGlyIG9yIHN5bWxpbms7IHNlY29uZCB3b3JkIGlzCi0jCQkJCQlleHBlY3RlZCBwZXJtaXNzaW9uczsgdGhpcmQgd29yZAotIwkJCQkJaXMgdXNlci1pZDsgZm91cnRoIGlzIGdyb3VwLWlkOwotIwkJCQkJZmlmdGggaXMgImV4YWN0IiBvciAicGF0dGVybiIKLSMJCQkJCWluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjb250ZW50cwotIwkJCQkJd2hpY2ggZm9sbG93IGlzIHRvIGJlIG1hdGNoZWQgZXhhY3RseQotIwkJCQkJb3IgaWYgaXQgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCi0jCQkJCQlUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHF1b3RlZCBuYW1lCi0jCQkJCQlvZiB0aGUgZmlsZSB0aGF0IHNob3VsZCBiZSBjcmVhdGVkLgotIwkJCQkJVGhlIGVuZC1xdW90ZSBzaG91bGQgYmUgZm9sbG93ZWQKLSMJCQkJCWJ5IGEgbmV3bGluZSwgdGhlbiB0aGUgZmlsZSBkYXRhCi0jCQkJCQkoaWYgYW55KS4gVGhlIGZpcnN0IHdvcmQgbWF5IGJlCi0jCQkJCQlwcmVjZWRlZCBieSBhICEgdG8gc3RyaXAgdGhlIHRyYWlsaW5nCi0jCQkJCQluZXdsaW5lIGluIHRoZSBmaWxlIGNvbnRlbnRzLgotIwkJCQkJVGhlIHBlcm1pc3Npb25zLCB1c2VyIGFuZCBncm91cCBmaWVsZHMKLSMJCQkJCW1heSBiZSAqIG1lYW5pbmcgYWNjZXB0IGFueSB2YWx1ZS4KLSMJdGltZS1saW1pdAkJCVRpbWUgbGltaXQgLSB0aGUgcHJvZ3JhbSBpcyBzZW50IGEKLSMJCQkJCVNJR0tJTEwgTiBzZWNvbmRzLiBEZWZhdWx0IGlzIG5vCi0jCQkJCQlsaW1pdC4KLSMJZXhwZWN0ZWQtZmFpbAkJCSd5ZXMnIGlmIHRoZSB0ZXN0IGlzIGV4cGVjdGVkIHRvIGZhaWwuCi0jCWV4cGVjdGVkLWV4aXQJCQlleHBlY3RlZCBleGl0IGNvZGUuIENhbiBiZSBhIG51bWJlciwKLSMJCQkJCW9yIGEgQyBleHByZXNzaW9uIHVzaW5nIHRoZSB2YXJpYWJsZXMKLSMJCQkJCWUsIHMgYW5kIHcgKGV4aXQgY29kZSwgdGVybWluYXRpb24KLSMJCQkJCXNpZ25hbCwgYW5kIHN0YXR1cyBjb2RlKS4KLSMJZXhwZWN0ZWQtc3Rkb3V0CQltCVdoYXQgdGhlIHRlc3Qgc2hvdWxkIGdlbmVyYXRlIG9uIHN0ZG91dDsKLSMJCQkJCWRlZmF1bHQgaXMgdG8gZXhwZWN0IG5vIG91dHB1dC4KLSMJZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4JbQlBIHBlcmwgcGF0dGVybiB3aGljaCBtYXRjaGVzIHRoZQotIwkJCQkJZXhwZWN0ZWQgb3V0cHV0LgotIwlleHBlY3RlZC1zdGRlcnIJCW0JV2hhdCB0aGUgdGVzdCBzaG91bGQgZ2VuZXJhdGUgb24gc3RkZXJyOwotIwkJCQkJZGVmYXVsdCBpcyB0byBleHBlY3Qgbm8gb3V0cHV0LgotIwlleHBlY3RlZC1zdGRlcnItcGF0dGVybgltCUEgcGVybCBwYXR0ZXJuIHdoaWNoIG1hdGNoZXMgdGhlCi0jCQkJCQlleHBlY3RlZCBzdGFuZGFyZCBlcnJvci4KLSMJY2F0ZWdvcnkJCW0JU3BlY2lmeSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCi0jCQkJCQknY2F0ZWdvcmllcycgb2YgcHJvZ3JhbSB0aGF0IHRoZSB0ZXN0Ci0jCQkJCQlpcyB0byBiZSBydW4gZm9yLiBBIGNhdGVnb3J5IGNhbiBiZQotIwkJCQkJbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIG5hbWUgd2l0aCBhICEuCi0jCQkJCQlUaGUgaWRlYSBpcyB0aGF0IHNvbWUgdGVzdHMgaW4gYQotIwkJCQkJdGVzdCBzdWl0ZSBtYXkgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyCi0jCQkJCQlwcm9ncmFtIHZlcnNpb24gYW5kIHNob3VsZG4ndCBiZSBydW4KLSMJCQkJCW9uIG90aGVyIHZlcnNpb25zLiBUaGUgY2F0ZWdvcnkocykgb2YKLSMJCQkJCXRoZSBwcm9ncmFtIGJlaW5nIHRlc3RlZCBjYW4gYmUKLSMJCQkJCXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotIwkJCQkJT25lIGNhdGVnb3J5IG9zOlhYWCBpcyBwcmVkZWZpbmVkCi0jCQkJCQkoWFhYIGlzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUsCi0jCQkJCQllZywgbGludXgsIGRlY19vc2YpLgotIyBGbGFnIG1lYW5pbmdzOgotIwlyCXRhZyBpcyByZXF1aXJlZCAoZWcsIGEgdGVzdCBtdXN0IGhhdmUgYSBuYW1lIHRhZykuCi0jCW0JdmFsdWUgY2FuIGJlIG11bHRpcGxlIGxpbmVzLiBMaW5lcyBtdXN0IGJlIHByZWZpeGVkIHdpdGgKLSMJCWEgdGFiLiBJZiB0aGUgdmFsdWUgcGFydCBvZiB0aGUgaW5pdGlhbCB0YWc6dmFsdWUgbGluZSBpcwotIwkJCS0gZW1wdHk6IHRoZSBpbml0aWFsIGJsYW5rIGxpbmUgaXMgc3RyaXBwZWQuCi0jCQkJLSBhIGxvbmUgITogdGhlIGxhc3QgbmV3bGluZSBpbiB0aGUgdmFsdWUgaXMgc3RyaXBwZWQ7Ci0jCU0JdmFsdWUgY2FuIGJlIG11bHRpcGxlIGxpbmVzIChwcmVmaXhlZCBieSBhIHRhYikgYW5kIGNvbnNpc3RzCi0jCQlvZiBtdWx0aXBsZSBmaWVsZHMsIGRlbGltaXRlZCBieSBhIGZpZWxkIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0jCQlUaGUgdmFsdWUgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIGYtcy1jLgotIwlwCXRhZyB0YWtlcyBwYXJhbWV0ZXJzICh1c2VkIHdpdGggbSkuCi0jCXMJdGFnIGNhbiBiZSB1c2VkIHNldmVyYWwgdGltZXMuCi0KLXVzZSBQT1NJWCBxdyhFSU5UUik7Ci11c2UgR2V0b3B0OjpTdGQ7Ci11c2UgQ29uZmlnOwotCi0kb3MgPSBkZWZpbmVkICReTyA/ICReTyA6ICd1bmtub3duJzsKLQotKCRwcm9nID0gJDApID1+IHMjLiovIyM7Ci0KLSRVc2FnZSA9IDw8RU9GIDsKLVVzYWdlOiAkcHJvZyBbLXMgdGVzdC1zZXRdIFstQyBjYXRlZ29yeV0gWy1wIHByb2ddIFstdl0gWy1lIGU9dl0gbmFtZSAuLi4KLQktcCBwCVVzZSBwIGFzIHRoZSBwcm9ncmFtIHRvIHRlc3QKLQktQyBjCVNwZWNpZnkgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNhdGVnb3JpZXMgdGhlIHByb2dyYW0KLQkJYmVsb25ncyB0byAoc2VlIGNhdGVnb3J5IGZpZWxkKS4KLQktcyBzCVJlYWQgdGVzdHMgZnJvbSBmaWxlIHM7IGlmIHMgaXMgYSBkaXJlY3RvcnksIGl0IGlzIHJlY3Vyc2l2ZWx5Ci0JCXNjYW5lZCBmb3IgdGVzdCBmaWxlcyAod2hpY2ggZW5kIGluIC50KS4KLQktdCB0CVVzZSB0IGFzIGRlZmF1bHQgdGltZSBsaW1pdCBmb3IgdGVzdHMgKGRlZmF1bHQgaXMgdW5saW1pdGVkKQotCS1QCXByb2dyYW0gKC1wKSBzdHJpbmcgaGFzIG11bHRpcGxlIHdvcmRzLCBhbmQgdGhlIHByb2dyYW0gaXMgaW4KLQkJdGhlIHBhdGggKGtsdWRnZSBvcHRpb24pCi0JLXYJVmVyYm9zZSBtb2RlOiBwcmludCByZWFzb24gdGVzdCBmYWlsZWQuCi0JLWUgZT12CVNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZSB0byB2IGZvciBhbGwgdGVzdHMKLQkJKGlmIG5vID12IGlzIGdpdmVuLCB0aGUgY3VycmVudCB2YWx1ZSBpcyB1c2VkKQotCQlPbmx5IG9uZSAtZSBvcHRpb24gY2FuIGJlIGdpdmVuIGF0IHRoZSBtb21lbnQsIHNhZGx5LgotCW5hbWUJc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0KHMpIHRvIHJ1bjsgaWYgbm9uZSBhcmUKLQkJc3BlY2lmaWVkLCBhbGwgdGVzdHMgYXJlIHJ1bi4KLUVPRgotCi0jIFNlZSBjb21tZW50IGFib3ZlIGZvciBmbGFnIG1lYW5pbmdzCi0ldGVzdF9maWVsZHMgPSAoCi0JJ25hbWUnLAkJCQkncicsCi0JJ2Rlc2NyaXB0aW9uJywJCQknbScsCi0JJ2FyZ3VtZW50cycsCQkJJ00nLAotCSdzY3JpcHQnLAkJCSdtJywKLQknc3RkaW4nLAkJCSdtJywKLQkncGVybC1zZXR1cCcsCQkJJ20nLAotCSdwZXJsLWNsZWFudXAnLAkJCSdtJywKLQknZW52LXNldHVwJywJCQknTScsCi0JJ2ZpbGUtc2V0dXAnLAkJCSdtcHMnLAotCSdmaWxlLXJlc3VsdCcsCQkJJ21wcycsCi0JJ3RpbWUtbGltaXQnLAkJCScnLAotCSdleHBlY3RlZC1mYWlsJywJCScnLAotCSdleHBlY3RlZC1leGl0JywJCScnLAotCSdleHBlY3RlZC1zdGRvdXQnLAkJJ20nLAotCSdleHBlY3RlZC1zdGRvdXQtcGF0dGVybicsCSdtJywKLQknZXhwZWN0ZWQtc3RkZXJyJywJCSdtJywKLQknZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nLAknbScsCi0JJ2NhdGVnb3J5JywJCQknbScsCi0JKTsKLSMgRmlsbGVkIGluIGJ5IHJlYWRfdGVzdCgpCi0laW50ZXJuYWxfdGVzdF9maWVsZHMgPSAoCi0JJzpmdWxsLW5hbWUnLCAxLAkJIyBmaWxlOm5hbWUKLQknOmxvbmctbmFtZScsIDEsCQkjIGRpci9maWxlOmxpbmVubzpuYW1lCi0JKTsKLQotIyBDYXRlZ29yaWVzIG9mIHRoZSBwcm9ncmFtIHVuZGVyIHRlc3QuIFByb3ZpZGUgdGhlIGN1cnJlbnQKLSMgb3MgYnkgZGVmYXVsdC4KLSVjYXRlZ29yaWVzID0gKAotCSJvczokb3MiLCAnMScKLQkpOwotCi0kdGVtcHMgPSAiL3RtcC9ydHMkJCI7Ci0kdGVtcGkgPSAiL3RtcC9ydGkkJCI7Ci0kdGVtcG8gPSAiL3RtcC9ydG8kJCI7Ci0kdGVtcGUgPSAiL3RtcC9ydGUkJCI7Ci0kdGVtcGRpciA9ICIvdG1wL3J0ZCQkIjsKLQotJG5mYWlsZWQgPSAwOwotJG54ZmFpbGVkID0gMDsKLSRucGFzc2VkID0gMDsKLSRueHBhc3NlZCA9IDA7Ci0KLSVrbm93bl90ZXN0cyA9ICgpOwotCi1pZiAoIWdldG9wdHMoJ0M6cDpQczp0OnZlOicpKSB7Ci0gICAgcHJpbnQgU1RERVJSICRVc2FnZTsKLSAgICBleGl0IDE7Ci19Ci0KLWRpZSAiJHByb2c6IG5vIHByb2dyYW0gc3BlY2lmaWVkICh1c2UgLXApXG4iIGlmICFkZWZpbmVkICRvcHRfcDsKLWRpZSAiJHByb2c6IG5vIHRlc3Qgc2V0IHNwZWNpZmllZCAodXNlIC1zKVxuIiBpZiAhZGVmaW5lZCAkb3B0X3M7Ci0kdGVzdF9wcm9nID0gJG9wdF9wOwotJHZlcmJvc2UgPSBkZWZpbmVkICRvcHRfdiAmJiAkb3B0X3Y7Ci0kdGVzdF9zZXQgPSAkb3B0X3M7Ci1pZiAoZGVmaW5lZCAkb3B0X3QpIHsKLSAgICBkaWUgIiRwcm9nOiBiYWQgLXQgYXJndW1lbnQgKHNob3VsZCBiZSBudW1iZXIgPiAwKTogJG9wdF90XG4iCi0JaWYgJG9wdF90ICF+IC9eXGQrJC8gfHwgJG9wdF90IDw9IDA7Ci0gICAgJGRlZmF1bHRfdGltZV9saW1pdCA9ICRvcHRfdDsKLX0KLSRwcm9ncmFtX2tsdWRnZSA9IGRlZmluZWQgJG9wdF9QID8gJG9wdF9QIDogMDsKLQotaWYgKGRlZmluZWQgJG9wdF9DKSB7Ci0gICAgZm9yZWFjaCAkYyAoc3BsaXQoJywnLCAkb3B0X0MpKSB7Ci0JJGMgPX4gcy9ccysvLzsKLQlkaWUgIiRwcm9nOiBjYXRlZ29yaWVzIGNhbid0IGJlIG5lZ2F0ZWQgb24gdGhlIGNvbW1hbmQgbGluZVxuIgotCSAgICBpZiAoJGMgPX4gL14hLyk7Ci0JJGNhdGVnb3JpZXN7JGN9ID0gMTsKLSAgICB9Ci19Ci0KLSMgTm90ZSB3aGljaCB0ZXN0cyBhcmUgdG8gYmUgcnVuLgotJWRvX3Rlc3QgPSAoKTsKLWdyZXAoJGRvX3Rlc3R7JF99ID0gMSwgQEFSR1YpOwotJGFsbF90ZXN0cyA9IEBBUkdWID09IDA7Ci0KLSMgU2V0IHVwIGEgdmVyeSBtaW5pbWFsIGVudmlyb25tZW50Ci0lbmV3X2VudiA9ICgpOwotZm9yZWFjaCAkZW52ICgoJ0hPTUUnLCAnTERfTElCUkFSWV9QQVRIJywgJ0xPQ1BBVEgnLCAnTE9HTkFNRScsCi0gICdQQVRIJywgJ1NIRUxMJywgJ1VTRVInKSkgewotICAgICRuZXdfZW52eyRlbnZ9ID0gJEVOVnskZW52fSBpZiBkZWZpbmVkICRFTlZ7JGVudn07Ci19Ci0kbmV3X2VudnsnRU5WJ30gPSAnL25vbmV4aXN0YW50JzsKLWlmICgoJG9zIGVxICdWTVMnKSB8fCAoJENvbmZpZ3twZXJscGF0aH0gPX4gbS8kQ29uZmlne19leGV9JC9pKSkgewotCSRuZXdfZW52eydfX3BlcmxuYW1lJ30gPSAkQ29uZmlne3BlcmxwYXRofTsKLX0gZWxzZSB7Ci0JJG5ld19lbnZ7J19fcGVybG5hbWUnfSA9ICRDb25maWd7cGVybHBhdGh9IC4gJENvbmZpZ3tfZXhlfTsKLX0KLWlmIChkZWZpbmVkICRvcHRfZSkgewotICAgICMgWFhYIG5lZWQgYSB3YXkgdG8gYWxsb3cgbWFueSAtZSBhcmd1bWVudHMuLi4KLSAgICBpZiAoJG9wdF9lID1+IC9eKFthLXpBLVpfXVx3KikofD0oLiopKSQvKSB7Ci0JJG5ld19lbnZ7JDF9ID0gJDIgZXEgJycgPyAkRU5WeyQxfSA6ICQzOwotICAgIH0gZWxzZSB7Ci0JZGllICIkMDogYmFkIC1lIGFyZ3VtZW50OiAkb3B0X2VcbiI7Ci0gICAgfQotfQotJW9sZF9lbnYgPSAlRU5WOwotCi1kaWUgIiRwcm9nOiBjb3VsZG4ndCBtYWtlIGRpcmVjdG9yeSAkdGVtcGRpciAtICQhXG4iIGlmICFta2RpcigkdGVtcGRpciwgMDc3Nyk7Ci0KLWNob3AoJHB3ZCA9IGBwd2QgMj4vZGV2L251bGxgKTsKLWRpZSAiJHByb2c6IGNvdWxkbid0IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4iIGlmICRwd2QgZXEgJyc7Ci1kaWUgIiRwcm9nOiBjb3VsZG4ndCBjZCB0byAkcHdkIC0gJCFcbiIgaWYgIWNoZGlyKCRwd2QpOwotCi1pZiAoISRwcm9ncmFtX2tsdWRnZSkgewotICAgICR0ZXN0X3Byb2cgPSAiJHB3ZC8kdGVzdF9wcm9nIiBpZiBzdWJzdHIoJHRlc3RfcHJvZywgMCwgMSkgbmUgJy8nOwotICAgIGRpZSAiJHByb2c6ICR0ZXN0X3Byb2cgaXMgbm90IGV4ZWN1dGFibGUgLSBieWVcbiIKLQlpZiAoISAteCAkdGVzdF9wcm9nICYmICRvcyBuZSAnb3MyJyk7Ci19Ci0KLUB0cmFwX3NpZ3MgPSAoJ1RFUk0nLCAnUVVJVCcsICdJTlQnLCAnUElQRScsICdIVVAnKTsKLUBTSUd7QHRyYXBfc2lnc30gPSAoJ2NsZWFudXBfZXhpdCcpIHggQHRyYXBfc2lnczsKLSRjaGlsZF9raWxsX29rID0gMDsKLSRTSUd7J0FMUk0nfSA9ICdjYXRjaF9zaWdhbHJtJzsKLQotJHwgPSAxOwotCi1pZiAoLWQgJHRlc3Rfc2V0KSB7Ci0gICAgJGZpbGVfcHJlZml4X3NraXAgPSBsZW5ndGgoJHRlc3Rfc2V0KSArIDE7Ci0gICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZGlyKCR0ZXN0X3NldCk7Ci19IGVsc2UgewotICAgICRmaWxlX3ByZWZpeF9za2lwID0gMDsKLSAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9maWxlKCR0ZXN0X3NldCk7Ci19Ci0mY2xlYW51cF9leGl0KCkgaWYgIWRlZmluZWQgJHJldDsKLQotJHRvdF9mYWlsZWQgPSAkbmZhaWxlZCArICRueGZhaWxlZDsKLSR0b3RfcGFzc2VkID0gJG5wYXNzZWQgKyAkbnhwYXNzZWQ7Ci1pZiAoJHRvdF9mYWlsZWQgfHwgJHRvdF9wYXNzZWQpIHsKLSAgICBwcmludCAiVG90YWwgZmFpbGVkOiAkdG90X2ZhaWxlZCI7Ci0gICAgcHJpbnQgIiAoJG54ZmFpbGVkIHVuZXhwZWN0ZWQpIiBpZiAkbnhmYWlsZWQ7Ci0gICAgcHJpbnQgIiAoYXMgZXhwZWN0ZWQpIiBpZiAkbmZhaWxlZCAmJiAhJG54ZmFpbGVkOwotICAgIHByaW50ICJcblRvdGFsIHBhc3NlZDogJHRvdF9wYXNzZWQiOwotICAgIHByaW50ICIgKCRueHBhc3NlZCB1bmV4cGVjdGVkKSIgaWYgJG54cGFzc2VkOwotICAgIHByaW50ICJcbiI7Ci19Ci0KLSZjbGVhbnVwX2V4aXQoJ29rJyk7Ci0KLXN1YgotY2xlYW51cF9leGl0Ci17Ci0gICAgbG9jYWwoJHNpZywgJGV4aXRjb2RlKSA9ICgnJywgMSk7Ci0KLSAgICBpZiAoJF9bMF0gZXEgJ29rJykgewotCSRleGl0Y29kZSA9IDA7Ci0gICAgfSBlbHNpZiAoJF9bMF0gbmUgJycpIHsKLQkkc2lnID0gJF9bMF07Ci0gICAgfQotCi0gICAgdW5saW5rKCR0ZW1waSwgJHRlbXBvLCAkdGVtcGUsICR0ZW1wcyk7Ci0gICAgJnNjcnViX2RpcigkdGVtcGRpcikgaWYgZGVmaW5lZCAkdGVtcGRpcjsKLSAgICBybWRpcigkdGVtcGRpcikgaWYgZGVmaW5lZCAkdGVtcGRpcjsKLQotICAgIGlmICgkc2lnKSB7Ci0JJFNJR3skc2lnfSA9ICdERUZBVUxUJzsKLQlraWxsICRzaWcsICQkOwotCXJldHVybjsKLSAgICB9Ci0gICAgZXhpdCAkZXhpdGNvZGU7Ci19Ci0KLXN1YgotY2F0Y2hfc2lnYWxybQotewotICAgICRTSUd7J0FMUk0nfSA9ICdjYXRjaF9zaWdhbHJtJzsKLSAgICBraWxsKDksICRjaGlsZF9waWQpIGlmICRjaGlsZF9raWxsX29rOwotICAgICRjaGlsZF9raWxsZWQgPSAxOwotfQotCi1zdWIKLXByb2Nlc3NfdGVzdF9kaXIKLXsKLSAgICBsb2NhbCgkZGlyKSA9IEBfOwotICAgIGxvY2FsKCRyZXQsICRmaWxlKTsKLSAgICBsb2NhbChAdG9kbykgPSAoKTsKLQotICAgIGlmICghb3BlbmRpcihESVIsICRkaXIpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiBkaXJlY3RvcnkgJGRpciAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgd2hpbGUgKGRlZmluZWQgKCRmaWxlID0gcmVhZGRpcihESVIpKSkgewotCXB1c2goQHRvZG8sICRmaWxlKSBpZiAkZmlsZSA9fiAvXlteLl0uKlwudCQvOwotICAgIH0KLSAgICBjbG9zZWRpcihESVIpOwotCi0gICAgZm9yZWFjaCAkZmlsZSAoQHRvZG8pIHsKLQkkZmlsZSA9ICIkZGlyLyRmaWxlIjsKLQlpZiAoLWQgJGZpbGUpIHsKLQkgICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZGlyKCRmaWxlKTsKLQl9IGVsc2lmICgtZiBfKSB7Ci0JICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2ZpbGUoJGZpbGUpOwotCX0KLQlsYXN0IGlmICFkZWZpbmVkICRyZXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXQ7Ci19Ci0KLXN1YgotcHJvY2Vzc190ZXN0X2ZpbGUKLXsKLSAgICBsb2NhbCgkZmlsZSkgPSBAXzsKLSAgICBsb2NhbCgkcmV0KTsKLQotICAgIGlmICghb3BlbihJTiwgJGZpbGUpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiAkZmlsZSAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgYmlubW9kZShJTik7Ci0gICAgd2hpbGUgKDEpIHsKLQkkcmV0ID0gJnJlYWRfdGVzdCgkZmlsZSwgSU4sICp0ZXN0KTsKLQlsYXN0IGlmICFkZWZpbmVkICRyZXQgfHwgISRyZXQ7Ci0JbmV4dCBpZiAhJGFsbF90ZXN0cyAmJiAhJGRvX3Rlc3R7JHRlc3R7J25hbWUnfX07Ci0JbmV4dCBpZiAhJmNhdGVnb3J5X2NoZWNrKCp0ZXN0KTsKLQkkcmV0ID0gJnJ1bl90ZXN0KCp0ZXN0KTsKLQlsYXN0IGlmICFkZWZpbmVkICRyZXQ7Ci0gICAgfQotICAgIGNsb3NlKElOKTsKLQotICAgIHJldHVybiAkcmV0OwotfQotCi1zdWIKLXJ1bl90ZXN0Ci17Ci0gICAgbG9jYWwoKnRlc3QpID0gQF87Ci0gICAgbG9jYWwoJG5hbWUpID0gJHRlc3R7JzpmdWxsLW5hbWUnfTsKLQotICAgIGlmIChkZWZpbmVkICR0ZXN0eydzdGRpbid9KSB7Ci0JcmV0dXJuIHVuZGVmIGlmICEmd3JpdGVfZmlsZSgkdGVtcGksICR0ZXN0eydzdGRpbid9KTsKLQkkaWZpbGUgPSAkdGVtcGk7Ci0gICAgfSBlbHNlIHsKLQkkaWZpbGUgPSAnL2Rldi9udWxsJzsKLSAgICB9Ci0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnc2NyaXB0J30pIHsKLQlyZXR1cm4gdW5kZWYgaWYgISZ3cml0ZV9maWxlKCR0ZW1wcywgJHRlc3R7J3NjcmlwdCd9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdW5kZWYgaWYgISZzY3J1Yl9kaXIoJHRlbXBkaXIpOwotCi0gICAgaWYgKCFjaGRpcigkdGVtcGRpcikpIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBjZCB0byAkdGVtcGRpciAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZmlsZS1zZXR1cCd9KSB7Ci0JbG9jYWwoJGkpOwotCWxvY2FsKCR0eXBlLCAkcGVybSwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7Ci0KLQlmb3IgKCRpID0gMDsgJGkgPCAkdGVzdHsnZmlsZS1zZXR1cCd9OyAkaSsrKSB7Ci0JICAgICR2YWwgPSAkdGVzdHsiZmlsZS1zZXR1cDokaSJ9OwotCi0JICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCi0JICAgICgkdHlwZSwgJHBlcm0sICRyZXN0KSA9Ci0JCXNwbGl0KCcgJywgJHZhbCwgMyk7Ci0JICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKLQkgICAgJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxOwotCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7Ci0JICAgICRyZXN0ID0gc3Vic3RyKCRyZXN0LCAyICsgJGxlbik7Ci0JICAgICRwZXJtID0gb2N0KCRwZXJtKSBpZiAkcGVybSA9fiAvXlxkKyQvOwotCSAgICBpZiAoJHR5cGUgZXEgJ2ZpbGUnKSB7Ci0JCXJldHVybiB1bmRlZiBpZiAhJndyaXRlX2ZpbGUoJG5hbWUsICRyZXN0KTsKLQkJaWYgKCFjaG1vZCgkcGVybSwgJG5hbWUpKSB7Ci0JCSAgICBwcmludCBTVERFUlIKLQkJICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgY2htb2QgJHBlcm0gJG5hbWUgLSAkIVxuIjsKLQkJICAgIHJldHVybiB1bmRlZjsKLQkJfQotCSAgICB9IGVsc2lmICgkdHlwZSBlcSAnZGlyJykgewotCQlpZiAoIW1rZGlyKCRuYW1lLCAkcGVybSkpIHsKLQkJICAgIHByaW50IFNUREVSUgotCQkgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCBta2RpciAkcGVybSAkbmFtZSAtICQhXG4iOwotCQkgICAgcmV0dXJuIHVuZGVmOwotCQl9Ci0JICAgIH0gZWxzaWYgKCR0eXBlIGVxICdzeW1saW5rJykgewotCQlsb2NhbCgkb3VtYXNrKSA9IHVtYXNrKCRwZXJtKTsKLQkJbG9jYWwoJHJldCkgPSBzeW1saW5rKCRyZXN0LCAkbmFtZSk7Ci0JCXVtYXNrKCRvdW1hc2spOwotCQlpZiAoISRyZXQpIHsKLQkJICAgIHByaW50IFNUREVSUgotCSAgICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY291bGRuJ3QgY3JlYXRlIHN5bWxpbmsgJG5hbWUgLSAkIVxuIjsKLQkJICAgIHJldHVybiB1bmRlZjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGlmIChkZWZpbmVkICR0ZXN0eydwZXJsLXNldHVwJ30pIHsKLQlldmFsICR0ZXN0eydwZXJsLXNldHVwJ307Ci0JaWYgKCRAIG5lICcnKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXJyb3IgcnVubmluZyBwZXJsLXNldHVwIC0gJEBcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfQotCi0gICAgJHBpZCA9IGZvcms7Ci0gICAgaWYgKCFkZWZpbmVkICRwaWQpIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiBjYW4ndCBmb3JrIC0gJCFcbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICBpZiAoISRwaWQpIHsKLQlAU0lHe0B0cmFwX3NpZ3N9ID0gKCdERUZBVUxUJykgeCBAdHJhcF9zaWdzOwotCSRTSUd7J0FMUk0nfSA9ICdERUZBVUxUJzsKLQlpZiAoZGVmaW5lZCAkdGVzdHsnZW52LXNldHVwJ30pIHsKLQkgICAgbG9jYWwoJHZhciwgJHZhbCwgJGkpOwotCi0JICAgIGZvcmVhY2ggJHZhciAoc3BsaXQoc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgMCwgMSksCi0JCSR0ZXN0eydlbnYtc2V0dXAnfSkpCi0JICAgIHsKLQkJJGkgPSBpbmRleCgkdmFyLCAnPScpOwotCQluZXh0IGlmICRpID09IDAgfHwgJHZhciBlcSAnJzsKLQkJaWYgKCRpIDwgMCkgewotCQkgICAgZGVsZXRlICRuZXdfZW52eyR2YXJ9OwotCQl9IGVsc2UgewotCQkgICAgJG5ld19lbnZ7c3Vic3RyKCR2YXIsIDAsICRpKX0gPSBzdWJzdHIoJHZhciwgJGkgKyAxKTsKLQkJfQotCSAgICB9Ci0JfQotCWlmICghb3BlbihTVERJTiwgIjwgJGlmaWxlIikpIHsKLQkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgb3BlbiAkaWZpbGUgaW4gY2hpbGQgLSAkIVxuIjsKLQkJa2lsbCgnVEVSTScsICQkKTsKLQl9Ci0JYmlubW9kZShTVERJTik7Ci0JaWYgKCFvcGVuKFNURE9VVCwgIj4gJHRlbXBvIikpIHsKLQkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgb3BlbiAkdGVtcG8gaW4gY2hpbGQgLSAkIVxuIjsKLQkJa2lsbCgnVEVSTScsICQkKTsKLQl9Ci0JYmlubW9kZShTVERPVVQpOwotCWlmICghb3BlbihTVERFUlIsICI+ICR0ZW1wZSIpKSB7Ci0JCXByaW50IFNURE9VVCAiJHByb2c6IGNvdWxkbid0IG9wZW4gJHRlbXBlIGluIGNoaWxkIC0gJCFcbiI7Ci0JCWtpbGwoJ1RFUk0nLCAkJCk7Ci0JfQotCWJpbm1vZGUoU1RERVJSKTsKLQlpZiAoJHByb2dyYW1fa2x1ZGdlKSB7Ci0JICAgIEBhcmd2ID0gc3BsaXQoJyAnLCAkdGVzdF9wcm9nKTsKLQl9IGVsc2UgewotCSAgICBAYXJndiA9ICgkdGVzdF9wcm9nKTsKLQl9Ci0JaWYgKGRlZmluZWQgJHRlc3R7J2FyZ3VtZW50cyd9KSB7Ci0JCXB1c2goQGFyZ3YsCi0JCSAgICAgc3BsaXQoc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMCwgMSksCi0JCQkgICBzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAxKSkpOwotCX0KLQlwdXNoKEBhcmd2LCAkdGVtcHMpIGlmIGRlZmluZWQgJHRlc3R7J3NjcmlwdCd9OwotCi0JI1hYWCByZWFscGF0aGlzZSwgdXNlIHdoaWNoL3doZW5jZSAtcCwgb3Igc3RoLiBsaWtlIHRoYXQKLQkjWFhYIGlmICEkcHJvZ3JhbV9rbHVkZ2UsIHdlIGdldCBieSB3aXRoIG5vdCBkb2luZyBpdCBmb3Igbm93IHRobwotCSRuZXdfZW52eydfX3Byb2duYW1lJ30gPSAkYXJndlswXTsKLQotCSMgVGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsgd2l0aCBwZXJsNS4uLiAgTmVlZCB0byBkbyBpdCBleHBsaWNpdGx5IC0geXVjay4KLQkjJUVOViA9ICVuZXdfZW52OwotCWZvcmVhY2ggJGsgKGtleXMoJUVOVikpIHsKLQkgICAgZGVsZXRlICRFTlZ7JGt9OwotCX0KLQkkRU5WeyRrfSA9ICR2IHdoaWxlICgkaywkdikgPSBlYWNoICVuZXdfZW52OwotCi0JZXhlYyB7ICRhcmd2WzBdIH0gQGFyZ3Y7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgZXhlY3V0ZSAkdGVzdF9wcm9nIC0gJCFcbiI7Ci0Ja2lsbCgnVEVSTScsICQkKTsKLQlleGl0KDk1KTsKLSAgICB9Ci0gICAgJGNoaWxkX3BpZCA9ICRwaWQ7Ci0gICAgJGNoaWxkX2tpbGxlZCA9IDA7Ci0gICAgJGNoaWxkX2tpbGxfb2sgPSAxOwotICAgIGFsYXJtKCR0ZXN0eyd0aW1lLWxpbWl0J30pIGlmIGRlZmluZWQgJHRlc3R7J3RpbWUtbGltaXQnfTsKLSAgICB3aGlsZSAoMSkgewotCSR4cGlkID0gd2FpdHBpZCgkcGlkLCAwKTsKLQkkY2hpbGRfa2lsbF9vayA9IDA7Ci0JaWYgKCR4cGlkIDwgMCkgewotCSAgICBuZXh0IGlmICQhID09IEVJTlRSOwotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiBlcnJvciB3YWl0aW5nIGZvciBjaGlsZCAtICQhXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCWxhc3Q7Ci0gICAgfQotICAgICRzdGF0dXMgPSAkPzsKLSAgICBhbGFybSgwKSBpZiBkZWZpbmVkICR0ZXN0eyd0aW1lLWxpbWl0J307Ci0KLSAgICAkZmFpbGVkID0gMDsKLSAgICAkd2h5ID0gJyc7Ci0KLSAgICBpZiAoJGNoaWxkX2tpbGxlZCkgewotCSRmYWlsZWQgPSAxOwotCSR3aHkgLj0gIlx0dGVzdCB0aW1lZCBvdXQgKGxpbWl0IG9mICR0ZXN0eyd0aW1lLWxpbWl0J30gc2Vjb25kcylcbiI7Ci0gICAgfQotCi0gICAgJHJldCA9ICZldmFsX2V4aXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkc3RhdHVzLCAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9KTsKLSAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHJldDsKLSAgICBpZiAoISRyZXQpIHsKLQlsb2NhbCgkZXhwbCk7Ci0KLQkkZmFpbGVkID0gMTsKLQlpZiAoKCRzdGF0dXMgJiAweGZmKSA9PSAweDdmKSB7Ci0JICAgICRleHBsID0gInN0b3BwZWQiOwotCX0gZWxzaWYgKCgkc3RhdHVzICYgMHhmZikpIHsKLQkgICAgJGV4cGwgPSAic2lnbmFsICIgLiAoJHN0YXR1cyAmIDB4N2YpOwotCX0gZWxzZSB7Ci0JICAgICRleHBsID0gImV4aXQtY29kZSAiIC4gKCgkc3RhdHVzID4+IDgpICYgMHhmZik7Ci0JfQotCSR3aHkgLj0KLQkiXHR1bmV4cGVjdGVkIGV4aXQgc3RhdHVzICRzdGF0dXMgKCRleHBsKSwgZXhwZWN0ZWQgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfVxuIjsKLSAgICB9Ci0KLSAgICAkdG1wID0gJmNoZWNrX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sICR0ZW1wbywgJ3N0ZG91dCcsCi0JCSR0ZXN0eydleHBlY3RlZC1zdGRvdXQnfSwgJHRlc3R7J2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuJ30pOwotICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOwotICAgIGlmICgkdG1wIG5lICcnKSB7Ci0JJGZhaWxlZCA9IDE7Ci0JJHdoeSAuPSAkdG1wOwotICAgIH0KLQotICAgICR0bXAgPSAmY2hlY2tfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwgJHRlbXBlLCAnc3RkZXJyJywKLQkJJHRlc3R7J2V4cGVjdGVkLXN0ZGVycid9LCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nfSk7Ci0gICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICR0bXA7Ci0gICAgaWYgKCR0bXAgbmUgJycpIHsKLQkkZmFpbGVkID0gMTsKLQkkd2h5IC49ICR0bXA7Ci0gICAgfQotCi0gICAgJHRtcCA9ICZjaGVja19maWxlX3Jlc3VsdCgqdGVzdCk7Ci0gICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICR0bXA7Ci0gICAgaWYgKCR0bXAgbmUgJycpIHsKLQkkZmFpbGVkID0gMTsKLQkkd2h5IC49ICR0bXA7Ci0gICAgfQotCi0gICAgaWYgKGRlZmluZWQgJHRlc3R7J3BlcmwtY2xlYW51cCd9KSB7Ci0JZXZhbCAkdGVzdHsncGVybC1jbGVhbnVwJ307Ci0JaWYgKCRAIG5lICcnKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXJyb3IgcnVubmluZyBwZXJsLWNsZWFudXAgLSAkQFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoIWNoZGlyKCRwd2QpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHB3ZCAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0KLSAgICBpZiAoJGZhaWxlZCkgewotCWlmICghJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSkgewotCSAgICBwcmludCAiRkFJTCAkbmFtZVxuIjsKLQkgICAgJG54ZmFpbGVkKys7Ci0JfSBlbHNlIHsKLQkgICAgcHJpbnQgImZhaWwgJG5hbWUgKGFzIGV4cGVjdGVkKVxuIjsKLQkgICAgJG5mYWlsZWQrKzsKLQl9Ci0JJHdoeSA9ICJcdERlc2NyaXB0aW9uIgotCQkuICZ3cmFwX2xpbmVzKCR0ZXN0eydkZXNjcmlwdGlvbid9LCAiIChtaXNzaW5nKVxuIikKLQkJLiAkd2h5OwotICAgIH0gZWxzaWYgKCR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKLQlwcmludCAiUEFTUyAkbmFtZSAodW5leHBlY3RlZGx5KVxuIjsKLQkkbnhwYXNzZWQrKzsKLSAgICB9IGVsc2UgewotCXByaW50ICJwYXNzICRuYW1lXG4iOwotCSRucGFzc2VkKys7Ci0gICAgfQotICAgIHByaW50ICR3aHkgaWYgJHZlcmJvc2U7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN1YgotY2F0ZWdvcnlfY2hlY2sKLXsKLSAgICBsb2NhbCgqdGVzdCkgPSBAXzsKLSAgICBsb2NhbCgkYyk7Ci0KLSAgICByZXR1cm4gMSBpZiAoIWRlZmluZWQgJHRlc3R7J2NhdGVnb3J5J30pOwotICAgIGxvY2FsKCRvaykgPSAwOwotICAgIGZvcmVhY2ggJGMgKHNwbGl0KCcsJywgJHRlc3R7J2NhdGVnb3J5J30pKSB7Ci0JJGMgPX4gcy9ccysvLzsKLQlpZiAoJGMgPX4gL14hLykgewotCSAgICAkYyA9ICQnOwotCSAgICByZXR1cm4gMCBpZiAoZGVmaW5lZCAkY2F0ZWdvcmllc3skY30pOwotCSAgICAkb2sgPSAxOwotCX0gZWxzZSB7Ci0JICAgICRvayA9IDEgaWYgKGRlZmluZWQgJGNhdGVnb3JpZXN7JGN9KTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAkb2s7Ci19Ci0KLXN1Ygotc2NydWJfZGlyCi17Ci0gICAgbG9jYWwoJGRpcikgPSBAXzsKLSAgICBsb2NhbChAdG9kbykgPSAoKTsKLSAgICBsb2NhbCgkZmlsZSk7Ci0KLSAgICBpZiAoIW9wZW5kaXIoRElSLCAkZGlyKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gZGlyZWN0b3J5ICRkaXIgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotICAgIHdoaWxlIChkZWZpbmVkICgkZmlsZSA9IHJlYWRkaXIoRElSKSkpIHsKLQlwdXNoKEB0b2RvLCAkZmlsZSkgaWYgJGZpbGUgbmUgJy4nICYmICRmaWxlIG5lICcuLic7Ci0gICAgfQotICAgIGNsb3NlZGlyKERJUik7Ci0gICAgZm9yZWFjaCAkZmlsZSAoQHRvZG8pIHsKLQkkZmlsZSA9ICIkZGlyLyRmaWxlIjsKLQlpZiAoLWQgJGZpbGUpIHsKLQkgICAgcmV0dXJuIHVuZGVmIGlmICEmc2NydWJfZGlyKCRmaWxlKTsKLQkgICAgaWYgKCFybWRpcigkZmlsZSkpIHsKLQkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgcm1kaXIgJGZpbGUgLSAkIVxuIjsKLQkJcmV0dXJuIHVuZGVmOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgaWYgKCF1bmxpbmsoJGZpbGUpKSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IHVubGluayAkZmlsZSAtICQhXG4iOwotCQlyZXR1cm4gdW5kZWY7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1zdWIKLXdyaXRlX2ZpbGUKLXsKLSAgICBsb2NhbCgkZmlsZSwgJHN0cikgPSBAXzsKLQotICAgIGlmICghb3BlbihURU1QLCAiPiAkZmlsZSIpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiAkZmlsZSAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgYmlubW9kZShURU1QKTsKLSAgICBwcmludCBURU1QICRzdHI7Ci0gICAgaWYgKCFjbG9zZShURU1QKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGVycm9yIHdyaXRpbmcgJGZpbGUgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1zdWIKLWNoZWNrX291dHB1dAotewotICAgIGxvY2FsKCRuYW1lLCAkZmlsZSwgJHdoYXQsICRleHBlY3QsICRleHBlY3RfcGF0KSA9IEBfOwotICAgIGxvY2FsKCRnb3QpID0gJyc7Ci0gICAgbG9jYWwoJHdoeSkgPSAnJzsKLSAgICBsb2NhbCgkcmV0KTsKLQotICAgIGlmICghb3BlbihURU1QLCAiPCAkZmlsZSIpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzokbmFtZSgkd2hhdCk6IGNvdWxkbid0IG9wZW4gJGZpbGUgYWZ0ZXIgcnVubmluZyBwcm9ncmFtIC0gJCFcbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICBiaW5tb2RlKFRFTVApOwotICAgIHdoaWxlICg8VEVNUD4pIHsKLQkkZ290IC49ICRfOwotICAgIH0KLSAgICBjbG9zZShURU1QKTsKLSAgICByZXR1cm4gY29tcGFyZV9vdXRwdXQoJG5hbWUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCwgJGdvdCk7Ci19Ci0KLXN1YgotY29tcGFyZV9vdXRwdXQKLXsKLSAgICBsb2NhbCgkbmFtZSwgJHdoYXQsICRleHBlY3QsICRleHBlY3RfcGF0LCAkZ290KSA9IEBfOwotICAgIGxvY2FsKCR3aHkpID0gJyc7Ci0KLSAgICBpZiAoZGVmaW5lZCAkZXhwZWN0X3BhdCkgewotCSRfID0gJGdvdDsKLQkkcmV0ID0gZXZhbCAiJGV4cGVjdF9wYXQiOwotCWlmICgkQCBuZSAnJykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRuYW1lKCR3aGF0KTogZXJyb3IgZXZhbHVhdGluZyAkd2hhdCBwYXR0ZXJuOiAkZXhwZWN0X3BhdCAtICRAXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCWlmICghJHJldCkgewotCSAgICAkd2h5ID0gIlx0dW5leHBlY3RlZCAkd2hhdCAtIHdhbnRlZCBwYXR0ZXJuIjsKLQkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZXhwZWN0X3BhdCk7Ci0JICAgICR3aHkgLj0gIlx0Z290IjsKLQkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZ290KTsKLQl9Ci0gICAgfSBlbHNlIHsKLQkkZXhwZWN0ID0gJycgaWYgIWRlZmluZWQgJGV4cGVjdDsKLQlpZiAoJGdvdCBuZSAkZXhwZWN0KSB7Ci0JICAgICR3aHkgLj0gIlx0dW5leHBlY3RlZCAkd2hhdCAtICIgLiAmZmlyc3RfZGlmZigkZXhwZWN0LCAkZ290KSAuICJcbiI7Ci0JICAgICR3aHkgLj0gIlx0d2FudGVkIjsKLQkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZXhwZWN0KTsKLQkgICAgJHdoeSAuPSAiXHRnb3QiOwotCSAgICAkd2h5IC49ICZ3cmFwX2xpbmVzKCRnb3QpOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuICR3aHk7Ci19Ci0KLXN1Ygotd3JhcF9saW5lcwotewotICAgIGxvY2FsKCRzdHIsICRlbXB0eSkgPSBAXzsKLSAgICBsb2NhbCgkbm9ubCkgPSBzdWJzdHIoJHN0ciwgLTEsIDEpIG5lICJcbiI7Ci0KLSAgICByZXR1cm4gKGRlZmluZWQgJGVtcHR5ID8gJGVtcHR5IDogIiBub3RoaW5nXG4iKSBpZiAkc3RyIGVxICcnOwotICAgIHN1YnN0cigkc3RyLCAwLCAwKSA9ICI6XG4iOwotICAgICRzdHIgPX4gcy9cbi9cblx0XHQvZzsKLSAgICBpZiAoJG5vbmwpIHsKLQkkc3RyIC49ICJcblx0W2luY29tcGxldGUgbGFzdCBsaW5lXVxuIjsKLSAgICB9IGVsc2UgewotCWNob3AoJHN0cik7Ci0JY2hvcCgkc3RyKTsKLSAgICB9Ci0gICAgcmV0dXJuICRzdHI7Ci19Ci0KLXN1YgotZmlyc3RfZGlmZgotewotICAgIGxvY2FsKCRleHAsICRnb3QpID0gQF87Ci0gICAgbG9jYWwoJGxpbmVubywgJGNoYXIpID0gKDEsIDEpOwotICAgIGxvY2FsKCRpLCAkZXhwX2xlbiwgJGdvdF9sZW4pOwotICAgIGxvY2FsKCRjZSwgJGNnKTsKLQotICAgICRleHBfbGVuID0gbGVuZ3RoKCRleHApOwotICAgICRnb3RfbGVuID0gbGVuZ3RoKCRnb3QpOwotICAgIGlmICgkZXhwX2xlbiAhPSAkZ290X2xlbikgewotCWlmICgkZXhwX2xlbiA8ICRnb3RfbGVuKSB7Ci0JICAgIGlmIChzdWJzdHIoJGdvdCwgMCwgJGV4cF9sZW4pIGVxICRleHApIHsKLQkJcmV0dXJuICJnb3QgdG9vIG11Y2ggb3V0cHV0IjsKLQkgICAgfQotCX0gZWxzaWYgKHN1YnN0cigkZXhwLCAwLCAkZ290X2xlbikgZXEgJGdvdCkgewotCSAgICByZXR1cm4gImdvdCB0b28gbGl0dGxlIG91dHB1dCI7Ci0JfQotICAgIH0KLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkZXhwX2xlbjsgJGkrKykgewotCSRjZSA9IHN1YnN0cigkZXhwLCAkaSwgMSk7Ci0JJGNnID0gc3Vic3RyKCRnb3QsICRpLCAxKTsKLQlsYXN0IGlmICRjZSBuZSAkY2c7Ci0JJGNoYXIrKzsKLQlpZiAoJGNlIGVxICJcbiIpIHsKLQkgICAgJGxpbmVubysrOwotCSAgICAkY2hhciA9IDE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gImZpcnN0IGRpZmZlcmVuY2U6IGxpbmUgJGxpbmVubywgY2hhciAkY2hhciAod2FudGVkICciCi0JLiAmZm9ybWF0X2NoYXIoJGNlKSAuICInLCBnb3QgJyIKLQkuICZmb3JtYXRfY2hhcigkY2cpIC4gIiciOwotfQotCi1zdWIKLWZvcm1hdF9jaGFyCi17Ci0gICAgbG9jYWwoJGNoLCAkcyk7Ci0KLSAgICAkY2ggPSBvcmQoJF9bMF0pOwotICAgIGlmICgkY2ggPT0gMTApIHsKLQlyZXR1cm4gJ1xuJzsKLSAgICB9IGVsc2lmICgkY2ggPT0gMTMpIHsKLQlyZXR1cm4gJ1xyJzsKLSAgICB9IGVsc2lmICgkY2ggPT0gOCkgewotCXJldHVybiAnXGInOwotICAgIH0gZWxzaWYgKCRjaCA9PSA5KSB7Ci0JcmV0dXJuICdcdCc7Ci0gICAgfSBlbHNpZiAoJGNoID4gMTI3KSB7Ci0JJGNoIC09IDEyNzsKLQkkcyA9ICJNLSI7Ci0gICAgfSBlbHNlIHsKLQkkcyA9ICcnOwotICAgIH0KLSAgICBpZiAoJGNoIDwgMzIpIHsKLQkkcyAuPSAnXic7Ci0JJGNoICs9IG9yZCgnQCcpOwotICAgIH0gZWxzaWYgKCRjaCA9PSAxMjcpIHsKLQlyZXR1cm4gJHMgLiAiXj8iOwotICAgIH0KLSAgICByZXR1cm4gJHMgLiBzcHJpbnRmKCIlYyIsICRjaCk7Ci19Ci0KLXN1YgotZXZhbF9leGl0Ci17Ci0gICAgbG9jYWwoJG5hbWUsICRzdGF0dXMsICRleHBlY3QpID0gQF87Ci0gICAgbG9jYWwoJGV4cHIpOwotICAgIGxvY2FsKCR3LCAkZSwgJHMpID0gKCRzdGF0dXMsICgkc3RhdHVzID4+IDgpICYgMHhmZiwgJHN0YXR1cyAmIDB4N2YpOwotCi0gICAgJGUgPSAtMTAwMCBpZiAkc3RhdHVzICYgMHhmZjsKLSAgICAkcyA9IC0xMDAwIGlmICRzID09IDB4N2Y7Ci0gICAgaWYgKCFkZWZpbmVkICRleHBlY3QpIHsKLQkkZXhwciA9ICckdyA9PSAwJzsKLSAgICB9IGVsc2lmICgkZXhwZWN0ID1+IC9eKHwtKVxkKyQvKSB7Ci0JJGV4cHIgPSAiXCRlID09ICRleHBlY3QiOwotICAgIH0gZWxzZSB7Ci0JJGV4cHIgPSAkZXhwZWN0OwotCSRleHByID1+IHMvXGIoW3dzZV0pXGIvXCQkMS9nOwotCSRleHByID1+IHMvXGIoU0lHW0EtWjAtOV0rKVxiLyYkMS9nOwotICAgIH0KLSAgICAkdyA9IGV2YWwgJGV4cHI7Ci0gICAgaWYgKCRAIG5lICcnKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgZXhwZWN0ZWQtZXhpdCBleHByZXNzaW9uOiAkZXhwZWN0ICgkQClcbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICByZXR1cm4gJHc7Ci19Ci0KLXN1YgotcmVhZF90ZXN0Ci17Ci0gICAgbG9jYWwoJGZpbGUsICRpbiwgKnRlc3QpID0gQF87Ci0gICAgbG9jYWwoJGZpZWxkLCAkdmFsLCAkZmxhZ3MsICRkb19jaG9wLCAkbmVlZF9yZWRvLCAkc3RhcnRfbGluZW5vKTsKLSAgICBsb2NhbCglY250LCAkc2ZpZWxkKTsKLQotICAgICV0ZXN0ID0gKCk7Ci0gICAgJWNudCA9ICgpOwotICAgIHdoaWxlICg8JGluPikgewotCW5leHQgaWYgL15ccyokLzsKLQluZXh0IGlmIC9eICojLzsKLQlsYXN0IGlmIC9eXHMqLS0tXHMqJC87Ci0JJHN0YXJ0X2xpbmVubyA9ICQuIGlmICFkZWZpbmVkICRzdGFydF9saW5lbm87Ci0JaWYgKCEvXihbLVx3XSspOlxzKih8XFN8XFMuKlxTKVxzKiQvKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IHVucmVjb2duaXNlZCBsaW5lXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCSgkZmllbGQsICR2YWwpID0gKCQxLCAkMik7Ci0JJHNmaWVsZCA9ICRmaWVsZDsKLQkkZmxhZ3MgPSAkdGVzdF9maWVsZHN7JGZpZWxkfTsKLQlpZiAoIWRlZmluZWQgJGZsYWdzKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IHVucmVjb2duaXNlZCBmaWVsZCBcIiRmaWVsZFwiXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCWlmICgkZmxhZ3MgPX4gL3MvKSB7Ci0JICAgIGxvY2FsKCRjbnQpID0gJGNudHskZmllbGR9Kys7Ci0JICAgICR0ZXN0eyRmaWVsZH0gPSAkY250eyRmaWVsZH07Ci0JICAgICRjbnQgPSAwIGlmICRjbnQgZXEgJyc7Ci0JICAgICRzZmllbGQgLj0gIjokY250IjsKLQl9IGVsc2lmIChkZWZpbmVkICR0ZXN0eyRmaWVsZH0pIHsKLQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokZmlsZTokLjogbXVsdGlwbGUgXCIkZmllbGRcIiBmaWVsZHNcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0JJGRvX2Nob3AgPSAkZmxhZ3MgIX4gL20vOwotCSRuZWVkX3JlZG8gPSAwOwotCWlmICgkdmFsIGVxICcnIHx8ICR2YWwgZXEgJyEnIHx8ICRmbGFncyA9fiAvcC8pIHsKLQkgICAgaWYgKCRmbGFncyA9fiAvW01tXS8pIHsKLQkJaWYgKCRmbGFncyA9fiAvcC8pIHsKLQkJICAgIGlmICgkdmFsID1+IC9eIS8pIHsKLQkJCSRkb19jaG9wID0gMTsKLQkJCSR2YWwgPSAkJzsKLQkJICAgIH0gZWxzZSB7Ci0JCQkkZG9fY2hvcCA9IDA7Ci0JCSAgICB9Ci0JCSAgICBpZiAoJHZhbCBlcSAnJykgewotCQkJcHJpbnQgU1RERVJSCi0JCSIkcHJvZzokZmlsZTokLjogbm8gcGFyYW1ldGVycyBnaXZlbiBmb3IgZmllbGQgXCIkZmllbGRcIlxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIGlmICgkdmFsIGVxICchJykgewotCQkJJGRvX2Nob3AgPSAxOwotCQkgICAgfQotCQkgICAgJHZhbCA9ICcnOwotCQl9Ci0JCXdoaWxlICg8JGluPikgewotCQkgICAgbGFzdCBpZiAhL15cdC87Ci0JCSAgICAkdmFsIC49ICQnOwotCQl9Ci0JCWNob3AgJHZhbCBpZiAkZG9fY2hvcDsKLQkJJGRvX2Nob3AgPSAxOwotCQkkbmVlZF9yZWRvID0gMTsKLQotCQkjIFN5bnRheCBjaGVjayBvbiBmaWVsZHMgdGhhdCBjYW4gc2V2ZXJhbCBpbnN0YW5jZXMKLQkJIyAoY2FuIGdpdmUgdXNlZnVsIGxpbmUgbnVtYmVycyB0aGlzIHdheSkKLQotCQlpZiAoJGZpZWxkIGVxICdmaWxlLXNldHVwJykgewotCQkgICAgbG9jYWwoJHR5cGUsICRwZXJtLCAkcmVzdCwgJGMsICRsZW4sICRuYW1lKTsKLQotCQkgICAgIyBmb3JtYXQgaXM6IHR5cGUgcGVybSAibmFtZSIKLQkJICAgIGlmICgkdmFsICF+IC9eWyBcdF0qKFxTKylbIFx0XSsoXFMrKVsgXHRdKyhbXiBcdF0uKikvKSB7Ci0JCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBhcmFtZXRlciBsaW5lIGZvciBmaWxlLXNldHVwIGZpZWxkXG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgKCR0eXBlLCAkcGVybSwgJHJlc3QpID0gKCQxLCAkMiwgJDMpOwotCQkgICAgaWYgKCR0eXBlICF+IC9eKGZpbGV8ZGlyfHN5bWxpbmspJC8pIHsKLQkJCXByaW50IFNUREVSUgotCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZmlsZSB0eXBlIGZvciBmaWxlLXNldHVwOiAkdHlwZVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgIGlmICgkcGVybSAhfiAvXlxkKyQvKSB7Ci0JCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBlcm1pc3Npb25zIGZvciBmaWxlLXNldHVwOiAkdHlwZVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKLQkJICAgIGlmICgoJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxKSA8PSAwKSB7Ci0JCQlwcmludCBTVERFUlIKLSAgICAiJHByb2c6JGZpbGU6JC46IG1pc3NpbmcgZW5kIHF1b3RlIGZvciBmaWxlIG5hbWUgaW4gZmlsZS1zZXR1cDogJHJlc3RcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7Ci0JCSAgICBpZiAoJG5hbWUgPX4gL15cLy8gfHwgJG5hbWUgPX4gLyhefFwvKVwuXC4oXC98JCkvKSB7Ci0JCQkjIE5vdGU6IHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgdGhpbmcgLSBqdXN0IGEgc2FuaXR5Ci0JCQkjIGNoZWNrIC0gYSB0ZXN0IGNhbiBzdGlsbCB1c2Ugc3ltbGlua3MgdG8gZ2V0IGF0IGZpbGVzCi0JCQkjIG91dHNpZGUgdGhlIHRlc3QgZGlyZWN0b3J5LgotCQkJcHJpbnQgU1RERVJSCi0iJHByb2c6JGZpbGU6JC46IGZpbGUgbmFtZSBpbiBmaWxlLXNldHVwIGlzIGFic29sdXRlIG9yIGNvbnRhaW5zIC4uOiAkbmFtZVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJfQotCQlpZiAoJGZpZWxkIGVxICdmaWxlLXJlc3VsdCcpIHsKLQkJICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJG1hdGNoVHlwZSwKLQkJCSAgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7Ci0KLQkJICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gdWlkIGdpZCBtYXRjaFR5cGUgIm5hbWUiCi0JCSAgICBpZiAoJHZhbCAhfiAvXlxzKihcUyspXHMrKFxTKylccysoXFMrKVxzKyhcUyspXHMrKFxTKylccysoXFMuKikvKSB7Ci0JCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBhcmFtZXRlciBsaW5lIGZvciBmaWxlLXJlc3VsdCBmaWVsZFxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgICgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRtYXRjaFR5cGUsICRyZXN0KQotCQkJPSAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7Ci0JCSAgICBpZiAoJHR5cGUgIX4gL14oZmlsZXxkaXJ8c3ltbGluaykkLykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBmaWxlIHR5cGUgZm9yIGZpbGUtcmVzdWx0OiAkdHlwZVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgIGlmICgkcGVybSAhfiAvXlxkKyQvICYmICRwZXJtIG5lICcqJykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwZXJtaXNzaW9ucyBmb3IgZmlsZS1yZXN1bHQ6ICRwZXJtXG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgaWYgKCR1aWQgIX4gL15cZCskLyAmJiAkdWlkIG5lICcqJykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCB1c2VyLWlkIGZvciBmaWxlLXJlc3VsdDogJHVpZFxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgIGlmICgkZ2lkICF+IC9eXGQrJC8gJiYgJGdpZCBuZSAnKicpIHsKLQkJCXByaW50IFNUREVSUgotCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZ3JvdXAtaWQgZm9yIGZpbGUtcmVzdWx0OiAkZ2lkXG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgaWYgKCRtYXRjaFR5cGUgIX4gL14oZXhhY3R8cGF0dGVybikkLykgewotCQkJcHJpbnQgU1RERVJSCi0JCSIkcHJvZzokZmlsZTokLjogYmFkIG1hdGNoIHR5cGUgZm9yIGZpbGUtcmVzdWx0OiAkbWF0Y2hUeXBlXG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgJGMgPSBzdWJzdHIoJHJlc3QsIDAsIDEpOwotCQkgICAgaWYgKCgkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDEpIDw9IDApIHsKLQkJCXByaW50IFNUREVSUgotICAgICIkcHJvZzokZmlsZTokLjogbWlzc2luZyBlbmQgcXVvdGUgZm9yIGZpbGUgbmFtZSBpbiBmaWxlLXJlc3VsdDogJHJlc3RcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7Ci0JCSAgICBpZiAoJG5hbWUgPX4gL15cLy8gfHwgJG5hbWUgPX4gLyhefFwvKVwuXC4oXC98JCkvKSB7Ci0JCQkjIE5vdGU6IHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgdGhpbmcgLSBqdXN0IGEgc2FuaXR5Ci0JCQkjIGNoZWNrIC0gYSB0ZXN0IGNhbiBzdGlsbCB1c2Ugc3ltbGlua3MgdG8gZ2V0IGF0IGZpbGVzCi0JCQkjIG91dHNpZGUgdGhlIHRlc3QgZGlyZWN0b3J5LgotCQkJcHJpbnQgU1RERVJSCi0iJHByb2c6JGZpbGU6JC46IGZpbGUgbmFtZSBpbiBmaWxlLXJlc3VsdCBpcyBhYnNvbHV0ZSBvciBjb250YWlucyAuLjogJG5hbWVcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfSBlbHNpZiAoJHZhbCBlcSAnJykgewotCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogbm8gdmFsdWUgZ2l2ZW4gZm9yIGZpZWxkIFwiJGZpZWxkXCJcbiI7Ci0JCXJldHVybiB1bmRlZjsKLQkgICAgfQotCX0KLQkkdmFsIC49ICJcbiIgaWYgISRkb19jaG9wOwotCSR0ZXN0eyRzZmllbGR9ID0gJHZhbDsKLQlyZWRvIGlmICRuZWVkX3JlZG87Ci0gICAgfQotICAgIGlmICgkXyBlcSAnJykgewotCWlmICgldGVzdCkgewotCSAgICBwcmludCBTVERFUlIKLQkgICAgICAiJHByb2c6JGZpbGU6JHN0YXJ0X2xpbmVubzogZW5kLW9mLWZpbGUgd2hpbGUgcmVhZGluZyB0ZXN0XG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCXJldHVybiAwOwotICAgIH0KLQotICAgIHdoaWxlICgoJGZpZWxkLCAkdmFsKSA9IGVhY2ggJXRlc3RfZmllbGRzKSB7Ci0JaWYgKCR2YWwgPX4gL3IvICYmICFkZWZpbmVkICR0ZXN0eyRmaWVsZH0pIHsKLQkgICAgcHJpbnQgU1RERVJSCi0JICAgICAgIiRwcm9nOiRmaWxlOiRzdGFydF9saW5lbm86IHJlcXVpcmVkIGZpZWxkIFwiJGZpZWxkXCIgbWlzc2luZ1xuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLSAgICB9Ci0KLSAgICAkdGVzdHsnOmZ1bGwtbmFtZSd9ID0gc3Vic3RyKCRmaWxlLCAkZmlsZV9wcmVmaXhfc2tpcCkgLiAiOiR0ZXN0eyduYW1lJ30iOwotICAgICR0ZXN0eyc6bG9uZy1uYW1lJ30gPSAiJGZpbGU6JHN0YXJ0X2xpbmVubzokdGVzdHsnbmFtZSd9IjsKLQotICAgICMgU3ludGF4IGNoZWNrIG9uIHNwZWNpZmljIGZpZWxkcwotICAgIGlmIChkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKLQlpZiAoJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSAhfiAvXih5ZXN8bm8pJC8pIHsKLQkgICAgcHJpbnQgU1RERVJSCi0JICAgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCB2YWx1ZSBmb3IgZXhwZWN0ZWQtZmFpbCBmaWVsZFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQkkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9ID0gJDEgZXEgJ3llcyc7Ci0gICAgfSBlbHNlIHsKLQkkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9ID0gMDsKLSAgICB9Ci0gICAgaWYgKGRlZmluZWQgJHRlc3R7J2FyZ3VtZW50cyd9KSB7Ci0JbG9jYWwoJGZpcnN0YykgPSBzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAwLCAxKTsKLQotCWlmIChzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAtMSwgMSkgbmUgJGZpcnN0YykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGFyZ3VtZW50cyBmaWVsZCBkb2Vzbid0IHN0YXJ0IGFuZCBlbmQgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfQotICAgIGlmIChkZWZpbmVkICR0ZXN0eydlbnYtc2V0dXAnfSkgewotCWxvY2FsKCRmaXJzdGMpID0gc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgMCwgMSk7Ci0KLQlpZiAoc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgLTEsIDEpIG5lICRmaXJzdGMpIHsKLQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBlbnYtc2V0dXAgZmllbGQgZG9lc24ndCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotICAgIH0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9KSB7Ci0JbG9jYWwoJHZhbCkgPSAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9OwotCi0JaWYgKCR2YWwgPX4gL14ofC0pXGQrJC8pIHsKLQkgICAgaWYgKCR2YWwgPCAwIHx8ICR2YWwgPiAyNTUpIHsKLQkJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBleHBlY3RlZC1leGl0IHZhbHVlICR2YWwgbm90IGluIDAuLjI1NVxuIjsKLQkJcmV0dXJuIHVuZGVmOwotCSAgICB9Ci0JfSBlbHNpZiAoJHZhbCAhfiAvXihbXHM8PistPSolXC8mfCEoKV18XGJbd3NlXVxifFxiU0lHW0EtWjAtOV0rXGIpKyQvKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIGV4cGVjdGVkLWV4aXQgZXhwcmVzc2lvbjogJHZhbFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLSAgICB9IGVsc2UgewotCSR0ZXN0eydleHBlY3RlZC1leGl0J30gPSAwOwotICAgIH0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0J30KLQkmJiBkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRvdXQtcGF0dGVybid9KQotICAgIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IHVzZSBib3RoIGV4cGVjdGVkLXN0ZG91dCBhbmQgZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm5cbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyJ30KLQkmJiBkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRlcnItcGF0dGVybid9KQotICAgIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IHVzZSBib3RoIGV4cGVjdGVkLXN0ZGVyciBhbmQgZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm5cbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsndGltZS1saW1pdCd9KSB7Ci0JaWYgKCR0ZXN0eyd0aW1lLWxpbWl0J30gIX4gL15cZCskLyB8fCAkdGVzdHsndGltZS1saW1pdCd9ID09IDApIHsKLQkgICAgcHJpbnQgU1RERVJSCi0JICAgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCB2YWx1ZSBmb3IgdGltZS1saW1pdCBmaWVsZFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLSAgICB9IGVsc2lmIChkZWZpbmVkICRkZWZhdWx0X3RpbWVfbGltaXQpIHsKLQkkdGVzdHsndGltZS1saW1pdCd9ID0gJGRlZmF1bHRfdGltZV9saW1pdDsKLSAgICB9Ci0KLSAgICBpZiAoZGVmaW5lZCAka25vd25fdGVzdHN7JHRlc3R7J25hbWUnfX0pIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IHdhcm5pbmc6IGR1cGxpY2F0ZSB0ZXN0IG5hbWUgJHt0ZXN0eyduYW1lJ319XG4iOwotICAgIH0KLSAgICAka25vd25fdGVzdHN7JHRlc3R7J25hbWUnfX0gPSAxOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN1YgotdHR5X21zZwotewotICAgIGxvY2FsKCRtc2cpID0gQF87Ci0KLSAgICBvcGVuKFRUWSwgIj4gL2Rldi90dHkiKSB8fCByZXR1cm4gMDsKLSAgICBwcmludCBUVFkgJG1zZzsKLSAgICBjbG9zZShUVFkpOwotICAgIHJldHVybiAxOwotfQotCi1zdWIKLW5ldmVyX2NhbGxlZF9mdW5jcwotewotCXJldHVybiAwOwotCSZ0dHlfbXNnKCJoaVxuIik7Ci0JJm5ldmVyX2NhbGxlZF9mdW5jcygpOwotCSZjYXRjaF9zaWdhbHJtKCk7Ci0JJG9sZF9lbnZ7J2Zvbyd9ID0gJ2Jhcic7Ci0JJGludGVybmFsX3Rlc3RfZmllbGRzeydmb28nfSA9ICdiYXInOwotfQotCi1zdWIKLWNoZWNrX2ZpbGVfcmVzdWx0Ci17Ci0gICAgbG9jYWwoKnRlc3QpID0gQF87Ci0KLSAgICByZXR1cm4gJycgaWYgKCFkZWZpbmVkICR0ZXN0eydmaWxlLXJlc3VsdCd9KTsKLQotICAgIGxvY2FsKCR3aHkpID0gJyc7Ci0gICAgbG9jYWwoJGkpOwotICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7Ci0gICAgbG9jYWwoQHN0YnVmKTsKLQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICR0ZXN0eydmaWxlLXJlc3VsdCd9OyAkaSsrKSB7Ci0JJHZhbCA9ICR0ZXN0eyJmaWxlLXJlc3VsdDokaSJ9OwotCi0JIyBmb3JtYXQgaXM6IHR5cGUgcGVybSAibmFtZSIKLQkoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkbWF0Y2hUeXBlLCAkcmVzdCkgPQotCSAgICBzcGxpdCgnICcsICR2YWwsIDYpOwotCSRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKLQkkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDE7Ci0JJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOwotCSRyZXN0ID0gc3Vic3RyKCRyZXN0LCAyICsgJGxlbik7Ci0JJHBlcm0gPSBvY3QoJHBlcm0pIGlmICRwZXJtID1+IC9eXGQrJC87Ci0KLQlAc3RidWYgPSBsc3RhdCgkbmFtZSk7Ci0JaWYgKCFAc3RidWYpIHsKLQkgICAgJHdoeSAuPSAiXHRleHBlY3RlZCAkdHlwZSBcIiRuYW1lXCIgbm90IGNyZWF0ZWRcbiI7Ci0JICAgIG5leHQ7Ci0JfQotCWlmICgkcGVybSBuZSAnKicgJiYgKCRzdGJ1ZlsyXSAmIDA3Nzc3KSAhPSAkcGVybSkgewotCSAgICAkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBoYXMgdW5leHBlY3RlZCBwZXJtaXNzaW9uc1xuIjsKLQkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgMCVvLCBmb3VuZCAwJW9cbiIsCi0JCSAgICAkcGVybSwgJHN0YnVmWzJdICYgMDc3NzcpOwotCX0KLQlpZiAoJHVpZCBuZSAnKicgJiYgJHN0YnVmWzRdICE9ICR1aWQpIHsKLQkgICAgJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaGFzIHVuZXhwZWN0ZWQgdXNlci1pZFxuIjsKLQkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgJWQsIGZvdW5kICVkXG4iLAotCQkgICAgJHVpZCwgJHN0YnVmWzRdKTsKLQl9Ci0JaWYgKCRnaWQgbmUgJyonICYmICRzdGJ1Zls1XSAhPSAkZ2lkKSB7Ci0JICAgICR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGhhcyB1bmV4cGVjdGVkIGdyb3VwLWlkXG4iOwotCSAgICAkd2h5IC49IHNwcmludGYoIlx0XHRleHBlY3RlZCAlZCwgZm91bmQgJWRcbiIsCi0JCSAgICAkZ2lkLCAkc3RidWZbNV0pOwotCX0KLQotCWlmICgkdHlwZSBlcSAnZmlsZScpIHsKLQkgICAgaWYgKC1sIF8gfHwgISAtZiBfKSB7Ci0JCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZVxuIjsKLQkgICAgfSBlbHNlIHsKLQkJbG9jYWwgJHRtcCA9ICZjaGVja19vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkbmFtZSwKLQkJCSAgICAiJHR5cGUgY29udGVudHMgaW4gXCIkbmFtZVwiIiwKLQkJCSAgICAkbWF0Y2hUeXBlIGVxICdleGFjdCcgPyAkcmVzdCA6IHVuZGVmCi0JCQkgICAgJG1hdGNoVHlwZSBlcSAncGF0dGVybicgPyAkcmVzdCA6IHVuZGVmKTsKLQkJcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCAkdG1wKTsKLQkJJHdoeSAuPSAkdG1wOwotCSAgICB9Ci0JfSBlbHNpZiAoJHR5cGUgZXEgJ2RpcicpIHsKLQkgICAgaWYgKCRyZXN0ICF+IC9eXHMqJC8pIHsKLQkJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBmaWxlLXJlc3VsdCB0ZXN0IGZvciBkaXJlY3RvcnkgJG5hbWUgc2hvdWxkIG5vdCBoYXZlIGNvbnRlbnQgc3BlY2lmaWVkXG4iOwotCQlyZXR1cm4gdW5kZWY7Ci0JICAgIH0KLQkgICAgaWYgKC1sIF8gfHwgISAtZCBfKSB7Ci0JCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIGRpcmVjdG9yeVxuIjsKLQkgICAgfQotCX0gZWxzaWYgKCR0eXBlIGVxICdzeW1saW5rJykgewotCSAgICBpZiAoIS1sIF8pIHsKLQkJJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaXMgbm90IGEgc3ltbGlua1xuIjsKLQkgICAgfSBlbHNlIHsKLQkJbG9jYWwgJGNvbnRlbnQgPSByZWFkbGluaygkbmFtZSk7Ci0JCWlmICghZGVmaW5lZCAkY29udGVudCkgewotCQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBmaWxlLXJlc3VsdCB0ZXN0IGZvciAkdHlwZSAkbmFtZSBmYWlsZWQgLSBjb3VsZCBub3QgcmVhZGxpbmsgLSAkIVxuIjsKLQkJICAgIHJldHVybiB1bmRlZjsKLQkJfQotCQlsb2NhbCAkdG1wID0gJmNvbXBhcmVfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwKLQkJCSAgICAiJHR5cGUgY29udGVudHMgaW4gXCIkbmFtZVwiIiwKLQkJCSAgICAkbWF0Y2hUeXBlIGVxICdleGFjdCcgPyAkcmVzdCA6IHVuZGVmCi0JCQkgICAgJG1hdGNoVHlwZSBlcSAncGF0dGVybicgPyAkcmVzdCA6IHVuZGVmKTsKLQkJcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCAkdG1wKTsKLQkJJHdoeSAuPSAkdG1wOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAkd2h5OwotfQotCi1zdWIKLUhFTFBfTUVTU0FHRQotewotICAgIHByaW50IFNUREVSUiAkVXNhZ2U7Ci0gICAgZXhpdCAwOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvY2hlY2sudCBiL21rc2gvc3JjL2NoZWNrLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZThjYWYuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvY2hlY2sudAorKysgL2Rldi9udWxsCkBAIC0xLDc0NDMgKzAsMCBAQAotIyAkTWlyT1M6IHNyYy9iaW4vbWtzaC9jaGVjay50LHYgMS4zODggMjAxMC8wOC8yNCAxNTo0Nzo0NCB0ZyBFeHAgJAotIyAkT3BlbkJTRDogYmtzbC1ubC50LHYgMS4yIDIwMDEvMDEvMjggMjM6MDQ6NTYgbmlrbGFzIEV4cCAkCi0jICRPcGVuQlNEOiBoaXN0b3J5LnQsdiAxLjUgMjAwMS8wMS8yOCAyMzowNDo1NiBuaWtsYXMgRXhwICQKLSMgJE9wZW5CU0Q6IHJlYWQudCx2IDEuMyAyMDAzLzAzLzEwIDAzOjQ4OjE2IGRhdmlkIEV4cCAkCi0jLQotIyBDb3B5cmlnaHQgwqkgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0jCi0jIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKLSMgbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0jIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0jCi0jIFRoaXMgd29yayBpcyBwcm92aWRlZCDigJxBUyBJU+KAnSBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0jIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0jIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSMgb2Ygc2FpZCBwZXJzb27igJlzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotIy0KLSMgWW91IG1heSBhbHNvIHdhbnQgdG8gdGVzdCBJRlMgd2l0aCB0aGUgc2NyaXB0IGF0Ci0jIGh0dHA6Ly93d3cucmVzZWFyY2guYXR0LmNvbS9+Z3NmL3B1YmxpYy9pZnMuc2gKLQotZXhwZWN0ZWQtc3Rkb3V0OgotCUAoIylNSVJCU0QgS1NIIFIzOSAyMDEwLzA4LzI0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB2ZXJzaW9uIG9mIHNoZWxsLgotc3RkaW46Ci0JZWNobyAkS1NIX1ZFUlNJT04KLW5hbWU6IEtTSF9WRVJTSU9OCi0tLS0KLW5hbWU6IHNlbGZ0ZXN0LTEKLWRlc2NyaXB0aW9uOgotCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKLXN0ZGluOgotCWVjaG8gJHtmb286LWJhen0KLWV4cGVjdGVkLXN0ZG91dDoKLQliYXoKLS0tLQotbmFtZTogc2VsZnRlc3QtMgotZGVzY3JpcHRpb246Ci0JUmVncmVzc2lvbiB0ZXN0IHNlbGYtdGVzdGluZwotZW52LXNldHVwOiAhZm9vPWJhciEKLXN0ZGluOgotCWVjaG8gJHtmb286LWJhen0KLWV4cGVjdGVkLXN0ZG91dDoKLQliYXIKLS0tLQotbmFtZTogc2VsZnRlc3QtMwotZGVzY3JpcHRpb246Ci0JUmVncmVzc2lvbiB0ZXN0IHNlbGYtdGVzdGluZwotZW52LXNldHVwOiAhRU5WPWZub3JkIQotc3RkaW46Ci0JZWNobyAiPCRFTlY+IgotZXhwZWN0ZWQtc3Rkb3V0OgotCTxmbm9yZD4KLS0tLQotbmFtZTogc2VsZnRlc3QtZW52Ci1kZXNjcmlwdGlvbjoKLQlKdXN0IG91dHB1dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCAoYWx3YXlzIGZhaWxzKQotY2F0ZWdvcnk6IGRpc2FibGVkCi1zdGRpbjoKLQlzZXQKLS0tLQotbmFtZTogYWxpYXMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgotc3RkaW46Ci0JYWxpYXMgZm9vQmFyPWZvb0JhcgotCWZvb0JhcgotCWV4aXQgMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2Zvb0Jhci4qbm90IGZvdW5kLiovCi0tLS0KLW5hbWU6IGFsaWFzLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KLXN0ZGluOgotCWFsaWFzIGZvb0Jhcj1iYXJGb28KLQlhbGlhcyBiYXJGb289Zm9vQmFyCi0JZm9vQmFyCi0JYmFyRm9vCi0JZXhpdCAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvZm9vQmFyLipub3QgZm91bmQuKlxuLipiYXJGb28uKm5vdCBmb3VuZC8KLS0tLQotbmFtZTogYWxpYXMtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgotc3RkaW46Ci0JYWxpYXMgRWNobz0nZWNobyAnCi0JYWxpYXMgZm9vQmFyPWJhckZvbwotCWFsaWFzIGJhckZvbz1mb29CYXIKLQlFY2hvIGZvb0JhcgotCXVuYWxpYXMgYmFyRm9vCi0JRWNobyBmb29CYXIKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29CYXIKLQliYXJGb28KLS0tLQotbmFtZTogYWxpYXMtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gaXNuJ3QgZG9uZSBvbiBrZXl3b3JkcyAoaW4ga2V5d29yZAotCXBvc3RpdGlvbnMpLgotc3RkaW46Ci0JYWxpYXMgRWNobz0nZWNobyAnCi0JYWxpYXMgd2hpbGU9V2hpbGUKLQl3aGlsZSBmYWxzZTsgZG8gZWNobyBoaSA7IGRvbmUKLQlFY2hvIHdoaWxlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JV2hpbGUKLS0tLQotbmFtZTogYWxpYXMtNQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gZG9uZSBhZnRlciBhbGlhcyB3aXRoIHRyYWlsaW5nIHNwYWNlLgotc3RkaW46Ci0JYWxpYXMgRWNobz0nZWNobyAnCi0JYWxpYXMgZm9vPSdiYXIgc3R1ZmYgJwotCWFsaWFzIGJhcj0nQmFyMSBCYXIyICcKLQlhbGlhcyBzdHVmZj0nU3R1ZmYnCi0JYWxpYXMgYmxhaD0nQmxhaCcKLQlFY2hvIGZvbyBibGFoCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQmFyMSBCYXIyIFN0dWZmIEJsYWgKLS0tLQotbmFtZTogYWxpYXMtNgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gZG9uZSBhZnRlciBhbGlhcyB3aXRoIHRyYWlsaW5nIHNwYWNlLgotc3RkaW46Ci0JYWxpYXMgRWNobz0nZWNobyAnCi0JYWxpYXMgZm9vPSdiYXIgYmFyJwotCWFsaWFzIGJhcj0nQmFyICcKLQlhbGlhcyBibGFoPUJsYWgKLQlFY2hvIGZvbyBibGFoCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQmFyIEJhciBCbGFoCi0tLS0KLW5hbWU6IGFsaWFzLTcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZQotCWFmdGVyIGEga2V5d29yZC4KLXN0ZGluOgotCWFsaWFzIFg9J2Nhc2UgJwotCWFsaWFzIFk9WgotCVggWSBpbiAnWScpIGVjaG8gaXMgeSA7OyBaKSBlY2hvIGlzIHogOyBlc2FjCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaXMgegotLS0tCi1uYW1lOiBhbGlhcy04Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IG5ld2xpbmVzIGluIGFuIGFsaWFzIGRvbid0IGNhdXNlIHRoZSBjb21tYW5kIHRvIGJlIGxvc3QuCi1zdGRpbjoKLQlhbGlhcyBmb289JwotCQotCQotCWVjaG8gaGkKLQkKLQkKLQkKLQllY2hvIHRoZXJlCi0JCi0JCi0JJwotCWZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JdGhlcmUKLS0tLQotbmFtZTogYWxpYXMtOQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgotCVRoaXMgY2hlY2sgZmFpbHMgZm9yIHNsb3cgbWFjaGluZXMgb3IgQ3lnd2luLCByYWlzZQotCXRoZSB0aW1lLWxpbWl0IGNsYXVzZSAoZS5nLiB0byA3KSBpZiB0aGlzIG9jY3Vycy4KLXRpbWUtbGltaXQ6IDMKLXN0ZGluOgotCWVjaG8gLW4gPnRmCi0JYWxpYXMgbHM9bHMKLQlscwotCWVjaG8gJChscykKLQlleGl0IDAKLWV4cGVjdGVkLXN0ZG91dDoKLQl0ZgotCXRmCi0tLS0KLW5hbWU6IGFsaWFzLTEwCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCi0JUmVncmVzc2lvbiwgaW50cm9kdWNlZCBkdXJpbmcgYW4gb2xkIGJ1Z2ZpeC4KLXN0ZGluOgotCWFsaWFzIGZvbz0ncHJpbnQgaGVsbG8gJwotCWFsaWFzIGJhcj0nZm9vIHdvcmxkJwotCWVjaG8gJChiYXIpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGVsbG8gd29ybGQKLS0tLQotbmFtZTogYXJpdGgtbGF6eS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IG9ubHkgb25lIHNpZGUgb2YgdGVybmFyeSBvcGVyYXRvciBpcyBldmFsdWF0ZWQKLXN0ZGluOgotCXg9aSs9MgotCXk9ais9MgotCXR5cGVzZXQgLWkgaT0xIGo9MQotCWVjaG8gJCgoMSA/IDIwIDogKHgrPTIpKSkKLQllY2hvICRpLCR4Ci0JZWNobyAkKCgwID8gKHkrPTIpIDogMzApKQotCWVjaG8gJGosJHkKLWV4cGVjdGVkLXN0ZG91dDoKLQkyMAotCTEsaSs9MgotCTMwCi0JMSxqKz0yCi0tLS0KLW5hbWU6IGFyaXRoLWxhenktMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBub3QgZG9uZSBvbiBub24tZXZhbHVhdGVkIHNpZGUgb2YgdGVybmFyeQotCW9wZXJhdG9yCi1zdGRpbjoKLQl4PWkrPTIKLQl5PWorPTIKLQl0eXBlc2V0IC1pIGk9MSBqPTEKLQllY2hvICQoKDEgPyAyMCA6ICh4Kz0yKSkpCi0JZWNobyAkaSwkeAotCWVjaG8gJCgoMCA/ICh5Kz0yKSA6IDMwKSkKLQllY2hvICRpLCR5Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMjAKLQkxLGkrPTIKLQkzMAotCTEsais9MgotLS0tCi1uYW1lOiBhcml0aC1sYXp5LTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgbm90IGRvbmUgb24gbm9uLWV2YWx1YXRlZCBzaWRlIG9mIHRlcm5hcnkKLQlvcGVyYXRvciBhbmQgdGhpcyBjb25zdHJ1Y3QgaXMgcGFyc2VkIGNvcnJlY3RseSAoRGViaWFuICM0NDU2NTEpCi1zdGRpbjoKLQl4PTQKLQl5PSQoKDAgPyB4PTEgOiAyKSkKLQllY2hvID0gJHggJHkgPQotZXhwZWN0ZWQtc3Rkb3V0OgotCT0gNCAyID0KLS0tLQotbmFtZTogYXJpdGgtdGVybmFyeS1wcmVjLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHByZWNlZGVuY2Ugb2YgdGVybmFyeSBvcGVyYXRvciB2cyBhc3NpZ25tZW50Ci1zdGRpbjoKLQl0eXBlc2V0IC1pIHg9MgotCXk9JCgoMSA/IDIwIDogeCs9MikpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKjouKjEgXD8gMjAgOiB4XCs9Mi4qbHZhbHVlLipcbiQvCi0tLS0KLW5hbWU6IGFyaXRoLXRlcm5hcnktcHJlYy0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBwcmVjZWRlbmNlIG9mIHRlcm5hcnkgb3BlcmF0b3IgdnMgYXNzaWdubWVudAotc3RkaW46Ci0JdHlwZXNldCAtaSB4PTIKLQllY2hvICQoKDAgPyB4Kz0yIDogMjApKQotZXhwZWN0ZWQtc3Rkb3V0OgotCTIwCi0tLS0KLW5hbWU6IGFyaXRoLWRpdi1hc3NvYy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBhc3NvY2lhdGl2aXR5IG9mIGRpdmlzaW9uIG9wZXJhdG9yCi1zdGRpbjoKLQllY2hvICQoKDIwIC8gMiAvIDIpKQotZXhwZWN0ZWQtc3Rkb3V0OgotCTUKLS0tLQotbmFtZTogYXJpdGgtYXNzb3AtYXNzb2MtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgYXNzb2NpYXRpdml0eSBvZiBhc3NpZ25tZW50LW9wZXJhdG9yIG9wZXJhdG9yCi1zdGRpbjoKLQl0eXBlc2V0IC1pIGk9MSBqPTIgaz0zCi0JZWNobyAkKChpICs9IGogKz0gaykpCi0JZWNobyAkaSwkaiwkawotZXhwZWN0ZWQtc3Rkb3V0OgotCTYKLQk2LDUsMwotLS0tCi1uYW1lOiBhcml0aC11bnNpZ25lZC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB1bnNpZ25lZCBhcml0aG1ldGljcyB3b3JrCi1zdGRpbjoKLQkjIHNpZ25lZCB2cyB1bnNpZ25lZAotCWVjaG8geDEgJCgoLTEpKSAkKCgjLTEpKQotCSMgY2FsY3VsYXRpbmcKLQl0eXBlc2V0IC1pIHZzCi0JdHlwZXNldCAtVWkgdnUKLQl2cz00MTIzNDU2Nzg5OyB2dT00MTIzNDU2Nzg5Ci0JZWNobyB4MiAkdnMgJHZ1Ci0JKCggdnMgJT0gMjE0NzQ4MzY0NyApKQotCSgoIHZ1ICU9IDIxNDc0ODM2NDcgKSkKLQllY2hvIHgzICR2cyAkdnUKLQl2cz00MTIzNDU2Nzg5OyB2dT00MTIzNDU2Nzg5Ci0JKCggIyB2cyAlPSAyMTQ3NDgzNjQ3ICkpCi0JKCggIyB2dSAlPSAyMTQ3NDgzNjQ3ICkpCi0JZWNobyB4NCAkdnMgJHZ1Ci0JIyBtYWtlIHN1cmUgdGhlIGNhbGN1bGF0aW9uIGRvZXMgbm90IGNoYW5nZSB1bnNpZ25lZCBmbGFnCi0JdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQotCWVjaG8geDUgJHZzICR2dQotCSMgc2hvcnQgZm9ybQotCWVjaG8geDYgJCgoIyB2cyAlIDIxNDc0ODM2NDcpKSAkKCgjIHZ1ICUgMjE0NzQ4MzY0NykpCi0JIyBhcnJheSByZWZzCi0Jc2V0IC1BIHZhCi0JdmFbMTk3NTk3MzE0Ml09cmlnaHQKLQl2YVs0MTIzNDU2Nzg5XT13cm9uZwotCWVjaG8geDcgJHt2YVsjNDEyMzQ1Njc4OSUyMTQ3NDgzNjQ3XX0KLWV4cGVjdGVkLXN0ZG91dDoKLQl4MSAtMSA0Mjk0OTY3Mjk1Ci0JeDIgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5Ci0JeDMgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5Ci0JeDQgMTk3NTk3MzE0MiAxOTc1OTczMTQyCi0JeDUgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5Ci0JeDYgMTk3NTk3MzE0MiAxOTc1OTczMTQyCi0JeDcgcmlnaHQKLS0tLQotbmFtZTogYXJpdGgtbGltaXQzMi0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBhcml0aG1ldGljcyBhcmUgMzIgYml0Ci1zdGRpbjoKLQkjIHNpZ25lZCB2cyB1bnNpZ25lZAotCWVjaG8geDEgJCgoLTEpKSAkKCgjLTEpKQotCSMgY2FsY3VsYXRpbmcKLQl0eXBlc2V0IC1pIHZzCi0JdHlwZXNldCAtVWkgdnUKLQl2cz0yMTQ3NDgzNjQ3OyB2dT0yMTQ3NDgzNjQ3Ci0JZWNobyB4MiAkdnMgJHZ1Ci0JbGV0IHZzKysgdnUrKwotCWVjaG8geDMgJHZzICR2dQotCXZzPTQyOTQ5NjcyOTU7IHZ1PTQyOTQ5NjcyOTUKLQllY2hvIHg0ICR2cyAkdnUKLQlsZXQgdnMrKyB2dSsrCi0JZWNobyB4NSAkdnMgJHZ1Ci0JbGV0IHZzKysgdnUrKwotCWVjaG8geDYgJHZzICR2dQotZXhwZWN0ZWQtc3Rkb3V0OgotCXgxIC0xIDQyOTQ5NjcyOTUKLQl4MiAyMTQ3NDgzNjQ3IDIxNDc0ODM2NDcKLQl4MyAtMjE0NzQ4MzY0OCAyMTQ3NDgzNjQ4Ci0JeDQgLTEgNDI5NDk2NzI5NQotCXg1IDAgMAotCXg2IDEgMQotLS0tCi1uYW1lOiBia3NsLW5sLWlnbi0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgYWZ0ZXIgIwotc3RkaW46Ci0JZWNobyBoaSAjdGhlcmUgXAotCWVjaG8gZm9sa3MKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWZvbGtzCi0tLS0KLW5hbWU6IGJrc2wtbmwtaWduLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgbm90IGNvbGxhc3BlZCBpbnNpZGUgc2luZ2xlIHF1b3Rlcwotc3RkaW46Ci0JZWNobyAnaGkgXAotCXRoZXJlJwotCWVjaG8gZm9sa3MKLWV4cGVjdGVkLXN0ZG91dDoKLQloaSBcCi0JdGhlcmUKLQlmb2xrcwotLS0tCi1uYW1lOiBia3NsLW5sLWlnbi0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgaW5zaWRlIHNpbmdsZSBxdW90ZXMKLXN0ZGluOgotCWNhdCA8PCBcRU9GCi0JaGkgXAotCXRoZXJlCi0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkgXAotCXRoZXJlCi0tLS0KLW5hbWU6IGJrc2wtbmwtaWduLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGludGVyYWN0aW9uIG9mIGFsaWFzZXMsIHNpbmdsZSBxdW90ZXMgYW5kIGhlcmUtZG9jdW1lbnRzCi0Jd2l0aCBiYWNrc2xhc2gtbmV3bGluZQotCShkb24ndCBrbm93IHdoYXQgUE9TSVggaGFzIHRvIHNheSBhYm91dCB0aGlzKQotc3RkaW46Ci0JYT0yCi0JYWxpYXMgeD0nZWNobyBoaQotCWNhdCA8PCAiRU9GIgotCWZvb1wKLQliYXIKLQlzb21lJwotCXgKLQltb3JlXAotCXN0dWZmJGEKLQlFT0YKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWZvb1wKLQliYXIKLQlzb21lCi0JbW9yZVwKLQlzdHVmZiRhCi0tLS0KLW5hbWU6IGJrc2wtbmwtaWduLTUKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHdoYXQgaGFwcGVucyB3aXRoIGJhY2tzbGFzaCBhdCBlbmQgb2YgaW5wdXQKLQkodGhlIG9sZCBCb3VybmUgc2hlbGwgdHJhc2hlcyB0aGVtOyBzbyBkbyB3ZSkKLXN0ZGluOiAhCi0JZWNobyBgZWNobyBmb29cXGBiYXIKLQllY2hvIGhpXAotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvb2JhcgotCWhpCi0tLS0KLSMKLSMgUGxhY2VzIFxuZXdsaW5lIHNob3VsZCBiZSBjb2xsYXBzZWQKLSMKLW5hbWU6IGJrc2wtbmwtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgYmVmb3JlLCBpbiB0aGUgbWlkZGxlIG9mLCBhbmQKLQlhZnRlciB3b3Jkcwotc3RkaW46Ci0JIAkgCVwKLQkJCSBlY2hvIGhpXAotCVRoZXJlLCBcCi0JZm9sa3MKLWV4cGVjdGVkLXN0ZG91dDoKLQloaVRoZXJlLCBmb2xrcwotLS0tCi1uYW1lOiBia3NsLW5sLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQgc2VxdWVuY2VzCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQlhPTEyCi0JYWI9MTkKLQllY2hvICRcCi0JYQotCWVjaG8gJGFcCi0JYgotCWVjaG8gJFwKLQl7YX0KLQllY2hvICR7YVwKLQlifQotCWVjaG8gJHthYlwKLQl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMTIKLQkxOQotCTEyCi0JMTkKLQkxOQotLS0tCi1uYW1lOiBia3NsLW5sLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQoLi4pIGFuZCBgLi4uYCBzZXF1ZW5jZXMKLQkoa3NoOTMgZmFpbHMgdGhpcykKLXN0ZGluOgotCWVjaG8gJFwKLQkoZWNobyBmb29iYXIxKQotCWVjaG8gJChcCi0JZWNobyBmb29iYXIyKQotCWVjaG8gJChlY2hvIGZvb1wKLQliYXIzKQotCWVjaG8gJChlY2hvIGZvb2JhcjRcCi0JKQotCWVjaG8gYAotCWVjaG8gc3R1ZmYxYAotCWVjaG8gYGVjaG8gc3RcCi0JdWZmMmAKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29iYXIxCi0JZm9vYmFyMgotCWZvb2JhcjMKLQlmb29iYXI0Ci0Jc3R1ZmYxCi0Jc3R1ZmYyCi0tLS0KLW5hbWU6IGJrc2wtbmwtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gJCgoLi4pKSBzZXF1ZW5jZXMKLQkoa3NoOTMgZmFpbHMgdGhpcykKLXN0ZGluOgotCWVjaG8gJFwKLQkoKDErMikpCi0JZWNobyAkKFwKLQkoMSsyKzMpKQotCWVjaG8gJCgoXAotCTErMiszKzQpKQotCWVjaG8gJCgoMStcCi0JMiszKzQrNSkpCi0JZWNobyAkKCgxKzIrMys0KzUrNilcCi0JKQotZXhwZWN0ZWQtc3Rkb3V0OgotCTMKLQk2Ci0JMTAKLQkxNQotCTIxCi0tLS0KLW5hbWU6IGJrc2wtbmwtNQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gZG91YmxlIHF1b3RlZCBzdHJpbmdzCi1zdGRpbjoKLQllY2hvICJcCi0JaGkiCi0JZWNobyAiZm9vXAotCWJhciIKLQllY2hvICJmb2xrc1wKLQkiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQlmb29iYXIKLQlmb2xrcwotLS0tCi1uYW1lOiBia3NsLW5sLTYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGhlcmUgZG9jdW1lbnQgZGVsaW1pdGVycwotCShrc2g5MyBmYWlscyBzZWNvbmQgcGFydCBvZiB0aGlzKQotc3RkaW46Ci0JYT0xMgotCWNhdCA8PCBFT1wKLQlGCi0JYT0kYQotCWZvb1wKLQliYXIKLQlFT0YKLQljYXQgPDwgRV9PX0YKLQlmb28KLQlFX09fXAotCUYKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlhPTEyCi0JZm9vYmFyCi0JZm9vCi0JZG9uZQotLS0tCi1uYW1lOiBia3NsLW5sLTcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGRvdWJsZS1xdW90ZWQgaGVyZS1kb2N1bWVudAotCWRlbGltaXRlci4KLXN0ZGluOgotCWE9MTIKLQljYXQgPDwgIkVPXAotCUYiCi0JYT0kYQotCWZvb1wKLQliYXIKLQlFT0YKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlhPSRhCi0JZm9vXAotCWJhcgotCWRvbmUKLS0tLQotbmFtZTogYmtzbC1ubC04Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiB2YXJpb3VzIDIrIGNoYXJhY3RlciB0b2tlbnMKLQlkZWxpbWl0ZXIuCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQllY2hvIGhpICZcCi0JJiBlY2hvIHRoZXJlCi0JZWNobyBmb28gfFwKLQl8IGVjaG8gYmFyCi0JY2F0IDxcCi0JPCBFT0YKLQlzdHVmZgotCUVPRgotCWNhdCA8XAotCTxcCi0JLSBFT0YKLQkJbW9yZSBzdHVmZgotCUVPRgotCWNhdCA8PFwKLQlFT0YKLQlhYmNkZWYKLQlFT0YKLQllY2hvIGhpID5cCi0JPiAvZGV2L251bGwKLQllY2hvICQ/Ci0JaT0xCi0JY2FzZSAkaSBpbgotCShcCi0JeHxcCi0JMVwKLQkpIGVjaG8gaGk7XAotCTsKLQkoKikgZWNobyBvb3BzCi0JZXNhYwotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JdGhlcmUKLQlmb28KLQlzdHVmZgotCW1vcmUgc3R1ZmYKLQlhYmNkZWYKLQkwCi0JaGkKLS0tLQotbmFtZTogYmtzbC1ubC05Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFwgYXQgdGhlIGVuZCBvZiBhbiBhbGlhcyBpcyBjb2xsYXBzZWQgd2hlbiBmb2xsb3dlZAotCWJ5IGEgbmV3bGluZQotCShkb24ndCBrbm93IHdoYXQgUE9TSVggaGFzIHRvIHNheSBhYm91dCB0aGlzKQotc3RkaW46Ci0JYWxpYXMgeD0nZWNobyBoaVwnCi0JeAotCWVjaG8gdGhlcmUKLWV4cGVjdGVkLXN0ZG91dDoKLQloaWVjaG8gdGhlcmUKLS0tLQotbmFtZTogYmtzbC1ubC0xMAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpbiBhIGtleXdvcmQgaXMgY29sbGFwc2VkCi1zdGRpbjoKLQlpXAotCWYgdHJ1ZTsgdGhlblwKLQkgZWNobyBwYXNzOyBlbFwKLQlzZSBlY2hvIGZhaWw7IGZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JcGFzcwotLS0tCi0jCi0jIFBsYWNlcyBcbmV3bGluZSBzaG91bGQgYmUgY29sbGFwc2VkIChrc2ggZXh0ZW5zaW9ucykKLSMKLW5hbWU6IGJrc2wtbmwta3NoLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFwc2VkIGluIGV4dGVuZGVkIGdsb2JiaW5nCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQl4eHg9Zm9vCi0JY2FzZSAkeHh4IGluCi0JKGYqXAotCShcCi0Jb1wKLQkpXAotCSkgZWNobyBvayA7OwotCSopIGVjaG8gYmFkCi0JZXNhYwotZXhwZWN0ZWQtc3Rkb3V0OgotCW9rCi0tLS0KLW5hbWU6IGJrc2wtbmwta3NoLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFwc2VkIGluICgoLi4uKSkgZXhwcmVzc2lvbnMKLQkoa3NoOTMgZmFpbHMgdGhpcykKLXN0ZGluOgotCWk9MQotCShcCi0JKFwKLQlpPWkrMlwKLQkpXAotCSkKLQllY2hvICRpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMwotLS0tCi1uYW1lOiBicmVhay0xCi1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgYnJlYWsgYnJlYWtzIG91dCBvZiBsb29wcwotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrOyBlY2hvIGJhZC0kaTsgZG9uZQotCWVjaG8gZW5kLTEKLQlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgMTsgZWNobyBiYWQtJGk7IGRvbmUKLQllY2hvIGVuZC0yCi0JZm9yIGkgaW4gYSBiIGM7IGRvCi0JICAgIGZvciBqIGluIHggeSB6OyBkbwotCQllY2hvICRpOiRqCi0JCWJyZWFrCi0JCWVjaG8gYmFkLSRpCi0JICAgIGRvbmUKLQkgICAgZWNobyBlbmQtJGkKLQlkb25lCi0JZWNobyBlbmQtMwotZXhwZWN0ZWQtc3Rkb3V0OgotCWEKLQllbmQtMQotCWEKLQllbmQtMgotCWE6eAotCWVuZC1hCi0JYjp4Ci0JZW5kLWIKLQljOngKLQllbmQtYwotCWVuZC0zCi0tLS0KLW5hbWU6IGJyZWFrLTIKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiBicmVhayBicmVha3Mgb3V0IG9mIG5lc3RlZCBsb29wcwotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvCi0JICAgIGZvciBqIGluIHggeSB6OyBkbwotCQllY2hvICRpOiRqCi0JCWJyZWFrIDIKLQkJZWNobyBiYWQtJGkKLQkgICAgZG9uZQotCSAgICBlY2hvIGVuZC0kaQotCWRvbmUKLQllY2hvIGVuZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWE6eAotCWVuZAotLS0tCi1uYW1lOiBicmVhay0zCi1kZXNjcmlwdGlvbjoKLQlXaGF0IGlmIGJyZWFrIHVzZWQgb3V0c2lkZSBvZiBhbnkgbG9vcHMKLQkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKLXN0ZGluOgotCWJyZWFrCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipicmVhay4qLwotLS0tCi1uYW1lOiBicmVhay00Ci1kZXNjcmlwdGlvbjoKLQlXaGF0IGlmIGJyZWFrIE4gdXNlZCB3aGVuIG9ubHkgTi0xIGxvb3BzCi0JKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCi1zdGRpbjoKLQlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgMjsgZWNobyBiYWQtJGk7IGRvbmUKLQllY2hvIGVuZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEKLQllbmQKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKmJyZWFrLiovCi0tLS0KLW5hbWU6IGJyZWFrLTUKLWRlc2NyaXB0aW9uOgotCUVycm9yIGlmIGJyZWFrIGFyZ3VtZW50IGlzbid0IGEgbnVtYmVyCi1zdGRpbjoKLQlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgYWJjOyBlY2hvIG1vcmUtJGk7IGRvbmUKLQllY2hvIGVuZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLy4qYnJlYWsuKi8KLS0tLQotbmFtZTogY29udGludWUtMQotZGVzY3JpcHRpb246Ci0JU2VlIGlmIGNvbnRpbnVlIGNvbnRpbnVlcyBsb29wcwotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlOyBlY2hvIGJhZC0kaSA7IGRvbmUKLQllY2hvIGVuZC0xCi0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlIDE7IGVjaG8gYmFkLSRpOyBkb25lCi0JZWNobyBlbmQtMgotCWZvciBpIGluIGEgYiBjOyBkbwotCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KLQkJZWNobyAkaTokagotCQljb250aW51ZQotCQllY2hvIGJhZC0kaS0kagotCSAgICBkb25lCi0JICAgIGVjaG8gZW5kLSRpCi0JZG9uZQotCWVjaG8gZW5kLTMKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi0JYgotCWMKLQllbmQtMQotCWEKLQliCi0JYwotCWVuZC0yCi0JYTp4Ci0JYTp5Ci0JYTp6Ci0JZW5kLWEKLQliOngKLQliOnkKLQliOnoKLQllbmQtYgotCWM6eAotCWM6eQotCWM6egotCWVuZC1jCi0JZW5kLTMKLS0tLQotbmFtZTogY29udGludWUtMgotZGVzY3JpcHRpb246Ci0JU2VlIGlmIGNvbnRpbnVlIGJyZWFrcyBvdXQgb2YgbmVzdGVkIGxvb3BzCi1zdGRpbjoKLQlmb3IgaSBpbiBhIGIgYzsgZG8KLQkgICAgZm9yIGogaW4geCB5IHo7IGRvCi0JCWVjaG8gJGk6JGoKLQkJY29udGludWUgMgotCQllY2hvIGJhZC0kaS0kagotCSAgICBkb25lCi0JICAgIGVjaG8gZW5kLSRpCi0JZG9uZQotCWVjaG8gZW5kCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYTp4Ci0JYjp4Ci0JYzp4Ci0JZW5kCi0tLS0KLW5hbWU6IGNvbnRpbnVlLTMKLWRlc2NyaXB0aW9uOgotCVdoYXQgaWYgY29udGludWUgdXNlZCBvdXRzaWRlIG9mIGFueSBsb29wcwotCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQotc3RkaW46Ci0JY29udGludWUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKmNvbnRpbnVlLiovCi0tLS0KLW5hbWU6IGNvbnRpbnVlLTQKLWRlc2NyaXB0aW9uOgotCVdoYXQgaWYgY29udGludWUgTiB1c2VkIHdoZW4gb25seSBOLTEgbG9vcHMKLQkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKLXN0ZGluOgotCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSAyOyBlY2hvIGJhZC0kaTsgZG9uZQotCWVjaG8gZW5kCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYQotCWIKLQljCi0JZW5kCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipjb250aW51ZS4qLwotLS0tCi1uYW1lOiBjb250aW51ZS01Ci1kZXNjcmlwdGlvbjoKLQlFcnJvciBpZiBjb250aW51ZSBhcmd1bWVudCBpc24ndCBhIG51bWJlcgotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlIGFiYzsgZWNobyBtb3JlLSRpOyBkb25lCi0JZWNobyBlbmQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKmNvbnRpbnVlLiovCi0tLS0KLW5hbWU6IGNkLWhpc3RvcnkKLWRlc2NyaXB0aW9uOgotCVRlc3Qgc29tZW9uZSdzIENEIGhpc3RvcnkgcGFja2FnZSAodXNlcyBhcnJheXMpCi1zdGRpbjoKLQkjIGdvIHRvIGtub3duIHBsYWNlIGJlZm9yZSBkb2luZyBhbnl0aGluZwotCWNkIC8KLQkKLQlhbGlhcyBjZD1fY2QKLQlmdW5jdGlvbiBfY2QKLQl7Ci0JCXR5cGVzZXQgLWkgY2RsZW4gaQotCQl0eXBlc2V0IHQKLQkKLQkJaWYgWyAkIyAtZXEgMCBdCi0JCXRoZW4KLQkJCXNldCAtLSAkSE9NRQotCQlmaQotCQotCQlpZiBbICIkQ0RISVNURklMRSIgLWEgLXIgIiRDREhJU1RGSUxFIiBdICMgaWYgZGlyZWN0b3J5IGhpc3RvcnkgZXhpc3RzCi0JCXRoZW4KLQkJCXR5cGVzZXQgQ0RISVNUCi0JCQlpPS0xCi0JCQl3aGlsZSByZWFkIC1yIHQJCQkjIHJlYWQgZGlyZWN0b3J5IGhpc3RvcnkgZmlsZQotCQkJZG8KLQkJCQlDREhJU1RbaT1pKzFdPSR0Ci0JCQlkb25lIDwkQ0RISVNURklMRQotCQlmaQotCQotCQlpZiBbICIke0NESElTVFswXX0iICE9ICIkUFdEIiAtYSAiJFBXRCIgIT0gIiIgXQotCQl0aGVuCi0JCQlfY2RpbnMJCQkJIyBpbnNlcnQgJFBXRCBpbnRvIGNkIGhpc3RvcnkKLQkJZmkKLQkKLQkJY2RsZW49JHsjQ0RISVNUWypdfQkJCSMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhpc3RvcnkKLQkKLQkJY2FzZSAiJEAiIGluCi0JCS0pCQkJCQkjIGNkIHRvIG5ldyBkaXIKLQkJCWlmIFsgIiRPTERQV0QiID0gIiIgXSAmJiAoKGNkbGVuPjEpKQotCQkJdGhlbgotCQkJCSdwcmludCcgJHtDREhJU1RbMV19Ci0JCQkJJ2NkJyAke0NESElTVFsxXX0KLQkJCQlfcHdkCi0JCQllbHNlCi0JCQkJJ2NkJyAkQAotCQkJCV9wd2QKLQkJCWZpCi0JCQk7OwotCQktbCkJCQkJCSMgcHJpbnQgZGlyZWN0b3J5IGxpc3QKLQkJCXR5cGVzZXQgLVIzIG51bQotCQkJKChpPWNkbGVuKSkKLQkJCXdoaWxlICgoKGk9aS0xKT49MCkpCi0JCQlkbwotCQkJCW51bT0kaQotCQkJCSdwcmludCcgIiRudW0gJHtDREhJU1RbaV19IgotCQkJZG9uZQotCQkJcmV0dXJuCi0JCQk7OwotCQktWzAtOV18LVswLTldWzAtOV0pCQkJIyBjZCB0byBkaXIgaW4gbGlzdAotCQkJaWYgKCgoaT0kezEjLX0pPGNkbGVuKSkKLQkJCXRoZW4KLQkJCQkncHJpbnQnICR7Q0RISVNUW2ldfQotCQkJCSdjZCcgJHtDREhJU1RbaV19Ci0JCQkJX3B3ZAotCQkJZWxzZQotCQkJCSdjZCcgJEAKLQkJCQlfcHdkCi0JCQlmaQotCQkJOzsKLQkJLSopCQkJCQkjIGNkIHRvIG1hdGNoZWQgZGlyIGluIGxpc3QKLQkJCXQ9JHsxIy19Ci0JCQlpPTEKLQkJCXdoaWxlICgoaTxjZGxlbikpCi0JCQlkbwotCQkJCWNhc2UgJHtDREhJU1RbaV19IGluCi0JCQkJKiR0KikKLQkJCQkJJ3ByaW50JyAke0NESElTVFtpXX0KLQkJCQkJJ2NkJyAke0NESElTVFtpXX0KLQkJCQkJX3B3ZAotCQkJCQlicmVhawotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQkoKGk9aSsxKSkKLQkJCWRvbmUKLQkJCWlmICgoaT49Y2RsZW4pKQotCQkJdGhlbgotCQkJCSdjZCcgJEAKLQkJCQlfcHdkCi0JCQlmaQotCQkJOzsKLQkJKikJCQkJCSMgY2QgdG8gbmV3IGRpcgotCQkJJ2NkJyAkQAotCQkJX3B3ZAotCQkJOzsKLQkJZXNhYwotCQotCQlfY2RpbnMJCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5Ci0JCi0JCWlmIFsgIiRDREhJU1RGSUxFIiBdCi0JCXRoZW4KLQkJCWNkbGVuPSR7I0NESElTVFsqXX0JCSMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhpc3RvcnkKLQkKLQkJCWk9MAotCQkJd2hpbGUgKChpPGNkbGVuKSkKLQkJCWRvCi0JCQkJJ3ByaW50JyAtciAke0NESElTVFtpXX0JIyB1cGRhdGUgZGlyZWN0b3J5IGhpc3RvcnkKLQkJCQkoKGk9aSsxKSkKLQkJCWRvbmUgPiRDREhJU1RGSUxFCi0JCWZpCi0JfQotCQotCWZ1bmN0aW9uIF9jZGlucwkJCQkJIyBpbnNlcnQgJFBXRCBpbnRvIGNkIGhpc3RvcnkKLQl7CQkJCQkJIyBtZWFudCB0byBiZSBjYWxsZWQgb25seSBieSBfY2QKLQkJdHlwZXNldCAtaSBpCi0JCi0JCSgoaT0wKSkKLQkJd2hpbGUgKChpPCR7I0NESElTVFsqXX0pKQkJIyBzZWUgaWYgZGlyIGlzIGFscmVhZHkgaW4gbGlzdAotCQlkbwotCQkJaWYgWyAiJHtDREhJU1RbJGldfSIgPSAiJFBXRCIgXQotCQkJdGhlbgotCQkJCWJyZWFrCi0JCQlmaQotCQkJKChpPWkrMSkpCi0JCWRvbmUKLQkKLQkJaWYgKChpPjIyKSkJCQkJIyBsaW1pdCBtYXggc2l6ZSBvZiBsaXN0Ci0JCXRoZW4KLQkJCWk9MjIKLQkJZmkKLQkKLQkJd2hpbGUgKCgoaT1pLTEpPj0wKSkJCQkjIGJ1bXAgb2xkIGRpcnMgaW4gbGlzdAotCQlkbwotCQkJQ0RISVNUW2krMV09JHtDREhJU1RbaV19Ci0JCWRvbmUKLQkKLQkJQ0RISVNUWzBdPSRQV0QJCQkJIyBpbnNlcnQgbmV3IGRpcmVjdG9yeSBpbiBsaXN0Ci0JfQotCQotCQotCWZ1bmN0aW9uIF9wd2QKLQl7Ci0JCWlmIFsgLW4gIiRFQ0QiIF0KLQkJdGhlbgotCQkJcHdkIDE+JjYKLQkJZmkKLQl9Ci0JIyBTdGFydCBvZiB0ZXN0Ci0JY2QgL3RtcAotCWNkIC9iaW4KLQljZCAvZXRjCi0JY2QgLQotCWNkIC0yCi0JY2QgLWwKLWV4cGVjdGVkLXN0ZG91dDoKLQkvYmluCi0JL3RtcAotCSAgMyAvCi0JICAyIC9ldGMKLQkgIDEgL2JpbgotCSAgMCAvdG1wCi0tLS0KLW5hbWU6IGVudi1wcm9tcHQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcHJvbXB0IG5vdCBwcmludGVkIHdoZW4gcHJvY2Vzc2luZyBFTlYKLWVudi1zZXR1cDogIUVOVj0uL2ZvbyEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJmb28iCi0JWFhYPV8KLQlQUzE9WAotCWZhbHNlICYmIGVjaG8gaG1tbQotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQllY2hvIGhpJHtYWFh9dGhlcmUKLWV4cGVjdGVkLXN0ZG91dDoKLQloaV90aGVyZQotZXhwZWN0ZWQtc3RkZXJyOiAhCi0JWFgKLS0tLQotbmFtZTogZXhwYW5kLXVnbHkKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgd2VpcmQgJHtmb28rYmFyfSBjb25zdHJ1Y3RzIGFyZSBwYXJzZWQgY29ycmVjdGx5Ci1zdGRpbjoKLQkoZWNobyAxICR7SUZTKyd9J3p9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEKLQkoZWNobyAyICIke0lGUysnfSd6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMgotCShlY2hvIDMgImZvbyAke0lGUysnYmFyfSBiYXoiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDMKLQkoZWNobyAtbiAnNCAnOyBwcmludGYgJyVzXG4nICJmb28gJHtJRlMrImIgICBjIn0gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA0Ci0JKGVjaG8gLW4gJzUgJzsgcHJpbnRmICclc1xuJyAiZm9vICR7SUZTK2IgICBjfSBiYXoiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDUKLQkoZWNobyA2ICR7SUZTKyJ9Inp9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDYKLQkoZWNobyA3ICIke0lGUysifSJ6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNwotCShlY2hvIDggIiR7SUZTK1wifVwien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDgKLQkoZWNobyA5ICIke0lGUytcIlx9XCJ6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gOQotCShlY2hvIDEwIGZvbyAke0lGUysnYmFyfSBiYXonfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMAotCShlY2hvIDExICIkKGVjaG8gIiR7SUZTKyd9J3p9IikiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDExCi0JKGVjaG8gMTIgIiQoZWNobyAke0lGUysnfSd6fSkiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEyCi0JKGVjaG8gMTMgJHtJRlMrXH16fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMwotCShlY2hvIDE0ICIke0lGUytcfXp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNAotCXU9eDsgKGVjaG8gLW4gJzE1ICc7IHByaW50ZiAnPCVzPiAnICJmb28gJHtJRlMrYSJiJHV7IHsie3tcfWJ9IGMgJHtJRlMrZHt9fSBiYXIiICR7SUZTLWV7fX0gYmF6OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTUKLQlsPXQ7IChlY2hvIDE2ICR7SUZTK2hgZWNobyAtbiBpICR7SUZTKyRsfWhgZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNgotCWw9dDsgKGVjaG8gMTcgJHtJRlMraCQoZWNobyAtbiBpICR7SUZTKyRsfWgpZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNwotCWw9dDsgKGVjaG8gMTggIiR7SUZTK2hgZWNobyAtbiBpICR7SUZTKyRsfWhgZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTgKLQlsPXQ7IChlY2hvIDE5ICIke0lGUytoJChlY2hvIC1uIGkgJHtJRlMrJGx9aCllcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxOQotCWw9dDsgKGVjaG8gMjAgJHtJRlMraGBlY2hvIC1uIGkgIiR7SUZTKyRsfSJoYGVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjAKLQlsPXQ7IChlY2hvIDIxICR7SUZTK2gkKGVjaG8gLW4gaSAiJHtJRlMrJGx9ImgpZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMQotCWw9dDsgKGVjaG8gMjIgIiR7SUZTK2hgZWNobyAtbiBpICIke0lGUyskbH0iaGBlcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMgotCWw9dDsgKGVjaG8gMjMgIiR7SUZTK2gkKGVjaG8gLW4gaSAiJHtJRlMrJGx9ImgpZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjMKLQlrZXk9dmFsdWU7IChlY2hvIC1uICcyNCAnOyBwcmludGYgJyVzXG4nICIke0lGUysnJGtleSd9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNAotCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI1ICc7IHByaW50ZiAnJXNcbicgIiR7SUZTKyInJGtleScifSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjUJIyBrc2g5Mzog4oCcJyRrZXkn4oCdCi0Ja2V5PXZhbHVlOyAoZWNobyAtbiAnMjYgJzsgcHJpbnRmICclc1xuJyAke0lGUysnJGtleSd9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI2Ci0Ja2V5PXZhbHVlOyAoZWNobyAtbiAnMjcgJzsgcHJpbnRmICclc1xuJyAke0lGUysiJyRrZXknIn0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjcKLQkoZWNobyAtbiAnMjggJzsgcHJpbnRmICclc1xuJyAiJHtJRlMrIicieCB+IHgnfSd4Iid9Inh9IiAjJykgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyOAotCXU9eDsgKGVjaG8gLW4gJzI5ICc7IHByaW50ZiAnPCVzPiAnIGZvbyAke0lGUythImIkdXsgeyJ7IHtcfWJ9IGMgJHtJRlMrZHt9fSBiYXIgJHtJRlMtZXt9fSBiYXo7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyOQotCShlY2hvIC1uICczMCAnOyBwcmludGYgJzwlcz4gJyAke0lGUytmb28gJ2JcCi0JYXInIGJhen07IGVjaG8gLikgMj4mLSB8fCAoZWNobyBmYWlsZWQgaW4gMzA7IGVjaG8gZmFpbGVkIGluIDMxKQotCShlY2hvIC1uICczMiAnOyBwcmludGYgJzwlcz4gJyAke0lGUytmb28gImJcCi0JYXIiIGJhen07IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzMgotCShlY2hvIC1uICczMyAnOyBwcmludGYgJzwlcz4gJyAiJHtJRlMrZm9vICdiXAotCWFyJyBiYXp9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDMzCi0JKGVjaG8gLW4gJzM0ICc7IHByaW50ZiAnPCVzPiAnICIke0lGUytmb28gImJcCi0JYXIiIGJhen0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzQKLQkoZWNobyAtbiAnMzUgJzsgcHJpbnRmICc8JXM+ICcgJHt2PWFcIGJ9IHggJHt2PWNcIGR9OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzUKLQkoZWNobyAtbiAnMzYgJzsgcHJpbnRmICc8JXM+ICcgIiR7dj1hXCBifSIgeCAiJHt2PWNcIGR9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM2Ci0JKGVjaG8gLW4gJzM3ICc7IHByaW50ZiAnPCVzPiAnICR7di1hXCBifSB4ICR7di1jXCBkfTsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM3Ci0JKGVjaG8gMzggJHtJRlMreCdhJ3l9IC8gIiR7SUZTK3gnYSd5fSIgLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzOAotCWZvbz0ieCdhJ3kiOyAoZWNobyAzOSAke2ZvbyUqJ2EnKn0gLyAiJHtmb28lKidhJyp9IiAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM5Ci0JZm9vPSJhIGIgYyI7IChlY2hvIC1uICc0MCAnOyBwcmludGYgJzwlcz4gJyAiJHtmb28jYX0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNDAKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIH16Ci0JMiAnJ3p9Ci0JMyBmb28gJ2JhciBiYXoKLQk0IGZvbyBiICAgYyBiYXoKLQk1IGZvbyBiICAgYyBiYXoKLQk2IH16Ci0JNyB9egotCTggIiJ6fQotCTkgIn0iegotCTEwIGZvbyBiYXJ9IGJhegotCTExICcnen0KLQkxMiB9egotCTEzIH16Ci0JMTQgfXoKLQkxNSA8Zm9vIGFieHsge3t7fWIgYyBke30gYmFyPiA8fT4gPGJhej4gLgotCTE2IGhpIHRoZXJlCi0JMTcgaGkgdGhlcmUKLQkxOCBoaSB0aGVyZQotCTE5IGhpIHRoZXJlCi0JMjAgaGkgdGhlcmUKLQkyMSBoaSB0aGVyZQotCTIyIGhpIHRoZXJlCi0JMjMgaGkgdGhlcmUKLQkyNCAndmFsdWUnCi0JMjUgJ3ZhbHVlJwotCTI2ICRrZXkKLQkyNyAndmFsdWUnCi0JMjggJ3ggfiB4Jyd4fSJ4fSIgIwotCTI5IDxmb28+IDxhYnh7IHt7PiA8e31iPiA8Yz4gPGR7fT4gPGJhcj4gPH0+IDxiYXo+IC4KLQkzMCA8Zm9vPiA8YlwKLQlhcj4gPGJhej4gLgotCTMyIDxmb28+IDxiYXI+IDxiYXo+IC4KLQkzMyA8Zm9vICdiYXInIGJhej4gLgotCTM0IDxmb28gYmFyIGJhej4gLgotCTM1IDxhPiA8Yj4gPHg+IDxhPiA8Yj4gLgotCTM2IDxhXCBiPiA8eD4gPGFcIGI+IC4KLQkzNyA8YSBiPiA8eD4gPGMgZD4gLgotCTM4IHhheSAvIHgnYSd5IC4KLQkzOSB4JyAvIHgnIC4KLQk0MCA8IGIgYz4gLgotLS0tCi1uYW1lOiBleHBhbmQtdW5nbG9iLWRibHEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcmVndWxhciAiJHtmb28rYmFyfSIgY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQotc3RkaW46Ci0JdT14Ci0JdGxfbm9ybSgpIHsKLQkJdj0kMgotCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2Ci0JCShlY2hvICIkMSBwbHVzIG5vcm0gZm9vICR7disnYmFyJ30gYmF6IikKLQkJKGVjaG8gIiQxIGRhc2ggbm9ybSBmb28gJHt2LSdiYXInfSBiYXoiKQotCQkoZWNobyAiJDEgZXFhbCBub3JtIGZvbyAke3Y9J2Jhcid9IGJheiIpCi0JCShlY2hvICIkMSBxc3RuIG5vcm0gZm9vICR7dj8nYmFyJ30gYmF6IikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBxc3RuIG5vcm0gLT4gZXJyb3IiCi0JCShlY2hvICIkMSBQTFVTIG5vcm0gZm9vICR7djorJ2Jhcid9IGJheiIpCi0JCShlY2hvICIkMSBEQVNIIG5vcm0gZm9vICR7djotJ2Jhcid9IGJheiIpCi0JCShlY2hvICIkMSBFUUFMIG5vcm0gZm9vICR7djo9J2Jhcid9IGJheiIpCi0JCShlY2hvICIkMSBRU1ROIG5vcm0gZm9vICR7djo/J2Jhcid9IGJheiIpIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgUVNUTiBub3JtIC0+IGVycm9yIgotCX0KLQl0bF9wYXJlbigpIHsKLQkJdj0kMgotCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2Ci0JCShlY2hvICIkMSBwbHVzIHBhcm4gZm9vICR7disoYmFyKX0gYmF6IikKLQkJKGVjaG8gIiQxIGRhc2ggcGFybiBmb28gJHt2LShiYXIpfSBiYXoiKQotCQkoZWNobyAiJDEgZXFhbCBwYXJuIGZvbyAke3Y9KGJhcil9IGJheiIpCi0JCShlY2hvICIkMSBxc3RuIHBhcm4gZm9vICR7dj8oYmFyKX0gYmF6IikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBxc3RuIHBhcm4gLT4gZXJyb3IiCi0JCShlY2hvICIkMSBQTFVTIHBhcm4gZm9vICR7djorKGJhcil9IGJheiIpCi0JCShlY2hvICIkMSBEQVNIIHBhcm4gZm9vICR7djotKGJhcil9IGJheiIpCi0JCShlY2hvICIkMSBFUUFMIHBhcm4gZm9vICR7djo9KGJhcil9IGJheiIpCi0JCShlY2hvICIkMSBRU1ROIHBhcm4gZm9vICR7djo/KGJhcil9IGJheiIpIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgUVNUTiBwYXJuIC0+IGVycm9yIgotCX0KLQl0bF9icmFjZSgpIHsKLQkJdj0kMgotCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2Ci0JCShlY2hvICIkMSBwbHVzIGJyYWMgZm9vICR7dithJHV7e3tcfWJ9IGMgJHt2K2R7fX0gYmF6IikKLQkJKGVjaG8gIiQxIGRhc2ggYnJhYyBmb28gJHt2LWEkdXt7e1x9Yn0gYyAke3YtZHt9fSBiYXoiKQotCQkoZWNobyAiJDEgZXFhbCBicmFjIGZvbyAke3Y9YSR1e3t7XH1ifSBjICR7dj1ke319IGJheiIpCi0JCShlY2hvICIkMSBxc3RuIGJyYWMgZm9vICR7dj9hJHV7e3tcfWJ9IGMgJHt2P2R7fX0gYmF6IikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBxc3RuIGJyYWMgLT4gZXJyb3IiCi0JCShlY2hvICIkMSBQTFVTIGJyYWMgZm9vICR7djorYSR1e3t7XH1ifSBjICR7djorZHt9fSBiYXoiKQotCQkoZWNobyAiJDEgREFTSCBicmFjIGZvbyAke3Y6LWEkdXt7e1x9Yn0gYyAke3Y6LWR7fX0gYmF6IikKLQkJKGVjaG8gIiQxIEVRQUwgYnJhYyBmb28gJHt2Oj1hJHV7e3tcfWJ9IGMgJHt2Oj1ke319IGJheiIpCi0JCShlY2hvICIkMSBRU1ROIGJyYWMgZm9vICR7djo/YSR1e3t7XH1ifSBjICR7djo/ZHt9fSBiYXoiKSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gYnJhYyAtPiBlcnJvciIKLQl9Ci0JdGxfbm9ybSAxIC0KLQl0bF9ub3JtIDIgJycKLQl0bF9ub3JtIDMgeAotCXRsX3BhcmVuIDQgLQotCXRsX3BhcmVuIDUgJycKLQl0bF9wYXJlbiA2IHgKLQl0bF9icmFjZSA3IC0KLQl0bF9icmFjZSA4ICcnCi0JdGxfYnJhY2UgOSB4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBwbHVzIG5vcm0gZm9vICBiYXoKLQkxIGRhc2ggbm9ybSBmb28gJ2JhcicgYmF6Ci0JMSBlcWFsIG5vcm0gZm9vICdiYXInIGJhegotCTEgcXN0biBub3JtIC0+IGVycm9yCi0JMSBQTFVTIG5vcm0gZm9vICBiYXoKLQkxIERBU0ggbm9ybSBmb28gJ2JhcicgYmF6Ci0JMSBFUUFMIG5vcm0gZm9vICdiYXInIGJhegotCTEgUVNUTiBub3JtIC0+IGVycm9yCi0JMiBwbHVzIG5vcm0gZm9vICdiYXInIGJhegotCTIgZGFzaCBub3JtIGZvbyAgYmF6Ci0JMiBlcWFsIG5vcm0gZm9vICBiYXoKLQkyIHFzdG4gbm9ybSBmb28gIGJhegotCTIgUExVUyBub3JtIGZvbyAgYmF6Ci0JMiBEQVNIIG5vcm0gZm9vICdiYXInIGJhegotCTIgRVFBTCBub3JtIGZvbyAnYmFyJyBiYXoKLQkyIFFTVE4gbm9ybSAtPiBlcnJvcgotCTMgcGx1cyBub3JtIGZvbyAnYmFyJyBiYXoKLQkzIGRhc2ggbm9ybSBmb28geCBiYXoKLQkzIGVxYWwgbm9ybSBmb28geCBiYXoKLQkzIHFzdG4gbm9ybSBmb28geCBiYXoKLQkzIFBMVVMgbm9ybSBmb28gJ2JhcicgYmF6Ci0JMyBEQVNIIG5vcm0gZm9vIHggYmF6Ci0JMyBFUUFMIG5vcm0gZm9vIHggYmF6Ci0JMyBRU1ROIG5vcm0gZm9vIHggYmF6Ci0JNCBwbHVzIHBhcm4gZm9vICBiYXoKLQk0IGRhc2ggcGFybiBmb28gKGJhcikgYmF6Ci0JNCBlcWFsIHBhcm4gZm9vIChiYXIpIGJhegotCTQgcXN0biBwYXJuIC0+IGVycm9yCi0JNCBQTFVTIHBhcm4gZm9vICBiYXoKLQk0IERBU0ggcGFybiBmb28gKGJhcikgYmF6Ci0JNCBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegotCTQgUVNUTiBwYXJuIC0+IGVycm9yCi0JNSBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegotCTUgZGFzaCBwYXJuIGZvbyAgYmF6Ci0JNSBlcWFsIHBhcm4gZm9vICBiYXoKLQk1IHFzdG4gcGFybiBmb28gIGJhegotCTUgUExVUyBwYXJuIGZvbyAgYmF6Ci0JNSBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegotCTUgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk1IFFTVE4gcGFybiAtPiBlcnJvcgotCTYgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKLQk2IGRhc2ggcGFybiBmb28geCBiYXoKLQk2IGVxYWwgcGFybiBmb28geCBiYXoKLQk2IHFzdG4gcGFybiBmb28geCBiYXoKLQk2IFBMVVMgcGFybiBmb28gKGJhcikgYmF6Ci0JNiBEQVNIIHBhcm4gZm9vIHggYmF6Ci0JNiBFUUFMIHBhcm4gZm9vIHggYmF6Ci0JNiBRU1ROIHBhcm4gZm9vIHggYmF6Ci0JNyBwbHVzIGJyYWMgZm9vICBjIH0gYmF6Ci0JNyBkYXNoIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JNyBlcWFsIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKLQk3IHFzdG4gYnJhYyAtPiBlcnJvcgotCTcgUExVUyBicmFjIGZvbyAgYyB9IGJhegotCTcgREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTcgRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6Ci0JNyBRU1ROIGJyYWMgLT4gZXJyb3IKLQk4IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk4IGRhc2ggYnJhYyBmb28gIGMgfSBiYXoKLQk4IGVxYWwgYnJhYyBmb28gIGMgfSBiYXoKLQk4IHFzdG4gYnJhYyBmb28gIGMgfSBiYXoKLQk4IFBMVVMgYnJhYyBmb28gIGMgfSBiYXoKLQk4IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk4IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegotCTggUVNUTiBicmFjIC0+IGVycm9yCi0JOSBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOSBkYXNoIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IGVxYWwgYnJhYyBmb28geCBjIHh9IGJhegotCTkgcXN0biBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBQTFVTIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOSBEQVNIIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IEVRQUwgYnJhYyBmb28geCBjIHh9IGJhegotCTkgUVNUTiBicmFjIGZvbyB4IGMgeH0gYmF6Ci0tLS0KLW5hbWU6IGV4cGFuZC11bmdsb2ItdW5xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHJlZ3VsYXIgJHtmb28rYmFyfSBjb25zdHJ1Y3RzIGFyZSBwYXJzZWQgY29ycmVjdGx5Ci1zdGRpbjoKLQl1PXgKLQl0bF9ub3JtKCkgewotCQl2PSQyCi0JCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKLQkJKGVjaG8gJDEgcGx1cyBub3JtIGZvbyAke3YrJ2Jhcid9IGJheikKLQkJKGVjaG8gJDEgZGFzaCBub3JtIGZvbyAke3YtJ2Jhcid9IGJheikKLQkJKGVjaG8gJDEgZXFhbCBub3JtIGZvbyAke3Y9J2Jhcid9IGJheikKLQkJKGVjaG8gJDEgcXN0biBub3JtIGZvbyAke3Y/J2Jhcid9IGJheikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBxc3RuIG5vcm0gLT4gZXJyb3IiCi0JCShlY2hvICQxIFBMVVMgbm9ybSBmb28gJHt2OisnYmFyJ30gYmF6KQotCQkoZWNobyAkMSBEQVNIIG5vcm0gZm9vICR7djotJ2Jhcid9IGJheikKLQkJKGVjaG8gJDEgRVFBTCBub3JtIGZvbyAke3Y6PSdiYXInfSBiYXopCi0JCShlY2hvICQxIFFTVE4gbm9ybSBmb28gJHt2Oj8nYmFyJ30gYmF6KSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gbm9ybSAtPiBlcnJvciIKLQl9Ci0JdGxfcGFyZW4oKSB7Ci0JCXY9JDIKLQkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgotCQkoZWNobyAkMSBwbHVzIHBhcm4gZm9vICR7ditcKGJhcicpJ30gYmF6KQotCQkoZWNobyAkMSBkYXNoIHBhcm4gZm9vICR7di1cKGJhcicpJ30gYmF6KQotCQkoZWNobyAkMSBlcWFsIHBhcm4gZm9vICR7dj1cKGJhcicpJ30gYmF6KQotCQkoZWNobyAkMSBxc3RuIHBhcm4gZm9vICR7dj9cKGJhcicpJ30gYmF6KSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIHFzdG4gcGFybiAtPiBlcnJvciIKLQkJKGVjaG8gJDEgUExVUyBwYXJuIGZvbyAke3Y6K1woYmFyJyknfSBiYXopCi0JCShlY2hvICQxIERBU0ggcGFybiBmb28gJHt2Oi1cKGJhcicpJ30gYmF6KQotCQkoZWNobyAkMSBFUUFMIHBhcm4gZm9vICR7djo9XChiYXInKSd9IGJheikKLQkJKGVjaG8gJDEgUVNUTiBwYXJuIGZvbyAke3Y6P1woYmFyJyknfSBiYXopIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgUVNUTiBwYXJuIC0+IGVycm9yIgotCX0KLQl0bF9icmFjZSgpIHsKLQkJdj0kMgotCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2Ci0JCShlY2hvICQxIHBsdXMgYnJhYyBmb28gJHt2K2EkdXt7e1x9Yn0gYyAke3YrZHt9fSBiYXopCi0JCShlY2hvICQxIGRhc2ggYnJhYyBmb28gJHt2LWEkdXt7e1x9Yn0gYyAke3YtZHt9fSBiYXopCi0JCShlY2hvICQxIGVxYWwgYnJhYyBmb28gJHt2PWEkdXt7e1x9Yn0gYyAke3Y9ZHt9fSBiYXopCi0JCShlY2hvICQxIHFzdG4gYnJhYyBmb28gJHt2P2EkdXt7e1x9Yn0gYyAke3Y/ZHt9fSBiYXopIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgcXN0biBicmFjIC0+IGVycm9yIgotCQkoZWNobyAkMSBQTFVTIGJyYWMgZm9vICR7djorYSR1e3t7XH1ifSBjICR7djorZHt9fSBiYXopCi0JCShlY2hvICQxIERBU0ggYnJhYyBmb28gJHt2Oi1hJHV7e3tcfWJ9IGMgJHt2Oi1ke319IGJheikKLQkJKGVjaG8gJDEgRVFBTCBicmFjIGZvbyAke3Y6PWEkdXt7e1x9Yn0gYyAke3Y6PWR7fX0gYmF6KQotCQkoZWNobyAkMSBRU1ROIGJyYWMgZm9vICR7djo/YSR1e3t7XH1ifSBjICR7djo/ZHt9fSBiYXopIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgUVNUTiBicmFjIC0+IGVycm9yIgotCX0KLQl0bF9ub3JtIDEgLQotCXRsX25vcm0gMiAnJwotCXRsX25vcm0gMyB4Ci0JdGxfcGFyZW4gNCAtCi0JdGxfcGFyZW4gNSAnJwotCXRsX3BhcmVuIDYgeAotCXRsX2JyYWNlIDcgLQotCXRsX2JyYWNlIDggJycKLQl0bF9icmFjZSA5IHgKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIHBsdXMgbm9ybSBmb28gYmF6Ci0JMSBkYXNoIG5vcm0gZm9vIGJhciBiYXoKLQkxIGVxYWwgbm9ybSBmb28gYmFyIGJhegotCTEgcXN0biBub3JtIC0+IGVycm9yCi0JMSBQTFVTIG5vcm0gZm9vIGJhegotCTEgREFTSCBub3JtIGZvbyBiYXIgYmF6Ci0JMSBFUUFMIG5vcm0gZm9vIGJhciBiYXoKLQkxIFFTVE4gbm9ybSAtPiBlcnJvcgotCTIgcGx1cyBub3JtIGZvbyBiYXIgYmF6Ci0JMiBkYXNoIG5vcm0gZm9vIGJhegotCTIgZXFhbCBub3JtIGZvbyBiYXoKLQkyIHFzdG4gbm9ybSBmb28gYmF6Ci0JMiBQTFVTIG5vcm0gZm9vIGJhegotCTIgREFTSCBub3JtIGZvbyBiYXIgYmF6Ci0JMiBFUUFMIG5vcm0gZm9vIGJhciBiYXoKLQkyIFFTVE4gbm9ybSAtPiBlcnJvcgotCTMgcGx1cyBub3JtIGZvbyBiYXIgYmF6Ci0JMyBkYXNoIG5vcm0gZm9vIHggYmF6Ci0JMyBlcWFsIG5vcm0gZm9vIHggYmF6Ci0JMyBxc3RuIG5vcm0gZm9vIHggYmF6Ci0JMyBQTFVTIG5vcm0gZm9vIGJhciBiYXoKLQkzIERBU0ggbm9ybSBmb28geCBiYXoKLQkzIEVRQUwgbm9ybSBmb28geCBiYXoKLQkzIFFTVE4gbm9ybSBmb28geCBiYXoKLQk0IHBsdXMgcGFybiBmb28gYmF6Ci0JNCBkYXNoIHBhcm4gZm9vIChiYXIpIGJhegotCTQgZXFhbCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk0IHFzdG4gcGFybiAtPiBlcnJvcgotCTQgUExVUyBwYXJuIGZvbyBiYXoKLQk0IERBU0ggcGFybiBmb28gKGJhcikgYmF6Ci0JNCBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegotCTQgUVNUTiBwYXJuIC0+IGVycm9yCi0JNSBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegotCTUgZGFzaCBwYXJuIGZvbyBiYXoKLQk1IGVxYWwgcGFybiBmb28gYmF6Ci0JNSBxc3RuIHBhcm4gZm9vIGJhegotCTUgUExVUyBwYXJuIGZvbyBiYXoKLQk1IERBU0ggcGFybiBmb28gKGJhcikgYmF6Ci0JNSBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegotCTUgUVNUTiBwYXJuIC0+IGVycm9yCi0JNiBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegotCTYgZGFzaCBwYXJuIGZvbyB4IGJhegotCTYgZXFhbCBwYXJuIGZvbyB4IGJhegotCTYgcXN0biBwYXJuIGZvbyB4IGJhegotCTYgUExVUyBwYXJuIGZvbyAoYmFyKSBiYXoKLQk2IERBU0ggcGFybiBmb28geCBiYXoKLQk2IEVRQUwgcGFybiBmb28geCBiYXoKLQk2IFFTVE4gcGFybiBmb28geCBiYXoKLQk3IHBsdXMgYnJhYyBmb28gYyB9IGJhegotCTcgZGFzaCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTcgZXFhbCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6Ci0JNyBxc3RuIGJyYWMgLT4gZXJyb3IKLQk3IFBMVVMgYnJhYyBmb28gYyB9IGJhegotCTcgREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTcgRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6Ci0JNyBRU1ROIGJyYWMgLT4gZXJyb3IKLQk4IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk4IGRhc2ggYnJhYyBmb28gYyB9IGJhegotCTggZXFhbCBicmFjIGZvbyBjIH0gYmF6Ci0JOCBxc3RuIGJyYWMgZm9vIGMgfSBiYXoKLQk4IFBMVVMgYnJhYyBmb28gYyB9IGJhegotCTggREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTggRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6Ci0JOCBRU1ROIGJyYWMgLT4gZXJyb3IKLQk5IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk5IGRhc2ggYnJhYyBmb28geCBjIHh9IGJhegotCTkgZXFhbCBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBxc3RuIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IFBMVVMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk5IERBU0ggYnJhYyBmb28geCBjIHh9IGJhegotCTkgRVFBTCBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBRU1ROIGJyYWMgZm9vIHggYyB4fSBiYXoKLS0tLQotbmFtZTogZWdsb2ItYmFkLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3giCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeiIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCi1zdGRpbjoKLQllY2hvICEoWyopKgotCWVjaG8gKyhhfGJbKSoKLWV4cGVjdGVkLXN0ZG91dDoKLQkhKFsqKSoKLQkrKGF8YlspKgotLS0tCi1uYW1lOiBlZ2xvYi1iYWQtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBnbG9iYmluZyBpc24ndCBkb25lIHdoZW4gZ2xvYiBoYXMgc3ludGF4IGVycm9yCi0JKEFUJlQga3NoIGZhaWxzIHRoaXMgdGVzdCkKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN4IgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3oiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgotc3RkaW46Ci0JZWNobyBbYSooXSopegotZXhwZWN0ZWQtc3Rkb3V0OgotCVthKihdKil6Ci0tLS0KLW5hbWU6IGVnbG9iLWluZmluaXRlLXBsdXMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc2hlbGwgZG9lc24ndCBnbyBpbnRvIGluZmluaXRlIGxvb3AgZXhwYW5kaW5nICsoLi4uKQotCWV4cHJlc3Npb25zLgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKLXRpbWUtbGltaXQ6IDMKLXN0ZGluOgotCWVjaG8gKygpYwotCWVjaG8gKygpeAotCWVjaG8gKygqKWMKLQllY2hvICsoKil4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JKygpYwotCSsoKXgKLQlhYmMKLQkrKCopeAotLS0tCi1uYW1lOiBlZ2xvYi1zdWJzdC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGVnbG9iYmluZyBpc24ndCBkb25lIG9uIHN1YnN0aXR1dGlvbiByZXN1bHRzCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgotc3RkaW46Ci0JeD0nQCgqKScKLQllY2hvICR4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JQCgqKQotLS0tCi1uYW1lOiBlZ2xvYi1ub21hdGNoLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHBhdHRlcm4gZG9lc24ndCBtYXRjaAotc3RkaW46Ci0JZWNobyAxOiBuby1maWxlKyhhfGIpc3R1ZmYKLQllY2hvIDI6IG5vLWZpbGUrKGEqKGMpfGIpc3R1ZmYKLQllY2hvIDM6IG5vLWZpbGUrKCgoKGMpKSl8YilzdHVmZgotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IG5vLWZpbGUrKGF8YilzdHVmZgotCTI6IG5vLWZpbGUrKGEqKGMpfGIpc3R1ZmYKLQkzOiBuby1maWxlKygoKChjKSkpfGIpc3R1ZmYKLS0tLQotbmFtZTogZWdsb2ItbWF0Y2gtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB0aGUgcGF0dGVybiBtYXRjaGVzIGNvcnJlY3RseQotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiZCIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhY2QiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJhYyIKLXN0ZGluOgotCWVjaG8gMTogYSsoYnxjKWQKLQllY2hvIDI6IGEhKEAoYnxCKSlkCi0JZWNobyAzOiAqKGEoYnxjKSkJCSMgKC4uLnwuLi4pIGNhbiBiZSB1c2VkIHdpdGhpbiBYKC4uKQotCWVjaG8gNDogYVtiKihmb298YmFyKV1kCQkjIHBhdHRlcm5zIG5vdCBzcGVjaWFsIGluc2lkZSBbLi4uXQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IGFiZCBhY2QKLQkyOiBhY2QKLQkzOiBhYmFjCi0JNDogYWJkCi0tLS0KLW5hbWU6IGVnbG9iLWNhc2UtMQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIG5lZ2F0aW9uIHRlc3RzCi1zdGRpbjoKLQljYXNlIGZvbyBpbiAhKGZvb3xiYXIpKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCi0JY2FzZSBiYXIgaW4gIShmb298YmFyKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYwotZXhwZWN0ZWQtc3Rkb3V0OgotCW5vCi0Jbm8KLS0tLQotbmFtZTogZWdsb2ItY2FzZS0yCi1kZXNjcmlwdGlvbjoKLQlTaW1wbGUga2xlZW5lIHRlc3RzCi1zdGRpbjoKLQljYXNlIGZvbyBpbiAqKGF8YlspKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCi0JY2FzZSBmb28gaW4gKihhfGJbKXxmKikgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYwotCWNhc2UgJyooYXxiWyknIGluICooYXxiWykpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKLWV4cGVjdGVkLXN0ZG91dDoKLQlubwotCXllcwotCXllcwotLS0tCi1uYW1lOiBlZ2xvYi10cmltLTEKLWRlc2NyaXB0aW9uOgotCUVnbG9iYmluZyBpbiB0cmltIGV4cHJlc3Npb25zLi4uCi0JKEFUJlQga3NoIGZhaWxzIHRoaXMgLSBkb2NzIHNheSAjIG1hdGNoZXMgc2hvcnRlc3Qgc3RyaW5nLCAjIyBtYXRjaGVzCi0JbG9uZ2VzdC4uLikKLXN0ZGluOgotCXg9YWJjZGVmCi0JZWNobyAxOiAke3gjYXxhYmN9Ci0JZWNobyAyOiAke3gjI2F8YWJjfQotCWVjaG8gMzogJHt4JWRlZnxmfQotCWVjaG8gNDogJHt4JSVmfGRlZn0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiBiY2RlZgotCTI6IGRlZgotCTM6IGFiY2RlCi0JNDogYWJjCi0tLS0KLW5hbWU6IGVnbG9iLXRyaW0tMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgZWdsb2JiaW5nIHdvcmtzIGluIHRyaW1zLi4uCi1zdGRpbjoKLQl4PWFiY2RlZgotCWVjaG8gMTogJHt4IyooYXxiKWNkfQotCWVjaG8gMjogIiR7eCMqKGF8YiljZH0iCi0JZWNobyAzOiAke3gjIiooYXxiKWNkIn0KLQllY2hvIDQ6ICR7eCNhKGJ8Yyl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMTogZWYKLQkyOiBlZgotCTM6IGFiY2RlZgotCTQ6IGNkZWYKLS0tLQotbmFtZTogZWdsb2Itc3Vic3RycGwtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgZWdsb2JiaW5nIHdvcmtzIGluIHN1YnN0cy4uLiBhbmQgdGhleSB3b3JrIGF0IGFsbAotc3RkaW46Ci0JW1sgLW4gJEJBU0hfVkVSU0lPTiBdXSAmJiBzaG9wdCAtcyBleHRnbG9iCi0JeD0xMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQotCXk9eHl6Ci0JZWNobyAxOiAke3gvMn0KLQllY2hvIDI6ICR7eC8vMn0KLQllY2hvIDM6ICR7eC8rKDIpfQotCWVjaG8gNDogJHt4Ly8rKDIpfQotCWVjaG8gNTogJHt4LzIvNH0KLQllY2hvIDY6ICR7eC8vMi80fQotCWVjaG8gNzogJHt4LysoMikvNH0KLQllY2hvIDg6ICR7eC8vKygyKS80fQotCWVjaG8gOTogJHt4L2IvYy9lL2Z9Ci0JZWNobyAxMDogJHt4L2JcL2MvZS9mfQotCWVjaG8gMTE6ICR7eC9iXC9jL2VcL2Z9Ci0JZWNobyAxMjogJHt4L2JcL2MvZVxcL2Z9Ci0JZWNobyAxMzogJHt4L2JcXC9jL2VcXC9mfQotCWVjaG8gMTQ6ICR7eC8vYi9jL2UvZn0KLQllY2hvIDE1OiAke3gvL2JcL2MvZS9mfQotCWVjaG8gMTY6ICR7eC8vYlwvYy9lXC9mfQotCWVjaG8gMTc6ICR7eC8vYlwvYy9lXFwvZn0KLQllY2hvIDE4OiAke3gvL2JcXC9jL2VcXC9mfQotCWVjaG8gMTk6ICR7eC9iXC8qXC9jL3h9Ci0JZWNobyAyMDogJHt4L1wvLy59Ci0JZWNobyAyMTogJHt4Ly9cLy8ufQotCWVjaG8gMjI6ICR7eC8vLy59Ci0JZWNobyAyMzogJHt4Ly8jMS85fQotCWVjaG8gMjQ6ICR7eC8vJTEvOX0KLQllY2hvIDI1OiAke3gvL1wlMS85fQotCWVjaG8gMjY6ICR7eC8vXFwlMS85fQotCWVjaG8gMjc6ICR7eC8vXGEvOX0KLQllY2hvIDI4OiAke3gvL1xcYS85fQotCWVjaG8gMjk6ICR7eC8yLyR5fQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IDEyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQkyOiAxMzFfYWIvY2RlX2IvY18xMQotCTM6IDEzMjFfYWIvY2RlX2IvY18xMjIxCi0JNDogMTMxX2FiL2NkZV9iL2NfMTEKLQk1OiAxNDIyMzIxX2FiL2NkZV9iL2NfMTIyMQotCTY6IDE0NDQzNDFfYWIvY2RlX2IvY18xNDQxCi0JNzogMTQzMjFfYWIvY2RlX2IvY18xMjIxCi0JODogMTQzNDFfYWIvY2RlX2IvY18xNDEKLQk5OiAxMjIyMzIxX2FjL2UvZi9jZGVfYi9jXzEyMjEKLQkxMDogMTIyMjMyMV9hZS9mZGVfYi9jXzEyMjEKLQkxMTogMTIyMjMyMV9hZS9mZGVfYi9jXzEyMjEKLQkxMjogMTIyMjMyMV9hZVwvZmRlX2IvY18xMjIxCi0JMTM6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCi0JMTQ6IDEyMjIzMjFfYWMvZS9mL2NkZV9jL2UvZi9jXzEyMjEKLQkxNTogMTIyMjMyMV9hZS9mZGVfZS9mXzEyMjEKLQkxNjogMTIyMjMyMV9hZS9mZGVfZS9mXzEyMjEKLQkxNzogMTIyMjMyMV9hZVwvZmRlX2VcL2ZfMTIyMQotCTE4OiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQotCTE5OiAxMjIyMzIxX2F4XzEyMjEKLQkyMDogMTIyMjMyMV9hYi5jZGVfYi9jXzEyMjEKLQkyMTogMTIyMjMyMV9hYi5jZGVfYi5jXzEyMjEKLQkyMjogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQkyMzogOTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQkyNDogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjkKLQkyNTogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjkKLQkyNjogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQkyNzogMTIyMjMyMV85Yi9jZGVfYi9jXzEyMjEKLQkyODogMTIyMjMyMV85Yi9jZGVfYi9jXzEyMjEKLQkyOTogMXh5ejIyMzIxX2FiL2NkZV9iL2NfMTIyMQotLS0tCi1uYW1lOiBlZ2xvYi1zdWJzdHJwbC0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBhbmNob3JlZCBzdWJzdHJpbmcgcmVwbGFjZW1lbnQgd29ya3MsIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JZm9vPTEyMwotCWVjaG8gMTogJHtmb28vIy94fQotCWVjaG8gMjogJHtmb28vJS94fQotCWVjaG8gMzogJHtmb28vIy99Ci0JZWNobyA0OiAke2Zvby8jfQotCWVjaG8gNTogJHtmb28vJS99Ci0JZWNobyA2OiAke2Zvby8lfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IHgxMjMKLQkyOiAxMjN4Ci0JMzogMTIzCi0JNDogMTIzCi0JNTogMTIzCi0JNjogMTIzCi0tLS0KLW5hbWU6IGVnbG9iLXN1YnN0cnBsLTNhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdWJzdHJpbmcgcmVwbGFjZW1lbnQgd29ya3Mgd2l0aCB2YXJpYWJsZXMgYW5kIHNsYXNoZXMsIHRvbwotc3RkaW46Ci0JcGZ4PS9ob21lL3VzZXIKLQl3ZD0vaG9tZS91c2VyL3RtcAotCWVjaG8gIiR7d2QvIyRwZngvfn0iCi0JZWNobyAiJHt3ZC8jXCRwZngvfn0iCi0JZWNobyAiJHt3ZC8jIiRwZngiL359IgotCWVjaG8gIiR7d2QvIyckcGZ4Jy9+fSIKLQllY2hvICIke3dkLyMiXCRwZngiL359IgotCWVjaG8gIiR7d2QvIydcJHBmeCcvfn0iCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jfi90bXAKLQkvaG9tZS91c2VyL3RtcAotCX4vdG1wCi0JL2hvbWUvdXNlci90bXAKLQkvaG9tZS91c2VyL3RtcAotCS9ob21lL3VzZXIvdG1wCi0tLS0KLW5hbWU6IGVnbG9iLXN1YnN0cnBsLTNiCi1kZXNjcmlwdGlvbjoKLQlNb3JlIG9mIHRoaXMsIGJhc2ggZmFpbHMgaXQgKGJhc2g0IHBhc3NlcykKLXN0ZGluOgotCXBmeD0vaG9tZS91c2VyCi0Jd2Q9L2hvbWUvdXNlci90bXAKLQllY2hvICIke3dkLyMkKGVjaG8gL2hvbWUvdXNlcikvfn0iCi0JZWNobyAiJHt3ZC8jIiQoZWNobyAvaG9tZS91c2VyKSIvfn0iCi0JZWNobyAiJHt3ZC8jJyQoZWNobyAvaG9tZS91c2VyKScvfn0iCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jfi90bXAKLQl+L3RtcAotCS9ob21lL3VzZXIvdG1wCi0tLS0KLW5hbWU6IGVnbG9iLXN1YnN0cnBsLTNjCi1kZXNjcmlwdGlvbjoKLQlFdmVuIG1vcmUgd2VpcmQgY2FzZXMKLXN0ZGluOgotCXBmeD0vaG9tZS91c2VyCi0Jd2Q9JyRwZngvdG1wJwotCWVjaG8gMTogJHt3ZC8jJHBmeC9+fQotCWVjaG8gMjogJHt3ZC8jXCRwZngvfn0KLQllY2hvIDM6ICR7d2QvIyIkcGZ4Ii9+fQotCWVjaG8gNDogJHt3ZC8jJyRwZngnL359Ci0JZWNobyA1OiAke3dkLyMiXCRwZngiL359Ci0JZWNobyA2OiAke3dkLyMnXCRwZngnL359Ci0JdHM9J2EvYmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKScKLQl0cD1hL2IKLQl0cj1jL2QKLQlbWyAtbiAkQkFTSF9WRVJTSU9OIF1dICYmIHNob3B0IC1zIGV4dGdsb2IKLQllY2hvIDc6ICR7dHMvYVwvYi8kdHJ9Ci0JZWNobyA4OiAke3RzL2FcL2IvXCR0cn0KLQllY2hvIDk6ICR7dHMvJHRwLyR0cn0KLQllY2hvIDEwOiAke3RzL1wkdHAvJHRyfQotCWVjaG8gMTE6ICR7dHMvXFwkdHAvJHRyfQotCWVjaG8gMTI6ICR7dHMvJHRwL2MvZH0KLQllY2hvIDEzOiAke3RzLyR0cC9jXC9kfQotCWVjaG8gMTQ6ICR7dHMvJHRwL2NcXC9kfQotCWVjaG8gMTU6ICR7dHMvKyhhXC9iKS8kdHJ9Ci0JZWNobyAxNjogJHt0cy8rKGFcL2IpL1wkdHJ9Ci0JZWNobyAxNzogJHt0cy8rKCR0cCkvJHRyfQotCWVjaG8gMTg6ICR7dHMvKygkdHApL2MvZH0KLQllY2hvIDE5OiAke3RzLysoJHRwKS9jXC9kfQotCWVjaG8gMjU6ICR7dHMvL2FcL2IvJHRyfQotCWVjaG8gMjY6ICR7dHMvL2FcL2IvXCR0cn0KLQllY2hvIDI3OiAke3RzLy8kdHAvJHRyfQotCWVjaG8gMjg6ICR7dHMvLyR0cC9jL2R9Ci0JZWNobyAyOTogJHt0cy8vJHRwL2NcL2R9Ci0JZWNobyAzMDogJHt0cy8vKyhhXC9iKS8kdHJ9Ci0JZWNobyAzMTogJHt0cy8vKyhhXC9iKS9cJHRyfQotCWVjaG8gMzI6ICR7dHMvLysoJHRwKS8kdHJ9Ci0JZWNobyAzMzogJHt0cy8vKygkdHApL2MvZH0KLQllY2hvIDM0OiAke3RzLy8rKCR0cCkvY1wvZH0KLQl0cD0iKygkdHApIgotCWVjaG8gNDA6ICR7dHMvJHRwLyR0cn0KLQllY2hvIDQxOiAke3RzLy8kdHAvJHRyfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6ICRwZngvdG1wCi0JMjogfi90bXAKLQkzOiAkcGZ4L3RtcAotCTQ6IH4vdG1wCi0JNTogfi90bXAKLQk2OiB+L3RtcAotCTc6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTg6ICR0cmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTk6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTEwOiBhL2JhL2JjL2QkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxMTogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTI6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTEzOiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxNDogY1wvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTE1OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxNjogJHRyJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTc6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTE4OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxOTogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMjU6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTI2OiAkdHIkdHIkdHAkdHBfJHRyJHRwXyooJHRyKV8qKCR0cCkKLQkyNzogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0JMjg6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTI5OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLQkzMDogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0JMzE6ICR0ciR0cCR0cF8kdHIkdHBfKigkdHIpXyooJHRwKQotCTMyOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLQkzMzogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0JMzQ6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTQwOiBhL2JhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQk0MTogYS9iYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0jCVRoaXMgaXMgd2hhdCBHTlUgYmFzaCBkb2VzOgotIwk0MDogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0jCTQxOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLS0tLQotbmFtZTogZWdsb2ItdXRmOC0xCi1kZXNjcmlwdGlvbjoKLQlVVEYtOCBtb2RlIGRpZmZlcmVuY2VzIGZvciBlZ2xvYmJpbmcKLXN0ZGluOgotCXM9YmzDtmQKLQlzZXQgK1UKLQlwcmludCAxOiAke3MlPz8/fSAuCi0JcHJpbnQgMjogJHtzL2I/Pz9kL3h9IC4KLQlzZXQgLVUKLQlwcmludCAzOiAke3MlPz8/fSAuCi0JcHJpbnQgNDogJHtzL2I/P2QveH0gLgotCXg9bsO2Ci0JcHJpbnQgNTogJHt4JT99ICR7eCUlP30gLgotCXg9w6RoCi0JcHJpbnQgNjogJHt4Iz99ICR7eCMjP30gLgotCXg9gYIKLQlwcmludCA3OiAke3glP30gJHt4JSU/fSAuCi0JeD1tw6SACi0JcHJpbnQgODogJHt4JT99ICR7eCUlP30gLgotCXg95L2VCi0JcHJpbnQgOTogJHt4JT99ICR7eCUlP30gLgotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IGJsIC4KLQkyOiB4IC4KLQkzOiBiIC4KLQk0OiB4IC4KLQk1OiBuIG4gLgotCTY6IGggaCAuCi0JNzoggSCBIC4KLQk4OiBtw6QgbcOkIC4KLQk5OiAuCi0tLS0KLW5hbWU6IGdsb2ItYmFkLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgotZmlsZS1zZXR1cDogZGlyIDc1NSAiW3giCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiW3gvZm9vIgotc3RkaW46Ci0JZWNobyBbKgotCWVjaG8gKlt4Ci0JZWNobyBbeC8qCi1leHBlY3RlZC1zdGRvdXQ6Ci0JWyoKLQkqW3gKLQlbeC9mb28KLS0tLQotbmFtZTogZ2xvYi1iYWQtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBzeW1ib2xpYyBsaW5rcyBhcmVuJ3Qgc3RhdCgpJ2QKLWZpbGUtc2V0dXA6IGRpciA3NTUgImRpciIKLWZpbGUtc2V0dXA6IHN5bWxpbmsgNjQ0ICJkaXIvYWJjIgotCW5vbi1leGlzdGVudC1maWxlCi1zdGRpbjoKLQllY2hvIGQqLyoKLQllY2hvIGQqL2FiYwotZXhwZWN0ZWQtc3Rkb3V0OgotCWRpci9hYmMKLQlkaXIvYWJjCi0tLS0KLW5hbWU6IGdsb2ItcmFuZ2UtMQotZGVzY3JpcHRpb246Ci0JVGVzdCByYW5nZSBtYXRjaGluZwotZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5iYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImNiYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICItYmMiCi1zdGRpbjoKLQllY2hvIFthYi1dKgotCWVjaG8gWy1hYl0qCi0JZWNobyBbIS1hYl0qCi0JZWNobyBbIWFiXSoKLQllY2hvIFtdYWJdKgotZXhwZWN0ZWQtc3Rkb3V0OgotCS1iYyBhYmMgYmJjCi0JLWJjIGFiYyBiYmMKLQljYmMKLQktYmMgY2JjCi0JYWJjIGJiYwotLS0tCi1uYW1lOiBnbG9iLXJhbmdlLTIKLWRlc2NyaXB0aW9uOgotCVRlc3QgcmFuZ2UgbWF0Y2hpbmcKLQkoQVQmVCBrc2ggZmFpbHMgdGhpczsgUE9TSVggc2F5cyBpbnZhbGlkKQotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKLXN0ZGluOgotCWVjaG8gW2EtLV0qCi1leHBlY3RlZC1zdGRvdXQ6Ci0JW2EtLV0qCi0tLS0KLW5hbWU6IGdsb2ItcmFuZ2UtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBnbG9iYmluZyBtYXRjaGVzIHRoZSByaWdodCB0aGluZ3MuLi4KLSMgYnJlYWtzIG9uIE1hYyBPU1ggKEhGUysgbm9uLXN0YW5kYXJkIFVuaWNvZGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24pCi1jYXRlZ29yeTogIW9zOmRhcndpbgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImHCYyIKLXN0ZGluOgotCWVjaG8gYVvBLdpdKgotZXhwZWN0ZWQtc3Rkb3V0OgotCWHCYwotLS0tCi1uYW1lOiBnbG9iLXJhbmdlLTQKLWRlc2NyaXB0aW9uOgotCVJlc3VsdHMgdW5zcGVjaWZpZWQgYWNjb3JkaW5nIHRvIFBPU0lYCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiLmJjIgotc3RkaW46Ci0JZWNobyBbYS5dKgotZXhwZWN0ZWQtc3Rkb3V0OgotCVthLl0qCi0tLS0KLW5hbWU6IGdsb2ItcmFuZ2UtNQotZGVzY3JpcHRpb246Ci0JUmVzdWx0cyB1bnNwZWNpZmllZCBhY2NvcmRpbmcgdG8gUE9TSVgKLQkoQVQmVCBrc2ggdHJlYXRzIHRoaXMgbGlrZSBbYS1jYy1lXSopCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJjYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZGJjIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImViYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICItYmMiCi1zdGRpbjoKLQllY2hvIFthLWMtZV0qCi1leHBlY3RlZC1zdGRvdXQ6Ci0JLWJjIGFiYyBiYmMgY2JjIGViYwotLS0tCi1uYW1lOiBoZXJlZG9jLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIG9yZGVyaW5nL2NvbnRlbnQgb2YgcmVkdW5kZW50IGhlcmUgZG9jdW1lbnRzLgotc3RkaW46Ci0JY2F0IDw8IEVPRjEgPDwgRU9GMgotCWhpCi0JRU9GMQotCXRoZXJlCi0JRU9GMgotZXhwZWN0ZWQtc3Rkb3V0OgotCXRoZXJlCi0tLS0KLW5hbWU6IGhlcmVkb2MtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcXVvdGVkIGhlcmUtZG9jIGlzIHByb3RlY3RlZC4KLXN0ZGluOgotCWE9Zm9vCi0JY2F0IDw8ICdFT0YnCi0JaGlcCi0JdGhlcmUkYQotCXN0dWZmCi0JRU9cCi0JRgotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpXAotCXRoZXJlJGEKLQlzdHVmZgotCUVPXAotCUYKLS0tLQotbmFtZTogaGVyZWRvYy0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IG5ld2xpbmUgaXNuJ3QgbmVlZGVkIGFmdGVyIGhlcmVkb2MtZGVsaW1pdGVyIG1hcmtlci4KLXN0ZGluOiAhCi0JY2F0IDw8IEVPRgotCWhpCi0JdGhlcmUKLQlFT0YKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCXRoZXJlCi0tLS0KLW5hbWU6IGhlcmVkb2MtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbiBlcnJvciBvY2N1cnMgaWYgdGhlIGhlcmVkb2MtZGVsaW1pdGVyIGlzIG1pc3NpbmcuCi1zdGRpbjogIQotCWNhdCA8PCBFT0YKLQloaQotCXRoZXJlCi1leHBlY3RlZC1leGl0OiBlID4gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi8KLS0tLQotbmFtZTogaGVyZWRvYy01Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGJhY2tzbGFzaCBxdW90ZXMgYSAkLCBgIGFuZCBcIGFuZCBraWxscyBhIFxuZXdsaW5lCi1zdGRpbjoKLQlhPUJBRAotCWI9b2sKLQljYXQgPDwgRU9GCi0JaFwke2F9aQotCWhcXCR7Yn1pCi0JdGhcYGVjaG8gbm90LXJ1blxgZXJlCi0JdGhcXGBlY2hvIGlzLXJ1bmBlcmUKLQlmb2xcXGtzCi0JbW9yZVxcCi0JbGFzdCBcCi0JbGluZQotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWgke2F9aQotCWhcb2tpCi0JdGhgZWNobyBub3QtcnVuYGVyZQotCXRoXGlzLXJ1bmVyZQotCWZvbFxrcwotCW1vcmVcCi0JbGFzdCBsaW5lCi0tLS0KLW5hbWU6IGhlcmVkb2MtNgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpbiBpbml0aWFsIGhlcmUtZGVsaW0gd29yZCBkb2Vzbid0IGltcGx5Ci0JYSBxdW90ZWQgaGVyZS1kb2MuCi1zdGRpbjoKLQlhPWkKLQljYXQgPDwgRU9cCi0JRgotCWgkYQotCXRoZXJlCi0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQl0aGVyZQotLS0tCi1uYW1lOiBoZXJlZG9jLTcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZG91YmxlIHF1b3RlZCAkIGV4cHJlc3Npb25zIGluIGhlcmUgZGVsaW1pdGVycyBhcmUKLQlub3QgZXhwYW5kZWQgYW5kIG1hdGNoIHRoZSBkZWxpbWl0ZXIuCi0JUE9TSVggc2F5cyBvbmx5IHF1b3RlIHJlbW92YWwgaXMgYXBwbGllZCB0byB0aGUgZGVsaW1pdGVyLgotc3RkaW46Ci0JYT1iCi0JY2F0IDw8ICJFJGEiCi0JaGkKLQloJGEKLQloYgotCUUkYQotCWVjaG8gZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JaCRhCi0JaGIKLQlkb25lCi0tLS0KLW5hbWU6IGhlcmVkb2MtOAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBkb3VibGUgcXVvdGVkIGVzY2FwZWQgJCBleHByZXNzaW9ucyBpbiBoZXJlCi0JZGVsaW1pdGVycyBhcmUgbm90IGV4cGFuZGVkIGFuZCBtYXRjaCB0aGUgZGVsaW1pdGVyLgotCVBPU0lYIHNheXMgb25seSBxdW90ZSByZW1vdmFsIGlzIGFwcGxpZWQgdG8gdGhlIGRlbGltaXRlcgotCShcIGNvdW50cyBhcyBhIHF1b3RlKS4KLXN0ZGluOgotCWE9YgotCWNhdCA8PCAiRVwkYSIKLQloaQotCWgkYQotCWhcJGEKLQloYgotCWhcYgotCUUkYQotCWVjaG8gZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JaCRhCi0JaFwkYQotCWhiCi0JaFxiCi0JZG9uZQotLS0tCi1uYW1lOiBoZXJlZG9jLTlhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGhlcmUgc3RyaW5ncyB3b3JrLgotc3RkaW46Ci0JYmFyPSJiYXIKLQkJYmF6IgotCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PGZvbwotCSIkX19wcm9nbmFtZSIgLWMgInRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PGZvbyIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwiJGJhciIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwnJGJhcicKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxcJGJhcgotCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PC1mb28KLWV4cGVjdGVkLXN0ZG91dDoKLQlzYmIKLQlzYmIKLQlvbmUKLQkJb25tCi0JJG9uZQotCSRvbmUKLQktc2JiCi0tLS0KLW5hbWU6IGhlcmVkb2MtOWIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYSBjb3JuZXIgY2FzZSBvZiBoZXJlIHN0cmluZ3Mgd29ya3MgbGlrZSBiYXNoCi1zdGRpbjoKLQlmbm9yZD00MgotCWJhcj0iYmFyCi0JCSBcJGZub3JkIGJheiIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwkYmFyCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb25lICRzYWJlcSBvbm0KLWNhdGVnb3J5OiBiYXNoCi0tLS0KLW5hbWU6IGhlcmVkb2MtOWMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYSBjb3JuZXIgY2FzZSBvZiBoZXJlIHN0cmluZ3Mgd29ya3MgbGlrZSBrc2g5MywgenNoCi1zdGRpbjoKLQlmbm9yZD00MgotCWJhcj0iYmFyCi0JCSBcJGZub3JkIGJheiIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwkYmFyCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb25lCi0JCSAkc2FiZXEgb25tCi0tLS0KLW5hbWU6IGhlcmVkb2MtOWQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGFub3RoZXIgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzCi1zdGRpbjoKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwgYmFyCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb25lCi0tLS0KLW5hbWU6IGhlcmVkb2MtcXVvdGluZy11bnN1YnN0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBxdW90ZWQgY2hhcmFjdGVycyBpbgotCWhlcmUgZG9jdW1lbnRzIHdpdGhvdXQgc3Vic3RpdHV0aW9uIChtYXJrZXIgaXMgcXVvdGVkKS4KLXN0ZGluOgotCWZvbz1iYXIKLQljYXQgPDwtJ0VPRicKLQkJeCAiIFwiIFwgXFwgJCBcJCBgZWNobyBiYXpgIFxgZWNobyBiYXpcYCAkZm9vIFwkZm9vIHgKLQlFT0YKLWV4cGVjdGVkLXN0ZG91dDoKLQl4ICIgXCIgXCBcXCAkIFwkIGBlY2hvIGJhemAgXGBlY2hvIGJhelxgICRmb28gXCRmb28geAotLS0tCi1uYW1lOiBoZXJlZG9jLXF1b3Rpbmctc3Vic3QKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIHF1b3RlZCBjaGFyYWN0ZXJzIGluCi0JaGVyZSBkb2N1bWVudHMgd2l0aCBzdWJzdGl0dXRpb24gKG1hcmtlciBpcyBub3QgcXVvdGVkKS4KLXN0ZGluOgotCWZvbz1iYXIKLQljYXQgPDwtRU9GCi0JCXggIiBcIiBcIFxcICQgXCQgYGVjaG8gYmF6YCBcYGVjaG8gYmF6XGAgJGZvbyBcJGZvbyB4Ci0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JeCAiIFwiIFwgXCAkICQgYmF6IGBlY2hvIGJhemAgYmFyICRmb28geAotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCi0JSGVyZWRvYyBpbiBzaW1wbGUgY29tbWFuZC4KLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JCWNhdCA8PC0gRU9GCi0JCWhpCi0JCUVPRgotCQlmb3IgaSBpbiBhIGIgOyBkbwotCQkJY2F0IDw8LSBFT0YKLQkJCW1vcmUKLQkJCUVPRgotCQlkb25lCi0JICAgICcgJgotCXNsZWVwIDEKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCW1vcmUKLQltb3JlCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCi0JSGVyZWRvYyBpbiBmdW5jdGlvbiwgbXVsdGlwbGUgY2FsbHMgdG8gZnVuY3Rpb24uCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCWV2YWwgJwotCQlmb28oKSB7Ci0JCQljYXQgPDwtIEVPRgotCQkJaGkKLQkJCUVPRgotCQl9Ci0JCWZvbwotCQlmb28KLQkgICAgJyAmCi0Jc2xlZXAgMQotCWVjaG8gTGVmdCBvdmVyczogKgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JaGkKLQlMZWZ0IG92ZXJzOiAqCi0tLS0KLW5hbWU6IGhlcmVkb2MtdG1wZmlsZS0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KLQlIZXJlZG9jIGluIGZ1bmN0aW9uIGluIGxvb3AsIG11bHRpcGxlIGNhbGxzIHRvIGZ1bmN0aW9uLgotc3RkaW46Ci0JVE1QRElSPSRQV0QKLQlldmFsICcKLQkJZm9vKCkgewotCQkJY2F0IDw8LSBFT0YKLQkJCWhpCi0JCQlFT0YKLQkJfQotCQlmb3IgaSBpbiBhIGI7IGRvCi0JCQlmb28KLQkJCWZvbygpIHsKLQkJCQljYXQgPDwtIEVPRgotCQkJCWZvbGtzICRpCi0JCQkJRU9GCi0JCQl9Ci0JCWRvbmUKLQkJZm9vCi0JICAgICcgJgotCXNsZWVwIDEKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWZvbGtzIGIKLQlmb2xrcyBiCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCi0JQmFja2dyb3VuZGVkIHNpbXBsZSBjb21tYW5kIHdpdGggaGVyZSBkb2MKLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JCWNhdCA8PC0gRU9GICYKLQkJaGkKLQkJRU9GCi0JICAgICcgJgotCXNsZWVwIDEKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTUKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUJhY2tncm91bmRlZCBzdWJzaGVsbCBjb21tYW5kIHdpdGggaGVyZSBkb2MKLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JICAgICAgKAotCQlzbGVlcCAxCSMgc28gcGFyZW50IGV4aXRzCi0JCWVjaG8gQQotCQljYXQgPDwtIEVPRgotCQloaQotCQlFT0YKLQkJZWNobyBCCi0JICAgICAgKSAmCi0JICAgICcgJgotCXNsZWVwIDIKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQlBCi0JaGkKLQlCCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtNgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCi0JSGVyZWRvYyBpbiBwaXBlbGluZS4KLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JCWNhdCA8PC0gRU9GIHwgc2VkICJzL2hpL0hJLyIKLQkJaGkKLQkJRU9GCi0JICAgICcgJgotCXNsZWVwIDEKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQlISQotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUhlcmVkb2MgaW4gYmFja2dyb3VuZGVkIHBpcGVsaW5lLgotc3RkaW46Ci0JVE1QRElSPSRQV0QKLQlldmFsICcKLQkJY2F0IDw8LSBFT0YgfCBzZWQgJ3MvaGkvSEkvJyAmCi0JCWhpCi0JCUVPRgotCSAgICAnICYKLQlzbGVlcCAxCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JSEkKLQlMZWZ0IG92ZXJzOiAqCi0tLS0KLW5hbWU6IGhlcmVkb2MtdG1wZmlsZS04Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28KLQlsYXRlLiBIZXJlZG9jIGluIGZ1bmN0aW9uLCBiYWNrZ3JvdW5kZWQgY2FsbCB0byBmdW5jdGlvbi4KLQlUaGlzIGNoZWNrIGNhbiBmYWlsIG9uIHNsb3cgbWFjaGluZXMgKDwxMDAgTUh6KSwgb3IgQ3lnd2luLAotCXRoYXQncyBub3JtYWwuCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCSMgQmFja2dyb3VuZCBldmFsIHNvIG1haW4gc2hlbGwgZG9lc24ndCBkbyBwYXJzaW5nCi0JZXZhbCAnCi0JCWZvbygpIHsKLQkJCWNhdCA8PC0gRU9GCi0JCQloaQotCQkJRU9GCi0JCX0KLQkJZm9vCi0JCSMgc2xlZXAgc28gZXZhbCBjYW4gZGllCi0JCShzbGVlcCAxOyBmb28pICYKLQkJKHNsZWVwIDE7IGZvbykgJgotCQlmb28KLQkgICAgJyAmCi0Jc2xlZXAgMgotCWVjaG8gTGVmdCBvdmVyczogKgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JaGkKLQloaQotCWhpCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoaXN0b3J5LWJhc2ljCi1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgd2UgY2FuIHRlc3QgaGlzdG9yeSBhdCBhbGwKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gaGkKLQlmYyAtbAotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JMQllY2hvIGhpCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1kdXBzCi1kZXNjcmlwdGlvbjoKLQlWZXJpZnkgZHVwbGljYXRlcyBhbmQgc3BhY2VzIGFyZSBub3QgZW50ZXJlZAotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBoaQotCSBlY2hvIHlvCi0JZWNobyBoaQotCWZjIC1sCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQl5bwotCWhpCi0JMQllY2hvIGhpCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS11bmxpbmsKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGJyb2tlbiBISVNURklMRXMgZG8gbm90IGNhdXNlIHRyb3VibGUKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWZvby9oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1maWxlLXNldHVwOiBkaXIgNzU1ICJmb28iCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZm9vL2hpc3QuZmlsZSIKLQlzb21ldGV4dAotdGltZS1saW1pdDogNQotcGVybC1zZXR1cDogY2htb2QoMDU1NSwgImZvbyIpOwotc3RkaW46Ci0JZWNobyBoaQotCWZjIC1sCi0JY2htb2QgMDc1NSBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCTEJZWNobyBoaQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLyguKmNhbm5vdCB1bmxpbmsgSElTVEZJTEUuKlxuKT9YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZS1taW51cy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBtb3JlIHJlY2VudCBjb21tYW5kIGlzIGV4ZWN1dGVkCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGhpCi0JZWNobyB0aGVyZQotCWZjIC1lIC0KLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCXRoZXJlCi0JdGhlcmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIHRoZXJlXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZS1taW51cy0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHJlcGVhdGVkIGNvbW1hbmQgaXMgcHJpbnRlZCBiZWZvcmUgY29tbWFuZAotCWlzIHJlLWV4ZWN1dGVkLgotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZXhlYyAyPiYxCi0JZWNobyBoaQotCWVjaG8gdGhlcmUKLQlmYyAtZSAtCi1leHBlY3RlZC1zdGRvdXQtcGF0dGVybjoKLQkvWCpoaVxuWCp0aGVyZVxuWCplY2hvIHRoZXJlXG50aGVyZVxuWCovCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1lLW1pbnVzLTMKLWRlc2NyaXB0aW9uOgotCWZjIC1lIC0gZmFpbHMgd2hlbiB0aGVyZSBpcyBubyBoaXN0b3J5Ci0JKGtzaDkzIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyB0aGlzIHRvIGZhaWwpCi0JKGtzaDg4IGxvb3BzIG9uIHRoaXMpCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQlmYyAtZSAtCi0JZWNobyBvawotZXhwZWN0ZWQtc3Rkb3V0OgotCW9rCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqLio6LipoaXN0b3J5LipcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1lLW1pbnVzLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmICJmYyAtZSAtIiBjb21tYW5kIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjCi0JZmMgLWUgLSB8IChyZWFkIHg7IGVjaG8gIkEgJHgiKQotCWVjaG8gb2sKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMKLQlBIGFiYwotCW9rCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBhYmNcblgqLwotLS0tCi1uYW1lOiBoaXN0b3J5LWUtbWludXMtNQotZGVzY3JpcHRpb246Ci0JZmMgaXMgcmVwbGFjZWQgaW4gaGlzdG9yeSBieSBuZXcgY29tbWFuZC4KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWVjaG8gZ2hpIGprbAotCToKLQlmYyAtZSAtIGVjaG8KLQlmYyAtbCAyIDUKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JZ2hpIGprbAotCWdoaSBqa2wKLQkyCWVjaG8gZ2hpIGprbAotCTMJOgotCTQJZWNobyBnaGkgamtsCi0JNQlmYyAtbCAyIDUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIGdoaSBqa2xcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LTEKLWRlc2NyaXB0aW9uOgotCUxpc3QgbGlzdHMgY29ycmVjdCByYW5nZQotCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQlmYyAtbCAtLSAtMgotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCTIJZWNobyBsaW5lIDIKLQkzCWVjaG8gbGluZSAzCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LTIKLWRlc2NyaXB0aW9uOgotCUxpc3RzIG9sZGVzdCBoaXN0b3J5IGlmIGdpdmVuIHByZS1oaXN0b3JpYyBudW1iZXIKLQkoa3NoOTMgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIHRoaXMgdG8gZmFpbCkKLQkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZmMgLWwgLS0gLTQwCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyCi0JbGluZSAzCi0JMQllY2hvIGxpbmUgMQotCTIJZWNobyBsaW5lIDIKLQkzCWVjaG8gbGluZSAzCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LTMKLWRlc2NyaXB0aW9uOgotCUNhbiBnaXZlIG51bWJlciAnb3B0aW9ucycgdG8gZmMKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZmMgLWwgLTMgLTIKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQkyCWVjaG8gbGluZSAyCi0JMwllY2hvIGxpbmUgMwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC00Ci1kZXNjcmlwdGlvbjoKLQktMSByZWZlcnMgdG8gcHJldmlvdXMgY29tbWFuZAotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQlmYyAtbCAtMSAtMQotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCTQJZWNobyBsaW5lIDQKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWxpc3QtNQotZGVzY3JpcHRpb246Ci0JTGlzdCBjb21tYW5kIHN0YXlzIGluIGhpc3RvcnkKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZmMgLWwgLTEgLTEKLQlmYyAtbCAtMiAtMQotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCTQJZWNobyBsaW5lIDQKLQk0CWVjaG8gbGluZSA0Ci0JNQlmYyAtbCAtMSAtMQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC02Ci1kZXNjcmlwdGlvbjoKLQlISVNUU0laRSBsaW1pdHMgYWJvdXQgb2YgaGlzdG9yeSBrZXB0LgotCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhSElTVFNJWkU9MyEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZWNobyBsaW5lIDUKLQlmYyAtbAotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCWxpbmUgNQotCTQJZWNobyBsaW5lIDQKLQk1CWVjaG8gbGluZSA1Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LTcKLWRlc2NyaXB0aW9uOgotCWZjIGFsbG93cyB0b28gb2xkL25ldyBlcnJvcnMgaW4gcmFuZ2Ugc3BlY2lmaWNhdGlvbgotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIUhJU1RTSVpFPTMhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWVjaG8gbGluZSA1Ci0JZmMgLWwgMSAzMAotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCWxpbmUgNQotCTQJZWNobyBsaW5lIDQKLQk1CWVjaG8gbGluZSA1Ci0JNglmYyAtbCAxIDMwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LXItMQotZGVzY3JpcHRpb246Ci0JdGVzdCAtciBmbGFnIGluIGhpc3RvcnkKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZWNobyBsaW5lIDUKLQlmYyAtbCAtciAyIDQKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQlsaW5lIDUKLQk0CWVjaG8gbGluZSA0Ci0JMwllY2hvIGxpbmUgMwotCTIJZWNobyBsaW5lIDIKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWxpc3Qtci0yCi1kZXNjcmlwdGlvbjoKLQlJZiBmaXJzdCBpcyBuZXdlciB0aGFuIGxhc3QsIC1yIGlzIGltcGxpZWQuCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWVjaG8gbGluZSA1Ci0JZmMgLWwgNCAyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyCi0JbGluZSAzCi0JbGluZSA0Ci0JbGluZSA1Ci0JNAllY2hvIGxpbmUgNAotCTMJZWNobyBsaW5lIDMKLQkyCWVjaG8gbGluZSAyCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LXItMwotZGVzY3JpcHRpb246Ci0JSWYgZmlyc3QgaXMgbmV3ZXIgdGhhbiBsYXN0LCAtciBpcyBjYW5jZWxsZWQuCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWVjaG8gbGluZSA1Ci0JZmMgLWwgLXIgNCAyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyCi0JbGluZSAzCi0JbGluZSA0Ci0JbGluZSA1Ci0JMgllY2hvIGxpbmUgMgotCTMJZWNobyBsaW5lIDMKLQk0CWVjaG8gbGluZSA0Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1zdWJzdC0xCi1kZXNjcmlwdGlvbjoKLQlCYXNpYyBzdWJzdGl0dXRpb24KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWVjaG8gZ2hpIGprbAotCWZjIC1lIC0gYWJjPUFCICdlY2hvIGEnCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCWdoaSBqa2wKLQlBQiBkZWYKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIEFCIGRlZlxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LXN1YnN0LTIKLWRlc2NyaXB0aW9uOgotCURvZXMgc3Vic3QgZmluZCBwcmV2aW91cyBjb21tYW5kPwotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBhYmMgZGVmCi0JZWNobyBnaGkgamtsCi0JZmMgLWUgLSBqa2w9WFlaUVJUICdlY2hvIGcnCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCWdoaSBqa2wKLQlnaGkgWFlaUVJUCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBnaGkgWFlaUVJUXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3Rvcnktc3Vic3QtMwotZGVzY3JpcHRpb246Ci0JRG9lcyBzdWJzdCBmaW5kIHByZXZpb3VzIGNvbW1hbmQgd2hlbiBubyBhcmd1bWVudHMgZ2l2ZW4KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWVjaG8gZ2hpIGprbAotCWZjIC1lIC0gamtsPVhZWlFSVAotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYKLQlnaGkgamtsCi0JZ2hpIFhZWlFSVAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gZ2hpIFhZWlFSVFxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LXN1YnN0LTQKLWRlc2NyaXB0aW9uOgotCUdsb2JhbCBzdWJzdGl0dXRpb25zIHdvcmsKLQkoa3NoODggYW5kIGtzaDkzIGRvIG5vdCBoYXZlIC1nIG9wdGlvbikKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZiBhc2pqIHNhZGpoYXNkamggYXNkamhhc2QKLQlmYyAtZSAtIC1nIGE9Rm9vQkFSCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZiBhc2pqIHNhZGpoYXNkamggYXNkamhhc2QKLQlGb29CQVJiYyBkZWYgRm9vQkFSc2pqIHNGb29CQVJkamhGb29CQVJzZGpoIEZvb0JBUnNkamhGb29CQVJzZAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gRm9vQkFSYmMgZGVmIEZvb0JBUnNqaiBzRm9vQkFSZGpoRm9vQkFSc2RqaCBGb29CQVJzZGpoRm9vQkFSc2RcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1zdWJzdC01Ci1kZXNjcmlwdGlvbjoKLQlNYWtlIHN1cmUgc2VhcmNoZXMgZG9uJ3QgZmluZCBjdXJyZW50IChmYykgY29tbWFuZAotCShrc2g4OC9rc2g5MyBkb24ndCBoYXZlIHRoZSA/IHByZWZpeCB0aGluZyBzbyB0aGV5IGZhaWwgdGhpcyB0ZXN0KQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBhYmMgZGVmCi0JZWNobyBnaGkgamtsCi0JZmMgLWUgLSBhYmM9QUIgXD9hYmMKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JZ2hpIGprbAotCUFCIGRlZgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gQUIgZGVmXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZWQtMS1vbGQKLWRlc2NyaXB0aW9uOgotCUJhc2ljIChlZCkgZWRpdGluZyB3b3JrcyAoYXNzdW1lcyB5b3UgaGF2ZSBnZW5lcmljIGVkIGVkaXRvcgotCXRoYXQgcHJpbnRzIG5vIHByb21wdHMpLiBUaGlzIGlzIGZvciBvbGRpc2ggZWQoMSkgd2hpY2ggd3JpdGUKLQl0aGUgY2hhcmFjdGVyIGNvdW50IHRvIHN0ZG91dC4KLWNhdGVnb3J5OiBzdGRvdXQtZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWZjIGVjaG8KLQlzL2FiYy9GT09CQVIvCi0JdwotCXEKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JMTMKLQkxNgotCUZPT0JBUiBkZWYKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIEZPT0JBUiBkZWZcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1lZC0yLW9sZAotZGVzY3JpcHRpb246Ci0JQ29ycmVjdCBjb21tYW5kIGlzIGVkaXRlZCB3aGVuIG51bWJlciBnaXZlbgotY2F0ZWdvcnk6IHN0ZG91dC1lZAotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMiBpcyBoZXJlCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWZjIDIKLQlzL2lzIGhlcmUvaXMgY2hhbmdlZC8KLQl3Ci0JcQotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMiBpcyBoZXJlCi0JbGluZSAzCi0JbGluZSA0Ci0JMjAKLQkyMwotCWxpbmUgMiBpcyBjaGFuZ2VkCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBsaW5lIDIgaXMgY2hhbmdlZFxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWVkLTMtb2xkCi1kZXNjcmlwdGlvbjoKLQlOZXdseSBjcmVhdGVkIG11bHRpIGxpbmUgY29tbWFuZHMgc2hvdyB1cCBhcyBzaW5nbGUgY29tbWFuZAotCWluIGhpc3RvcnkuCi0JKE5PVEU6IGFkanVzdGVkIGZvciBDT01QTEVYIEhJU1RPUlkgY29tcGlsZSB0aW1lIG9wdGlvbikKLQkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQotY2F0ZWdvcnk6IHN0ZG91dC1lZAotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBhYmMgZGVmCi0JZmMgZWNobwotCXMvYWJjL0ZPT0JBUi8KLQkkYQotCWVjaG8gYSBuZXcgbGluZQotCS4KLQl3Ci0JcQotCWZjIC1sCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCTEzCi0JMzIKLQlGT09CQVIgZGVmCi0JYSBuZXcgbGluZQotCTEJZWNobyBhYmMgZGVmCi0JMgllY2hvIEZPT0JBUiBkZWYKLQkzCWVjaG8gYSBuZXcgbGluZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gRk9PQkFSIGRlZlxuZWNobyBhIG5ldyBsaW5lXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZWQtMQotZGVzY3JpcHRpb246Ci0JQmFzaWMgKGVkKSBlZGl0aW5nIHdvcmtzIChhc3N1bWVzIHlvdSBoYXZlIGdlbmVyaWMgZWQgZWRpdG9yCi0JdGhhdCBwcmludHMgbm8gcHJvbXB0cykuIFRoaXMgaXMgZm9yIG5ld2lzaCBlZCgxKSBhbmQgc3RkZXJyLgotY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWZjIGVjaG8KLQlzL2FiYy9GT09CQVIvCi0JdwotCXEKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JRk9PQkFSIGRlZgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKjEzXG4xNlxuZWNobyBGT09CQVIgZGVmXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZWQtMgotZGVzY3JpcHRpb246Ci0JQ29ycmVjdCBjb21tYW5kIGlzIGVkaXRlZCB3aGVuIG51bWJlciBnaXZlbgotY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIgaXMgaGVyZQotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQlmYyAyCi0Jcy9pcyBoZXJlL2lzIGNoYW5nZWQvCi0JdwotCXEKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIgaXMgaGVyZQotCWxpbmUgMwotCWxpbmUgNAotCWxpbmUgMiBpcyBjaGFuZ2VkCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqMjBcbjIzXG5lY2hvIGxpbmUgMiBpcyBjaGFuZ2VkXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZWQtMwotZGVzY3JpcHRpb246Ci0JTmV3bHkgY3JlYXRlZCBtdWx0aSBsaW5lIGNvbW1hbmRzIHNob3cgdXAgYXMgc2luZ2xlIGNvbW1hbmQKLQlpbiBoaXN0b3J5LgotY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWZjIGVjaG8KLQlzL2FiYy9GT09CQVIvCi0JJGEKLQllY2hvIGEgbmV3IGxpbmUKLQkuCi0JdwotCXEKLQlmYyAtbAotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYKLQlGT09CQVIgZGVmCi0JYSBuZXcgbGluZQotCTEJZWNobyBhYmMgZGVmCi0JMgllY2hvIEZPT0JBUiBkZWYKLQkzCWVjaG8gYSBuZXcgbGluZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKjEzXG4zMlxuZWNobyBGT09CQVIgZGVmXG5lY2hvIGEgbmV3IGxpbmVcblgqJC8KLS0tLQotbmFtZTogSUZTLXNwYWNlLTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBkZWZhdWx0IElGUwotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlzZXQgLS0gQSBCIEMKLQlzaG93YXJncyAxICQqCi0Jc2hvd2FyZ3MgMiAiJCoiCi0Jc2hvd2FyZ3MgMyAkQAotCXNob3dhcmdzIDQgIiRAIgotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8MT4gPEE+IDxCPiA8Qz4KLQkgPDI+IDxBIEIgQz4KLQkgPDM+IDxBPiA8Qj4gPEM+Ci0JIDw0PiA8QT4gPEI+IDxDPgotLS0tCi1uYW1lOiBJRlMtY29sb24tMQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz06Ci1zdGRpbjoKLQlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQotCUlGUz06Ci0Jc2V0IC0tIEEgQiBDCi0Jc2hvd2FyZ3MgMSAkKgotCXNob3dhcmdzIDIgIiQqIgotCXNob3dhcmdzIDMgJEAKLQlzaG93YXJncyA0ICIkQCIKLWV4cGVjdGVkLXN0ZG91dDoKLQkgPDE+IDxBPiA8Qj4gPEM+Ci0JIDwyPiA8QTpCOkM+Ci0JIDwzPiA8QT4gPEI+IDxDPgotCSA8ND4gPEE+IDxCPiA8Qz4KLS0tLQotbmFtZTogSUZTLW51bGwtMQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz0iIgotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlJRlM9IiIKLQlzZXQgLS0gQSBCIEMKLQlzaG93YXJncyAxICQqCi0Jc2hvd2FyZ3MgMiAiJCoiCi0Jc2hvd2FyZ3MgMyAkQAotCXNob3dhcmdzIDQgIiRAIgotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8MT4gPEEgQiBDPgotCSA8Mj4gPEFCQz4KLQkgPDM+IDxBIEIgQz4KLQkgPDQ+IDxBIEIgQz4KLS0tLQotbmFtZTogSUZTLXNwYWNlLWNvbG9uLTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIkSUZTOiIKLQlzZXQgLS0KLQlzaG93YXJncyAxICQqCi0Jc2hvd2FyZ3MgMiAiJCoiCi0Jc2hvd2FyZ3MgMyAkQAotCXNob3dhcmdzIDQgIiRAIgotCXNob3dhcmdzIDUgOiAiJEAiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JIDwxPgotCSA8Mj4gPD4KLQkgPDM+Ci0JIDw0PgotCSA8NT4gPDo+Ci0tLS0KLW5hbWU6IElGUy1zcGFjZS1jb2xvbi0yCi1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46Ci0JQVQmVCBrc2ggZmFpbHMgdGhpcywgUE9TSVggc2F5cyB0aGUgdGVzdCBpcyBjb3JyZWN0Lgotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlJRlM9IiRJRlM6IgotCXNldCAtLQotCXNob3dhcmdzIDoiJEAiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JIDw6PgotLS0tCi1uYW1lOiBJRlMtc3BhY2UtY29sb24tMwotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgotCXBka3NoIGZhaWxzIGJvdGggb2YgdGhlc2UgdGVzdHMKLQlub3Qgc3VyZSB3aGV0aGVyICMyIGlzIGNvcnJlY3QKLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIkSUZTOiIKLQl4PQotCXNldCAtLQotCXNob3dhcmdzICIkeCRAIiAxCi0Jc2hvd2FyZ3MgIiRAJHgiIDIKLWV4cGVjdGVkLWZhaWw6IHllcwotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8PiA8MT4KLQkgPD4gPDI+Ci0tLS0KLW5hbWU6IElGUy1zcGFjZS1jb2xvbi00Ci1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46Ci1zdGRpbjoKLQlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQotCUlGUz0iJElGUzoiCi0Jc2V0IC0tCi0Jc2hvd2FyZ3MgIiRAJEAiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JCi0tLS0KLW5hbWU6IElGUy1zcGFjZS1jb2xvbi01Ci1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46Ci0JRG9uJ3Qga25vdyB3aGF0IFBPU0lYIHRoaW5rcyBvZiB0aGlzLiAgQVQmVCBrc2ggZG9lcyBub3QgZG8gdGhpcy4KLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIkSUZTOiIKLQlzZXQgLS0KLQlzaG93YXJncyAiJHtAOi19IgotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8PgotLS0tCi1uYW1lOiBJRlMtc3Vic3QtMQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+Ogotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlJRlM9IiRJRlM6IgotCXg9IjpiOiA6IgotCWVjaG8gLW4gJzE6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCWVjaG8gLW4gJzI6JzsgZm9yIGkgaW4gOmI6OiA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCi0Jc2hvd2FyZ3MgMyAkeAotCXNob3dhcmdzIDQgOmI6OgotCXg9ImE6YjoiCi0JZWNobyAtbiAnNTonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCi0Jc2hvd2FyZ3MgNiAkeAotCXg9ImE6OmMiCi0JZWNobyAtbiAnNzonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCi0Jc2hvd2FyZ3MgOCAkeAotCWVjaG8gLW4gJzk6JzsgZm9yIGkgaW4gJHtGT08tYGVjaG8gLW4gaDppYHRoOmVyZX0gOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCXNob3dhcmdzIDEwICR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9Ci0Jc2hvd2FyZ3MgMTEgIiR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9IgotCXg9IiBBIDogIEI6OkQiCi0JZWNobyAtbiAnMTI6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCXNob3dhcmdzIDEzICR4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMTogW10gW2JdIFtdCi0JMjogWzpiOjpdCi0JIDwzPiA8PiA8Yj4gPD4KLQkgPDQ+IDw6Yjo6PgotCTU6IFthXSBbYl0KLQkgPDY+IDxhPiA8Yj4KLQk3OiBbYV0gW10gW2NdCi0JIDw4PiA8YT4gPD4gPGM+Ci0JOTogW2hdIFtpdGhdIFtlcmVdCi0JIDwxMD4gPGg+IDxpdGg+IDxlcmU+Ci0JIDwxMT4gPGg6aXRoOmVyZT4KLQkxMjogW0FdIFtCXSBbXSBbRF0KLQkgPDEzPiA8QT4gPEI+IDw+IDxEPgotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTEKLWRlc2NyaXB0aW9uOgotCUNhbid0IGhhdmUgMCBiYXNlIChjYXVzZXMgc2hlbGwgdG8gZXhpdCkKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotc3RkaW46Ci0JdHlwZXNldCAtaSBpCi0JaT0zCi0JaT0wIzQKLQllY2hvICRpCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXi4qOi4qMCM0LipcbiQvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1lcnItMgotZGVzY3JpcHRpb246Ci0JQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBiYXNlcyBpbiBhICdjb25zdGFudCcgKGNhdXNlcyBzaGVsbCB0byBleGl0KQotCShrc2g4OCBmYWlscyB0aGlzIHRlc3QpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLXN0ZGluOgotCXR5cGVzZXQgLWkgaQotCWk9MwotCWk9MiMxMTAjMTEKLQllY2hvICRpCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXi4qOi4qMiMxMTAjMTEuKlxuJC8KLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLWVyci0zCi1kZXNjcmlwdGlvbjoKLQlTeW50YXggZXJyb3JzIGluIGV4cHJlc3Npb25zIGFuZCBlZmZlY3RzIG9uIGJhc2VzCi0JKGludGVyYWN0aXZlIHNvIGVycm9ycyBkb24ndCBjYXVzZSBleGl0cykKLQkoa3NoODggZmFpbHMgdGhpcyB0ZXN0IC0gc2hlbGwgZXhpdHMsIGV2ZW4gd2l0aCAtaSkKLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JUFMxPSAjIG1pbmltaXNlIHByb21wdCBoYXNzbGVzCi0JdHlwZXNldCAtaTQgYT0xMAotCXR5cGVzZXQgLWkgYT0yKwotCWVjaG8gJGEKLQl0eXBlc2V0IC1pNCBhPTEwCi0JdHlwZXNldCAtaTIgYT0yKwotCWVjaG8gJGEKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eKFsjXCRdICk/Lio6LioyKy4qXG4uKjouKjIrLipcbiQvCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNCMyMgotCTQjMjIKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLWVyci00Ci1kZXNjcmlwdGlvbjoKLQlBcmUgaW52YWxpZCBkaWdpdHMgKGFjY29yZGluZyB0byBiYXNlKSBlcnJvcnM/Ci0JKGtzaDkzIGZhaWxzIHRoaXMgdGVzdCkKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotc3RkaW46Ci0JdHlwZXNldCAtaSBpOwotCWk9MyM0Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXihbI1wkXSApPy4qOi4qMyM0LipcbiQvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS0xCi1kZXNjcmlwdGlvbjoKLQlNaXNzaW5nIG51bWJlciBhZnRlciBiYXNlIGlzIHRyZWF0ZWQgYXMgMC4KLXN0ZGluOgotCXR5cGVzZXQgLWkgaQotCWk9MwotCWk9MiMKLQllY2hvICRpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgJ3N0aWNreW5lc3MnIG9mIGJhc2UgaW4gdmFyaW91cyBzaXR1YXRpb25zCi1zdGRpbjoKLQl0eXBlc2V0IC1pIGk9OAotCWVjaG8gJGkKLQllY2hvIC0tLS0tLS0tLS0gQQotCXR5cGVzZXQgLWk0IGo9OAotCWVjaG8gJGoKLQllY2hvIC0tLS0tLS0tLS0gQgotCXR5cGVzZXQgLWkgaz04Ci0JdHlwZXNldCAtaTQgaz04Ci0JZWNobyAkawotCWVjaG8gLS0tLS0tLS0tLSBDCi0JdHlwZXNldCAtaTQgbAotCWw9MyMxMAotCWVjaG8gJGwKLQllY2hvIC0tLS0tLS0tLS0gRAotCXR5cGVzZXQgLWkgbQotCW09MyMxMAotCWVjaG8gJG0KLQllY2hvIC0tLS0tLS0tLS0gRQotCW49MiMxMQotCXR5cGVzZXQgLWkgbgotCWVjaG8gJG4KLQluPTEwCi0JZWNobyAkbgotCWVjaG8gLS0tLS0tLS0tLSBGCi0JdHlwZXNldCAtaTggbz0xMgotCXR5cGVzZXQgLWk0IG8KLQllY2hvICRvCi0JZWNobyAtLS0tLS0tLS0tIEcKLQl0eXBlc2V0IC1pIHAKLQlsZXQgcD04IzEyCi0JZWNobyAkcAotZXhwZWN0ZWQtc3Rkb3V0OgotCTgKLQktLS0tLS0tLS0tIEEKLQk0IzIwCi0JLS0tLS0tLS0tLSBCCi0JNCMyMAotCS0tLS0tLS0tLS0gQwotCTQjMwotCS0tLS0tLS0tLS0gRAotCTMjMTAKLQktLS0tLS0tLS0tIEUKLQkyIzExCi0JMiMxMDEwCi0JLS0tLS0tLS0tLSBGCi0JNCMzMAotCS0tLS0tLS0tLS0gRwotCTgjMTIKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLTMKLWRlc2NyaXB0aW9uOgotCU1vcmUgYmFzZSBwYXJzaW5nIChobW0gZG9lc24ndCB0ZXN0IG11Y2guLikKLXN0ZGluOgotCXR5cGVzZXQgLWkgYWEKLQlhYT0xKzEyIzEwKzIKLQllY2hvICRhYQotCXR5cGVzZXQgLWkgYmIKLQliYj0xKyRhYQotCWVjaG8gJGJiCi0JdHlwZXNldCAtaSBiYgotCWJiPSRhYQotCWVjaG8gJGJiCi0JdHlwZXNldCAtaSBjYwotCWNjPSRhYQotCWVjaG8gJGNjCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMTUKLQkxNgotCTE1Ci0JMTUKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhpbmdzIG5vdCBkZWNsYXJlZCBhcyBpbnRlZ2VycyBhcmUgbm90IG1hZGUgaW50ZWdlcnMsCi0JYWxzbywgY2hlY2sgaWYgYmFzZSBpcyBub3QgcmVzZXQgYnkgLWkgd2l0aCBubyBhcmd1bWVudHMuCi0JKGtzaDkzIGZhaWxzIC0gcHJpbnRzIDEwIzIwIC0gZ28gZmlndXJlKQotc3RkaW46Ci0JeHg9MjAKLQlsZXQgeHg9MTAKLQl0eXBlc2V0IC1pIHwgZ3JlcCAnXnh4PScKLQl0eXBlc2V0IC1pNCBhPTEwCi0JdHlwZXNldCAtaSBhPTIwCi0JZWNobyAkYQotZXhwZWN0ZWQtc3Rkb3V0OgotCTQjMTEwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS01Ci1kZXNjcmlwdGlvbjoKLQlNb3JlIGJhc2Ugc3R1ZmYKLXN0ZGluOgotCXR5cGVzZXQgLWk0IGE9MyMxMAotCWVjaG8gJGEKLQllY2hvIC0tCi0JdHlwZXNldCAtaSBqPTMKLQlqPSd+MycKLQllY2hvICRqCi0JZWNobyAtLQotCXR5cGVzZXQgLWkgaz0xCi0JeFtrPWsrMV09MwotCWVjaG8gJGsKLQllY2hvIC0tCi0JdHlwZXNldCAtaSBsCi0JZm9yIGwgaW4gMSAyKzMgNDsgZG8gZWNobyAkbDsgZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCTQjMwotCS0tCi0JLTQKLQktLQotCTIKLQktLQotCTEKLQk1Ci0JNAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtNgotZGVzY3JpcHRpb246Ci0JRXZlbiBtb3JlIGJhc2Ugc3R1ZmYKLQkoa3NoOTMgZmFpbHMgdGhpcyB0ZXN0IC0gcHJpbnRzIDApCi1zdGRpbjoKLQl0eXBlc2V0IC1pNyBpCi0JaT0KLQllY2hvICRpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNyMwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IG5vbi1pbnRlZ2VyIHBhcmFtZXRlcnMgZG9uJ3QgZ2V0IGJhc2VzIGFzc2lnbmVkCi1zdGRpbjoKLQllY2hvICQoKCB6eiA9IDgjMTAwICkpCi0JZWNobyAkenoKLWV4cGVjdGVkLXN0ZG91dDoKLQk2NAotCTY0Ci0tLS0KLW5hbWU6IGxpbmVuby1zdGRpbgotZGVzY3JpcHRpb246Ci0JU2VlIGlmICRMSU5FTk8gaXMgdXBkYXRlZCBhbmQgY2FuIGJlIG1vZGlmaWVkLgotc3RkaW46Ci0JZWNobyBBICRMSU5FTk8KLQllY2hvIEIgJExJTkVOTwotCUxJTkVOTz0yMAotCWVjaG8gQyAkTElORU5PCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAxCi0JQiAyCi0JQyAyMAotLS0tCi1uYW1lOiBsaW5lbm8taW5jCi1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgJExJTkVOTyBpcyBzZXQgZm9yIC4nZCBmaWxlcy4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgotCWVjaG8gZG90IEEgJExJTkVOTwotCWVjaG8gZG90IEIgJExJTkVOTwotCUxJTkVOTz0yMAotCWVjaG8gZG90IEMgJExJTkVOTwotc3RkaW46Ci0JZWNobyBBICRMSU5FTk8KLQllY2hvIEIgJExJTkVOTwotCS4gLi9kb3RmaWxlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAxCi0JQiAyCi0JZG90IEEgMQotCWRvdCBCIDIKLQlkb3QgQyAyMAotLS0tCi1uYW1lOiBsaW5lbm8tZnVuYwotZGVzY3JpcHRpb246Ci0JU2VlIGlmICRMSU5FTk8gaXMgc2V0IGZvciBjb21tYW5kcyBpbiBhIGZ1bmN0aW9uLgotc3RkaW46Ci0JZWNobyBBICRMSU5FTk8KLQllY2hvIEIgJExJTkVOTwotCWJhcigpIHsKLQkgICAgZWNobyBmdW5jIEEgJExJTkVOTwotCSAgICBlY2hvIGZ1bmMgQiAkTElORU5PCi0JfQotCWJhcgotCWVjaG8gQyAkTElORU5PCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAxCi0JQiAyCi0JZnVuYyBBIDQKLQlmdW5jIEIgNQotCUMgOAotLS0tCi1uYW1lOiBsaW5lbm8tdW5zZXQKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiB1bnNldHRpbmcgTElORU5PIG1ha2VzIGl0IG5vbi1tYWdpYy4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgotCWVjaG8gZG90IEEgJExJTkVOTwotCWVjaG8gZG90IEIgJExJTkVOTwotc3RkaW46Ci0JdW5zZXQgTElORU5PCi0JZWNobyBBICRMSU5FTk8KLQllY2hvIEIgJExJTkVOTwotCWJhcigpIHsKLQkgICAgZWNobyBmdW5jIEEgJExJTkVOTwotCSAgICBlY2hvIGZ1bmMgQiAkTElORU5PCi0JfQotCWJhcgotCS4gLi9kb3RmaWxlCi0JZWNobyBDICRMSU5FTk8KLWV4cGVjdGVkLXN0ZG91dDoKLQlBCi0JQgotCWZ1bmMgQQotCWZ1bmMgQgotCWRvdCBBCi0JZG90IEIKLQlDCi0tLS0KLW5hbWU6IGxpbmVuby11bnNldC11c2UKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiB1bnNldHRpbmcgTElORU5PIG1ha2VzIGl0IG5vbi1tYWdpYyBldmVuCi0Jd2hlbiBpdCBpcyByZS11c2VkLgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImRvdGZpbGUiCi0JZWNobyBkb3QgQSAkTElORU5PCi0JZWNobyBkb3QgQiAkTElORU5PCi1zdGRpbjoKLQl1bnNldCBMSU5FTk8KLQlMSU5FTk89MwotCWVjaG8gQSAkTElORU5PCi0JZWNobyBCICRMSU5FTk8KLQliYXIoKSB7Ci0JICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KLQkgICAgZWNobyBmdW5jIEIgJExJTkVOTwotCX0KLQliYXIKLQkuIC4vZG90ZmlsZQotCWVjaG8gQyAkTElORU5PCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAzCi0JQiAzCi0JZnVuYyBBIDMKLQlmdW5jIEIgMwotCWRvdCBBIDMKLQlkb3QgQiAzCi0JQyAzCi0tLS0KLW5hbWU6IGxpbmVuby10cmFwCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBMSU5FTk8gaXMgdHJhY2tlZCBpbiB0cmFwcwotc3RkaW46Ci0JZmFpbCgpIHsKLQkJZWNobyAibGluZSA8JDE+IgotCQlleGl0IDEKLQl9Ci0JdHJhcCAnZmFpbCAkTElORU5PJyBJTlQgRVJSCi0JZmFsc2UKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDw2PgotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiByZWFkLUlGUy0xCi1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgZGVmYXVsdCBJRlMKLXN0ZGluOgotCWVjaG8gIkEgQiAiID4gSU4KLQl1bnNldCB4IHkgegotCXJlYWQgeCB5IHogPCBJTgotCWVjaG8gMTogInhbJHhdIHlbJHldIHpbJHpdIgotCWVjaG8gMWE6ICR7ei16IG5vdCBzZXR9Ci0JcmVhZCB4IDwgSU4KLQllY2hvIDI6ICJ4WyR4XSIKLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiB4W0FdIHlbQl0geltdCi0JMWE6Ci0JMjogeFtBIEJdCi0tLS0KLW5hbWU6IHJlYWQta3NoLTEKLWRlc2NyaXB0aW9uOgotCUlmIG5vIHZhciBzcGVjaWZpZWQsIFJFUExZIGlzIHVzZWQKLXN0ZGluOgotCWVjaG8gImFiYyIgPiBJTgotCXJlYWQgPCBJTgotCWVjaG8gIlskUkVQTFldIjsKLWV4cGVjdGVkLXN0ZG91dDoKLQlbYWJjXQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTEKLWRlc2NyaXB0aW9uOgotCUxleCBhcnJheSBjb2RlIGhhZCBwcm9ibGVtcyB3aXRoIHRoaXMuCi1zdGRpbjoKLQllY2hvIGZvb1sKLQluPWJhcgotCWVjaG8gImhpWyAkbiBdPTEiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZm9vWwotCWhpWyBiYXIgXT0xCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMgotZGVzY3JpcHRpb246Ci0JV2hlbiBQQVRIIGlzIHNldCBiZWZvcmUgcnVubmluZyBhIGNvbW1hbmQsIHRoZSBuZXcgcGF0aCBpcwotCW5vdCB1c2VkIGluIGRvaW5nIHRoZSBwYXRoIHNlYXJjaAotCQkkIGVjaG8gZWNobyBoaSA+IC90bXAvcSA7IGNobW9kIGErcnggL3RtcC9xCi0JCSQgUEFUSD0vdG1wIHEKLQkJcTogbm90IGZvdW5kCi0JCSQKLQlpbiBjb21leGVjKCkgdGhlIHR3byBsaW5lcwotCQl3aGlsZSAoKnZwICE9IE5VTEwpCi0JCQkodm9pZCkgdHlwZXNldCgqdnArKywgeHh4LCAwKTsKLQluZWVkIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgc3dpdGNoIHRvIGJlZm9yZSBmaW5kY29tKCkgaXMKLQljYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIHdpbGwgYnJlYWsuCi1zdGRpbjoKLQk6ICR7UFdEOi1gcHdkIDI+IC9kZXYvbnVsbGB9Ci0JOiAke1BXRDo/IlBXRCBub3Qgc2V0IC0gY2FuJ3QgZG8gdGVzdCJ9Ci0JbWtkaXIgWQotCWNhdCA+IFkveHh4c2NyaXB0IDw8IEVPRgotCSMhL2Jpbi9zaAotCSMgTmVlZCB0byByZXN0b3JlIHBhdGggc28gZWNobyBjYW4gYmUgZm91bmQgKHNvbWUgc2hlbGxzIGRvbid0IGhhdmUKLQkjIGl0IGFzIGEgYnVpbHQtaW4pCi0JUEFUSD1cJE9MRFBBVEgKLQllY2hvIGhpCi0JZXhpdCAwCi0JRU9GCi0JY2htb2QgYStyeCBZL3h4eHNjcmlwdAotCWV4cG9ydCBPTERQQVRIPSIkUEFUSCIKLQlQQVRIPSRQV0QvWSB4eHhzY3JpcHQKLQlleGl0ICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLS0tLQotbmFtZTogcmVncmVzc2lvbi02Ci1kZXNjcmlwdGlvbjoKLQlQYXJzaW5nIG9mICQoLi4pIGV4cHJlc3Npb25zIGlzIG5vbi1vcHRpbWFsLiAgSXQgaXMKLQlpbXBvc3NpYmxlIHRvIGhhdmUgYW55IHBhcmVudGhlc2VzIGluc2lkZSB0aGUgZXhwcmVzc2lvbi4KLQlJLmUuLAotCQkkIGtzaCAtYyAnZWNobyAkKGVjaG8gXCggKScKLQkJbm8gY2xvc2luZyBxdW90ZQotCQkkIGtzaCAtYyAnZWNobyAkKGVjaG8gIigiICknCi0JCW5vIGNsb3NpbmcgcXVvdGUKLQkJJAotCVRoZSBzb2x1dGlvbiBpcyB0byBoYWNrIHRoZSBwYXJzaW5nIGNsb2RlIGluIGxleC5jLCB0aGUKLQlxdWVzdGlvbiBpcyBob3cgdG8gaGFjayBpdDogc2hvdWxkIGFueSBwYXJlbnRoZXNlcyBiZQotCWVzY2FwZWQgYnkgYSBiYWNrc2xhc2gsIG9yIHNob3VsZCByZWN1cnNpdmUgcGFyc2luZyBiZSBkb25lCi0JKHNvIHF1b3RlcyBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gaGlkZSBoZW0pLiAgVGhlIGZvcm1lciBpcwotCWVhc2llciwgdGhlIGxhdGVyIGJldHRlci4uLgotc3RkaW46Ci0JZWNobyAkKGVjaG8gXCgpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JKAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTkKLWRlc2NyaXB0aW9uOgotCUNvbnRpbnVlIGluIGEgZm9yIGxvb3AgZG9lcyBub3Qgd29yayByaWdodDoKLQkJZm9yIGkgaW4gYSBiIGMgOyBkbwotCQkJaWYgWyAkaSA9IGIgXSA7IHRoZW4KLQkJCQljb250aW51ZQotCQkJZmkKLQkJCWVjaG8gJGkKLQkJZG9uZQotCVByaW50cyBhIGZvcmV2ZXIuLi4KLXN0ZGluOgotCWZpcnN0PXllcwotCWZvciBpIGluIGEgYiBjIDsgZG8KLQkJaWYgWyAkaSA9IGIgXSA7IHRoZW4KLQkJCWlmIFsgJGZpcnN0ID0gbm8gXSA7IHRoZW4KLQkJCQllY2hvICdjb250aW51ZSBpbiBmb3IgbG9vcCBicm9rZW4nCi0JCQkJYnJlYWsJIyBob3BlIGJyZWFrIGlzbid0IGJyb2tlbiB0b28gOi0pCi0JCQlmaQotCQkJZmlyc3Q9bm8KLQkJCWNvbnRpbnVlCi0JCWZpCi0JZG9uZQotCWVjaG8gYnllCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYnllCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMTAKLWRlc2NyaXB0aW9uOgotCVRoZSBmb2xsb3dpbmc6Ci0JCXNldCAtLSBgZmFsc2VgCi0JCWVjaG8gJD8KLQlzaG91bGQgcHJpbnQgMCBhY2NvcmRpbmcgdG8gUE9TSVggKGRhc2gsIGJhc2gsIGtzaDkzLCBwb3NoKQotCWJ1dCBub3QgMCBhY2NvcmRpbmcgdG8gdGhlIGdldG9wdCgxKSBtYW51YWwgcGFnZSwga3NoODgsIGFuZAotCUJvdXJuZSBzaCAoc3VjaCBhcyAvYmluL3NoIG9uIFNvbGFyaXMpLgotCUluIG1rc2ggUjM5Yiwgd2UgaG9ub3VyIFBPU0lYIGV4Y2VwdCB3aGVuIC1vIHNoIGlzIHNldC4KLXN0ZGluOgotCXNob3dmKCkgewotCQlbWyAtbyBwb3NpeCBdXTsgRlBPU0lYPSQoKDEtJD8pKQotCQlbWyAtbyBzaCBdXTsgRlNIPSQoKDEtJD8pKQotCQllY2hvIC1uICJGUE9TSVg9JEZQT1NJWCBGU0g9JEZTSCAiCi0JfQotCXNldCArbyBwb3NpeCArbyBzaAotCXNob3dmCi0Jc2V0IC0tIGBmYWxzZWAKLQllY2hvIHJ2PSQ/Ci0Jc2V0IC1vIHNoCi0Jc2hvd2YKLQlzZXQgLS0gYGZhbHNlYAotCWVjaG8gcnY9JD8KLQlzZXQgLW8gcG9zaXgKLQlzaG93ZgotCXNldCAtLSBgZmFsc2VgCi0JZWNobyBydj0kPwotZXhwZWN0ZWQtc3Rkb3V0OgotCUZQT1NJWD0wIEZTSD0wIHJ2PTAKLQlGUE9TSVg9MCBGU0g9MSBydj0xCi0JRlBPU0lYPTEgRlNIPTAgcnY9MAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTExCi1kZXNjcmlwdGlvbjoKLQlUaGUgZm9sbG93aW5nOgotCQl4PS9mb28vYmFyL2JsYWgKLQkJZWNobyAke3gjIyovfQotCXNob3VsZCBlY2hvIGJsYWggYnV0IG9uIHNvbWUgbWFjaGluZXMgZWNob3MgL2Zvby9iYXIvYmxhaC4KLXN0ZGluOgotCXg9L2Zvby9iYXIvYmxhaAotCWVjaG8gJHt4IyMqL30KLWV4cGVjdGVkLXN0ZG91dDoKLQlibGFoCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMTIKLWRlc2NyaXB0aW9uOgotCUJvdGggb2YgdGhlIGZvbGxvd2luZyBlY2hvcyBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dCB1bmRlciBzaC9rc2guYXR0OgotCQkjIS9iaW4vc2gKLQkJeD0iZm9vCWJhciIKLQkJZWNobyAiYGVjaG8gXCIkeFwiYCIKLQkJZWNobyAiYGVjaG8gIiR4ImAiCi0JcGRrc2ggcHJvZHVjZXMgZGlmZmVyZW50IG91dHB1dCBmb3IgdGhlIGZvcm1lciAoZm9vIGluc3RlYWQgb2YgZm9vXHRiYXIpCi1zdGRpbjoKLQl4PSJmb28JYmFyIgotCWVjaG8gImBlY2hvIFwiJHhcImAiCi0JZWNobyAiYGVjaG8gIiR4ImAiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZm9vCWJhcgotCWZvbwliYXIKLS0tLQotbmFtZTogcmVncmVzc2lvbi0xMwotZGVzY3JpcHRpb246Ci0JVGhlIGZvbGxvd2luZyBjb21tYW5kIGhhbmdzIGZvcmV2ZXI6Ci0JCSQgKDogOyBjYXQgL2V0Yy90ZXJtY2FwKSB8IHNsZWVwIDIKLQlUaGlzIGlzIGJlY2F1c2UgdGhlIHNoZWxsIGZvcmtzIGEgc2hlbGwgdG8gcnVuIHRoZSAoLi4pIGNvbW1hbmQKLQlhbmQgdGhpcyBzaGVsbCBoYXMgdGhlIHBpcGUgb3Blbi4gIFdoZW4gdGhlIHNsZWVwIGRpZXMsIHRoZSBjYXQKLQlkb2Vzbid0IGdldCBhIFNJR1BJUEUgJ2NhdXNlIGEgcHJvY2VzcyAoaWUsIHRoZSBzZWNvbmQgc2hlbGwpCi0Jc3RpbGwgaGFzIHRoZSBwaXBlIG9wZW4uCi0JCi0JTk9URTogdGhpcyB0ZXN0IHByb3Zva2VzIGEgYml6YXJyZSBidWcgaW4ga3NoOTMgKHNoZWxsIHN0YXJ0cyByZWFkaW5nCi0JICAgICAgY29tbWFuZHMgZnJvbSAvZXRjL3Rlcm1jYXAuLikKLXRpbWUtbGltaXQ6IDEwCi1zdGRpbjoKLQllY2hvIEEgbGluZSBvZiB0ZXh0IHRoYXQgd2lsbCBiZSBkdXBsaWNhdGVkIHF1aXRlIGEgbnVtYmVyIG9mIHRpbWVzLj4gdDEKLQljYXQgdDEgdDEgdDEgdDEgIHQxIHQxIHQxIHQxICB0MSB0MSB0MSB0MSAgdDEgdDEgdDEgdDEgID4gdDIKLQljYXQgdDIgdDIgdDIgdDIgIHQyIHQyIHQyIHQyICB0MiB0MiB0MiB0MiAgdDIgdDIgdDIgdDIgID4gdDEKLQljYXQgdDEgdDEgdDEgdDEgPiB0MgotCSg6IDsgY2F0IHQyIDI+Ji0pIHwgc2xlZXAgMQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTE0Ci1kZXNjcmlwdGlvbjoKLQlUaGUgY29tbWFuZAotCQkkIChmb29iYXIpIDI+IC9kZXYvbnVsbAotCWdlbmVyYXRlcyBubyBvdXRwdXQgdW5kZXIgL2Jpbi9zaCwgYnV0IHBka3NoIHByb2R1Y2VzIHRoZSBlcnJvcgotCQlmb29iYXI6IG5vdCBmb3VuZAotCUFsc28sIHRoZSBjb21tYW5kCi0JCSQgZm9vYmFyIDI+IC9kZXYvbnVsbAotCWdlbmVyYXRlcyBhbiBlcnJvciB1bmRlciAvYmluL3NoIGFuZCBwZGtzaCwgYnV0IEFUJlQga3NoODggcHJvZHVjZXMKLQlubyBlcnJvciAocmVkaXJlY3RlZCB0byAvZGV2L251bGwpLgotc3RkaW46Ci0JKHlvdS9zaG91bGQvbm90L3NlZS90aGlzL2Vycm9yLzEpIDI+IC9kZXYvbnVsbAotCXlvdS9zaG91bGQvbm90L3NlZS90aGlzL2Vycm9yLzIgMj4gL2Rldi9udWxsCi0JdHJ1ZQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTE1Ci1kZXNjcmlwdGlvbjoKLQlUaGUgY29tbWFuZAotCQkkIHdoZW5jZSBmb29iYXIKLQlnZW5lcmF0ZXMgYSBibGFuayBsaW5lIHVuZGVyIHBka3NoIGFuZCBzZXRzIHRoZSBleGl0IHN0YXR1cyB0byAwLgotCUFUJlQga3NoODggZ2VuZXJhdGVzIG5vIG91dHB1dCBhbmQgc2V0cyB0aGUgZXhpdCBzdGF0dXMgdG8gMS4gIEFsc28sCi0JdGhlIGNvbW1hbmQKLQkJJCB3aGVuY2UgZm9vYmFyIGNhdAotCWdlbmVyYXRlcyBubyBvdXRwdXQgdW5kZXIgQVQmVCBrc2g4OCAocGRrc2ggZ2VuZXJhdGVzIGEgYmxhbmsgbGluZQotCWFuZCAvYmluL2NhdCkuCi1zdGRpbjoKLQl3aGVuY2UgZG9lcy9ub3QvZXhpc3QgPiAvZGV2L251bGwKLQllY2hvIDE6ICQ/Ci0JZWNobyAyOiAkKHdoZW5jZSBkb2VzL25vdC9leGlzdCB8IHdjIC1sKQotCWVjaG8gMzogJCh3aGVuY2UgZG9lcy9ub3QvZXhpc3QgY2F0IHwgd2MgLWwpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMTogMQotCTI6IDAKLQkzOiAwCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMTYKLWRlc2NyaXB0aW9uOgotCSR7dmFyJSVleHByfSBzZWVtcyB0byBiZSBicm9rZW4gaW4gbWFueSBwbGFjZXMuICBPbiB0aGUgbWlwcwotCXRoZSBjb21tYW5kcwotCQkkIHJlYWQgbGluZSA8IC9ldGMvcGFzc3dkCi0JCSQgZWNobyAkbGluZQotCQlyb290OjA6MTouLi4KLQkJJCBlY2hvICR7bGluZSUlOip9Ci0JCXJvb3QKLQkJJCBlY2hvICRsaW5lCi0JCXJvb3QKLQkJJAotCWNoYW5nZSB0aGUgdmFsdWUgb2YgbGluZS4gIE9uIHN1bjRzICYgcGFzLCB0aGUgZWNobyAke2xpbmUlJToqfSBkb2Vzbid0Ci0Jd29yay4gIEhhdmVuJ3QgY2hlY2tlZCBlbHNld2hlcmUuLi4KLXNjcmlwdDoKLQlyZWFkIHgKLQl5PSR4Ci0JZWNobyAke3glJToqfQotCWVjaG8gJHgKLXN0ZGluOgotCXJvb3Q6YXNkamhhc2Rhc2poczowOjE6Um9vdDovOi9iaW4vc2gKLWV4cGVjdGVkLXN0ZG91dDoKLQlyb290Ci0Jcm9vdDphc2RqaGFzZGFzamhzOjA6MTpSb290Oi86L2Jpbi9zaAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTE3Ci1kZXNjcmlwdGlvbjoKLQlUaGUgY29tbWFuZAotCQkuIC9mb28vYmFyCi0Jc2hvdWxkIHNldCB0aGUgZXhpdCBzdGF0dXMgdG8gbm9uLXplcm8gKHNoIGFuZCBBVCZUIGtzaDg4IGRvKS4KLQlYWFggZG90aW5nIGEgbm9uIGV4aXN0ZW50IGZpbGUgaXMgYSBmYXRhbCBlcnJvciBmb3IgYSBzY3JpcHQKLXN0ZGluOgotCS4gZG9lcy9ub3QvZXhpc3QKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uPy8KLS0tLQotbmFtZTogcmVncmVzc2lvbi0xOQotZGVzY3JpcHRpb246Ci0JQm90aCBvZiB0aGUgZm9sbG93aW5nIGVjaG9zIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIHRoaW5nLCBidXQgZG9uJ3Q6Ci0JCSQgeD1mb28vYmFyCi0JCSQgZWNobyAke3glLyp9Ci0JCWZvbwotCQkkIGVjaG8gIiR7eCUvKn0iCi0JCWZvby9iYXIKLXN0ZGluOgotCXg9Zm9vL2JhcgotCWVjaG8gIiR7eCUvKn0iCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZm9vCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMjEKLWRlc2NyaXB0aW9uOgotCWJhY2tzbGFzaCBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGluIGNhc2UgbGFiZWxzOgotCSQgeD0nLXgnCi0JJCBjYXNlICR4IGluCi0JLVw/KSBlY2hvIGhpCi0JZXNhYwotCWhpCi0JJCB4PSctPycKLQkkIGNhc2UgJHggaW4KLQktXFw/KSBlY2hvIGhpCi0JZXNhYwotCWhpCi0JJAotc3RkaW46Ci0JY2FzZSAteCBpbgotCS1cPykJZWNobyBmYWlsCi0JZXNhYwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTIyCi1kZXNjcmlwdGlvbjoKLQlRdW90aW5nIGJhY2txdW90ZXMgaW5zaWRlIGJhY2txdW90ZXMgZG9lc24ndCB3b3JrOgotCSQgZWNobyBgZWNobyBoaSBcYGVjaG8gdGhlcmVcYCBmb2xrc2AKLQlhc2tzIGZvciBtb3JlIGluZm8uICBzaCBhbmQgQVQmVCBrc2g4OCBib3RoIGVjaG8KLQloaSB0aGVyZSBmb2xrcwotc3RkaW46Ci0JZWNobyBgZWNobyBoaSBcYGVjaG8gdGhlcmVcYCBmb2xrc2AKLWV4cGVjdGVkLXN0ZG91dDoKLQloaSB0aGVyZSBmb2xrcwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTIzCi1kZXNjcmlwdGlvbjoKLQkpKSBpcyBub3QgdHJlYXRlZCBgY29ycmVjdGx5JzoKLQkgICAgJCAoZWNobyBoaSA7IChlY2hvIHRoZXJlIDsgZWNobyBmb2xrcykpCi0JICAgIG1pc3NpbmcgKCgKLQkgICAgJAotCWluc3RlYWQgb2YgKGFzIHNoIGFuZCBrc2guYXR0KQotCSAgICAkIChlY2hvIGhpIDsgKGVjaG8gdGhlcmUgOyBlY2hvIGZvbGtzKSkKLQkgICAgaGkKLQkgICAgdGhlcmUKLQkgICAgZm9sa3MKLQkgICAgJAotc3RkaW46Ci0JKCA6IDsgKCA6IDsgZWNobyBoaSkpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLS0tLQotbmFtZTogcmVncmVzc2lvbi0yNQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcmVhZGluZyBzdGRpbiBpbiBhIHdoaWxlIGxvb3AuICBUaGUgcmVhZCBzaG91bGQgb25seSByZWFkCi0JYSBzaW5nbGUgbGluZSwgbm90IGEgd2hvbGUgc3RkaW8gYnVmZmVyOyB0aGUgY2F0IHNob3VsZCBnZXQKLQl0aGUgcmVzdC4KLXN0ZGluOgotCShlY2hvIGE7IGVjaG8gYikgfCB3aGlsZSByZWFkIHggOyBkbwotCSAgICBlY2hvICR4Ci0JICAgIGNhdCA+IC9kZXYvbnVsbAotCWRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMjYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHJlYWRpbmcgc3RkaW4gaW4gYSB3aGlsZSBsb29wLiAgVGhlIHJlYWQgc2hvdWxkIHJlYWQgYm90aAotCWxpbmVzLCBub3QganVzdCB0aGUgZmlyc3QuCi1zY3JpcHQ6Ci0JYT0KLQl3aGlsZSBbICIkYSIgIT0geHh4IF0gOyBkbwotCSAgICBsYXN0PSR4Ci0JICAgIHJlYWQgeAotCSAgICBjYXQgL2Rldi9udWxsIHwgc2VkICdzL3gveS8nCi0JICAgIGE9eCRhCi0JZG9uZQotCWVjaG8gJGxhc3QKLXN0ZGluOgotCWEKLQliCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTI3Ci1kZXNjcmlwdGlvbjoKLQlUaGUgY29tbWFuZAotCQkuIC9kb2VzL25vdC9leGlzdAotCXNob3VsZCBjYXVzZSBhIHNjcmlwdCB0byBleGl0Lgotc3RkaW46Ci0JLiBkb2VzL25vdC9leGlzdAotCWVjaG8gaGkKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9kb2VzXC9ub3RcL2V4aXN0LwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTI4Ci1kZXNjcmlwdGlvbjoKLQl2YXJpYWJsZSBhc3NpZ25lbWVudHMgbm90IGRldGVjdGVkIHdlbGwKLXN0ZGluOgotCWEueD0xIGVjaG8gaGkKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9hXC54PTEvCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMjkKLWRlc2NyaXB0aW9uOgotCWFsaWFzIGV4cGFuc2lvbiBkaWZmZXJlbnQgZnJvbSBBVCZUIGtzaDg4Ci1zdGRpbjoKLQlhbGlhcyBhPSdmb3IgJyBiPSdpIGluJwotCWEgYiBoaSA7IGRvIGVjaG8gJGkgOyBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLS0tLQotbmFtZTogcmVncmVzc2lvbi0zMAotZGVzY3JpcHRpb246Ci0Jc3RyYW5nZSBjaGFyYWN0ZXJzIGFsbG93ZWQgaW5zaWRlICR7Li4ufQotc3RkaW46Ci0JZWNobyAke2F7Yn19Ci1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLj8vCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzEKLWRlc2NyaXB0aW9uOgotCURvZXMgcmVhZCBoYW5kbGUgcGFydGlhbCBsaW5lcyBjb3JyZWN0bHkKLXNjcmlwdDoKLQlhPSByZXQ9Ci0Jd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KLQkgICAgcmVhZCB4IHkgegotCSAgICByZXQ9JD8KLQkgICAgYT14JGEKLQlkb25lCi0JZWNobyAiWyR4XSIKLQllY2hvICRyZXQKLXN0ZGluOiAhCi0JYSBBIGFBCi0JYiBCIEJiCi0JYwotZXhwZWN0ZWQtc3Rkb3V0OgotCVtjXQotCTEKLS0tLQotbmFtZTogcmVncmVzc2lvbi0zMgotZGVzY3JpcHRpb246Ci0JRG9lcyByZWFkIHNldCB2YXJpYWJsZXMgdG8gbnVsbCBhdCBlb2Y/Ci1zY3JpcHQ6Ci0JYT0KLQl3aGlsZSBbICIkYSIgIT0geHh4IF0gOyBkbwotCSAgICByZWFkIHggeSB6Ci0JICAgIGE9eCRhCi0JZG9uZQotCWVjaG8gMTogJHt4LXggbm90IHNldH0gJHt5LXkgbm90IHNldH0gJHt6LXogbm90IHNldH0KLQllY2hvIDI6ICR7eDoreCBub3QgbnVsbH0gJHt5Oit5IG5vdCBudWxsfSAke3o6K3ogbm90IG51bGx9Ci1zdGRpbjoKLQlhIEEgQWEKLQliIEIgQmIKLWV4cGVjdGVkLXN0ZG91dDoKLQkxOgotCTI6Ci0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzMKLWRlc2NyaXB0aW9uOgotCURvZXMgdW1hc2sgcHJpbnQgYSBsZWFkaW5nIDAgd2hlbiB1bWFzayBpcyAzIGRpZ2l0cz8KLXN0ZGluOgotCXVtYXNrIDIyMgotCXVtYXNrCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMDIyMgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTM1Ci1kZXNjcmlwdGlvbjoKLQlUZW1wb3J5IGZpbGVzIHVzZWQgZm9yIGhlcmUtZG9jcyBpbiBmdW5jdGlvbnMgZ2V0IHRyYXNoZWQgYWZ0ZXIKLQl0aGUgZnVuY3Rpb24gaXMgcGFyc2VkIChiZWZvcmUgaXQgaXMgZXhlY3V0ZWQpCi1zdGRpbjoKLQlmMSgpIHsKLQkJY2F0IDw8LSBFT0YKLQkJCUYxCi0JCUVPRgotCQlmMigpIHsKLQkJCWNhdCA8PC0gRU9GCi0JCQkJRjIKLQkJCUVPRgotCQl9Ci0JfQotCWYxCi0JZjIKLQl1bnNldCAtZiBmMQotCWYyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JRjEKLQlGMgotCUYyCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzYKLWRlc2NyaXB0aW9uOgotCUNvbW1hbmQgc3Vic3RpdHV0aW9uIGJyZWFrcyByZWFkaW5nIGluIHdoaWxlIGxvb3AKLQkodGVzdCBmcm9tIDxzamdAdm9pZC56ZW4ub3ouYXU+KQotc3RkaW46Ci0JKGVjaG8gYWJjZGVmOyBlY2hvOyBlY2hvIDEyMykgfAotCSAgICB3aGlsZSByZWFkIGxpbmUKLQkgICAgZG8KLQkgICAgICAjIHRoZSBmb2xsb3dpbmcgbGluZSBicmVha3MgaXQKLQkgICAgICBjPWBlY2hvICRsaW5lIHwgd2MgLWNgCi0JICAgICAgZWNobyAkYwotCSAgICBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNwotCTEKLQk0Ci0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzcKLWRlc2NyaXB0aW9uOgotCU1hY2hpbmVzIHdpdGggYnJva2VuIHRpbWVzKCkgKHJlcG9ydGVkIGJ5IDxzamdAdm9pZC56ZW4ub3ouYXU+KQotCXRpbWUgZG9lcyBub3QgcmVwb3J0IGNvcnJlY3QgcmVhbCB0aW1lCi1zdGRpbjoKLQl0aW1lIHNsZWVwIDEKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAhL15ccyowXC4wW1xzXGRdK3JlYWx8XlxzKnJlYWxbXHNdKzArXC4wLwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTM4Ci1kZXNjcmlwdGlvbjoKLQlzZXQgLWUgZG9lc24ndCBpZ25vcmUgZXhpdCBjb2RlcyBmb3IgaWYvd2hpbGUvdW50aWwvJiYvfHwvIS4KLWFyZ3VtZW50czogIS1lIQotc3RkaW46Ci0JaWYgZmFsc2U7IHRoZW4gZWNobyBoaSA7IGZpCi0JZmFsc2UgfHwgdHJ1ZQotCWZhbHNlICYmIHRydWUKLQl3aGlsZSBmYWxzZTsgZG8gZWNobyBoaTsgZG9uZQotCWVjaG8gb2sKLWV4cGVjdGVkLXN0ZG91dDoKLQlvawotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTM5Ci1kZXNjcmlwdGlvbjoKLQlzZXQgLWU6IGVycm9ycyBpbiBjb21tYW5kIHN1YnN0aXR1dGlvbnMgYXJlbid0IGlnbm9yZWQKLQlOb3QgY2xlYXIgaWYgdGhleSBzaG91bGQgYmUgb3Igbm90Li4uIGJhc2ggcGFzc2VzIGhlcmUKLQl0aGlzIG1heSBhY3R1YWxseSBiZSByZXF1aXJlZCBmb3IgbWFrZSwgc28gY2hhbmdlZCB0aGUKLQl0ZXN0IHRvIG1ha2UgdGhpcyBhbiBta3NoIGZlYXR1cmUsIG5vdCBhIGJ1ZwotYXJndW1lbnRzOiAhLWUhCi1zdGRpbjoKLQllY2hvIGBmYWxzZTsgZWNobyBoaWAKLSNleHBlY3RlZC1mYWlsOiB5ZXMKLSNleHBlY3RlZC1zdGRvdXQ6Ci0jCWhpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDAKLWRlc2NyaXB0aW9uOgotCVRoaXMgdXNlZCB0byBjYXVzZSBhIGNvcmUgZHVtcAotZW52LXNldHVwOiAhUkFORE9NPTEyIQotc3RkaW46Ci0JZWNobyBoaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDEKLWRlc2NyaXB0aW9uOgotCWZvbyBzaG91bGQgYmUgc2V0IHRvIGJhciAoc2hvdWxkIG5vdCBiZSBlbXB0eSkKLXN0ZGluOgotCWZvbz1gCi0JZWNobyBiYXJgCi0JZWNobyAiKCRmb28pIgotZXhwZWN0ZWQtc3Rkb3V0OgotCShiYXIpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDIKLWRlc2NyaXB0aW9uOgotCUNhbid0IHVzZSBjb21tYW5kIGxpbmUgYXNzaWdubWVudHMgdG8gYXNzaWduIHJlYWRvbmx5IHBhcmFtZXRlcnMuCi1zdGRpbjoKLQlmb289YmFyCi0JcmVhZG9ubHkgZm9vCi0JZm9vPXN0dWZmIGVudiB8IGdyZXAgJ15mb28nCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKnJlYWQgKm9ubHkuKi8KLS0tLQotbmFtZTogcmVncmVzc2lvbi00MwotZGVzY3JpcHRpb246Ci0JQ2FuIHN1YnNoZWxscyBiZSBwcmVmaXhlZCBieSByZWRpcmVjdGlvbnMgKGhpc3RvcmljYWwgc2hlbGxzIGFsbG93Ci0JdGhpcykKLXN0ZGluOgotCTwgL2Rldi9udWxsIChzZWQgJ3MvXi9YLycpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDUKLWRlc2NyaXB0aW9uOgotCVBhcmFtZXRlciBhc3NpZ25tZW50cyB3aXRoIFtdIHJlY29nbmlzZWQgY29ycmVjdGx5Ci1zdGRpbjoKLQlGT089KlsxMl0KLQlCQVI9YWJjWwotCU1PUkU9W2FiY10KLQlKVU5LPWFbYmMKLQllY2hvICI8JEZPTz4iCi0JZWNobyAiPCRCQVI+IgotCWVjaG8gIjwkTU9SRT4iCi0JZWNobyAiPCRKVU5LPiIKLWV4cGVjdGVkLXN0ZG91dDoKLQk8KlsxMl0+Ci0JPGFiY1s+Ci0JPFthYmNdPgotCTxhW2JjPgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQ2Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiB3b3JrcyBpbiBjb21tYW5kIHN1YnN0aXR1dGlvbnMgYW5kCi0JYXQgdGhlIGVuZCBvZiBmaWxlLgotc3RkaW46Ci0JYWxpYXMgeD0nZWNobyBoaScKLQlGT089ImB4YCAiCi0JZWNobyAiWyRGT09dIgotCXgKLWV4cGVjdGVkLXN0ZG91dDoKLQlbaGkgXQotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYWxpYXNlcyBhcmUgZnVsbHkgcmVhZC4KLXN0ZGluOgotCWFsaWFzIHg9J2VjaG8gaGk7Ci0JZWNobyB0aGVyZScKLQl4Ci0JZWNobyBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQl0aGVyZQotCWRvbmUKLS0tLQotbmFtZTogcmVncmVzc2lvbi00OAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCAoaGVyZSBkb2MpIHRlbXAgZmlsZXMgYXJlIG5vdCBsZWZ0IGJlaGluZCBhZnRlciBhbiBleGVjLgotc3RkaW46Ci0JbWtkaXIgZm9vIHx8IGV4aXQgMQotCVRNUERJUj0kUFdEL2ZvbyAiJF9fcHJvZ25hbWUiIDw8LSAnRU9GJwotCQl4KCkgewotCQkJc2VkICdzL14vWCAvJyA8PCBFX09fRgotCQkJaGkKLQkJCXRoZXJlCi0JCQlmb2xrcwotCQkJRV9PX0YKLQkJCWVjaG8gImRvbmUgKCQ/KSIKLQkJfQotCQllY2hvPWVjaG87IFsgLXggL2Jpbi9lY2hvIF0gJiYgZWNobz0vYmluL2VjaG8KLQkJZXhlYyAkZWNobyBzdWJ0ZXN0LTEgaGkKLQlFT0YKLQllY2hvIHN1YnRlc3QtMSBmb28vKgotCVRNUERJUj0kUFdEL2ZvbyAiJF9fcHJvZ25hbWUiIDw8LSAnRU9GJwotCQllY2hvPWVjaG87IFsgLXggL2Jpbi9lY2hvIF0gJiYgZWNobz0vYmluL2VjaG8KLQkJc2VkICdzL14vWCAvJyA8PCBFX09fRjsgZXhlYyAkZWNobyBzdWJ0ZXN0LTIgaGkKLQkJYQotCQlmZXcKLQkJbGluZXMKLQkJRV9PX0YKLQlFT0YKLQllY2hvIHN1YnRlc3QtMiBmb28vKgotZXhwZWN0ZWQtc3Rkb3V0OgotCXN1YnRlc3QtMSBoaQotCXN1YnRlc3QtMSBmb28vKgotCVggYQotCVggZmV3Ci0JWCBsaW5lcwotCXN1YnRlc3QtMiBoaQotCXN1YnRlc3QtMiBmb28vKgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQ5Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHVuc2V0IHBhcmFtcyB3aXRoIGF0dHJpYnV0ZXMgYXJlIHJlcG9ydGVkIGJ5IHNldCwgdGhvc2UKLQlzYW5zIGF0dHJpYnV0ZXMgYXJlIG5vdC4KLXN0ZGluOgotCXVuc2V0IEZPTyBCQVIKLQllY2hvIFgkRk9PCi0JZXhwb3J0IEJBUgotCXR5cGVzZXQgLWkgQkxBSAotCXNldCB8IGdyZXAgRk9PCi0Jc2V0IHwgZ3JlcCBCQVIKLQlzZXQgfCBncmVwIEJMQUgKLWV4cGVjdGVkLXN0ZG91dDoKLQlYCi0JQkFSCi0JQkxBSAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTUwCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGFsaWFzZXMgZG8gbm90IHVzZSBjb250aW51YXRpb24gcHJvbXB0IGFmdGVyIHRyYWlsaW5nCi0Jc2VtaS1jb2xvbi4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlbnYiCi0JUFMxPVkKLQlQUzI9WAotZW52LXNldHVwOiAhRU5WPS4vZW52IQotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQlhbGlhcyBmb289J2VjaG8gaGkgOyAnCi0JZm9vCi0JZm9vIGVjaG8gdGhlcmUKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWhpCi0JdGhlcmUKLWV4cGVjdGVkLXN0ZGVycjogIQotCVlZWVkKLS0tLQotbmFtZTogcmVncmVzc2lvbi01MQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBzZXQgYWxsb3dzIGJvdGggK28gYW5kIC1vIG9wdGlvbnMgb24gc2FtZSBjb21tYW5kIGxpbmUuCi1zdGRpbjoKLQlzZXQgYSBiIGMKLQlzZXQgLW8gbm9nbG9iICtvIGFsbGV4cG9ydAotCWVjaG8gQTogJCosICoKLWV4cGVjdGVkLXN0ZG91dDoKLQlBOiBhIGIgYywgKgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTUyCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGdsb2JiaW5nIHdvcmtzIGluIHBpcGVsaW5lZCBjb21tYW5kcwotZmlsZS1zZXR1cDogZmlsZSA2NDQgImVudiIKLQlQUzE9UAotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKLQlzdHVmZgotZW52LXNldHVwOiAhRU5WPS4vZW52IQotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQlzZWQgJ3MvXi9YIC8nIDwgYWIqCi0JZWNobyBtYXJrIDEKLQlzZWQgJ3MvXi9YIC8nIDwgYWIqIHwgc2VkICdzL14vWSAvJwotCWVjaG8gbWFyayAyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JWCBzdHVmZgotCW1hcmsgMQotCVkgWCBzdHVmZgotCW1hcmsgMgotZXhwZWN0ZWQtc3RkZXJyOiAhCi0JUFBQUFAKLS0tLQotbmFtZTogcmVncmVzc2lvbi01MwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBnZXRvcHRzIHdvcmtzIGluIGZ1bmN0aW9ucwotc3RkaW46Ci0JYmZ1bmMoKSB7Ci0JICAgIGVjaG8gYmZ1bmM6IGVudGVyICIoYXJnczogJCo7IE9QVElORD0kT1BUSU5EKSIKLQkgICAgd2hpbGUgZ2V0b3B0cyBCIG9jOyBkbwotCQljYXNlICRvYyBpbgotCQkgIChCKQotCQkgICAgZWNobyBiZnVuYzogQiBvcHRpb24KLQkJICAgIDs7Ci0JCSAgKCopCi0JCSAgICBlY2hvIGJmdW5jOiBvZGQgb3B0aW9uICIoJG9jKSIKLQkJICAgIDs7Ci0JCWVzYWMKLQkgICAgZG9uZQotCSAgICBlY2hvIGJmdW5jOiBsZWF2ZQotCX0KLQkKLQlmdW5jdGlvbiBrZnVuYyB7Ci0JICAgIGVjaG8ga2Z1bmM6IGVudGVyICIoYXJnczogJCo7IE9QVElORD0kT1BUSU5EKSIKLQkgICAgd2hpbGUgZ2V0b3B0cyBLIG9jOyBkbwotCQljYXNlICRvYyBpbgotCQkgIChLKQotCQkgICAgZWNobyBrZnVuYzogSyBvcHRpb24KLQkJICAgIDs7Ci0JCSAgKCopCi0JCSAgICBlY2hvIGJmdW5jOiBvZGQgb3B0aW9uICIoJG9jKSIKLQkJICAgIDs7Ci0JCWVzYWMKLQkgICAgZG9uZQotCSAgICBlY2hvIGtmdW5jOiBsZWF2ZQotCX0KLQkKLQlzZXQgLS0gLWYgLWIgLWsgLWwKLQllY2hvICJsaW5lIDE6IE9QVElORD0kT1BUSU5EIgotCWdldG9wdHMga2JmbCBvcHRjCi0JZWNobyAibGluZSAyOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgotCWJmdW5jIC1CQkIgYmxhaAotCWVjaG8gImxpbmUgMzogT1BUSU5EPSRPUFRJTkQiCi0JZ2V0b3B0cyBrYmZsIG9wdGMKLQllY2hvICJsaW5lIDQ6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCi0Ja2Z1bmMgLUtLSyBibGFoCi0JZWNobyAibGluZSA1OiBPUFRJTkQ9JE9QVElORCIKLQlnZXRvcHRzIGtiZmwgb3B0YwotCWVjaG8gImxpbmUgNjogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKLQllY2hvCi0JCi0JT1BUSU5EPTEKLQlzZXQgLS0gLWZia2wKLQllY2hvICJsaW5lIDEwOiBPUFRJTkQ9JE9QVElORCIKLQlnZXRvcHRzIGtiZmwgb3B0YwotCWVjaG8gImxpbmUgMjA6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCi0JYmZ1bmMgLUJCQiBibGFoCi0JZWNobyAibGluZSAzMDogT1BUSU5EPSRPUFRJTkQiCi0JZ2V0b3B0cyBrYmZsIG9wdGMKLQllY2hvICJsaW5lIDQwOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgotCWtmdW5jIC1LS0sgYmxhaAotCWVjaG8gImxpbmUgNTA6IE9QVElORD0kT1BUSU5EIgotCWdldG9wdHMga2JmbCBvcHRjCi0JZWNobyAibGluZSA2MDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDE6IE9QVElORD0xCi0JbGluZSAyOiByZXQ9MCwgb3B0Yz1mLCBPUFRJTkQ9MgotCWJmdW5jOiBlbnRlciAoYXJnczogLUJCQiBibGFoOyBPUFRJTkQ9MikKLQliZnVuYzogQiBvcHRpb24KLQliZnVuYzogQiBvcHRpb24KLQliZnVuYzogbGVhdmUKLQlsaW5lIDM6IE9QVElORD0yCi0JbGluZSA0OiByZXQ9MCwgb3B0Yz1iLCBPUFRJTkQ9MwotCWtmdW5jOiBlbnRlciAoYXJnczogLUtLSyBibGFoOyBPUFRJTkQ9MSkKLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogbGVhdmUKLQlsaW5lIDU6IE9QVElORD0zCi0JbGluZSA2OiByZXQ9MCwgb3B0Yz1rLCBPUFRJTkQ9NAotCQotCWxpbmUgMTA6IE9QVElORD0xCi0JbGluZSAyMDogcmV0PTAsIG9wdGM9ZiwgT1BUSU5EPTIKLQliZnVuYzogZW50ZXIgKGFyZ3M6IC1CQkIgYmxhaDsgT1BUSU5EPTIpCi0JYmZ1bmM6IEIgb3B0aW9uCi0JYmZ1bmM6IEIgb3B0aW9uCi0JYmZ1bmM6IGxlYXZlCi0JbGluZSAzMDogT1BUSU5EPTIKLQlsaW5lIDQwOiByZXQ9MSwgb3B0Yz0/LCBPUFRJTkQ9MgotCWtmdW5jOiBlbnRlciAoYXJnczogLUtLSyBibGFoOyBPUFRJTkQ9MSkKLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogSyBvcHRpb24KLQlrZnVuYzogbGVhdmUKLQlsaW5lIDUwOiBPUFRJTkQ9MgotCWxpbmUgNjA6IHJldD0xLCBvcHRjPT8sIE9QVElORD0yCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgOyBpcyBub3QgcmVxdWlyZWQgYmVmb3JlIHRoZSB0aGVuIGluIGlmICgoIC4uLiApKSB0aGVuIC4uLgotc3RkaW46Ci0JaWYgKCggMSApKSB0aGVuCi0JICAgIGVjaG8gb2sgZHBhcmVuCi0JZmkKLQlpZiBbWyAtbiAxIF1dIHRoZW4KLQkgICAgZWNobyBvayBkYnJhY2tldHMKLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCW9rIGRwYXJlbgotCW9rIGRicmFja2V0cwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTU1Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayAke2ZvbzolYmFyfSBpcyBhbGxvd2VkIChrc2g4OCBhbGxvd3MgaXQuLi4pCi1zdGRpbjoKLQl4PWZvb1hiYXJYYmxhaAotCWVjaG8gMSAke3glWCp9Ci0JZWNobyAyICR7eDolWCp9Ci0JZWNobyAzICR7eCUlWCp9Ci0JZWNobyA0ICR7eDolJVgqfQotCWVjaG8gNSAke3gjKlh9Ci0JZWNobyA2ICR7eDojKlh9Ci0JZWNobyA3ICR7eCMjKlh9Ci0JZWNobyA4ICR7eDojIypYfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgZm9vWGJhcgotCTIgZm9vWGJhcgotCTMgZm9vCi0JNCBmb28KLQk1IGJhclhibGFoCi0JNiBiYXJYYmxhaAotCTcgYmxhaAotCTggYmxhaAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTU3Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB0eXBlc2V0IG91dHB1dCBpcyBjb3JyZWN0IGZvcgotCXVuaW5pdGlhbGlzZWQgYXJyYXkgZWxlbWVudHMuCi1zdGRpbjoKLQl0eXBlc2V0IC1pIHh4eFs0XQotCWVjaG8gQQotCXR5cGVzZXQgLWkgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJwotCWVjaG8gQgotCXR5cGVzZXQgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJwotCQotCXh4eFsxXT0yKzUKLQllY2hvIE0KLQl0eXBlc2V0IC1pIHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKLQllY2hvIE4KLQl0eXBlc2V0IHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKLWV4cGVjdGVkLXN0ZG91dDoKLQlBCi0JICAgIHh4eAotCUIKLQkgICAgdHlwZXNldCAtaSB4eHgKLQlNCi0JICAgIHh4eFsxXT03Ci0JTgotCSAgICB0eXBlc2V0IC1pIHh4eAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTU4Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB0cmFwIGV4aXQgaXMgb2sgKGV4aXQgbm90IG1pc3Rha2VuIGZvciBzaWduYWwgbmFtZSkKLXN0ZGluOgotCXRyYXAgJ2VjaG8gaGknIGV4aXQKLQl0cmFwIGV4aXQgMQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNTkKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmICR7I2FycmF5WypdfSBpcyBjYWxjdWxhdGVkIGNvcnJlY3RseS4KLXN0ZGluOgotCWFbMTJdPWhpCi0JYVs4XT10aGVyZQotCWVjaG8gJHsjYVsqXX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkyCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNjAKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGRlZmF1bHQgZXhpdCBzdGF0dXMgaXMgcHJldmlvdXMgY29tbWFuZAotc3RkaW46Ci0JKHRydWU7IGV4aXQpCi0JZWNobyBBICQ/Ci0JKGZhbHNlOyBleGl0KQotCWVjaG8gQiAkPwotCSggKGV4aXQgMTAzKSA7IGV4aXQpCi0JZWNobyBDICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAwCi0JQiAxCi0JQyAxMDMKLS0tLQotbmFtZTogcmVncmVzc2lvbi02MQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgRVhJVCB0cmFwIGlzIGV4ZWN1dGVkIGZvciBzdWIgc2hlbGxzLgotc3RkaW46Ci0JdHJhcCAnZWNobyBwYXJlbnQgZXhpdCcgRVhJVAotCWVjaG8gc3RhcnQKLQkoZWNobyBBOyBlY2hvIEEgbGFzdCkKLQllY2hvIEIKLQkoZWNobyBDOyB0cmFwICdlY2hvIHN1YiBleGl0JyBFWElUOyBlY2hvIEMgbGFzdCkKLQllY2hvIHBhcmVudCBsYXN0Ci1leHBlY3RlZC1zdGRvdXQ6Ci0Jc3RhcnQKLQlBCi0JQSBsYXN0Ci0JQgotCUMKLQlDIGxhc3QKLQlzdWIgZXhpdAotCXBhcmVudCBsYXN0Ci0JcGFyZW50IGV4aXQKLS0tLQotbmFtZTogcmVncmVzc2lvbi02MgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgdGVzdCAtbnQvLW90IHN1Y2NlZWRzIGlmIHNlY29uZChmaXJzdCkgZmlsZSBpcyBtaXNzaW5nLgotc3RkaW46Ci0JdG91Y2ggYQotCXRlc3QgYSAtbnQgYiAmJiBlY2hvIG50IE9LIHx8IGVjaG8gbnQgQkFECi0JdGVzdCBiIC1vdCBhICYmIGVjaG8gb3QgT0sgfHwgZWNobyBvdCBCQUQKLWV4cGVjdGVkLXN0ZG91dDoKLQludCBPSwotCW90IE9LCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNjMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHR5cGVzZXQsIGV4cG9ydCwgYW5kIHJlYWRvbmx5IHdvcmsKLXN0ZGluOgotCXsKLQkJZWNobyBGTk9SRC0wCi0JCUZOT1JEX0E9MQotCQlGTk9SRF9CPTIKLQkJRk5PUkRfQz0zCi0JCUZOT1JEX0Q9NAotCQlGTk9SRF9FPTUKLQkJRk5PUkRfRj02Ci0JCUZOT1JEX0c9NwotCQlGTk9SRF9IPTgKLQkJaW50ZWdlciBGTk9SRF9FIEZOT1JEX0YgRk5PUkRfRyBGTk9SRF9ICi0JCWV4cG9ydCBGTk9SRF9DIEZOT1JEX0QgRk5PUkRfRyBGTk9SRF9ICi0JCXJlYWRvbmx5IEZOT1JEX0IgRk5PUkRfRCBGTk9SRF9GIEZOT1JEX0gKLQkJZWNobyBGTk9SRC0xCi0JCWV4cG9ydAotCQllY2hvIEZOT1JELTIKLQkJZXhwb3J0IC1wCi0JCWVjaG8gRk5PUkQtMwotCQlyZWFkb25seQotCQllY2hvIEZOT1JELTQKLQkJcmVhZG9ubHkgLXAKLQkJZWNobyBGTk9SRC01Ci0JCXR5cGVzZXQKLQkJZWNobyBGTk9SRC02Ci0JCXR5cGVzZXQgLXAKLQkJZWNobyBGTk9SRC03Ci0JCXR5cGVzZXQgLQotCQllY2hvIEZOT1JELTgKLQl9IHwgZmdyZXAgRk5PUkQKLWV4cGVjdGVkLXN0ZG91dDoKLQlGTk9SRC0wCi0JRk5PUkQtMQotCUZOT1JEX0MKLQlGTk9SRF9ECi0JRk5PUkRfRwotCUZOT1JEX0gKLQlGTk9SRC0yCi0JZXhwb3J0IEZOT1JEX0M9MwotCWV4cG9ydCBGTk9SRF9EPTQKLQlleHBvcnQgRk5PUkRfRz03Ci0JZXhwb3J0IEZOT1JEX0g9OAotCUZOT1JELTMKLQlGTk9SRF9CCi0JRk5PUkRfRAotCUZOT1JEX0YKLQlGTk9SRF9ICi0JRk5PUkQtNAotCXJlYWRvbmx5IEZOT1JEX0I9MgotCXJlYWRvbmx5IEZOT1JEX0Q9NAotCXJlYWRvbmx5IEZOT1JEX0Y9NgotCXJlYWRvbmx5IEZOT1JEX0g9OAotCUZOT1JELTUKLQl0eXBlc2V0IEZOT1JEX0EKLQl0eXBlc2V0IC1yIEZOT1JEX0IKLQl0eXBlc2V0IC14IEZOT1JEX0MKLQl0eXBlc2V0IC14IC1yIEZOT1JEX0QKLQl0eXBlc2V0IC1pIEZOT1JEX0UKLQl0eXBlc2V0IC1pIC1yIEZOT1JEX0YKLQl0eXBlc2V0IC1pIC14IEZOT1JEX0cKLQl0eXBlc2V0IC1pIC14IC1yIEZOT1JEX0gKLQlGTk9SRC02Ci0JdHlwZXNldCBGTk9SRF9BPTEKLQl0eXBlc2V0IC1yIEZOT1JEX0I9MgotCXR5cGVzZXQgLXggRk5PUkRfQz0zCi0JdHlwZXNldCAteCAtciBGTk9SRF9EPTQKLQl0eXBlc2V0IC1pIEZOT1JEX0U9NQotCXR5cGVzZXQgLWkgLXIgRk5PUkRfRj02Ci0JdHlwZXNldCAtaSAteCBGTk9SRF9HPTcKLQl0eXBlc2V0IC1pIC14IC1yIEZOT1JEX0g9OAotCUZOT1JELTcKLQlGTk9SRF9BPTEKLQlGTk9SRF9CPTIKLQlGTk9SRF9DPTMKLQlGTk9SRF9EPTQKLQlGTk9SRF9FPTUKLQlGTk9SRF9GPTYKLQlGTk9SRF9HPTcKLQlGTk9SRF9IPTgKLQlGTk9SRC04Ci0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNjQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgd2UgY2FuIHJlZGVmaW5lIGZ1bmN0aW9ucyBjYWxsaW5nIHRpbWUgYnVpbHRpbgotc3RkaW46Ci0JdCgpIHsKLQkJdGltZSA+L2Rldi9udWxsCi0JfQotCXQgMj4vZGV2L251bGwKLQl0KCkgewotCQl0aW1lCi0JfQotLS0tCi1uYW1lOiBzeW50YXgtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBsb25lIGFtcGVyc2FuZCBpcyBhIHN5bnRheCBlcnJvcgotc3RkaW46Ci0JICYKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL3N5bnRheCBlcnJvci8KLS0tLQotbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBpbnNpZGUgb2YgJHt9Ci1zdGRpbjoKLQlhYmM9MgotCWVjaG8gJHthYlwKLQljfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTIKLS0tLQotbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBhdCB0aGUgc3RhcnQgb2YgYSBoZXJlIGRvY3VtZW50Ci1zdGRpbjoKLQljYXQgPDwgRU9cCi0JRgotCWhpCi0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLS0tLQotbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBhdCB0aGUgZW5kIG9mIGEgaGVyZSBkb2N1bWVudAotc3RkaW46Ci0JY2F0IDw8IEVPRgotCWhpCi0JRU9cCi0JRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LWNtZAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBpbiBhIGNvbW1hbmQgYWZmZWN0IHN1YnNlcXVlbnQgYXNzaWdubWVudHMKLQlpbiB0aGUgc2FtZSBjb21tYW5kCi1zdGRpbjoKLQlGT089YWJjCi0JRk9PPTEyMyBCQVI9JEZPTwotCWVjaG8gJEJBUgotZXhwZWN0ZWQtc3Rkb3V0OgotCTEyMwotLS0tCi1uYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1wb3NpeC1jbWQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgd2l0aCBhCi0JY29tbWFuZCBuYW1lIG1hdGNoZXMgUE9TSVguIFNlZToKLQlodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLnN0YW5kYXJkcy5wb3NpeC5hdXN0aW4uZ2VuZXJhbC8xOTI1Ci1zdGRpbjoKLQlYPWEgWT1iOyBYPSRZIFk9JFggIiRfX3Byb2duYW1lIiAtYyAnZWNobyAxICRYICRZIC4nOyBlY2hvIDIgJFggJFkgLgotCXVuc2V0IFggWSBaCi0JWD1hIFk9JHtYPWJ9IFo9JFggIiRfX3Byb2duYW1lIiAtYyAnZWNobyAzICRaIC4nCi0JdW5zZXQgWCBZIFoKLQlYPWEgWT0ke1g9Yn0gWj0kWDsgZWNobyA0ICRaIC4KLWV4cGVjdGVkLXN0ZG91dDoKLQkxIGIgYSAuCi0JMiBhIGIgLgotCTMgYiAuCi0JNCBhIC4KLS0tLQotbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtbm9jbWQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgd2l0aCBubwotCWNvbW1hbmQgbmFtZSBtYXRjaGVzIFBPU0lYIChEZWJpYW4gIzMzNDE4MikuIFNlZToKLQlodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLnN0YW5kYXJkcy5wb3NpeC5hdXN0aW4uZ2VuZXJhbC8xOTI1Ci1zdGRpbjoKLQlYPWEgWT1iOyBYPSRZIFk9JFg7IGVjaG8gMSAkWCAkWSAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBiIGIgLgotLS0tCi1uYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1wb3NpeC1zdWJhc3NpZ24KLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgbWF0Y2hlcyBQT1NJWDoKLQktIFRoZSBhc3NpZ25tZW50IHdvcmRzIHNoYWxsIGJlIGV4cGFuZGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgotCSAgZW52aXJvbm1lbnQuCi0JLSBUaGUgYXNzaWdubWVudHMgaGFwcGVuIGluIHRoZSB0ZW1wb3JhcnkgZXhlY3V0aW9uIGVudmlyb25tZW50Lgotc3RkaW46Ci0JdW5zZXQgWCBZIFoKLQlaPWEgWT0ke1g6PWJ9IHNoIC1jICdlY2hvICskWCsgKyRZKyArJForJwotCWVjaG8gLyRYLwotCSMgTm93IGZvciB0aGUgc3BlY2lhbCBjYXNlOgotCXVuc2V0IFggWSBaCi0JWD0gWT0ke1g6PWJ9IHNoIC1jICdlY2hvICskWCsgKyRZKycKLQllY2hvIC8kWC8KLWV4cGVjdGVkLXN0ZG91dDoKLQkrKyArYisgK2ErCi0JL2IvCi0JKysgK2IrCi0JL2IvCi0tLS0KLW5hbWU6IHh4eC1leGVjLWVudmlyb25tZW50LTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRvIHNlZSBpZiBleGVjIHNldHMgaXQncyBlbnZpcm9ubWVudCBjb3JyZWN0bHkKLXN0ZGluOgotCUZPTz1iYXIgZXhlYyBlbnYKLWV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOgotCS8oXnwuKlxuKUZPTz1iYXJcbi8KLS0tLQotbmFtZTogeHh4LWV4ZWMtZW52aXJvbm1lbnQtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdG8gbWFrZSBzdXJlIGV4ZWMgZG9lc24ndCBjaGFuZ2UgZW52aXJvbm1lbnQgaWYgYSBwcm9ncmFtCi0JaXNuJ3QgZXhlYy1lZAotc3RkaW46Ci0Jc29ydHByb2c9JCh3aGVuY2UgLXAgc29ydCkgfHwgc29ydHByb2c9Y2F0Ci0JZW52IHwgJHNvcnRwcm9nIHwgZ3JlcCAtdiAnXlJBTkRPTT0nID5iYXIxCi0JRk9PPWJhciBleGVjOyBlbnYgfCAkc29ydHByb2cgfCBncmVwIC12ICdeUkFORE9NPScgPmJhcjIKLQljbXAgLXMgYmFyMSBiYXIyCi0tLS0KLW5hbWU6IGV4ZWMtZnVuY3Rpb24tZW52aXJvbm1lbnQtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgYXNzaWdubWVudHMgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIHdoZXRoZXIgdGhleSBhZmZlY3QKLQl0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQgKGtzaDkzLCBTVVN2NCkKLXN0ZGluOgotCWYoKSB7IGE9MjsgfTsgZygpIHsgYj0zOyBlY2hvIHkkYy07IH07IGE9MSBmOyBiPTI7IGM9MSBnCi0JZWNobyB4JGEtJGItIHokYy0KLWV4cGVjdGVkLXN0ZG91dDoKLQl5MS0KLQl4Mi0zLSB6MS0KLS0tLQotbmFtZTogeHh4LXdoYXQtZG8teW91LWNhbGwtdGhpcy0xCi1zdGRpbjoKLQllY2hvICIke2ZvbzotImEifSoiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYSoKLS0tLQotbmFtZTogeHh4LXByZWZpeC1zdHJpcC0xCi1zdGRpbjoKLQlmb289J2EgY2RlZicKLQllY2hvICR7Zm9vI2EgY30KLWV4cGVjdGVkLXN0ZG91dDoKLQlkZWYKLS0tLQotbmFtZTogeHh4LXByZWZpeC1zdHJpcC0yCi1zdGRpbjoKLQlzZXQgYSBjCi0JeD0nYSBjZGVmJwotCWVjaG8gJHt4IyQqfQotZXhwZWN0ZWQtc3Rkb3V0OgotCWRlZgotLS0tCi1uYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTEKLXN0ZGluOgotCWVjaG8gJHs6fQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHh4eC12YXJpYWJsZS1zeW50YXgtMgotc3RkaW46Ci0Jc2V0IDAKLQllY2hvICR7KjowfQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHh4eC12YXJpYWJsZS1zeW50YXgtMwotc3RkaW46Ci0Jc2V0IC1BIGZvbyAwCi0JZWNobyAke2Zvb1sqXTowfQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHh4eC1zdWJzdGl0dXRpb24tZXZhbC1vcmRlcgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgb3JkZXIgb2YgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucwotc3RkaW46Ci0JaT0xIHg9IHk9Ci0Jc2V0IC1BIEEgYWJjIGRlZiBHSEkgaiBHIGsKLQllY2hvICR7QVt4PShpKz0xKV0jJHtBW3k9KGkrPTIpXX19Ci0JZWNobyAkeCAkeQotZXhwZWN0ZWQtc3Rkb3V0OgotCUhJCi0JMiA0Ci0tLS0KLW5hbWU6IHh4eC1zZXQtb3B0aW9uLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIG9wdGlvbiBwYXJzaW5nIGluIHNldAotc3RkaW46Ci0Jc2V0IC12c0EgZm9vIC0tIEEgMSAzIDIKLQllY2hvICR7Zm9vWypdfQotZXhwZWN0ZWQtc3RkZXJyOgotCWVjaG8gJHtmb29bKl19Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMSAyIDMgQQotLS0tCi1uYW1lOiB4eHgtZXhlYy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGV4ZWMgZXhpdHMgZm9yIGJ1aWx0LWlucwotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQlleGVjIGVjaG8gaGkKLQllY2hvIHN0aWxsIGhlcnJlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLiovCi0tLS0KLW5hbWU6IHh4eC13aGlsZS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHdoaWxlIGxvb3BzCi0JWFhYIG5lZWQgdG8gZG8gc2FtZSBmb3IgZm9yL3NlbGVjdC91bnRpbCBsb29wcwotc3RkaW46Ci0JaT14Ci0Jd2hpbGUgWyAkaSAhPSB4eHggXSA7IGRvCi0JICAgIGk9eCRpCi0JICAgIGlmIFsgJGkgPSB4eHggXSA7IHRoZW4KLQkJZmFsc2UKLQkJY29udGludWUKLQkgICAgZmkKLQlkb25lCi0JZWNobyBsb29wMT0kPwotCQotCWk9eAotCXdoaWxlIFsgJGkgIT0geHh4IF0gOyBkbwotCSAgICBpPXgkaQotCSAgICBpZiBbICRpID0geHh4IF0gOyB0aGVuCi0JCWZhbHNlCi0JCWJyZWFrCi0JICAgIGZpCi0JZG9uZQotCWVjaG8gbG9vcDI9JD8KLQkKLQlpPXgKLQl3aGlsZSBbICRpICE9IHh4eCBdIDsgZG8KLQkgICAgaT14JGkKLQkgICAgZmFsc2UKLQlkb25lCi0JZWNobyBsb29wMz0kPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWxvb3AxPTAKLQlsb29wMj0wCi0JbG9vcDM9MQotLS0tCi1uYW1lOiB4eHgtc3RhdHVzLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYmxhbmsgbGluZXMgZG9uJ3QgY2xlYXIgJD8KLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JKGV4aXQgMSkKLQllY2hvICQ/Ci0JKGV4aXQgMSkKLQkKLQllY2hvICQ/Ci0JdHJ1ZQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEKLQkxCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLwotLS0tCi1uYW1lOiB4eHgtc3RhdHVzLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgJD8gaXMgcHJlc2VydmVkIGluIHN1YnNoZWxscywgaW5jbHVkZXMsIHRyYXBzLgotc3RkaW46Ci0JKGV4aXQgMSkKLQkKLQllY2hvIGJsYW5rOiAkPwotCQotCShleGl0IDIpCi0JKGVjaG8gc3Vic2hlbGw6ICQ/KQotCQotCWVjaG8gJ2VjaG8gaW5jbHVkZTogJD8nID4gZm9vCi0JKGV4aXQgMykKLQkuIC4vZm9vCi0JCi0JdHJhcCAnZWNobyB0cmFwOiAkPycgRVJSCi0JKGV4aXQgNCkKLQllY2hvIGV4aXQ6ICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYmxhbms6IDEKLQlzdWJzaGVsbDogMgotCWluY2x1ZGU6IDMKLQl0cmFwOiA0Ci0JZXhpdDogNAotLS0tCi1uYW1lOiB4eHgtY2xlYW4tY2hhcnMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgTUFHSUMgY2hhcmFjdGVyIGlzIHN0dWZmZWQgY29ycmVjdGx5Ci1zdGRpbjoKLQllY2hvIGBlY2hvIFujYAotZXhwZWN0ZWQtc3Rkb3V0OgotCVujCi0tLS0KLW5hbWU6IHh4eC1wYXJhbS1zdWJzdC1xbWFyay0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdXBwcmVzaW9uIG9mIGVycm9yIG1lc3NhZ2Ugd2l0aCBudWxsIHN0cmluZy4gIEFjY29yZGluZyB0bwotCVBPU0lYLCBpdCBzaG91bGRuJ3QgcHJpbnQgdGhlIGVycm9yIGFzICd3b3JkJyBpc24ndCBvbW1pdHRlZC4KLQlrc2g4OC85MywgU29sYXJpcyAvYmluL3NoIGFuZCAvdXNyL3hwZzQvYmluL3NoIGFsbCBwcmludCB0aGUgZXJyb3IsCi0JdGhhdCdzIHdoeSB0aGUgY29uZGl0aW9uIGlzIHJldmVyc2VkLgotc3RkaW46Ci0JdW5zZXQgZm9vCi0JeD0KLQllY2hvIHgke2Zvbz8keH0KLWV4cGVjdGVkLWV4aXQ6IDEKLSMgUE9TSVgKLSNleHBlY3RlZC1mYWlsOiB5ZXMKLSNleHBlY3RlZC1zdGRlcnItcGF0dGVybjogIS9ub3Qgc2V0LwotIyBjb21tb24gdXNlCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjogL3BhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQvCi0tLS0KLW5hbWU6IHh4eC1wYXJhbS1fLTEKLSMgZmFpbHMgZHVlIHRvIHdlaXJkbmVzcyBvZiBleGVjdiBzdHVmZgotY2F0ZWdvcnk6ICFvczp1d2luLW50Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBjIGZsYWcgaXMgc2V0LgotYXJndW1lbnRzOiAhLWMhZWNobyAiWyQtXSIhCi1leHBlY3RlZC1zdGRvdXQtcGF0dGVybjogL15cWy4qYy4qXF0kLwotLS0tCi1uYW1lOiB0aWxkZS1leHBhbmQtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGlsZGUgZXhwYW5zaW9uIGFmdGVyIGVxdWFsIHNpZ25zCi1lbnYtc2V0dXA6ICFIT01FPS9zd2VldCEKLXN0ZGluOgotCWVjaG8gJHtBPWE9fX4gYj1+IGM9ZH4gfgotCXNldCArbyBicmFjZWV4cGFuZAotCWVjaG8gJHtBPWE9fX4gYj1+IGM9ZH4gfgotZXhwZWN0ZWQtc3Rkb3V0OgotCWE9L3N3ZWV0IGI9L3N3ZWV0IGM9ZH4gL3N3ZWV0Ci0JYT1+IGI9fiBjPWR+IC9zd2VldAotLS0tCi1uYW1lOiBleGl0LWVyci0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lICJleGl0IG9uIGVycm9yIiBjb25kaXRpb25zCi1zdGRpbjoKLQlzZXQgLWV4Ci0JL3Vzci9iaW4vZW52IGZhbHNlICYmIGVjaG8gc29tZXRoaW5nCi0JZWNobyBFTkQKLWV4cGVjdGVkLXN0ZG91dDoKLQlFTkQKLWV4cGVjdGVkLXN0ZGVycjoKLQkrIC91c3IvYmluL2VudiBmYWxzZQotCSsgZWNobyBFTkQKLS0tLQotbmFtZTogZXhpdC1lcnItMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSAiZXhpdCBvbiBlcnJvciIgZWRnZSBjb25kaXRpb25zIChQT1NJWGx5KQotc3RkaW46Ci0Jc2V0IC1leAotCWlmIC91c3IvYmluL2VudiB0cnVlOyB0aGVuCi0JCS91c3IvYmluL2VudiBmYWxzZSAmJiBlY2hvIHNvbWV0aGluZwotCWZpCi0JZWNobyBFTkQKLWV4cGVjdGVkLXN0ZG91dDoKLQlFTkQKLWV4cGVjdGVkLXN0ZGVycjoKLQkrIC91c3IvYmluL2VudiB0cnVlCi0JKyAvdXNyL2Jpbi9lbnYgZmFsc2UKLQkrIGVjaG8gRU5ECi0tLS0KLW5hbWU6IGV4aXQtZXJyLTMKLWRlc2NyaXB0aW9uOgotCXBka3NoIHJlZ3Jlc3Npb24gd2hpY2ggQVQmVCBrc2ggZG9lcyByaWdodAotCVRGTSBzYXlzOiBbc2V0XSAtZSB8IGVycmV4aXQKLQkJRXhpdCAoYWZ0ZXIgZXhlY3V0aW5nIHRoZSBFUlIgdHJhcCkgLi4uCi1zdGRpbjoKLQl0cmFwICdlY2hvIEVYSVQnIEVYSVQKLQl0cmFwICdlY2hvIEVSUicgRVJSCi0Jc2V0IC1lCi0JY2QgL1hYWFhYIDI+L2Rldi9udWxsCi0JZWNobyBET05FCi0JZXhpdCAwCi1leHBlY3RlZC1zdGRvdXQ6Ci0JRVJSCi0JRVhJVAotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi0tLS0KLW5hbWU6IGV4aXQtZXJyLTQKLWRlc2NyaXB0aW9uOgotCSJzZXQgLWUiIHRlc3Qgc3VpdGUgKFBPU0lYKQotc3RkaW46Ci0Jc2V0IC1lCi0JZWNobyBwcmUKLQlpZiB0cnVlIDsgdGhlbgotCQlmYWxzZSAmJiBlY2hvIGZvbwotCWZpCi0JZWNobyBiYXIKLWV4cGVjdGVkLXN0ZG91dDoKLQlwcmUKLQliYXIKLS0tLQotbmFtZTogZXhpdC1lcnItNQotZGVzY3JpcHRpb246Ci0JInNldCAtZSIgdGVzdCBzdWl0ZSAoUE9TSVgpCi1zdGRpbjoKLQlzZXQgLWUKLQlmb28oKSB7Ci0JCXdoaWxlIFsgIiQxIiBdOyBkbwotCQkJZm9yIEUgaW4gJHg7IGRvCi0JCQkJWyAiJDEiID0gIiRFIiBdICYmIHsgc2hpZnQgOyBjb250aW51ZSAyIDsgfQotCQkJZG9uZQotCQkJeD0iJHggJDEiCi0JCQlzaGlmdAotCQlkb25lCi0JCWVjaG8gJHgKLQl9Ci0JZWNobyBwcmUKLQlmb28gYSBiIGIgYwotCWVjaG8gcG9zdAotZXhwZWN0ZWQtc3Rkb3V0OgotCXByZQotCWEgYiBjCi0JcG9zdAotLS0tCi1uYW1lOiBleGl0LWVyci02Ci1kZXNjcmlwdGlvbjoKLQkic2V0IC1lIiB0ZXN0IHN1aXRlIChCU0QgbWFrZSkKLWNhdGVnb3J5OiBvczptaXJic2QKLXN0ZGluOgotCW1rZGlyIHpkIHpkL2EgemQvYgotCXByaW50ICdhbGw6XG5cdEBlY2hvIGVpbnNcblx0QGV4aXQgNDJcbicgPnpkL2EvTWFrZWZpbGUKLQlwcmludCAnYWxsOlxuXHRAZWNobyB6d2VpXG4nID56ZC9iL01ha2VmaWxlCi0Jd2Q9JChwd2QpCi0Jc2V0IC1lCi0JZm9yIGVudHJ5IGluIGEgYjsgZG8gKCAgc2V0IC1lOyAgaWYgW1sgLWQgJHdkL3pkLyRlbnRyeS5pMzg2IF1dOyB0aGVuICBfbmV3ZGlyXz0iJGVudHJ5LmkzODYiOyAgZWxzZSAgX25ld2Rpcl89IiRlbnRyeSI7ICBmaTsgIGlmIFtbIC16ICRfVEhJU0RJUl8gXV07IHRoZW4gIF9uZXh0ZGlyXz0iJF9uZXdkaXJfIjsgIGVsc2UgIF9uZXh0ZGlyXz0iJF9USElTRElSXy8kX25ld2Rpcl8iOyAgZmk7ICBfbWFrZWZpbGVfc3BlY189OyAgW1sgISAtZiAkd2QvemQvJF9uZXdkaXJfL01ha2VmaWxlLmJzZC13cmFwcGVyIF1dICB8fCBfbWFrZWZpbGVfc3BlY189Ii1mIE1ha2VmaWxlLmJzZC13cmFwcGVyIjsgIHN1YnNraXBkaXI9OyAgZm9yIHNraXBkaXIgaW4gOyBkbyAgc3ViZW50cnk9JHtza2lwZGlyIyRlbnRyeX07ICBpZiBbWyAkc3ViZW50cnkgIT0gJHNraXBkaXIgXV07IHRoZW4gIGlmIFtbIC16ICRzdWJlbnRyeSBdXTsgdGhlbiAgZWNobyAiKCRfbmV4dGRpcl8gc2tpcHBlZCkiOyAgYnJlYWs7ICBmaTsgIHN1YnNraXBkaXI9IiRzdWJza2lwZGlyICR7c3ViZW50cnkjL30iOyAgZmk7ICBkb25lOyAgaWYgW1sgLXogJHNraXBkaXIgfHwgLW4gJHN1YmVudHJ5IF1dOyB0aGVuICBlY2hvICI9PT0+ICRfbmV4dGRpcl8iOyAgY2QgJHdkL3pkLyRfbmV3ZGlyXzsgIG1ha2UgU0tJUERJUj0iJHN1YnNraXBkaXIiICRfbWFrZWZpbGVfc3BlY18gIF9USElTRElSXz0iJF9uZXh0ZGlyXyIgICBhbGw7ICBmaTsgICkgZG9uZSAyPiYxIHwgc2VkICJzISR3ZCFXRCFnIgotZXhwZWN0ZWQtc3Rkb3V0OgotCT09PT4gYQotCWVpbnMKLQkqKiogRXJyb3IgY29kZSA0MgotCQotCVN0b3AgaW4gV0QvemQvYSAobGluZSAyIG9mIE1ha2VmaWxlKS4KLS0tLQotbmFtZTogZXhpdC1lbm9lbnQtMQotZGVzY3JpcHRpb246Ci0JU1VTdjQgc2F5cyB0aGF0IHRoZSBzaGVsbCBzaG91bGQgZXhpdCB3aXRoIDEyNi8xMjcgaW4gc29tZSBzaXR1YXRpb25zCi1zdGRpbjoKLQlpPTAKLQkoZWNobzsgZWNobyA6KSA+eAotCSIkX19wcm9nbmFtZSIgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCi0JIiRfX3Byb2duYW1lIiAtYyAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KLQllY2hvIGV4aXQgNDIgPngKLQkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgotCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCi0Jcm0gLWYgeAotCSIkX19wcm9nbmFtZSIgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCi0JIiRfX3Byb2duYW1lIiAtYyAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KLWV4cGVjdGVkLXN0ZG91dDoKLQkwIDAgLgotCTEgMTI2IC4KLQkyIDQyIC4KLQkzIDEyNiAuCi0JNCAxMjcgLgotCTUgMTI3IC4KLS0tLQotbmFtZTogZXhpdC1ldmFsLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGV2YWwgdnMgc3Vic3RpdHV0aW9uIGV4aXQgY29kZXMgKGtzaDkzIGFsaWtlKQotc3RkaW46Ci0JZXZhbCAkKGZhbHNlKQotCWVjaG8gQSAkPwotCWV2YWwgJyAkKGZhbHNlKScKLQllY2hvIEIgJD8KLQlldmFsICIgJChmYWxzZSkiCi0JZWNobyBDICQ/Ci0JZXZhbCAiZXZhbCAkKGZhbHNlKSIKLQllY2hvIEQgJD8KLQlldmFsICdldmFsICciJChmYWxzZSkiCi0JZWNobyBFICQ/Ci0JSUZTPSIkSUZTOiIKLQlldmFsICQoZWNobyA6OyBmYWxzZSkKLQllY2hvIEYgJD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlBIDAKLQlCIDEKLQlDIDAKLQlEIDAKLQlFIDAKLQlGIDAKLS0tLQotbmFtZTogdGVzdC1zdGx0LTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGVzdCBhbHNvIGNhbiBoYW5kbGUgc3RyaW5nMSA8IHN0cmluZzIgZXRjLgotc3RkaW46Ci0JdGVzdCAyMDA1LzEwLzA4ICc8JyAyMDA1LzA4LzIxICYmIGVjaG8gamEgfHwgZWNobyBuZWluCi0JdGVzdCAyMDA1LzA4LzIxIFw8IDIwMDUvMTAvMDggJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KLQl0ZXN0IDIwMDUvMTAvMDggJz4nIDIwMDUvMDgvMjEgJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KLQl0ZXN0IDIwMDUvMDgvMjEgXD4gMjAwNS8xMC8wOCAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgotZXhwZWN0ZWQtc3Rkb3V0OgotCW5laW4KLQlqYQotCWphCi0JbmVpbgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46ICEvdW5leHBlY3RlZCBvcC8KLS0tLQotbmFtZTogdGVzdC1wcmVjZWRlbmNlLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGEgd2VpcmQgcHJlY2VkZW5jZSBjYXNlIChhbmQgUE9TSVggZWNobykKLXN0ZGluOgotCXRlc3QgXCggLWYgPSAtZiBcKQotCXJ2PSQ/Ci0JdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCi0JZWNobyAtZSAkcnYKLWV4cGVjdGVkLXN0ZG91dDoKLQktZSAwCi0tLS0KLW5hbWU6IHRlc3Qtb3B0aW9uLTEKLWRlc2NyaXB0aW9uOgotCVRlc3QgdGhlIHRlc3QgLW8gb3BlcmF0b3IKLXN0ZGluOgotCXJ1bnRlc3QoKSB7Ci0JCXRlc3QgLW8gJDE7IGVjaG8gJD8KLQkJWyAtbyAkMSBdOyBlY2hvICQ/Ci0JCVtbIC1vICQxIF1dOyBlY2hvICQ/Ci0JfQotCWlmX3Rlc3QoKSB7Ci0JCXRlc3QgLW8gJDEgLW8gLW8gISQxOyBlY2hvICQ/Ci0JCVsgLW8gJDEgLW8gLW8gISQxIF07IGVjaG8gJD8KLQkJW1sgLW8gJDEgfHwgLW8gISQxIF1dOyBlY2hvICQ/Ci0JCXRlc3QgLW8gPyQxOyBlY2hvICQ/Ci0JfQotCWVjaG8gMHkgJChpZl90ZXN0IHV0ZjgtbW9kZSkgPQotCWVjaG8gMG4gJChpZl90ZXN0IHV0ZjgtaGFjaykgPQotCWVjaG8gMT0gJChydW50ZXN0IHV0ZjgtaGFjaykgPQotCWVjaG8gMj0gJChydW50ZXN0ICF1dGY4LWhhY2spID0KLQllY2hvIDM9ICQocnVudGVzdCA/dXRmOC1oYWNrKSA9Ci0Jc2V0ICtVCi0JZWNobyAxKyAkKHJ1bnRlc3QgdXRmOC1tb2RlKSA9Ci0JZWNobyAyKyAkKHJ1bnRlc3QgIXV0ZjgtbW9kZSkgPQotCWVjaG8gMysgJChydW50ZXN0ID91dGY4LW1vZGUpID0KLQlzZXQgLVUKLQllY2hvIDEtICQocnVudGVzdCB1dGY4LW1vZGUpID0KLQllY2hvIDItICQocnVudGVzdCAhdXRmOC1tb2RlKSA9Ci0JZWNobyAzLSAkKHJ1bnRlc3QgP3V0ZjgtbW9kZSkgPQotCWVjaG8gPSBzaG9ydCBmbGFncyA9Ci0JZWNobyAweSAkKGlmX3Rlc3QgLVUpID0KLQllY2hvIDB5ICQoaWZfdGVzdCArVSkgPQotCWVjaG8gMG4gJChpZl90ZXN0IC1fKSA9Ci0JZWNobyAwbiAkKGlmX3Rlc3QgLVUtKSA9Ci0JZWNobyAxPSAkKHJ1bnRlc3QgLV8pID0KLQllY2hvIDI9ICQocnVudGVzdCAhLV8pID0KLQllY2hvIDM9ICQocnVudGVzdCA/LV8pID0KLQlzZXQgK1UKLQllY2hvIDErICQocnVudGVzdCAtVSkgPQotCWVjaG8gMisgJChydW50ZXN0ICEtVSkgPQotCWVjaG8gMysgJChydW50ZXN0ID8tVSkgPQotCWVjaG8gMSsgJChydW50ZXN0ICtVKSA9Ci0JZWNobyAyKyAkKHJ1bnRlc3QgIStVKSA9Ci0JZWNobyAzKyAkKHJ1bnRlc3QgPytVKSA9Ci0Jc2V0IC1VCi0JZWNobyAxLSAkKHJ1bnRlc3QgLVUpID0KLQllY2hvIDItICQocnVudGVzdCAhLVUpID0KLQllY2hvIDMtICQocnVudGVzdCA/LVUpID0KLQllY2hvIDEtICQocnVudGVzdCArVSkgPQotCWVjaG8gMi0gJChydW50ZXN0ICErVSkgPQotCWVjaG8gMy0gJChydW50ZXN0ID8rVSkgPQotZXhwZWN0ZWQtc3Rkb3V0OgotCTB5IDAgMCAwIDAgPQotCTBuIDEgMSAxIDEgPQotCTE9IDEgMSAxID0KLQkyPSAxIDEgMSA9Ci0JMz0gMSAxIDEgPQotCTErIDEgMSAxID0KLQkyKyAwIDAgMCA9Ci0JMysgMCAwIDAgPQotCTEtIDAgMCAwID0KLQkyLSAxIDEgMSA9Ci0JMy0gMCAwIDAgPQotCT0gc2hvcnQgZmxhZ3MgPQotCTB5IDAgMCAwIDAgPQotCTB5IDAgMCAwIDAgPQotCTBuIDEgMSAxIDEgPQotCTBuIDEgMSAxIDEgPQotCTE9IDEgMSAxID0KLQkyPSAxIDEgMSA9Ci0JMz0gMSAxIDEgPQotCTErIDEgMSAxID0KLQkyKyAwIDAgMCA9Ci0JMysgMCAwIDAgPQotCTErIDEgMSAxID0KLQkyKyAwIDAgMCA9Ci0JMysgMCAwIDAgPQotCTEtIDAgMCAwID0KLQkyLSAxIDEgMSA9Ci0JMy0gMCAwIDAgPQotCTEtIDAgMCAwID0KLQkyLSAxIDEgMSA9Ci0JMy0gMCAwIDAgPQotLS0tCi1uYW1lOiBta3NocmMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgotCVBhcnQgMTogdmVyaWZ5IHVzZXIgZW52aXJvbm1lbnQgaXMgbm90IHJlYWQgKGludGVybmFsKQotc3RkaW46Ci0JZWNobyB4ICRGTk9SRAotZXhwZWN0ZWQtc3Rkb3V0OgotCXgKLS0tLQotbmFtZTogbWtzaHJjLTJhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCi0JUGFydCAyOiB2ZXJpZnkgbWtzaHJjIGlzIG5vdCByZWFkIChub24taW50ZXJhY3RpdmUgc2hlbGxzKQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5ta3NocmMiCi0JRk5PUkQ9NDIKLWVudi1zZXR1cDogIUhPTUU9LiFFTlY9IQotc3RkaW46Ci0JZWNobyB4ICRGTk9SRAotZXhwZWN0ZWQtc3Rkb3V0OgotCXgKLS0tLQotbmFtZTogbWtzaHJjLTJiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCi0JUGFydCAyOiB2ZXJpZnkgbWtzaHJjIGNhbiBiZSByZWFkIChpbnRlcmFjdGl2ZSBzaGVsbHMpCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiLm1rc2hyYyIKLQlGTk9SRD00MgotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFIT01FPS4hRU5WPSFQUzE9IQotc3RkaW46Ci0JZWNobyB4ICRGTk9SRAotZXhwZWN0ZWQtc3Rkb3V0OgotCXggNDIKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8oIyApKi8KLS0tLQotbmFtZTogbWtzaHJjLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KLQlQYXJ0IDM6IHZlcmlmeSBta3NocmMgY2FuIGJlIHR1cm5lZCBvZmYKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIubWtzaHJjIgotCUZOT1JEPTQyCi1lbnYtc2V0dXA6ICFIT01FPS4hRU5WPW5vbmV4aXN0YW50IQotc3RkaW46Ci0JZWNobyB4ICRGTk9SRAotZXhwZWN0ZWQtc3Rkb3V0OgotCXgKLS0tLQotbmFtZTogc2gtbW9kZS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHNoIG1vZGUgdHVybnMgYnJhY2VleHBhbmQgb2ZmCi0JYW5kIHRoYXQgdGhhdCB3b3JrcyBjb3JyZWN0bHkKLXN0ZGluOgotCXNldCAtbyBicmFjZWV4cGFuZAotCXNldCArbyBzaAotCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKLQlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAotCWVjaG8ge2EsYixjfQotCXNldCArbyBicmFjZWV4cGFuZAotCWVjaG8ge2EsYixjfQotCXNldCAtbyBicmFjZWV4cGFuZAotCWVjaG8ge2EsYixjfQotCXNldCAtbyBzaAotCWVjaG8ge2EsYixjfQotCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKLQlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAotCXNldCAtbyBicmFjZWV4cGFuZAotCWVjaG8ge2EsYixjfQotCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKLQlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAotZXhwZWN0ZWQtc3Rkb3V0OgotCW5vc2gKLQlicmV4Ci0JYSBiIGMKLQl7YSxiLGN9Ci0JYSBiIGMKLQl7YSxiLGN9Ci0Jc2gKLQlub2JyZXgKLQlhIGIgYwotCXNoCi0JYnJleAotLS0tCi1uYW1lOiBzaC1tb2RlLTJhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHNoIG1vZGUgaXMgKm5vdCogYXV0b21hdGljYWxseSB0dXJuZWQgb24KLWNhdGVnb3J5OiAhYmluc2gKLXN0ZGluOgotCWxuIC1zICIkX19wcm9nbmFtZSIga3NoCi0JbG4gLXMgIiRfX3Byb2duYW1lIiBzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgLi8ta3NoCi0JbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1zaAotCWZvciBzaGVsbCBpbiB7LC19eyxrfXNoOyBkbwotCQlwcmludCAtLSAkc2hlbGwgJCguLyRzaGVsbCArbCAtYyBcCi0JCSAgICAnW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaCcpCi0JZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCXNoIG5vc2gKLQlrc2ggbm9zaAotCS1zaCBub3NoCi0JLWtzaCBub3NoCi0tLS0KLW5hbWU6IHNoLW1vZGUtMmIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc2ggbW9kZSAqaXMqIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uCi1jYXRlZ29yeTogYmluc2gKLXN0ZGluOgotCWxuIC1zICIkX19wcm9nbmFtZSIga3NoCi0JbG4gLXMgIiRfX3Byb2duYW1lIiBzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgLi8ta3NoCi0JbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1zaAotCWZvciBzaGVsbCBpbiB7LC19eyxrfXNoOyBkbwotCQlwcmludCAtLSAkc2hlbGwgJCguLyRzaGVsbCArbCAtYyBcCi0JCSAgICAnW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaCcpCi0JZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCXNoIHNoCi0Ja3NoIG5vc2gKLQktc2ggc2gKLQkta3NoIG5vc2gKLS0tLQotbmFtZTogcGlwZWxpbmUtMQotZGVzY3JpcHRpb246Ci0JcGRrc2ggYnVnOiBsYXN0IGNvbW1hbmQgb2YgYSBwaXBlbGluZSBpcyBleGVjdXRlZCBpbiBhCi0Jc3Vic2hlbGwgLSBtYWtlIHN1cmUgaXQgc3RpbGwgaXMsIHNjcmlwdHMgZGVwZW5kIG9uIGl0Ci1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeCIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN5Igotc3RkaW46Ci0JZWNobyAqCi0JZWNobyBhIHwgd2hpbGUgcmVhZCBkOyBkbwotCQllY2hvICRkCi0JCWVjaG8gJGQqCi0JCWVjaG8gKgotCQlzZXQgLW8gbm9nbG9iCi0JCWVjaG8gJGQqCi0JCWVjaG8gKgotCWRvbmUKLQllY2hvICoKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmN4IGFiY3kKLQlhCi0JYWJjeCBhYmN5Ci0JYWJjeCBhYmN5Ci0JYSoKLQkqCi0JYWJjeCBhYmN5Ci0tLS0KLW5hbWU6IHBpcGVsaW5lLTIKLWRlc2NyaXB0aW9uOgotCWNoZWNrIHRoYXQgY28tcHJvY2Vzc2VzIHdvcmsgd2l0aCBUQ09NcywgVFBJUEVzIGFuZCBUUEFSRU5zCi1zdGRpbjoKLQkiJF9fcHJvZ25hbWUiIC1jICdpPTEwMDsgZWNobyBoaSB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKLQkiJF9fcHJvZ25hbWUiIC1jICdpPTIwMDsgZWNobyBoaSB8IGNhdCB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKLQkiJF9fcHJvZ25hbWUiIC1jICdpPTMwMDsgKGVjaG8gaGkgfCBjYXQpIHwmIHdoaWxlIHJlYWQgLXAgbGluZTsgZG8gZWNobyAiJCgoaSsrKSkgJGxpbmUiOyBkb25lJwotZXhwZWN0ZWQtc3Rkb3V0OgotCTEwMCBoaQotCTIwMCBoaQotCTMwMCBoaQotLS0tCi1uYW1lOiBwZXJzaXN0LWhpc3RvcnktMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgcGVyc2lzdGVudCBoaXN0b3J5IHNhdmluZyB3b3JrcwotY2F0ZWdvcnk6ICFuby1oaXN0ZmlsZQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JY2F0IGhpc3QuZmlsZQotZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46Ci0JL2NhdCBoaXN0LmZpbGUvCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogdHlwZXNldC1wYWRkaW5nLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGxlZnQvcmlnaHQganVzdGlmaWNhdGlvbiB3b3JrcyBhcyBwZXIgVEZNCi1zdGRpbjoKLQl0eXBlc2V0IC1MMTAgbG49MGhhbGwwCi0JdHlwZXNldCAtUjEwIHJuPTBoYWxsMAotCXR5cGVzZXQgLVpMMTAgbHo9MGhhbGwwCi0JdHlwZXNldCAtWlIxMCByej0waGFsbDAKLQl0eXBlc2V0IC1aMTAgcng9IiBoYWxsbyAiCi0JZWNobyAiPCRsbj4gPCRybj4gPCRsej4gPCRyej4gPCRyeD4iCi1leHBlY3RlZC1zdGRvdXQ6Ci0JPDBoYWxsMCAgICA+IDwgICAgMGhhbGwwPiA8aGFsbDAgICAgID4gPDAwMDAwaGFsbDA+IDwwMDAwIGhhbGxvPgotLS0tCi1uYW1lOiB0eXBlc2V0LXBhZGRpbmctMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYmFzZS0hMTAgaW50ZWdlcnMgYXJlIHBhZGRlZCByaWdodAotc3RkaW46Ci0JdHlwZXNldCAtVXVpMTYgLUw5IGxuPTE2IzEKLQl0eXBlc2V0IC1VdWkxNiAtUjkgcm49MTYjMQotCXR5cGVzZXQgLVV1aTE2IC1aOSB6bj0xNiMxCi0JdHlwZXNldCAtTDkgbHM9MTYjMQotCXR5cGVzZXQgLVI5IHJzPTE2IzEKLQl0eXBlc2V0IC1aOSB6cz0xNiMxCi0JZWNobyAiPCRsbj4gPCRybj4gPCR6bj4gPCRscz4gPCRycz4gPCR6cz4iCi1leHBlY3RlZC1zdGRvdXQ6Ci0JPDE2IzEgICAgID4gPCAgICAgMTYjMT4gPDE2IzAwMDAwMT4gPDE2IzEgICAgID4gPCAgICAgMTYjMT4gPDAwMDAwMTYjMT4KLS0tLQotbmFtZTogdXRmOGJvbS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBVVEYtOCBCeXRlIE9yZGVyIE1hcmsgaXMgaWdub3JlZCBhcyB0aGUgZmlyc3QKLQltdWx0aWJ5dGUgY2hhcmFjdGVyIG9mIHRoZSBzaGVsbCBpbnB1dCAod2l0aCAtYywgZnJvbSBzdGFuZGFyZAotCWlucHV0LCBhcyBmaWxlLCBvciBhcyBldmFsIGFyZ3VtZW50KSwgYnV0IG5vd2hlcmUgZWxzZQotIyBicmVha3Mgb24gTWFjIE9TWCAoSEZTKyBub24tc3RhbmRhcmQgVW5pY29kZSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbikKLWNhdGVnb3J5OiAhb3M6ZGFyd2luCi1zdGRpbjoKLQlta2RpciBmb28KLQlwcmludCAnIyEvYmluL3NoXG5lY2hvIG9obmUnID5mb28vZm5vcmQKLQlwcmludCAnIyEvYmluL3NoXG5lY2hvIG1pdCcgPmZvby/vu79mbm9yZAotCXByaW50ICfvu79mbm9yZFxuZm5vcmRcbu+7v2Zub3JkXG5mbm9yZCcgPmZvby9iYXIKLQlwcmludCBldmFsIFwnJ++7v2Zub3JkXG5mbm9yZFxu77u/Zm5vcmRcbmZub3JkJ1wnID5mb28vem9vCi0Jc2V0IC1BIGFuemFobCAtLSBmb28vKgotCWVjaG8gZ290ICR7I2FuemFobFsqXX0gZmlsZXMKLQljaG1vZCAreCBmb28vKgotCWV4cG9ydCBQQVRIPSQocHdkKS9mb286JFBBVEgKLQkiJF9fcHJvZ25hbWUiIC1jICfvu79mbm9yZCcKLQllY2hvID0KLQkiJF9fcHJvZ25hbWUiIC1jICfvu79mbm9yZDsgZm5vcmQ7IO+7v2Zub3JkOyBmbm9yZCcKLQllY2hvID0KLQkiJF9fcHJvZ25hbWUiIGZvby9iYXIKLQllY2hvID0KLQkiJF9fcHJvZ25hbWUiIDxmb28vYmFyCi0JZWNobyA9Ci0JIiRfX3Byb2duYW1lIiBmb28vem9vCi0JZWNobyA9Ci0JIiRfX3Byb2duYW1lIiAtYyAnZWNobyDvu786ICQo77u/Zm5vcmQpJwotCXJtIC1yZiBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQlnb3QgNCBmaWxlcwotCW9obmUKLQk9Ci0Jb2huZQotCW9obmUKLQltaXQKLQlvaG5lCi0JPQotCW9obmUKLQlvaG5lCi0JbWl0Ci0Jb2huZQotCT0KLQlvaG5lCi0Jb2huZQotCW1pdAotCW9obmUKLQk9Ci0Jb2huZQotCW9obmUKLQltaXQKLQlvaG5lCi0JPQotCe+7vzogbWl0Ci0tLS0KLW5hbWU6IHV0Zjhib20tMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB3ZSBjYW4gZXhlY3V0ZSBCT00tc2hlYmFuZ3MgKGZhaWx1cmVzIG5vdCBmYXRhbCkKLQlYWFggaWYgdGhlIE9TIGNhbiBhbHJlYWR5IGV4ZWN1dGUgdGhlbSwgd2UgbG9zZQotCW5vdGU6IGN5Z3dpbiBleGVjdmUoMikgZG9lc24ndCByZXR1cm4gdG8gdXMgd2l0aCBFTk9FWEVDLCB3ZSBsb3NlCi0Jbm90ZTogVWx0cml4IHBlcmw1IHQ0IHJldHVybnMgNjUyODAgKGV4aXQtY29kZSAyNTUpIGFuZCBubyB0ZXh0Ci1jYXRlZ29yeTogIW9zOmN5Z3dpbiwhb3M6dXdpbi1udCwhb3M6dWx0cml4LCFzbWtzaAotZW52LXNldHVwOiAhRk9PPUJBUiEKLXN0ZGluOgotCXByaW50ICcjISciJF9fcHJvZ25hbWUiJ1xucHJpbnQgIjEgYT0kRU5We0ZPT30iOycgPnQxCi0JcHJpbnQgJ++7vyMhJyIkX19wcm9nbmFtZSInXG5wcmludCAiMiBhPSRFTlZ7Rk9PfSI7JyA+dDIKLQlwcmludCAnIyEnIiRfX3BlcmxuYW1lIidcbnByaW50ICIzIGE9JEVOVntGT099XG4iOycgPnQzCi0JcHJpbnQgJ++7vyMhJyIkX19wZXJsbmFtZSInXG5wcmludCAiNCBhPSRFTlZ7Rk9PfVxuIjsnID50NAotCWNobW9kICt4IHQ/Ci0JLi90MQotCS4vdDIKLQkuL3QzCi0JLi90NAotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgYT0vbm9uZXhpc3RhbnR7Rk9PfQotCTIgYT0vbm9uZXhpc3RhbnR7Rk9PfQotCTMgYT1CQVIKLQk0IGE9QkFSCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvKFVucmVjb2duaXplZCBjaGFyYWN0ZXIgLi4uLiBpZ25vcmVkIGF0IFwuLnQ0IGxpbmUgMSkqLwotLS0tCi1uYW1lOiB1dGY4Ym9tLTMKLWRlc2NyaXB0aW9uOgotCVJlYWRpbmcgdGhlIFVURi04IEJPTSBzaG91bGQgZW5hYmxlIHRoZSB1dGY4LW1vZGUgZmxhZwotc3RkaW46Ci0JIiRfX3Byb2duYW1lIiAtYyAnOjsgaWYgW1sgJC0gPSAqVSogXV07IHRoZW4gZWNobyAxIG9uOyBlbHNlIGVjaG8gMSBvZmY7IGZpJwotCSIkX19wcm9nbmFtZSIgLWMgJ++7vzo7IGlmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gMiBvbjsgZWxzZSBlY2hvIDIgb2ZmOyBmaScKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIG9mZgotCTIgb24KLS0tLQotbmFtZTogdXRmOG9wdC0xYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgbm90IHNldCBhdCBub24taW50ZXJhY3RpdmUgc3RhcnR1cAotY2F0ZWdvcnk6ICFvczpocHV4Ci1lbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMuVVRGLTghCi1zdGRpbjoKLQlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgotCQllY2hvIGlzIHNldAotCWVsc2UKLQkJZWNobyBpcyBub3Qgc2V0Ci0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlpcyBub3Qgc2V0Ci0tLS0KLW5hbWU6IHV0ZjhvcHQtMWIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIG5vdCBzZXQgYXQgbm9uLWludGVyYWN0aXZlIHN0YXJ0dXAKLWNhdGVnb3J5OiBvczpocHV4Ci1lbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMudXRmOCEKLXN0ZGluOgotCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCi0JCWVjaG8gaXMgc2V0Ci0JZWxzZQotCQllY2hvIGlzIG5vdCBzZXQKLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWlzIG5vdCBzZXQKLS0tLQotbmFtZTogdXRmOG9wdC0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgc2V0IGF0IGludGVyYWN0aXZlIHN0YXJ0dXAuCi0JLURNS1NIX0FTU1VNRV9VVEY4PTAgPT4gZXhwZWN0ZWQgZmFpbHVyZSwgcGxlYXNlIGlnbm9yZQotCS1ETUtTSF9BU1NVTUVfVVRGOD0xID0+IG5vdCBleHBlY3RlZCwgcGxlYXNlIGludmVzdGlnYXRlCi0JLVVNS1NIX0FTU1VNRV9VVEY4ID0+IG5vdCBleHBlY3RlZCwgYnV0IGlmIHlvdXIgT1MgaXMgb2xkLAotCSB0cnkgcGFzc2luZyBIQVZFX1NFVExPQ0FMRV9DVFlQRT0wIHRvIEJ1aWxkLnNoCi1jYXRlZ29yeTogIW9zOmhwdXgKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLlVURi04IQotc3RkaW46Ci0JaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KLQkJZWNobyBpcyBzZXQKLQllbHNlCi0JCWVjaG8gaXMgbm90IHNldAotCWZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaXMgc2V0Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvKCMgKSovCi0tLS0KLW5hbWU6IHV0ZjhvcHQtMmIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIHNldCBhdCBpbnRlcmFjdGl2ZSBzdGFydHVwCi0JRXhwZWN0ZWQgZmFpbHVyZSBpZiAtRE1LU0hfQVNTVU1FX1VURjg9MAotY2F0ZWdvcnk6IG9zOmhwdXgKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLnV0ZjghCi1zdGRpbjoKLQlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgotCQllY2hvIGlzIHNldAotCWVsc2UKLQkJZWNobyBpcyBub3Qgc2V0Ci0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlpcyBzZXQKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8oIyApKi8KLS0tLQotbmFtZTogdXRmOG9wdC0zCi1kZXNjcmlwdGlvbjoKLQlFbnN1cmUgwrFVIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgaG9ub3VyZWQKLQkodGhpcyB0ZXN0IG1heSBwYXNzIGZhbHNlbHkgZGVwZW5kaW5nIG9uIENQUEZMQUdTKQotc3RkaW46Ci0JZXhwb3J0IGk9MAotCWNvZGU9J2lmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gJGkgb247IGVsc2UgZWNobyAkaSBvZmY7IGZpJwotCWxldCBpKys7ICIkX19wcm9nbmFtZSIgLVUgLWMgIiRjb2RlIgotCWxldCBpKys7ICIkX19wcm9nbmFtZSIgK1UgLWMgIiRjb2RlIgotCWxldCBpKys7ICIkX19wcm9nbmFtZSIgLVUgLWljICIkY29kZSIKLQlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiICtVIC1pYyAiJGNvZGUiCi0JZWNobyAkKCgrK2kpKSBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBvbgotCTIgb2ZmCi0JMyBvbgotCTQgb2ZmCi0JNSBkb25lCi0tLS0KLW5hbWU6IGFsaWFzZXMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYnVpbHQtaW4gc2hlbGwgYWxpYXNlcyBhcmUgb2theQotY2F0ZWdvcnk6ICFhcmdlCi1zdGRpbjoKLQlhbGlhcwotCXR5cGVzZXQgLWYKLWV4cGVjdGVkLXN0ZG91dDoKLQlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCi0JZnVuY3Rpb25zPSd0eXBlc2V0IC1mJwotCWhhc2g9J2FsaWFzIC10JwotCWhpc3Rvcnk9J2ZjIC1sJwotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotCWxvZ2luPSdleGVjIGxvZ2luJwotCW5hbWVyZWY9J3R5cGVzZXQgLW4nCi0Jbm9odXA9J25vaHVwICcKLQlyPSdmYyAtZSAtJwotCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKLQlzdXNwZW5kPSdraWxsIC1TVE9QICQkJwotCXR5cGU9J3doZW5jZSAtdicKLS0tLQotbmFtZTogYWxpYXNlcy0xLWhhcnR6NAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYnVpbHQtaW4gc2hlbGwgYWxpYXNlcyBhcmUgb2theQotY2F0ZWdvcnk6IGFyZ2UKLXN0ZGluOgotCWFsaWFzCi0JdHlwZXNldCAtZgotZXhwZWN0ZWQtc3Rkb3V0OgotCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKLQlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCi0JaGFzaD0nYWxpYXMgLXQnCi0JaGlzdG9yeT0nZmMgLWwnCi0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0JbG9naW49J2V4ZWMgbG9naW4nCi0JbmFtZXJlZj0ndHlwZXNldCAtbicKLQlub2h1cD0nbm9odXAgJwotCXI9J2ZjIC1lIC0nCi0Jc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJwotCXR5cGU9J3doZW5jZSAtdicKLS0tLQotbmFtZTogYWxpYXNlcy0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYg4oCcc2V0IC1vIHNo4oCdIGRpc2FibGVzIGJ1aWx0LWluIGFsaWFzZXMgKGV4Y2VwdCBhIGZldykKLWNhdGVnb3J5OiBkaXNhYmxlZAotYXJndW1lbnRzOiAhLW8hc2ghCi1zdGRpbjoKLQlhbGlhcwotCXR5cGVzZXQgLWYKLWV4cGVjdGVkLXN0ZG91dDoKLQlpbnRlZ2VyPSd0eXBlc2V0IC1pJwotCWxvY2FsPXR5cGVzZXQKLS0tLQotbmFtZTogYWxpYXNlcy0zYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgcnVubmluZyBhcyBzaCBkaXNhYmxlcyBidWlsdC1pbiBhbGlhc2VzIChleGNlcHQgYSBmZXcpCi1jYXRlZ29yeTogZGlzYWJsZWQKLWFyZ3VtZW50czogIS1vIXNoIQotc3RkaW46Ci0JY3AgIiRfX3Byb2duYW1lIiBzaAotCS4vc2ggLWMgJ2FsaWFzOyB0eXBlc2V0IC1mJwotCXJtIC1mIHNoCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0tLS0KLW5hbWU6IGFsaWFzZXMtMmIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIOKAnHNldCAtbyBzaOKAnSBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcwotY2F0ZWdvcnk6ICFhcmdlCi1hcmd1bWVudHM6ICEtbyFzaCEKLXN0ZGluOgotCWFsaWFzCi0JdHlwZXNldCAtZgotZXhwZWN0ZWQtc3Rkb3V0OgotCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKLQlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCi0JaGFzaD0nYWxpYXMgLXQnCi0JaGlzdG9yeT0nZmMgLWwnCi0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0JbG9naW49J2V4ZWMgbG9naW4nCi0JbmFtZXJlZj0ndHlwZXNldCAtbicKLQlub2h1cD0nbm9odXAgJwotCXI9J2ZjIC1lIC0nCi0Jc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJwotCXN1c3BlbmQ9J2tpbGwgLVNUT1AgJCQnCi0JdHlwZT0nd2hlbmNlIC12JwotLS0tCi1uYW1lOiBhbGlhc2VzLTNiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBydW5uaW5nIGFzIHNoIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCi1jYXRlZ29yeTogIWFyZ2UKLWFyZ3VtZW50czogIS1vIXNoIQotc3RkaW46Ci0JY3AgIiRfX3Byb2duYW1lIiBzaAotCS4vc2ggLWMgJ2FsaWFzOyB0eXBlc2V0IC1mJwotCXJtIC1mIHNoCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JwotCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKLQloYXNoPSdhbGlhcyAtdCcKLQloaXN0b3J5PSdmYyAtbCcKLQlpbnRlZ2VyPSd0eXBlc2V0IC1pJwotCWxvY2FsPXR5cGVzZXQKLQlsb2dpbj0nZXhlYyBsb2dpbicKLQluYW1lcmVmPSd0eXBlc2V0IC1uJwotCW5vaHVwPSdub2h1cCAnCi0Jcj0nZmMgLWUgLScKLQlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCi0Jc3VzcGVuZD0na2lsbCAtU1RPUCAkJCcKLQl0eXBlPSd3aGVuY2UgLXYnCi0tLS0KLW5hbWU6IGFsaWFzZXMtMmItaGFydHo0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKLWNhdGVnb3J5OiBhcmdlCi1hcmd1bWVudHM6ICEtbyFzaCEKLXN0ZGluOgotCWFsaWFzCi0JdHlwZXNldCAtZgotZXhwZWN0ZWQtc3Rkb3V0OgotCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKLQlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCi0JaGFzaD0nYWxpYXMgLXQnCi0JaGlzdG9yeT0nZmMgLWwnCi0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0JbG9naW49J2V4ZWMgbG9naW4nCi0JbmFtZXJlZj0ndHlwZXNldCAtbicKLQlub2h1cD0nbm9odXAgJwotCXI9J2ZjIC1lIC0nCi0Jc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJwotCXR5cGU9J3doZW5jZSAtdicKLS0tLQotbmFtZTogYWxpYXNlcy0zYi1oYXJ0ejQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHJ1bm5pbmcgYXMgc2ggZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKLWNhdGVnb3J5OiBhcmdlCi1hcmd1bWVudHM6ICEtbyFzaCEKLXN0ZGluOgotCWNwICIkX19wcm9nbmFtZSIgc2gKLQkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKLQlybSAtZiBzaAotZXhwZWN0ZWQtc3Rkb3V0OgotCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKLQlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCi0JaGFzaD0nYWxpYXMgLXQnCi0JaGlzdG9yeT0nZmMgLWwnCi0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0JbG9naW49J2V4ZWMgbG9naW4nCi0JbmFtZXJlZj0ndHlwZXNldCAtbicKLQlub2h1cD0nbm9odXAgJwotCXI9J2ZjIC1lIC0nCi0Jc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJwotCXR5cGU9J3doZW5jZSAtdicKLS0tLQotbmFtZTogYWxpYXNlcy1mdW5jZGVmLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIFBPU0lYIGZ1bmN0aW9ucyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgYWxpYXNlcwotc3RkaW46Ci0JYWxpYXMgZm9vPSdlY2hvIG1ha3JvJwotCWZvbygpIHsKLQkJZWNobyBmdW5rdGlvbgotCX0KLQlmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQlmdW5rdGlvbgotLS0tCi1uYW1lOiBhbGlhc2VzLWZ1bmNkZWYtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgUE9TSVggZnVuY3Rpb25zIHRha2UgcHJlY2VkZW5jZXMgb3ZlciBhbGlhc2VzCi1zdGRpbjoKLQlhbGlhcyBmb289J2VjaG8gbWFrcm8nCi0JZm9vICgpIHsKLQkJZWNobyBmdW5rdGlvbgotCX0KLQlmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQlmdW5rdGlvbgotLS0tCi1uYW1lOiBhbGlhc2VzLWZ1bmNkZWYtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYWxpYXNlcyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgS29ybiBmdW5jdGlvbnMKLXN0ZGluOgotCWFsaWFzIGZvbz0nZWNobyBtYWtybycKLQlmdW5jdGlvbiBmb28gewotCQllY2hvIGZ1bmt0aW9uCi0JfQotCWZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCW1ha3JvCi0tLS0KLW5hbWU6IGFycmF5cy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBLb3JuIFNoZWxsIGFycmF5cyB3b3JrIGFzIGV4cGVjdGVkCi1zdGRpbjoKLQl2PSJjIGQiCi0Jc2V0IC1BIGZvbyAtLSBhIFwkdiAiJHYiICckdicgYgotCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNXxhfCR2fGMgZHwkdnxifAotLS0tCi1uYW1lOiBhcnJheXMtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYmFzaC1zdHlsZSBhcnJheXMgd29yayBhcyBleHBlY3RlZAotY2F0ZWdvcnk6ICFzbWtzaAotc3RkaW46Ci0Jdj0iYyBkIgotCWZvbz0oYSBcJHYgIiR2IiAnJHYnIGIpCi0JZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCIKLWV4cGVjdGVkLXN0ZG91dDoKLQk1fGF8JHZ8YyBkfCR2fGJ8Ci0tLS0KLW5hbWU6IGFycmF5cy0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBhcnJheSBib3VuZHMgYXJlIHVpbnQzMl90Ci1zdGRpbjoKLQlzZXQgLUEgZm9vIGEgYiBjCi0JZm9vWzQwOTddPWQKLQlmb29bMjE0NzQ4MzYzN109ZQotCWVjaG8gJHtmb29bKl19Ci0JZm9vWy0xXT1mCi0JZWNobyAke2Zvb1s0Mjk0OTY3Mjk1XX0gZyAke2Zvb1sqXX0KLWV4cGVjdGVkLXN0ZG91dDoKLQlhIGIgYyBkIGUKLQlmIGcgYSBiIGMgZCBlIGYKLS0tLQotbmFtZTogYXJyYXlzLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEtvcm4gU2hlbGwgYXJyYXlzIHdpdGggc3BlY2lmaWVkIGluZGljZXMgd29yayBhcyBleHBlY3RlZAotY2F0ZWdvcnk6ICFzbWtzaAotc3RkaW46Ci0Jdj0iYyBkIgotCXNldCAtQSBmb28gLS0gWzFdPVwkdiBbMl09IiR2IiBbNF09JyR2JyBbMF09YSBbNV09YgotCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwke2Zvb1s1XX18IgotZXhwZWN0ZWQtc3Rkb3V0OgotCTV8YXwkdnxjIGR8fCR2fGJ8Ci0tLS0KLW5hbWU6IGFycmF5cy01Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBiYXNoLXN0eWxlIGFycmF5cyB3aXRoIHNwZWNpZmllZCBpbmRpY2VzIHdvcmsgYXMgZXhwZWN0ZWQKLWNhdGVnb3J5OiAhc21rc2gKLXN0ZGluOgotCXY9ImMgZCIKLQlmb289KFsxXT1cJHYgWzJdPSIkdiIgWzRdPSckdicgWzBdPWEgWzVdPWIpCi0JZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCR7Zm9vWzVdfXwiCi0JeD0oWzEyOF09Zm9vIGJhciBiYXopCi0JZWNobyBrPSAkeyF4WypdfSAuCi0JZWNobyB2PSAke3hbKl19IC4KLWV4cGVjdGVkLXN0ZG91dDoKLQk1fGF8JHZ8YyBkfHwkdnxifAotCWs9IDEyOCAxMjkgMTMwIC4KLQl2PSBmb28gYmFyIGJheiAuCi0tLS0KLW5hbWU6IGFycmF5cy02Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB3ZSBjYW4gZ2V0IHRoZSBhcnJheSBrZXlzIChpbmRpY2VzKSBmb3IgaW5kZXhlZCBhcnJheXMsCi0JS29ybiBzaGVsbCBzdHlsZQotc3RkaW46Ci0Jb2YoKSB7Ci0JCWk9MAotCQlmb3IgeCBpbiAiJEAiOyBkbwotCQkJZWNobyAtbiAiJCgoaSsrKSk8JHg+IgotCQlkb25lCi0JCWVjaG8KLQl9Ci0JZm9vWzFdPWVpbnMKLQlzZXQgfCBncmVwICdeZm9vJwotCWVjaG8gPQotCWZvb1swXT16d2VpCi0JZm9vWzRdPWRyZWkKLQlzZXQgfCBncmVwICdeZm9vJwotCWVjaG8gPQotCWVjaG8gYSAkKG9mICR7Zm9vWypdfSkgPSAkKG9mICR7YmFyWypdfSkgYQotCWVjaG8gYiAkKG9mICIke2Zvb1sqXX0iKSA9ICQob2YgIiR7YmFyWypdfSIpIGIKLQllY2hvIGMgJChvZiAke2Zvb1tAXX0pID0gJChvZiAke2JhcltAXX0pIGMKLQllY2hvIGQgJChvZiAiJHtmb29bQF19IikgPSAkKG9mICIke2JhcltAXX0iKSBkCi0JZWNobyBlICQob2YgJHshZm9vWypdfSkgPSAkKG9mICR7IWJhclsqXX0pIGUKLQllY2hvIGYgJChvZiAiJHshZm9vWypdfSIpID0gJChvZiAiJHshYmFyWypdfSIpIGYKLQllY2hvIGcgJChvZiAkeyFmb29bQF19KSA9ICQob2YgJHshYmFyW0BdfSkgZwotCWVjaG8gaCAkKG9mICIkeyFmb29bQF19IikgPSAkKG9mICIkeyFiYXJbQF19IikgaAotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvb1sxXT1laW5zCi0JPQotCWZvb1swXT16d2VpCi0JZm9vWzFdPWVpbnMKLQlmb29bNF09ZHJlaQotCT0KLQlhIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGEKLQliIDA8endlaSBlaW5zIGRyZWk+ID0gMDw+IGIKLQljIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGMKLQlkIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGQKLQllIDA8MD4xPDE+Mjw0PiA9IGUKLQlmIDA8MCAxIDQ+ID0gMDw+IGYKLQlnIDA8MD4xPDE+Mjw0PiA9IGcKLQloIDA8MD4xPDE+Mjw0PiA9IGgKLS0tLQotbmFtZTogYXJyYXlzLTcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHdlIGNhbiBnZXQgdGhlIGFycmF5IGtleXMgKGluZGljZXMpIGZvciBpbmRleGVkIGFycmF5cywKLQlLb3JuIHNoZWxsIHN0eWxlLCBpbiBzb21lIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JZWNobyAhYXJ6OiAkeyFhcnp9Ci0JZWNobyAhYXJ6WzBdOiAkeyFhcnpbMF19Ci0JZWNobyAhYXJ6WzFdOiAkeyFhcnpbMV19Ci0JYXJ6PWZvbwotCWVjaG8gIWFyejogJHshYXJ6fQotCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQotCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQotCXVuc2V0IGFyegotCWVjaG8gIWFyejogJHshYXJ6fQotCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQotCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQotZXhwZWN0ZWQtc3Rkb3V0OgotCSFhcno6IDAKLQkhYXJ6WzBdOgotCSFhcnpbMV06Ci0JIWFyejogYXJ6Ci0JIWFyelswXTogMAotCSFhcnpbMV06Ci0JIWFyejogMAotCSFhcnpbMF06Ci0JIWFyelsxXToKLS0tLQotbmFtZTogYXJyYXlzLTgKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHNvbWUgYmVoYXZpb3VyYWwgcnVsZXMgZm9yIGFycmF5cy4KLXN0ZGluOgotCWZuYSgpIHsKLQkJc2V0IC1BIGFhIDkKLQl9Ci0JZm5iKCkgewotCQl0eXBlc2V0IGFiCi0JCXNldCAtQSBhYiA5Ci0JfQotCWZuYygpIHsKLQkJdHlwZXNldCBhYwotCQlzZXQgLUEgYWMgOTEKLQkJdW5zZXQgYWMKLQkJc2V0IC1BIGFjIDkyCi0JfQotCWZuZCgpIHsKLQkJc2V0ICtBIGFkIDkKLQl9Ci0JZm5lKCkgewotCQl1bnNldCBhZQotCQlzZXQgK0EgYWUgOQotCX0KLQlmbmYoKSB7Ci0JCXVuc2V0IGFmWzBdCi0JCXNldCArQSBhZiA5Ci0JfQotCWZuZygpIHsKLQkJdW5zZXQgYWdbKl0KLQkJc2V0ICtBIGFnIDkKLQl9Ci0Jc2V0IC1BIGFhIDEgMgotCXNldCAtQSBhYiAxIDIKLQlzZXQgLUEgYWMgMSAyCi0Jc2V0IC1BIGFkIDEgMgotCXNldCAtQSBhZSAxIDIKLQlzZXQgLUEgYWYgMSAyCi0Jc2V0IC1BIGFnIDEgMgotCXNldCAtQSBhaCAxIDIKLQl0eXBlc2V0IC1aMyBhYSBhYiBhYyBhZCBhZSBhZiBhZwotCXByaW50IDFhICR7YWFbKl19IC4KLQlwcmludCAxYiAke2FiWypdfSAuCi0JcHJpbnQgMWMgJHthY1sqXX0gLgotCXByaW50IDFkICR7YWRbKl19IC4KLQlwcmludCAxZSAke2FlWypdfSAuCi0JcHJpbnQgMWYgJHthZlsqXX0gLgotCXByaW50IDFnICR7YWdbKl19IC4KLQlwcmludCAxaCAke2FoWypdfSAuCi0JZm5hCi0JZm5iCi0JZm5jCi0JZm5kCi0JZm5lCi0JZm5mCi0JZm5nCi0JdHlwZXNldCAtWjUgYWhbKl0KLQlwcmludCAyYSAke2FhWypdfSAuCi0JcHJpbnQgMmIgJHthYlsqXX0gLgotCXByaW50IDJjICR7YWNbKl19IC4KLQlwcmludCAyZCAke2FkWypdfSAuCi0JcHJpbnQgMmUgJHthZVsqXX0gLgotCXByaW50IDJmICR7YWZbKl19IC4KLQlwcmludCAyZyAke2FnWypdfSAuCi0JcHJpbnQgMmggJHthaFsqXX0gLgotZXhwZWN0ZWQtc3Rkb3V0OgotCTFhIDAwMSAwMDIgLgotCTFiIDAwMSAwMDIgLgotCTFjIDAwMSAwMDIgLgotCTFkIDAwMSAwMDIgLgotCTFlIDAwMSAwMDIgLgotCTFmIDAwMSAwMDIgLgotCTFnIDAwMSAwMDIgLgotCTFoIDEgMiAuCi0JMmEgOSAuCi0JMmIgMDAxIDAwMiAuCi0JMmMgOTIgLgotCTJkIDAwOSAwMDIgLgotCTJlIDkgLgotCTJmIDkgMDAyIC4KLQkyZyAwMDkgLgotCTJoIDAwMDAxIDAwMDAyIC4KLS0tLQotbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBiYXNoLXN0eWxlIHN1YnN0cmluZyBleHBhbnNpb24gd29ya3MKLQl3aGVuIHVzaW5nIHBvc2l0aXZlIG51bWVyaWNzCi1zdGRpbjoKLQl4PWFiY2RlZmdoaQotCXR5cGVzZXQgLWkgeT0xMjM0NTY3ODkKLQl0eXBlc2V0IC1pIDE2IHo9MTIzNDU2Nzg5CSMgMTYjNzViY2QxNQotCWVjaG8gYSB0JHt4OjI6Mn0gJHt5OjI6M30gJHt6OjI6M30gYQotCWVjaG8gYiAke3g6OjN9ICR7eTo6M30gJHt6OjozfSBiCi0JZWNobyBjICR7eDoyOn0gJHt5OjI6fSAke3o6Mjp9IGMKLQllY2hvIGQgJHt4OjJ9ICR7eToyfSAke3o6Mn0gZAotCWVjaG8gZSAke3g6Mjo2fSAke3k6Mjo2fSAke3o6Mjo3fSBlCi0JZWNobyBmICR7eDoyOjd9ICR7eToyOjd9ICR7ejoyOjh9IGYKLQllY2hvIGcgJHt4OjI6OH0gJHt5OjI6OH0gJHt6OjI6OX0gZwotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgdGNkIDM0NSAjNzUgYQotCWIgYWJjIDEyMyAxNiMgYgotCWMgYwotCWQgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGQKLQllIGNkZWZnaCAzNDU2NzggIzc1YmNkMSBlCi0JZiBjZGVmZ2hpIDM0NTY3ODkgIzc1YmNkMTUgZgotCWcgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGcKLS0tLQotbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBiYXNoLXN0eWxlIHN1YnN0cmluZyBleHBhbnNpb24gd29ya3MKLQl3aGVuIHVzaW5nIG5lZ2F0aXZlIG51bWVyaWNzIG9yIGV4cHJlc3Npb25zCi1zdGRpbjoKLQl4PWFiY2RlZmdoaQotCXR5cGVzZXQgLWkgeT0xMjM0NTY3ODkKLQl0eXBlc2V0IC1pIDE2IHo9MTIzNDU2Nzg5CSMgMTYjNzViY2QxNQotCW49MgotCWVjaG8gYSAke3g6JG46M30gJHt5OiRuOjN9ICR7ejokbjozfSBhCi0JZWNobyBiICR7eDoobik6M30gJHt5OihuKTozfSAke3o6KG4pOjN9IGIKLQllY2hvIGMgJHt4OigtMik6MX0gJHt5OigtMik6MX0gJHt6OigtMik6MX0gYwotCWVjaG8gZCB0JHt4OiBuOjJ9ICR7eTogbjozfSAke3o6IG46M30gZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgY2RlIDM0NSAjNzUgYQotCWIgY2RlIDM0NSAjNzUgYgotCWMgaCA4IDEgYwotCWQgdGNkIDM0NSAjNzUgZAotLS0tCi1uYW1lOiB2YXJleHBhbmQtc3Vic3RyLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc29tZSB0aGluZ3MgdGhhdCB3b3JrIGluIGJhc2ggZmFpbC4KLQlUaGlzIGlzIGJ5IGRlc2lnbi4gQW5kIHRoYXQgc29tZSB0aGluZ3MgZmFpbCBpbiBib3RoLgotc3RkaW46Ci0JZXhwb3J0IHg9YWJjZGVmZ2hpIG49MgotCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gdiR7eDoobil9eCcKLQkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHcke3g6IG59eCcKLQkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHgke3g6bn14JwotCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8geSR7eDp9eCcKLQkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHoke3h9eCcKLQkiJF9fcHJvZ25hbWUiIC1jICd4PWFiY2RlZjt5PTEyMztlY2hvICR7eDoke3k6MjoxfToyfScgPi9kZXYvbnVsbCAyPiYxOyBlY2hvICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JdmNkZWZnaGl4Ci0Jd2NkZWZnaGl4Ci0JemFiY2RlZmdoaXgKLQkxCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkveDpuLipiYWQgc3Vic3RpdHV0aW9uLipcbi4qYmFkIHN1YnN0aXR1dGlvbi8KLS0tLQotbmFtZTogdmFyZXhwYW5kLXN1YnN0ci00Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBjb3JuZXIgY2FzZXMgZm9yIHN1YnN0cmluZyBleHBhbnNpb24KLXN0ZGluOgotCXg9YWJjZGVmZ2hpCi0JaW50ZWdlciB5PTIKLQllY2hvIGEgJHt4Oih5ID09IDEgPyAyIDogMyk6NH0gYQotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgZGVmZyBhCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItNUEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc3Vic3RyaW5nIGV4cGFuc2lvbnMgd29yayBvbiBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlzZXQgK1UKLQl4PW3DpGgKLQllY2hvIGEgJHt4OjoxfSAke3g6IC0xfSBhCi0JZWNobyBiICR7eDo6M30gJHt4OiAtM30gYgotCWVjaG8gYyAke3g6MToyfSAke3g6IC0zOjJ9IGMKLQllY2hvIGQgJHsjeH0gZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgbSBoIGEKLQliIG3DpCDDpGggYgotCWMgw6Qgw6QgYwotCWQgNCBkCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItNVcKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc3Vic3RyaW5nIGV4cGFuc2lvbnMgd29yayBvbiBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlzZXQgLVUKLQl4PW3DpGgKLQllY2hvIGEgJHt4OjoxfSAke3g6IC0xfSBhCi0JZWNobyBiICR7eDo6Mn0gJHt4OiAtMn0gYgotCWVjaG8gYyAke3g6MToxfSAke3g6IC0yOjF9IGMKLQllY2hvIGQgJHsjeH0gZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgbSBoIGEKLQliIG3DpCDDpGggYgotCWMgw6Qgw6QgYwotCWQgMyBkCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItNgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBzdHJpbmcgc3Vic3RpdHV0aW9uIHdvcmtzIGNvcnJlY3RseQotc3RkaW46Ci0JZm9vPTEKLQliYXI9MgotCWJhej1xd2VydHl1aW9wCi0JZWNobyBhICR7YmF6OiBmb286IGJhcn0KLQllY2hvIGIgJHtiYXo6IGZvbzogJGJhcn0KLQllY2hvIGMgJHtiYXo6ICRmb286IGJhcn0KLQllY2hvIGQgJHtiYXo6ICRmb286ICRiYXJ9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYSB3ZQotCWIgd2UKLQljIHdlCi0JZCB3ZQotLS0tCi1uYW1lOiB2YXJleHBhbmQtbnVsbC0xCi1kZXNjcmlwdGlvbjoKLQlFbnN1cmUgZW1wdHkgc3RyaW5ncyBleHBhbmQgZW1wdGlseQotc3RkaW46Ci0JcHJpbnQgeCAke2F9ICR7Yn0geQotCXByaW50IHogJHthIz99ICR7YiU/fSB3Ci0JcHJpbnQgdiAke2E9fSAke2IvYy9kfSB1Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JeCB5Ci0JeiB3Ci0JdiB1Ci0tLS0KLW5hbWU6IHZhcmV4cGFuZC1udWxsLTIKLWRlc2NyaXB0aW9uOgotCUVuc3VyZSBlbXB0eSBzdHJpbmdzLCB3aGVuIHF1b3RlZCwgYXJlIGV4cGFuZGVkIGFzIGVtcHR5IHN0cmluZ3MKLXN0ZGluOgotCXByaW50ZiAnPCVzPiAnIDEgIiR7YX0iIDIgIiR7YSM/fSIgKyAiJHtiJT99IiAzICIke2E9fSIgKyAiJHtiL2MvZH0iCi0JZWNobyAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JPDE+IDw+IDwyPiA8PiA8Kz4gPD4gPDM+IDw+IDwrPiA8PiAuCi0tLS0KLW5hbWU6IHByaW50LWZ1bm55LWNoYXJzCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBwcmludCBidWlsdGluJ3MgY2FwYWJpbGl0eSB0byBvdXRwdXQgZGVzaWduYXRlZCBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlwcmludCAnPFwwMTQ0XDAzNDRceERCXHUwMERCXHUyMEFDXHVEQlx4NDA+JwotZXhwZWN0ZWQtc3Rkb3V0OgotCTxk5NvDm+KCrMObQD4KLS0tLQotbmFtZTogcHJpbnQtYmtzbC1jCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBwcmludCBidWlsdGluJ3MgXGMgZXNjYXBlCi1zdGRpbjoKLQlwcmludCAnXGNhJzsgcHJpbnQgYgotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiCi0tLS0KLW5hbWU6IHByaW50LW51bC1jaGFycwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaGFuZGxpbmcgb2YgTlVMIGNoYXJhY3RlcnMgZm9yIHByaW50IGFuZCByZWFkCi0Jbm90ZTogc2Vjb25kIGxpbmUgc2hvdWxkIG91dHB1dCDigJw0IDPigJ0gYnV0IHdlIGNhbm5vdAotCWhhbmRsZSBOVUwgY2hhcmFjdGVycyBpbiBzdHJpbmdzIHlldAotc3RkaW46Ci0JcHJpbnQgJCgoJChwcmludCAnPFwwPicgfCB3YyAtYykpKQotCXg9JChwcmludCAnPFwwPicpCi0JcHJpbnQgJCgoJChwcmludCAiJHgiIHwgd2MgLWMpKSkgJHsjeH0KLWV4cGVjdGVkLXN0ZG91dDoKLQk0Ci0JMyAyCi0tLS0KLW5hbWU6IHByaW50LWVzY2FwZXMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGJhY2tzbGFzaCBleHBhbnNpb24gYnkgdGhlIHByaW50IGJ1aWx0aW4KLXN0ZGluOgotCXByaW50ICdcIFwhXCJcI1wkXCVcJidcXFwnJ1woXClcKlwrXCxcLVwuXC9cMFwxXDJcM1w0XDVcNlw3XDgnIFwKLQkgICAgJ1w5XDpcO1w8XD1cPlw/XEBcQVxCXENcRFxFXEZcR1xIXElcSlxLXExcTVxOXE9cUFxRXFJcU1xUJyBcCi0JICAgICdcVVxWXFdcWFxZXFpcW1xcXF1cXlxfXGBcYVxiICBcZFxlXGZcZ1xoXGlcalxrXGxcbVxuXG9ccCcgXAotCSAgICAnXHFcclxzXHRcdVx2XHdceFx5XHpce1x8XH1cficgJ1x1MjBhY2QnICdcVTIwYWNkJyAnXHgxMjMnIFwKLQkgICAgJ1wweCcgJ1wwMTIzJyAnXDAxMjM0JyB8IHsKLQkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAotCQl0eXBlc2V0IC1VdWkxNiAtWjUgaHYKLQkJdHlwZXNldCAtaTEgd2M9MHgwQQotCQlkYXNjPQotCQlubD0ke3djIzEjfQotCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KLQkJCWxpbmU9JGxpbmUkbmwKLQkJCXdoaWxlIFtbIC1uICRsaW5lIF1dOyBkbwotCQkJCWh2PTEjJHtsaW5lOjoxfQotCQkJCWlmICgoIChwb3MgJiAxNSkgPT0gMCApKTsgdGhlbgotCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKLQkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKLQkJCQkJZGFzYz0nIHwnCi0JCQkJZmkKLQkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKLQkJCQlpZiAoKCAoaHYgPCAzMikgfHwgKGh2ID4gMTI2KSApKTsgdGhlbgotCQkJCQlkYXNjPSRkYXNjLgotCQkJCWVsc2UKLQkJCQkJZGFzYz0kZGFzYyR7bGluZTo6MX0KLQkJCQlmaQotCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKLQkJCQlsaW5lPSR7bGluZToxfQotCQkJZG9uZQotCQlkb25lCi0JCWlmICgoIChwb3MgJiAxNSkgIT0gMSApKTsgdGhlbgotCQkJd2hpbGUgKCggcG9zICYgMTUgKSk7IGRvCi0JCQkJcHJpbnQgLW4gJyAgICcKLQkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQlkb25lCi0JCQlwcmludCAiJGRhc2N8IgotCQlmaQotCX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkwMDAwMDAwMCAgNUMgMjAgNUMgMjEgNUMgMjIgNUMgMjMgLSA1QyAyNCA1QyAyNSA1QyAyNiA1QyAyNyAgfFwgXCFcIlwjXCRcJVwmXCd8Ci0JMDAwMDAwMTAgIDVDIDI4IDVDIDI5IDVDIDJBIDVDIDJCIC0gNUMgMkMgNUMgMkQgNUMgMkUgNUMgMkYgIHxcKFwpXCpcK1wsXC1cLlwvfAotCTAwMDAwMDIwICA1QyAzMSA1QyAzMiA1QyAzMyA1QyAzNCAtIDVDIDM1IDVDIDM2IDVDIDM3IDVDIDM4ICB8XDFcMlwzXDRcNVw2XDdcOHwKLQkwMDAwMDAzMCAgMjAgNUMgMzkgNUMgM0EgNUMgM0IgNUMgLSAzQyA1QyAzRCA1QyAzRSA1QyAzRiA1QyAgfCBcOVw6XDtcPFw9XD5cP1x8Ci0JMDAwMDAwNDAgIDQwIDVDIDQxIDVDIDQyIDVDIDQzIDVDIC0gNDQgMUIgNUMgNDYgNUMgNDcgNUMgNDggIHxAXEFcQlxDXEQuXEZcR1xIfAotCTAwMDAwMDUwICA1QyA0OSA1QyA0QSA1QyA0QiA1QyA0QyAtIDVDIDREIDVDIDRFIDVDIDRGIDVDIDUwICB8XElcSlxLXExcTVxOXE9cUHwKLQkwMDAwMDA2MCAgNUMgNTEgNUMgNTIgNUMgNTMgNUMgNTQgLSAyMCA1QyA1NiA1QyA1NyA1QyA1OCA1QyAgfFxRXFJcU1xUIFxWXFdcWFx8Ci0JMDAwMDAwNzAgIDU5IDVDIDVBIDVDIDVCIDVDIDVDIDVEIC0gNUMgNUUgNUMgNUYgNUMgNjAgMDcgMDggIHxZXFpcW1xdXF5cX1xgLi58Ci0JMDAwMDAwODAgIDIwIDIwIDVDIDY0IDFCIDBDIDVDIDY3IC0gNUMgNjggNUMgNjkgNUMgNkEgNUMgNkIgIHwgIFxkLi5cZ1xoXGlcalxrfAotCTAwMDAwMDkwICA1QyA2QyA1QyA2RCAwQSA1QyA2RiA1QyAtIDcwIDIwIDVDIDcxIDBEIDVDIDczIDA5ICB8XGxcbS5cb1xwIFxxLlxzLnwKLQkwMDAwMDBBMCAgMEIgNUMgNzcgNUMgNzkgNUMgN0EgNUMgLSA3QiA1QyA3QyA1QyA3RCA1QyA3RSAyMCAgfC5cd1x5XHpce1x8XH1cfiB8Ci0JMDAwMDAwQjAgIEUyIDgyIEFDIDY0IDIwIEVGIEJGIEJEIC0gMjAgMTIgMzMgMjAgNzggMjAgNTMgMjAgIHwuLi5kIC4uLiAuMyB4IFMgfAotCTAwMDAwMEMwICA1MyAzNCAwQSAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICB8UzQufAotLS0tCi1uYW1lOiBkb2xsYXItcXVvdGVkLXN0cmluZ3MKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGJhY2tzbGFzaCBleHBhbnNpb24gYnkgJCfigKYnIHN0cmluZ3MKLXN0ZGluOgotCXByaW50ZiAnJXNcbicgJCdcIFwhXCJcI1wkXCVcJlwnXChcKVwqXCtcLFwtXC5cLyBcMVwyXDNcNFw1XDYnIFwKLQkgICAgJCdhXDBiJyAkJ2FcMDFiJyAkJ1w3XDhcOVw6XDtcPFw9XD5cP1xAXEFcQlxDXERcRVxGXEdcSFxJJyBcCi0JICAgICQnXEpcS1xMXE1cTlxPXFBcUVxSXFNcVFxVMVxWXFdcWFxZXFpcW1xcXF1cXlxfXGBcYVxiXGRcZScgXAotCSAgICAkJ1xmXGdcaFxpXGpca1xsXG1cblxvXHBccVxyXHNcdFx1MVx2XHdceDFceVx6XHtcfFx9XH4gJHgnIFwKLQkgICAgJCdcdTIwYWNkJyAkJ1xVMjBhY2QnICQnXHgxMjMnICQnZm5ceDByZCcgJCdcMDIzNCcgJCdcMjM0JyBcCi0JICAgICQnXDIzNDUnICQnXGNhJyAkJ1xjIScgJCdcYz8nICQnXGPigqwnICQnYVwKLQliJyB8IHsKLQkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAotCQl0eXBlc2V0IC1VdWkxNiAtWjUgaHYKLQkJdHlwZXNldCAtaTEgd2M9MHgwQQotCQlkYXNjPQotCQlubD0ke3djIzEjfQotCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KLQkJCWxpbmU9JGxpbmUkbmwKLQkJCXdoaWxlIFtbIC1uICRsaW5lIF1dOyBkbwotCQkJCWh2PTEjJHtsaW5lOjoxfQotCQkJCWlmICgoIChwb3MgJiAxNSkgPT0gMCApKTsgdGhlbgotCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKLQkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKLQkJCQkJZGFzYz0nIHwnCi0JCQkJZmkKLQkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKLQkJCQlpZiAoKCAoaHYgPCAzMikgfHwgKGh2ID4gMTI2KSApKTsgdGhlbgotCQkJCQlkYXNjPSRkYXNjLgotCQkJCWVsc2UKLQkJCQkJZGFzYz0kZGFzYyR7bGluZTo6MX0KLQkJCQlmaQotCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKLQkJCQlsaW5lPSR7bGluZToxfQotCQkJZG9uZQotCQlkb25lCi0JCWlmICgoIChwb3MgJiAxNSkgIT0gMSApKTsgdGhlbgotCQkJd2hpbGUgKCggcG9zICYgMTUgKSk7IGRvCi0JCQkJcHJpbnQgLW4gJyAgICcKLQkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQlkb25lCi0JCQlwcmludCAiJGRhc2N8IgotCQlmaQotCX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkwMDAwMDAwMCAgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgLSAyOCAyOSAyQSAyQiAyQyAyRCAyRSAyRiAgfCAhIiMkJSYnKCkqKywtLi98Ci0JMDAwMDAwMTAgIDIwIDAxIDAyIDAzIDA0IDA1IDA2IDBBIC0gNjEgMEEgNjEgMDEgNjIgMEEgMDcgMzggIHwgLi4uLi4uLmEuYS5iLi44fAotCTAwMDAwMDIwICAzOSAzQSAzQiAzQyAzRCAzRSAzRiA0MCAtIDQxIDQyIDQzIDQ0IDFCIDQ2IDQ3IDQ4ICB8OTo7PD0+P0BBQkNELkZHSHwKLQkwMDAwMDAzMCAgNDkgMEEgNEEgNEIgNEMgNEQgNEUgNEYgLSA1MCA1MSA1MiA1MyA1NCAwMSA1NiA1NyAgfEkuSktMTU5PUFFSU1QuVld8Ci0JMDAwMDAwNDAgIDU4IDU5IDVBIDVCIDVDIDVEIDVFIDVGIC0gNjAgMDcgMDggNjQgMUIgMEEgMEMgNjcgIHxYWVpbXF1eX2AuLmQuLi5nfAotCTAwMDAwMDUwICA2OCA2OSA2QSA2QiA2QyA2RCAwQSA2RiAtIDcwIDcxIDBEIDczIDA5IDAxIDBCIDc3ICB8aGlqa2xtLm9wcS5zLi4ud3wKLQkwMDAwMDA2MCAgMDEgNzkgN0EgN0IgN0MgN0QgN0UgMjAgLSAyNCA3OCAwQSBFMiA4MiBBQyA2NCAwQSAgfC55ent8fX4gJHguLi4uZC58Ci0JMDAwMDAwNzAgIEVGIEJGIEJEIDBBIEM0IEEzIDBBIDY2IC0gNkUgMEEgMTMgMzQgMEEgOUMgMEEgOUMgIHwuLi4uLi4uZm4uLjQuLi4ufAotCTAwMDAwMDgwICAzNSAwQSAwMSAwQSAwMSAwQSA3RiAwQSAtIDAyIDgyIEFDIDBBIDYxIDBBIDYyIDBBICB8NS4uLi4uLi4uLi4uYS5iLnwKLS0tLQotbmFtZTogZG9sbGFyLXF1b3Rlcy1pbi1oZXJlZG9jcwotZGVzY3JpcHRpb246Ci0JVGhleSBhcmUsIGhvd2V2ZXIsIG5vdCBwYXJzZWQgaW4gaGVyZSBkb2N1bWVudHMKLXN0ZGluOgotCWNhdCA8PEVPRgotCQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLwotCUVPRgotCWNhdCA8PCQnYVx0YicKLQlhXHRiCi0JYQliCi1leHBlY3RlZC1zdGRvdXQ6Ci0JCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCi0JYVx0YgotLS0tCi1uYW1lOiBkb2xsYXItcXVvdGVzLWluLWhlcmVzdHJpbmdzCi1kZXNjcmlwdGlvbjoKLQlUaGV5IGFyZSwgbm90IHBhcnNlZCBpbiBoZXJlIHN0cmluZ3MgZWl0aGVyCi1zdGRpbjoKLQljYXQgPDw8ImRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovIgotCWNhdCA8PDwnZG9sbGFyID0gc3RyY2hyKHMsICdcJyckJ1wnJyk7CS8qICdcJycgKi8nCi0JeD0iZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8iCi0JY2F0IDw8PCIkeCIKLQljYXQgPDw8JCdhXEVbMG1cdGInCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KLQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLwotCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCi0JYRtbMG0JYgotLS0tCi1uYW1lOiBkb3QtbmVlZHMtYXJndW1lbnQKLWRlc2NyaXB0aW9uOgotCWNoZWNrIERlYmlhbiAjNDE1MTY3IHNvbHV0aW9uOiAnLicgd2l0aG91dCBhcmd1bWVudHMgc2hvdWxkIGZhaWwKLXN0ZGluOgotCSIkX19wcm9nbmFtZSIgLWMgLgotCSIkX19wcm9nbmFtZSIgLWMgc291cmNlCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9cLjogbWlzc2luZyBhcmd1bWVudC4qXG4uKlwuOiBtaXNzaW5nIGFyZ3VtZW50LwotLS0tCi1uYW1lOiBhbGlhcy1mdW5jdGlvbi1uby1jb25mbGljdAotZGVzY3JpcHRpb246Ci0JbWFrZSBhbGlhc2VzIG5vdCBjb25mbGljdCB3aXRoIGZ1bmN0aW9ucwotCW5vdGU6IGZvciBrc2gtbGlrZSBmdW5jdGlvbnMsIHRoZSBvcmRlciBvZiBwcmVmZXJlbmNlIGlzCi0JZGlmZmVyZW50OyBiYXNoIG91dHB1dHMgYmF6IGluc3RlYWQgb2YgYmFyIGluIGxpbmUgMiBiZWxvdwotc3RkaW46Ci0JYWxpYXMgZm9vPSdlY2hvIGJhcicKLQlmb28oKSB7Ci0JCWVjaG8gYmF6Ci0JfQotCWFsaWFzIGtvcm49J2VjaG8gYmFyJwotCWZ1bmN0aW9uIGtvcm4gewotCQllY2hvIGJhegotCX0KLQlmb28KLQlrb3JuCi0JdW5zZXQgLWYgZm9vCi0JZm9vIDI+Ji0gfHwgZWNobyByYWIKLWV4cGVjdGVkLXN0ZG91dDoKLQliYXoKLQliYXIKLQlyYWIKLS0tLQotbmFtZTogYmFzaC1mdW5jdGlvbi1wYXJlbnMKLWRlc2NyaXB0aW9uOgotCWVuc3VyZSB0aGUga2V5d29yZCBmdW5jdGlvbiBpcyBpZ25vcmVkIHdoZW4gcHJlY2VkaW5nCi0JUE9TSVggc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChiYXNoaXNtKQotc3RkaW46Ci0JbWsoKSB7Ci0JCWVjaG8gJyMhJyIkX19wcm9nbmFtZSIKLQkJZWNobyAiJDEgeyIKLQkJZWNobyAnCWVjaG8gImJhcj0nXCcnJDAnXCdcIgotCQllY2hvICd9JwotCQllY2hvICR7MjotZm9vfQotCX0KLQltayAnZnVuY3Rpb24gZm9vJyA+Zi1rb3JuCi0JbWsgJ2ZvbyAoKScgPmYtZGFzaAotCW1rICdmdW5jdGlvbiBmb28gKCknID5mLWJhc2gKLQltayAnZnVuY3Rpb24gc3RvcCAoKScgc3RvcCA+Zi1zdG9wCi0JY2htb2QgK3ggZi0qCi0JZWNobyAia29ybjogJCguL2Yta29ybikiCi0JZWNobyAiZGFzaDogJCguL2YtZGFzaCkiCi0JZWNobyAiYmFzaDogJCguL2YtYmFzaCkiCi0JZWNobyAic3RvcDogJCguL2Ytc3RvcCkiCi1leHBlY3RlZC1zdGRvdXQ6Ci0Ja29ybjogYmFyPSdmb28nCi0JZGFzaDogYmFyPScuL2YtZGFzaCcKLQliYXNoOiBiYXI9Jy4vZi1iYXNoJwotCXN0b3A6IGJhcj0nLi9mLXN0b3AnCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMQotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHdvcmtzCi1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1VdWkxNiBpMD0xI+8gaTE9MSPigqwKLQl0eXBlc2V0IC1pMSBvMGE9NjQKLQl0eXBlc2V0IC1pMSBvMWE9MHgyNjNBCi0JdHlwZXNldCAtVXVpMSBvMGI9MHg3RQotCXR5cGVzZXQgLVV1aTEgbzFiPTB4RkREMAotCWludGVnZXIgcHg9MHhDQUZFICdwMD0xIyAnIHAxPTEj4oCmIHBsPTEjZgotCWVjaG8gImluIDwkaTA+IDwkaTE+IgotCWVjaG8gIm91dCA8JHtvMGEjMSN9fCR7bzBiIzEjfT4gPCR7bzFhIzEjfXwke28xYiMxI30+IgotCXR5cGVzZXQgLVV1aTEgaTAgaTEKLQllY2hvICJwYXNzIDwkcHg+IDwkcDA+IDwkcDE+IDwkcGw+IDwke2kwIzEjfXwke2kxIzEjfT4iCi0JdHlwZXNldCAtVXVpMTYgdHYxPTEjfiB0djI9MSN/IHR2Mz0xI4AgdHY0PTEjgSB0djU9MSPAIHR2Nj0xI8EgdHY3PTEjwqAgdHY4PTEjwoAKLQllY2hvICJzcGVjWCA8JHt0djEjMTYjfT4gPCR7dHYyIzE2I30+IDwke3R2MyMxNiN9PiA8JHt0djQjMTYjfT4gPCR7dHY1IzE2I30+IDwke3R2NiMxNiN9PiA8JHt0djcjMTYjfT4gPCR7dHY4IzE2I30+IgotCXR5cGVzZXQgLWkxIHR2MSB0djIgdHYzIHR2NCB0djUgdHY2IHR2NyB0djgKLQllY2hvICJzcGVjVyA8JHt0djEjMSN9PiA8JHt0djIjMSN9PiA8JHt0djMjMSN9PiA8JHt0djQjMSN9PiA8JHt0djUjMSN9PiA8JHt0djYjMSN9PiA8JHt0djcjMSN9PiA8JHt0djgjMSN9PiIKLQl0eXBlc2V0IC1pMSB4czE9MHhFRjdGIHhzMj0weEVGODAgeHMzPTB4RkREMAotCWVjaG8gInNwZWNVIDwke3hzMSMxI30+IDwke3hzMiMxI30+IDwke3hzMyMxI30+IgotZXhwZWN0ZWQtc3Rkb3V0OgotCWluIDwxNiNFRkVGPiA8MTYjMjBBQz4KLQlvdXQgPEB8fj4gPOKYunzvt5A+Ci0JcGFzcyA8MTYjY2FmZT4gPDEjID4gPDEj4oCmPiA8MSNmPiA873zigqw+Ci0Jc3BlY1ggPDdFPiA8N0Y+IDxFRjgwPiA8RUY4MT4gPEVGQzA+IDxFRkMxPiA8QTA+IDw4MD4KLQlzcGVjVyA8fj4gPH8+IDyAPiA8gT4gPMA+IDzBPiA8wqA+IDzCgD4KLQlzcGVjVSA87r2/PiA8gD4gPO+3kD4KLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYQotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0IC1VCi0JaW50ZWdlciB4PTEjZm9vCi0JZWNobyAvJHgvCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvMSNmb286IHVuZXhwZWN0ZWQgJ29vJy8KLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJiCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlzZXQgLVUKLQlpbnRlZ2VyIHg9MSPAgAotCWVjaG8gLyR4LwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLzEjwIA6IHVuZXhwZWN0ZWQgJ4AnLwotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmMxCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlzZXQgLVUKLQlpbnRlZ2VyIHg9MSPigKYKLQllY2hvIC8keC8KLWV4cGVjdGVkLXN0ZG91dDoKLQkvMSPigKYvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmMyCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCi1zdGRpbjoKLQlzZXQgK1UKLQlpbnRlZ2VyIHg9MSPigKYKLQllY2hvIC8keC8KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8xI+KApjogdW5leHBlY3RlZCAngCcvCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDEKLWRlc2NyaXB0aW9uOgotCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBoYW5kbGVzIG9jdGV0cyBva2F5Ci1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1pMTYgeD0xI/8KLQllY2hvIC8keC8JIyBpbnZhbGlkIHV0Zi04Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JLzE2I2VmZmYvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmQyCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMKLXN0ZGluOgotCXNldCAtVQotCXR5cGVzZXQgLWkxNiB4PTEjwgotCWVjaG8gLyR4LwkjIGludmFsaWQgMi1ieXRlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JLzE2I2VmYzIvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmQzCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMKLXN0ZGluOgotCXNldCAtVQotCXR5cGVzZXQgLWkxNiB4PTEj7wotCWVjaG8gLyR4LwkjIGludmFsaWQgMi1ieXRlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JLzE2I2VmZWYvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmQ0Ci1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgaW52YWxpZCBpbnB1dAotc3RkaW46Ci0Jc2V0IC1VCi0JdHlwZXNldCAtaTE2IHg9MSPvv8AKLQllY2hvIC8keC8JIyBpbnZhbGlkIDMtYnl0ZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLzEj77/AOiB1bmV4cGVjdGVkICe/Jy8KLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkNQotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGludmFsaWQgaW5wdXQKLXN0ZGluOgotCXNldCAtVQotCXR5cGVzZXQgLWkxNiB4PTEjwIAKLQllY2hvIC8keC8JIyBub24tbWluaW1hbGlzdGljCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvMSPAgDogdW5leHBlY3RlZCAngCcvCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDYKLWRlc2NyaXB0aW9uOgotCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBpbnZhbGlkIGlucHV0Ci1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1pMTYgeD0xI+CAgAotCWVjaG8gLyR4LwkjIG5vbi1taW5pbWFsaXN0aWMKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8xI+CAgDogdW5leHBlY3RlZCAngCcvCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0zQQotZGVzY3JpcHRpb246Ci0Jc29tZSBzYW1wbGUgY29kZSBmb3IgaGV4ZHVtcGluZwotc3RkaW46Ci0JewotCQlwcmludCAnSGVsbG8sIFdvcmxkIVxcXG7jgZPjgpPjgavjgaHjga/vvIEnCi0JCXR5cGVzZXQgLVV1aTE2IGk9MHgxMDAKLQkJIyBjaGFuZ2UgdGhhdCB0byAweEZGIG9uY2Ugd2UgY2FuIGhhbmRsZSBlbWJlZGRlZAotCQkjIE5VTCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgLyBoZXJlIGRvY3VtZW50cwotCQl3aGlsZSAoKCBpKysgPCAweDFGRiApKTsgZG8KLQkJCXByaW50IC1uICJceCR7aSMxNiMxfSIKLQkJZG9uZQotCQlwcmludAotCX0gfCB7Ci0JCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKLQkJdHlwZXNldCAtVXVpMTYgLVo1IGh2Ci0JCXR5cGVzZXQgLWkxIHdjPTB4MEEKLQkJZGFzYz0KLQkJbmw9JHt3YyMxI30KLQkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCi0JCQlsaW5lPSRsaW5lJG5sCi0JCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KLQkJCQlodj0xIyR7bGluZTo6MX0KLQkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KLQkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCi0JCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCi0JCQkJCWRhc2M9JyB8JwotCQkJCWZpCi0JCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCi0JCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KLQkJCQkJZGFzYz0kZGFzYy4KLQkJCQllbHNlCi0JCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9Ci0JCQkJZmkKLQkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQkJbGluZT0ke2xpbmU6MX0KLQkJCWRvbmUKLQkJZG9uZQotCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KLQkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbwotCQkJCXByaW50IC1uICcgICAnCi0JCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJwotCQkJZG9uZQotCQkJcHJpbnQgIiRkYXNjfCIKLQkJZmkKLQl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMDAwMDAwMDAgIDQ4IDY1IDZDIDZDIDZGIDJDIDIwIDU3IC0gNkYgNzIgNkMgNjQgMjEgNUMgMEEgRTMgIHxIZWxsbywgV29ybGQhXC4ufAotCTAwMDAwMDEwICA4MSA5MyBFMyA4MiA5MyBFMyA4MSBBQiAtIEUzIDgxIEExIEUzIDgxIEFGIEVGIEJDICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDAyMCAgODEgMEEgMDEgMDIgMDMgMDQgMDUgMDYgLSAwNyAwOCAwOSAwQSAwQiAwQyAwRCAwRSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwMzAgIDBGIDEwIDExIDEyIDEzIDE0IDE1IDE2IC0gMTcgMTggMTkgMUEgMUIgMUMgMUQgMUUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMDQwICAxRiAyMCAyMSAyMiAyMyAyNCAyNSAyNiAtIDI3IDI4IDI5IDJBIDJCIDJDIDJEIDJFICB8LiAhIiMkJSYnKCkqKywtLnwKLQkwMDAwMDA1MCAgMkYgMzAgMzEgMzIgMzMgMzQgMzUgMzYgLSAzNyAzOCAzOSAzQSAzQiAzQyAzRCAzRSAgfC8wMTIzNDU2Nzg5Ojs8PT58Ci0JMDAwMDAwNjAgIDNGIDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IC0gNDcgNDggNDkgNEEgNEIgNEMgNEQgNEUgIHw/QEFCQ0RFRkdISUpLTE1OfAotCTAwMDAwMDcwICA0RiA1MCA1MSA1MiA1MyA1NCA1NSA1NiAtIDU3IDU4IDU5IDVBIDVCIDVDIDVEIDVFICB8T1BRUlNUVVZXWFlaW1xdXnwKLQkwMDAwMDA4MCAgNUYgNjAgNjEgNjIgNjMgNjQgNjUgNjYgLSA2NyA2OCA2OSA2QSA2QiA2QyA2RCA2RSAgfF9gYWJjZGVmZ2hpamtsbW58Ci0JMDAwMDAwOTAgIDZGIDcwIDcxIDcyIDczIDc0IDc1IDc2IC0gNzcgNzggNzkgN0EgN0IgN0MgN0QgN0UgIHxvcHFyc3R1dnd4eXp7fH1+fAotCTAwMDAwMEEwICA3RiA4MCA4MSA4MiA4MyA4NCA4NSA4NiAtIDg3IDg4IDg5IDhBIDhCIDhDIDhEIDhFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDBCMCAgOEYgOTAgOTEgOTIgOTMgOTQgOTUgOTYgLSA5NyA5OCA5OSA5QSA5QiA5QyA5RCA5RSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwQzAgIDlGIEEwIEExIEEyIEEzIEE0IEE1IEE2IC0gQTcgQTggQTkgQUEgQUIgQUMgQUQgQUUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMEQwICBBRiBCMCBCMSBCMiBCMyBCNCBCNSBCNiAtIEI3IEI4IEI5IEJBIEJCIEJDIEJEIEJFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDBFMCAgQkYgQzAgQzEgQzIgQzMgQzQgQzUgQzYgLSBDNyBDOCBDOSBDQSBDQiBDQyBDRCBDRSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwRjAgIENGIEQwIEQxIEQyIEQzIEQ0IEQ1IEQ2IC0gRDcgRDggRDkgREEgREIgREMgREQgREUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMTAwICBERiBFMCBFMSBFMiBFMyBFNCBFNSBFNiAtIEU3IEU4IEU5IEVBIEVCIEVDIEVEIEVFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDExMCAgRUYgRjAgRjEgRjIgRjMgRjQgRjUgRjYgLSBGNyBGOCBGOSBGQSBGQiBGQyBGRCBGRSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAxMjAgIEZGIDBBICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgIHwuLnwKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0zVwotZGVzY3JpcHRpb246Ci0Jc29tZSBzYW1wbGUgY29kZSBmb3IgaGV4ZHVtcGluZyBVbmljb2RlCi1zdGRpbjoKLQlzZXQgLVUKLQl7Ci0JCXByaW50ICdIZWxsbywgV29ybGQhXFxcbuOBk+OCk+OBq+OBoeOBr++8gScKLQkJdHlwZXNldCAtVXVpMTYgaT0weDEwMAotCQkjIGNoYW5nZSB0aGF0IHRvIDB4RkYgb25jZSB3ZSBjYW4gaGFuZGxlIGVtYmVkZGVkCi0JCSMgTlVMIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyAvIGhlcmUgZG9jdW1lbnRzCi0JCXdoaWxlICgoIGkrKyA8IDB4MUZGICkpOyBkbwotCQkJcHJpbnQgLW4gIlx1JHtpIzE2IzF9IgotCQlkb25lCi0JCXByaW50Ci0JCXByaW50IFxceGZmCQkjIGludmFsaWQgdXRmLTgKLQkJcHJpbnQgXFx4YzIJCSMgaW52YWxpZCAyLWJ5dGUKLQkJcHJpbnQgXFx4ZWZcXHhiZlxceGMwCSMgaW52YWxpZCAzLWJ5dGUKLQkJcHJpbnQgXFx4YzBcXHg4MAkjIG5vbi1taW5pbWFsaXN0aWMKLQkJcHJpbnQgXFx4ZTBcXHg4MFxceDgwCSMgbm9uLW1pbmltYWxpc3RpYwotCQlwcmludCAn77+977++77+/JwkjIGVuZCBvZiByYW5nZQotCX0gfCB7Ci0JCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKLQkJdHlwZXNldCAtVXVpMTYgLVo3IGh2Ci0JCXR5cGVzZXQgLWkxIHdjPTB4MEEKLQkJdHlwZXNldCAtaSBscG9zCi0JCWRhc2M9Ci0JCW5sPSR7d2MjMSN9Ci0JCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbwotCQkJbGluZT0kbGluZSRubAotCQkJbHBvcz0wCi0JCQl3aGlsZSAoKCBscG9zIDwgJHsjbGluZX0gKSk7IGRvCi0JCQkJd2M9MSMke2xpbmU6KGxwb3MrKyk6MX0KLQkJCQlpZiAoKCAod2MgPCAzMikgfHwgXAotCQkJCSAgICAoKHdjID4gMTI2KSAmJiAod2MgPCAxNjApKSApKTsgdGhlbgotCQkJCQlkY2g9LgotCQkJCWVsaWYgKCggKHdjICYgMHhGRjgwKSA9PSAweEVGODAgKSk7IHRoZW4KLQkJCQkJZGNoPe+/vQotCQkJCWVsc2UKLQkJCQkJZGNoPSR7d2MjMSN9Ci0JCQkJZmkKLQkJCQlpZiAoKCAocG9zICYgNykgPT0gNyApKTsgdGhlbgotCQkJCQlkYXNjPSRkYXNjJGRjaAotCQkJCQlkY2g9Ci0JCQkJZWxpZiAoKCAocG9zICYgNykgPT0gMCApKTsgdGhlbgotCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKLQkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKLQkJCQkJZGFzYz0nIHwnCi0JCQkJZmkKLQkJCQlsZXQgaHY9d2MKLQkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKLQkJCQkoKCAocG9zKysgJiA3KSA9PSAzICkpICYmIFwKLQkJCQkgICAgcHJpbnQgLW4gLS0gJy0gJwotCQkJCWRhc2M9JGRhc2MkZGNoCi0JCQlkb25lCi0JCWRvbmUKLQkJaWYgKCggcG9zICYgNyApKTsgdGhlbgotCQkJd2hpbGUgKCggcG9zICYgNyApKTsgZG8KLQkJCQlwcmludCAtbiAnICAgICAnCi0JCQkJKCggKHBvcysrICYgNykgPT0gMyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQlkb25lCi0JCQlwcmludCAiJGRhc2N8IgotCQlmaQotCX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkwMDAwMDAwMCAgMDA0OCAwMDY1IDAwNkMgMDA2QyAtIDAwNkYgMDAyQyAwMDIwIDAwNTcgIHxIZWxsbywgV3wKLQkwMDAwMDAwOCAgMDA2RiAwMDcyIDAwNkMgMDA2NCAtIDAwMjEgMDA1QyAwMDBBIDMwNTMgIHxvcmxkIVwu44GTfAotCTAwMDAwMDEwICAzMDkzIDMwNkIgMzA2MSAzMDZGIC0gRkYwMSAwMDBBIDAwMDEgMDAwMiAgfOOCk+OBq+OBoeOBr++8gS4uLnwKLQkwMDAwMDAxOCAgMDAwMyAwMDA0IDAwMDUgMDAwNiAtIDAwMDcgMDAwOCAwMDA5IDAwMEEgIHwuLi4uLi4uLnwKLQkwMDAwMDAyMCAgMDAwQiAwMDBDIDAwMEQgMDAwRSAtIDAwMEYgMDAxMCAwMDExIDAwMTIgIHwuLi4uLi4uLnwKLQkwMDAwMDAyOCAgMDAxMyAwMDE0IDAwMTUgMDAxNiAtIDAwMTcgMDAxOCAwMDE5IDAwMUEgIHwuLi4uLi4uLnwKLQkwMDAwMDAzMCAgMDAxQiAwMDFDIDAwMUQgMDAxRSAtIDAwMUYgMDAyMCAwMDIxIDAwMjIgIHwuLi4uLiAhInwKLQkwMDAwMDAzOCAgMDAyMyAwMDI0IDAwMjUgMDAyNiAtIDAwMjcgMDAyOCAwMDI5IDAwMkEgIHwjJCUmJygpKnwKLQkwMDAwMDA0MCAgMDAyQiAwMDJDIDAwMkQgMDAyRSAtIDAwMkYgMDAzMCAwMDMxIDAwMzIgIHwrLC0uLzAxMnwKLQkwMDAwMDA0OCAgMDAzMyAwMDM0IDAwMzUgMDAzNiAtIDAwMzcgMDAzOCAwMDM5IDAwM0EgIHwzNDU2Nzg5OnwKLQkwMDAwMDA1MCAgMDAzQiAwMDNDIDAwM0QgMDAzRSAtIDAwM0YgMDA0MCAwMDQxIDAwNDIgIHw7PD0+P0BBQnwKLQkwMDAwMDA1OCAgMDA0MyAwMDQ0IDAwNDUgMDA0NiAtIDAwNDcgMDA0OCAwMDQ5IDAwNEEgIHxDREVGR0hJSnwKLQkwMDAwMDA2MCAgMDA0QiAwMDRDIDAwNEQgMDA0RSAtIDAwNEYgMDA1MCAwMDUxIDAwNTIgIHxLTE1OT1BRUnwKLQkwMDAwMDA2OCAgMDA1MyAwMDU0IDAwNTUgMDA1NiAtIDAwNTcgMDA1OCAwMDU5IDAwNUEgIHxTVFVWV1hZWnwKLQkwMDAwMDA3MCAgMDA1QiAwMDVDIDAwNUQgMDA1RSAtIDAwNUYgMDA2MCAwMDYxIDAwNjIgIHxbXF1eX2BhYnwKLQkwMDAwMDA3OCAgMDA2MyAwMDY0IDAwNjUgMDA2NiAtIDAwNjcgMDA2OCAwMDY5IDAwNkEgIHxjZGVmZ2hpanwKLQkwMDAwMDA4MCAgMDA2QiAwMDZDIDAwNkQgMDA2RSAtIDAwNkYgMDA3MCAwMDcxIDAwNzIgIHxrbG1ub3BxcnwKLQkwMDAwMDA4OCAgMDA3MyAwMDc0IDAwNzUgMDA3NiAtIDAwNzcgMDA3OCAwMDc5IDAwN0EgIHxzdHV2d3h5enwKLQkwMDAwMDA5MCAgMDA3QiAwMDdDIDAwN0QgMDA3RSAtIDAwN0YgMDA4MCAwMDgxIDAwODIgIHx7fH1+Li4uLnwKLQkwMDAwMDA5OCAgMDA4MyAwMDg0IDAwODUgMDA4NiAtIDAwODcgMDA4OCAwMDg5IDAwOEEgIHwuLi4uLi4uLnwKLQkwMDAwMDBBMCAgMDA4QiAwMDhDIDAwOEQgMDA4RSAtIDAwOEYgMDA5MCAwMDkxIDAwOTIgIHwuLi4uLi4uLnwKLQkwMDAwMDBBOCAgMDA5MyAwMDk0IDAwOTUgMDA5NiAtIDAwOTcgMDA5OCAwMDk5IDAwOUEgIHwuLi4uLi4uLnwKLQkwMDAwMDBCMCAgMDA5QiAwMDlDIDAwOUQgMDA5RSAtIDAwOUYgMDBBMCAwMEExIDAwQTIgIHwuLi4uLsKgwqHConwKLQkwMDAwMDBCOCAgMDBBMyAwMEE0IDAwQTUgMDBBNiAtIDAwQTcgMDBBOCAwMEE5IDAwQUEgIHzCo8KkwqXCpsKnwqjCqcKqfAotCTAwMDAwMEMwICAwMEFCIDAwQUMgMDBBRCAwMEFFIC0gMDBBRiAwMEIwIDAwQjEgMDBCMiAgfMKrwqzCrcKuwq/CsMKxwrJ8Ci0JMDAwMDAwQzggIDAwQjMgMDBCNCAwMEI1IDAwQjYgLSAwMEI3IDAwQjggMDBCOSAwMEJBICB8wrPCtMK1wrbCt8K4wrnCunwKLQkwMDAwMDBEMCAgMDBCQiAwMEJDIDAwQkQgMDBCRSAtIDAwQkYgMDBDMCAwMEMxIDAwQzIgIHzCu8K8wr3CvsK/w4DDgcOCfAotCTAwMDAwMEQ4ICAwMEMzIDAwQzQgMDBDNSAwMEM2IC0gMDBDNyAwMEM4IDAwQzkgMDBDQSAgfMODw4TDhcOGw4fDiMOJw4p8Ci0JMDAwMDAwRTAgIDAwQ0IgMDBDQyAwMENEIDAwQ0UgLSAwMENGIDAwRDAgMDBEMSAwMEQyICB8w4vDjMONw47Dj8OQw5HDknwKLQkwMDAwMDBFOCAgMDBEMyAwMEQ0IDAwRDUgMDBENiAtIDAwRDcgMDBEOCAwMEQ5IDAwREEgIHzDk8OUw5XDlsOXw5jDmcOafAotCTAwMDAwMEYwICAwMERCIDAwREMgMDBERCAwMERFIC0gMDBERiAwMEUwIDAwRTEgMDBFMiAgfMObw5zDncOew5/DoMOhw6J8Ci0JMDAwMDAwRjggIDAwRTMgMDBFNCAwMEU1IDAwRTYgLSAwMEU3IDAwRTggMDBFOSAwMEVBICB8w6PDpMOlw6bDp8Oow6nDqnwKLQkwMDAwMDEwMCAgMDBFQiAwMEVDIDAwRUQgMDBFRSAtIDAwRUYgMDBGMCAwMEYxIDAwRjIgIHzDq8Osw63DrsOvw7DDscOyfAotCTAwMDAwMTA4ICAwMEYzIDAwRjQgMDBGNSAwMEY2IC0gMDBGNyAwMEY4IDAwRjkgMDBGQSAgfMOzw7TDtcO2w7fDuMO5w7p8Ci0JMDAwMDAxMTAgIDAwRkIgMDBGQyAwMEZEIDAwRkUgLSAwMEZGIDAwMEEgRUZGRiAwMDBBICB8w7vDvMO9w77Dvy7vv70ufAotCTAwMDAwMTE4ICBFRkMyIDAwMEEgRUZFRiBFRkJGIC0gRUZDMCAwMDBBIEVGQzAgRUY4MCAgfO+/vS7vv73vv73vv70u77+977+9fAotCTAwMDAwMTIwICAwMDBBIEVGRTAgRUY4MCBFRjgwIC0gMDAwQSBGRkZEIEVGRUYgRUZCRiAgfC7vv73vv73vv70u77+977+977+9fAotCTAwMDAwMTI4ICBFRkJFIEVGRUYgRUZCRiBFRkJGIC0gMDAwQSAgICAgICAgICAgICAgICAgfO+/ve+/ve+/ve+/vS58Ci0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYga3NoOTMtc3R5bGUgYmFzZS1vbmUgaW50ZWdlcnMgd29yawotY2F0ZWdvcnk6ICFzbWtzaAotc3RkaW46Ci0Jc2V0IC1VCi0JZWNobyAxICQoKCdhJykpCi0JKGVjaG8gMmYgJCgoJ2FhJykpKSAyPiYxIHwgc2VkICJzL15bXiddKicvMnAgJy8iCi0JZWNobyAzICQoKCfigKYnKSkKLQl4PSInYSciCi0JZWNobyAiNCA8JHg+IgotCWVjaG8gNSAkKCgkeCkpCi0JZWNobyA2ICQoKHgpKQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgOTcKLQkycCAnYWEnOiBtdWx0aS1jaGFyYWN0ZXIgY2hhcmFjdGVyIGNvbnN0YW50Ci0JMyA4MjMwCi0JNCA8J2EnPgotCTUgOTcKLQk2IDk3Ci0tLS0KLW5hbWU6IHVsaW1pdC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB3ZSBjYW4gdXNlIGEgc3BlY2lmaWMgc3ludGF4IGlkaW9tIGZvciB1bGltaXQKLXN0ZGluOgotCWlmICEgeD0kKHVsaW1pdCAtZCkgfHwgW1sgJHggPSB1bmtub3duIF1dOyB0aGVuCi0JCSNlY2hvIGV4cGVjdGVkIHRvIGZhaWwgb24gdGhpcyBPUwotCQllY2hvIG9rYXkKLQllbHNlCi0JCXVsaW1pdCAtZFMgJHggJiYgZWNobyBva2F5Ci0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlva2F5Ci0tLS0KLW5hbWU6IGJhc2hpb3AtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKLQlQYXJ0IDE6IHRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKLXN0ZGluOgotCWV4ZWMgMz4mMQotCWZ1bmN0aW9uIHRocmVlb3V0IHsKLQkJZWNobyByYXMKLQkJZWNobyBkd2EgPiYyCi0JCWVjaG8gdHJpID4mMwotCX0KLQl0aHJlZW91dCAmPmZvbwotCWVjaG8gPT09Ci0JY2F0IGZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCXRyaQotCT09PQotCXJhcwotCWR3YQotLS0tCi1uYW1lOiBiYXNoaW9wLTJhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcwotCVBhcnQgMjogdGhpcyBpcyAqbm90KiBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKLXN0ZGluOgotCWV4ZWMgMz4mMQotCWZ1bmN0aW9uIHRocmVlb3V0IHsKLQkJZWNobyByYXMKLQkJZWNobyBkd2EgPiYyCi0JCWVjaG8gdHJpID4mMwotCX0KLQl0aHJlZW91dCAzJj5mb28KLQllY2hvID09PQotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQlyYXMKLQk9PT0KLQlkd2EKLQl0cmkKLS0tLQotbmFtZTogYmFzaGlvcC0yYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKLQlQYXJ0IDI6IHRoaXMgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCi1zdGRpbjoKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgMz5mb28gJj4mMwotCWVjaG8gPT09Ci0JY2F0IGZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCT09PQotCXJhcwotCWR3YQotCXRyaQotLS0tCi1uYW1lOiBiYXNoaW9wLTJjCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcwotCVBhcnQgMjogdGhpcyBpcyBzdXBwb3J0ZWQgYnkgR05VIGJhc2ggNCBvbmx5Ci1zdGRpbjoKLQllY2hvIG1pciA+Zm9vCi0Jc2V0IC1vIG5vY2xvYmJlcgotCWV4ZWMgMz4mMQotCWZ1bmN0aW9uIHRocmVlb3V0IHsKLQkJZWNobyByYXMKLQkJZWNobyBkd2EgPiYyCi0JCWVjaG8gdHJpID4mMwotCX0KLQl0aHJlZW91dCAmPj5mb28KLQllY2hvID09PQotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQl0cmkKLQk9PT0KLQltaXIKLQlyYXMKLQlkd2EKLS0tLQotbmFtZTogYmFzaGlvcC0zYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gZmFpbHMgY29ycmVjdGx5Ci0JUGFydCAxOiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCi1zdGRpbjoKLQllY2hvIG1pciA+Zm9vCi0Jc2V0IC1vIG5vY2xvYmJlcgotCWV4ZWMgMz4mMQotCWZ1bmN0aW9uIHRocmVlb3V0IHsKLQkJZWNobyByYXMKLQkJZWNobyBkd2EgPiYyCi0JCWVjaG8gdHJpID4mMwotCX0KLQl0aHJlZW91dCAmPmZvbwotCWVjaG8gPT09Ci0JY2F0IGZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCT09PQotCW1pcgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKjogY2Fubm90IChjcmVhdGV8b3ZlcndyaXRlKSAuKi8KLS0tLQotbmFtZTogYmFzaGlvcC0zYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gZmFpbHMgY29ycmVjdGx5Ci0JUGFydCAyOiB0aGlzIGlzICpub3QqIHN1cHBvcnRlZCBieSBHTlUgYmFzaAotc3RkaW46Ci0JZWNobyBtaXIgPmZvbwotCXNldCAtbyBub2Nsb2JiZXIKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgJj58Zm9vCi0JZWNobyA9PT0KLQljYXQgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JdHJpCi0JPT09Ci0JcmFzCi0JZHdhCi0tLS0KLW5hbWU6IGJhc2hpb3AtNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKLQlQYXJ0IDQ6IHRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgR05VIGJhc2gsCi0JYnV0IGZhaWxlZCBpbiBzb21lIG1rc2ggdmVyc2lvbnMKLXN0ZGluOgotCWV4ZWMgMz4mMQotCWZ1bmN0aW9uIHRocmVlb3V0IHsKLQkJZWNobyByYXMKLQkJZWNobyBkd2EgPiYyCi0JCWVjaG8gdHJpID4mMwotCX0KLQlmdW5jdGlvbiBibHViYiB7Ci0JCVtbIC1lIGJhciBdXSAmJiB0aHJlZW91dCAiJGJmIiAmPmZvbwotCX0KLQlibHViYgotCWVjaG8gLW4gPmJhcgotCWJsdWJiCi0JZWNobyA9PT0KLQljYXQgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JdHJpCi0JPT09Ci0JcmFzCi0JZHdhCi0tLS0KLW5hbWU6IG1rc2hpb3AtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgZm9yIHN1cHBvcnQgb2YgbW9yZSB0aGFuIDkgZmlsZSBkZXNjcmlwdG9ycwotY2F0ZWdvcnk6ICFjb252ZmRzCi1zdGRpbjoKLQlyZWFkIC11MTAgZm9vIDEwPDw8IGJhcgotCWVjaG8geCRmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQl4YmFyCi0tLS0KLW5hbWU6IG1rc2hpb3AtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgZm9yIHN1cHBvcnQgb2YgbW9yZSB0aGFuIDkgZmlsZSBkZXNjcmlwdG9ycwotY2F0ZWdvcnk6ICFjb252ZmRzCi1zdGRpbjoKLQlleGVjIDEyPmZvbwotCXByaW50IC11MTIgYmFyCi0JZWNobyBiYXogPiYxMgotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQliYXIKLQliYXoKLS0tLQotbmFtZTogb2tzaC1zaGNyYXNoCi1kZXNjcmlwdGlvbjoKLQlzcmMvcmVncmVzcy9iaW4va3NoL3NoY3Jhc2guc2gsdiAxLjEKLXN0ZGluOgotCWRlcGxpYnM9Ii1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbHRpZmYgLWxqcGVnIC1seiAtbHBuZyAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdka19waXhidWYubGEgLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC1sbSAtbG0gL3Vzci9sb2NhbC9saWIvbGliYXVkaW9maWxlLmxhIC1sbSAtbG0gLWxhdWRpb2ZpbGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZS5sYSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC1seiAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9YMTFSNi9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC1sbSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbElDRSAtbFNNIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLUwvdXNyL1gxMVI2L2xpYiAtbG0gLWx6IC1scG5nIC1sdW5naWYgLWx6IC1sanBlZyAtbHRpZmYgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWV1aS5sYSAtbHogLWx6IC91c3IvbG9jYWwvbGliL2xpYnhtbC5sYSAtbHogLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgLWxtIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbGFkZS5sYSAtbHogLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAtbG0gLWxtIC91c3IvbG9jYWwvbGliL2xpYmF1ZGlvZmlsZS5sYSAtbG0gLWxtIC1sYXVkaW9maWxlIC91c3IvbG9jYWwvbGliL2xpYmVzZC5sYSAtbG0gLWx6IC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWUubGEgLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtbGdsaWIgLWxnbW9kdWxlIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtbGdsaWIgLWxnbW9kdWxlIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfaW1saWIubGEgL3Vzci9sb2NhbC9saWIvbGliYXJ0X2xncGwubGEgLWxtIC1seiAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxtIC1seiAtbHVuZ2lmIC1seiAtbGpwZWcgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC91c3IvbG9jYWwvbGliL2xpYmdub21ldWkubGEgLUwvdXNyL1gxMVI2L2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdsYWRlLWdub21lLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgLWxtIC1sbSAvdXNyL2xvY2FsL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtIC1sbSAtbGF1ZGlvZmlsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmVzZC5sYSAtbG0gLWx6IC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWVzdXBwb3J0LmxhIC1sbSAtbHogLWxtIC1sZ2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lLmxhIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1sSUNFIC1sU00gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1sbSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgLWx6IC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL1gxMVI2L2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfaW1saWIubGEgLWxtIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliYXJ0X2xncGwubGEgLWxtIC1seiAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sSUNFIC1sU00gLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtTC91c3IvWDExUjYvbGliIC1sbSAtbHogLWxwbmcgLWx1bmdpZiAtbHogLWxqcGVnIC1sdGlmZiAtbGpwZWcgLWxnZGtfaW1saWIgLWxnbGliIC1sbSAtbGF1ZGlvZmlsZSAtbG0gLWxhdWRpb2ZpbGUgLWxlc2QgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXVpLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiIKLQlzcGVjaWFsZGVwbGlicz0iLWxnbm9tZXVpIC1sYXJ0X2xncGwgLWxnZGtfaW1saWIgLWx0aWZmIC1sanBlZyAtbHVuZ2lmIC1scG5nIC1seiAtbFNNIC1sSUNFIC1sZ3RrIC1sZ2RrIC1sZ21vZHVsZSAtbGludGwgLWxYZXh0IC1sWDExIC1sZ25vbWUgLWxnbm9tZXN1cHBvcnQgLWxlc2QgLWxhdWRpb2ZpbGUgLWxtIC1sZ2xpYiIKLQlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotCQljYXNlICRkZXBsaWIgaW4KLQkJLUwqKQotCQkJbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgotCQkJOzsKLQkJKikKLQkJCWNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgotCQkJKiIgJGRlcGxpYiAiKikKLQkJCQluZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiOzsKLQkJCWVzYWMKLQkJCTs7Ci0JCWVzYWMKLQlkb25lCi0tLS0KLW5hbWU6IG9rc2gtdmFyZnVuY3Rpb24tbW9kMQotZGVzY3JpcHRpb246Ci0JJE9wZW5CU0Q6IHZhcmZ1bmN0aW9uLnNoLHYgMS4xIDIwMDMvMTIvMTUgMDU6Mjg6NDAgb3R0byBFeHAgJAotCUNhbGxpbmcKLQkJRk9PPWJhciBmCi0Jd2hlcmUgZiBpcyBhIGtzaCBzdHlsZSBmdW5jdGlvbiwgc2hvdWxkIG5vdCBzZXQgRk9PIGluIHRoZSBjdXJyZW50Ci0JZW52LiBJZiBmIGlzIGEgQm91cm5lIHN0eWxlIGZ1bmN0aW9uLCBGT08gc2hvdWxkIGJlIHNldC4gRnVydGhlcm1vcmUsCi0JdGhlIGZ1bmN0aW9uIHNob3VsZCByZWNlaXZlIGEgY29ycmVjdCB2YWx1ZSBvZiBGT08uIEhvd2V2ZXIsIGRpZmZlcmluZwotCWZyb20gb2tzaCwgc2V0dGluZyBGT08gaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBtdXN0IGNoYW5nZSB0aGUgdmFsdWUgaW4KLQlzZXR0aW5nIEZPTyBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmIHNob3VsZCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBpbgotCWdsb2JhbCBlbnZpcm9ubWVudC4KLQlJbnNwaXJlZCBieSBQUiAyNDUwLgotc3RkaW46Ci0JZnVuY3Rpb24gayB7Ci0JCWlmIFsgeCRGT08gIT0geGJhciBdOyB0aGVuCi0JCQllY2hvIDEKLQkJCXJldHVybiAxCi0JCWZpCi0JCXg9JChlbnYgfCBncmVwIEZPTykKLQkJaWYgWyAieCR4IiAhPSAieEZPTz1iYXIiIF07IHRoZW4KLQkJCWVjaG8gMgotCQkJcmV0dXJuIDE7Ci0JCWZpCi0JCUZPTz1mb28KLQkJcmV0dXJuIDAKLQl9Ci0JYiAoKSB7Ci0JCWlmIFsgeCRGT08gIT0geGJhciBdOyB0aGVuCi0JCQllY2hvIDMKLQkJCXJldHVybiAxCi0JCWZpCi0JCXg9JChlbnYgfCBncmVwIEZPTykKLQkJaWYgWyAieCR4IiAhPSAieEZPTz1iYXIiIF07IHRoZW4KLQkJCWVjaG8gNAotCQkJcmV0dXJuIDE7Ci0JCWZpCi0JCUZPTz1mb28KLQkJcmV0dXJuIDAKLQl9Ci0JRk9PPWJhciBrCi0JaWYgWyAkPyAhPSAwIF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLQlpZiBbIHgkRk9PICE9IHggXTsgdGhlbgotCQlleGl0IDEKLQlmaQotCUZPTz1iYXIgYgotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0JaWYgWyB4JEZPTyAhPSB4Zm9vIF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLQlGT089YmFyYmFyCi0JRk9PPWJhciBrCi0JaWYgWyAkPyAhPSAwIF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLQlpZiBbIHgkRk9PICE9IHhiYXJiYXIgXTsgdGhlbgotCQlleGl0IDEKLQlmaQotCUZPTz1iYXIgYgotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0JaWYgWyB4JEZPTyAhPSB4Zm9vIF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLS0tLQotbmFtZTogZmQtY2xvZXhlYy0xCi1kZXNjcmlwdGlvbjoKLQlWZXJpZnkgdGhhdCBmaWxlIGRlc2NyaXB0b3JzID4gMiBhcmUgcHJpdmF0ZSBmb3IgS29ybiBzaGVsbHMKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJ0ZXN0LnNoIgotCXByaW50IC11MyBGb3dsCi1zdGRpbjoKLQlleGVjIDM+JjEKLQkiJF9fcHJvZ25hbWUiIHRlc3Quc2gKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotZXhwZWN0ZWQtc3RkZXJyOgotCXRlc3Quc2hbMV06IHByaW50OiAtdTogMzogYmFkIGZpbGUgZGVzY3JpcHRvcgotLS0tCi1uYW1lOiBmZC1jbG9leGVjLTIKLWRlc2NyaXB0aW9uOgotCVZlcmlmeSB0aGF0IGZpbGUgZGVzY3JpcHRvcnMgPiAyIGFyZSBub3QgcHJpdmF0ZSBmb3IgUE9TSVggc2hlbGxzCi0JU2VlIERlYmlhbiBCdWcgIzE1NDU0MCwgQ2xvc2VzOiAjNDk5MTM5Ci1maWxlLXNldHVwOiBmaWxlIDY0NCAidGVzdC5zaCIKLQlwcmludCAtdTMgRm93bAotc3RkaW46Ci0JdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCi0JZXhlYyAzPiYxCi0JIiRfX3Byb2duYW1lIiB0ZXN0LnNoCi1leHBlY3RlZC1zdGRvdXQ6Ci0JRm93bAotLS0tCi1uYW1lOiBjb21zdWItMQotZGVzY3JpcHRpb246Ci0JQ09NU1VCIGFyZSBjdXJyZW50bHkgcGFyc2VkIGJ5IGhhY2tpbmcgbGV4LmMgaW5zdGVhZCBvZgotCXJlY3Vyc2l2ZWx5IChzZWUgcmVncmVzc2lvbi02KTogbWF0Y2hpbmcgcGFyZW50aGVzxJNzIGJ1ZwotCUZhaWxzIG9uOiBwZGtzaCBta3NoIGJhc2gyIGJhc2gzIHpzaAotCVBhc3NlcyBvbjogYmFzaDQga3NoOTMKLWV4cGVjdGVkLWZhaWw6IHllcwotc3RkaW46Ci0JZWNobyAkKGNhc2UgMSBpbiAoMSkgZWNobyB5ZXM7OyAoMikgZWNobyBubzs7IGVzYWMpCi0JZWNobyAkKGNhc2UgMSBpbiAxKSBlY2hvIHllczs7IDIpIGVjaG8gbm87OyBlc2FjKQotZXhwZWN0ZWQtc3Rkb3V0OgotCXllcwotCXllcwotLS0tCi1uYW1lOiBjb21zdWItMgotZGVzY3JpcHRpb246Ci0JUmVkSGF0IEJaIzQ5Njc5MSDigJMgYW5vdGhlciBjYXNlIG9mIG1pc3NpbmcgcmVjdXJzaW9uCi0JaW4gcGFyc2luZyBDT01TVUIgZXhwcmVzc2lvbnMKLQlGYWlscyBvbjogcGRrc2ggbWtzaCBiYXNoMiBiYXNoM8K5IGJhc2g0wrkgenNoCi0JUGFzc2VzIG9uOiBrc2g5MwotCeKRoCBiYXNoWzM0XSBzZWVtIHRvIGNob2tlIG9uIGNvbW1lbnQgZW5kaW5nIHdpdGggYmFja3NsYXNoLW5ld2xpbmUKLWV4cGVjdGVkLWZhaWw6IHllcwotc3RkaW46Ci0JIyBhIGNvbW1lbnQgd2l0aCAiICcgXAotCXg9JCgKLQllY2hvIHllcwotCSMgYSBjb21tZW50IHdpdGggIiAnIFwKLQkpCi0JZWNobyAkeAotZXhwZWN0ZWQtc3Rkb3V0OgotCXllcwotLS0tCi1uYW1lOiB0ZXN0LXN0bnplLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHNob3J0IGZvcm0gWyAkeCBdIHdvcmtzCi1zdGRpbjoKLQlpPTAKLQlbIC1uICR4IF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbICR4IF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbIC1uICIkeCIgXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVsgIiR4IiBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JeD0wCi0JWyAtbiAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAtbiAiJHgiIF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbICIkeCIgXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCXg9JzEgLWEgMSA9IDInCi0JWyAtbiAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAtbiAiJHgiIF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbICIkeCIgXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgMAotCTIgMQotCTMgMQotCTQgMQotCTUgMAotCTYgMAotCTcgMAotCTggMAotCTkgMQotCTEwIDEKLQkxMSAwCi0JMTIgMAotLS0tCi1uYW1lOiB0ZXN0LXN0bnplLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHNob3J0IGZvcm0gW1sgJHggXV0gd29ya3MgKGtzaDkzIGV4dGVuc2lvbikKLXN0ZGluOgotCWk9MAotCVtbIC1uICR4IF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgJHggXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbWyAtbiAiJHgiIF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgIiR4IiBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCXg9MAotCVtbIC1uICR4IF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgJHggXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbWyAtbiAiJHgiIF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgIiR4IiBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCXg9JzEgLWEgMSA9IDInCi0JW1sgLW4gJHggXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbWyAkeCBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVtbIC1uICIkeCIgXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbWyAiJHgiIF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMSAxCi0JMiAxCi0JMyAxCi0JNCAxCi0JNSAwCi0JNiAwCi0JNyAwCi0JOCAwCi0JOSAwCi0JMTAgMAotCTExIDAKLQkxMiAwCi0tLS0KLW5hbWU6IGV2ZW50LXN1YnN0LTFhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSB3b3JrcwotY2F0ZWdvcnk6ICFzbWtzaAotZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgotCSMhIC9iaW4vc2gKLQllY2hvIG1vbHRvIGJlbmUKLQlleGl0IDQyCi1maWxlLXNldHVwOiBmaWxlIDc1NSAiIWZhbHNlIgotCSMhIC9iaW4vc2gKLQllY2hvIHNpCi1hcmd1bWVudHM6ICEtaSEKLXN0ZGluOgotCWV4cG9ydCBQQVRIPS46JFBBVEgKLQlmYWxzZXR0bwotCWVjaG8geWVhcAotCSFmYWxzZQotZXhwZWN0ZWQtZXhpdDogNDIKLWV4cGVjdGVkLXN0ZG91dDoKLQltb2x0byBiZW5lCi0JeWVhcAotCW1vbHRvIGJlbmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKi8KLS0tLQotbmFtZTogZXZlbnQtc3Vic3QtMWIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgJyEnIHN1YnN0aXR1dGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlIHdvcmtzCi0JZXZlbiB3aGVuIGEgc3BhY2Ugc2VwYXJhdGVzIGl0IGZyb20gdGhlIHNlYXJjaCBjb21tYW5kLAotCXdoaWNoIGlzIG5vdCB3aGF0IEdOVSBiYXNoIHByb3ZpZGVzIGJ1dCByZXF1aXJlZCBmb3IgdGhlCi0Jb3RoZXIgcmVncmVzc2lvbiB0ZXN0cyBiZWxvdyB0byBjaGVjawotY2F0ZWdvcnk6ICFzbWtzaAotZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgotCSMhIC9iaW4vc2gKLQllY2hvIG1vbHRvIGJlbmUKLQlleGl0IDQyCi1maWxlLXNldHVwOiBmaWxlIDc1NSAiISIKLQkjISAvYmluL3NoCi0JZWNobyBzaQotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQlleHBvcnQgUEFUSD0uOiRQQVRICi0JZmFsc2V0dG8KLQllY2hvIHllYXAKLQkhIGZhbHNlCi1leHBlY3RlZC1leGl0OiA0MgotZXhwZWN0ZWQtc3Rkb3V0OgotCW1vbHRvIGJlbmUKLQl5ZWFwCi0JbW9sdG8gYmVuZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLy4qLwotLS0tCi1uYW1lOiBldmVudC1zdWJzdC0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZQotCWRvZXMgbm90IGJyZWFrIHRoaW5ncwotY2F0ZWdvcnk6ICFzbWtzaAotZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgotCSMhIC9iaW4vc2gKLQllY2hvIG1vbHRvIGJlbmUKLQlleGl0IDQyCi1maWxlLXNldHVwOiBmaWxlIDc1NSAiISIKLQkjISAvYmluL3NoCi0JZWNobyBzaQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQlleHBvcnQgUEFUSD0uOiRQQVRICi0JZmFsc2V0dG8KLQllY2hvIHllYXAKLQkhZmFsc2UKLQllY2hvIG1lb3cKLQkhIGZhbHNlCi0JZWNobyA9ICQ/Ci0JaWYKLQkhIGZhbHNlOyB0aGVuIGVjaG8gZm9vOyBlbHNlIGVjaG8gYmFyOyBmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCW1vbHRvIGJlbmUKLQl5ZWFwCi0JbW9sdG8gYmVuZQotCW1lb3cKLQltb2x0byBiZW5lCi0JPSA0MgotCWZvbwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLy4qLwotLS0tCi1uYW1lOiBldmVudC1zdWJzdC0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gbm9uaW50ZXJhY3RpdmUgbW9kZSBpcyBpZ25vcmVkCi1jYXRlZ29yeTogIXNta3NoCi1maWxlLXNldHVwOiBmaWxlIDc1NSAiZmFsc2V0dG8iCi0JIyEgL2Jpbi9zaAotCWVjaG8gbW9sdG8gYmVuZQotCWV4aXQgNDIKLWZpbGUtc2V0dXA6IGZpbGUgNzU1ICIhZmFsc2UiCi0JIyEgL2Jpbi9zaAotCWVjaG8gc2kKLXN0ZGluOgotCWV4cG9ydCBQQVRIPS46JFBBVEgKLQlmYWxzZXR0bwotCWVjaG8geWVhcAotCSFmYWxzZQotCWVjaG8gbWVvdwotCSEgZmFsc2UKLQllY2hvID0gJD8KLQlpZgotCSEgZmFsc2U7IHRoZW4gZWNobyBmb287IGVsc2UgZWNobyBiYXI7IGZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbW9sdG8gYmVuZQotCXllYXAKLQlzaQotCW1lb3cKLQk9IDAKLQlmb28KLS0tLQotbmFtZTogbm91bnNldC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICJzZXQgLXUiIG1hdGNoZXMgKGZ1dHVyZSkgU1VTdjQgcmVxdWlyZW1lbnQKLXN0ZGluOgotCShzZXQgLXUKLQl0cnkoKSB7Ci0JCWxvY2FsIHYKLQkJZXZhbCB2PVwkJDEKLQkJaWYgW1sgLW4gJHYgXV07IHRoZW4KLQkJCWVjaG8gJDE9bnoKLQkJZWxzZQotCQkJZWNobyAkMT16ZgotCQlmaQotCX0KLQl4PXkKLQkoZWNobyAkeCkKLQllY2hvID0xCi0JKGVjaG8gJHkpCi0JZWNobyA9MgotCSh0cnkgeCkKLQllY2hvID0zCi0JKHRyeSB5KQotCWVjaG8gPTQKLQkodHJ5IDApCi0JZWNobyA9NQotCSh0cnkgMikKLQllY2hvID02Ci0JKHRyeSkKLQllY2hvID03Ci0JKGVjaG8gYXQ9JEApCi0JZWNobyA9OAotCShlY2hvIGFzdGVyaXNrPSQqKQotCWVjaG8gPTkKLQkoZWNobyAkPykKLQllY2hvID0xMAotCShlY2hvICQhKQotCWVjaG8gPTExCi0JKGVjaG8gJC0pCi0JZWNobyA9MTIKLQkjKGVjaG8gJF8pCi0JI2VjaG8gPTEzCi0JKGVjaG8gJCMpCi0JZWNobyA9MTQKLQkobXlwaWQ9JCQ7IHRyeSBteXBpZCkKLQllY2hvID0xNQotCSkgMj4mMSB8IHNlZCAtZSAncy9eW15dXSpdLy8nIC1lICdzL15bXjpdKjogKi8vJwotZXhwZWN0ZWQtc3Rkb3V0OgotCXkKLQk9MQotCXk6IHBhcmFtZXRlciBub3Qgc2V0Ci0JPTIKLQl4PW56Ci0JPTMKLQl5OiBwYXJhbWV0ZXIgbm90IHNldAotCT00Ci0JMD1uegotCT01Ci0JMjogcGFyYW1ldGVyIG5vdCBzZXQKLQk9NgotCTE6IHBhcmFtZXRlciBub3Qgc2V0Ci0JPTcKLQlhdD0KLQk9OAotCWFzdGVyaXNrPQotCT05Ci0JMAotCT0xMAotCSE6IHBhcmFtZXRlciBub3Qgc2V0Ci0JPTExCi0JdXNoCi0JPTEyCi0JMAotCT0xNAotCW15cGlkPW56Ci0JPTE1Ci0tLS0KLW5hbWU6IG5hbWVyZWYtMQotZGVzY3JpcHRpb246Ci0JVGVzdHN1aXRlIGZvciBuYW1lcmVmIChib3VuZCB2YXJpYWJsZXMpCi1zdGRpbjoKLQliYXI9Z2xvYmFsCi0JdHlwZXNldCAtbiBpcjI9YmFyCi0JdHlwZXNldCAtbiBpbmQ9aXIyCi0JZWNobyAhaW5kOiAkeyFpbmR9Ci0JZWNobyBpbmQ6ICRpbmQKLQllY2hvICFpcjI6ICR7IWlyMn0KLQllY2hvIGlyMjogJGlyMgotCXR5cGVzZXQgK24gaW5kCi0JZWNobyAhaW5kOiAkeyFpbmR9Ci0JZWNobyBpbmQ6ICRpbmQKLQl0eXBlc2V0IC1uIGlyMj1pbmQKLQllY2hvICFpcjI6ICR7IWlyMn0KLQllY2hvIGlyMjogJGlyMgotCXNldHxncmVwIF5pcjJ8c2VkICdzL14vczE6IC8nCi0JdHlwZXNldHxncmVwICcgaXIyJ3xzZWQgLWUgJ3MvXi9zMjogLycgLWUgJ3MvbmFtZXJlZi90eXBlc2V0IC1uLycKLQlzZXQgLUEgYmx1YiAtLSBlMSBlMiBlMwotCXR5cGVzZXQgLW4gaW5kPWJsdWIKLQl0eXBlc2V0IC1uIGlyMj1ibHViWzJdCi0JZWNobyAhaW5kWzFdOiAkeyFpbmRbMV19Ci0JZWNobyAhaXIyOiAkIWlyMgotCWVjaG8gaW5kWzFdOiAke2luZFsxXX0KLQllY2hvIGlyMjogJGlyMgotZXhwZWN0ZWQtc3Rkb3V0OgotCSFpbmQ6IGJhcgotCWluZDogZ2xvYmFsCi0JIWlyMjogYmFyCi0JaXIyOiBnbG9iYWwKLQkhaW5kOiBpbmQKLQlpbmQ6IGlyMgotCSFpcjI6IGluZAotCWlyMjogaXIyCi0JczE6IGlyMj1pbmQKLQlzMjogdHlwZXNldCAtbiBpcjIKLQkhaW5kWzFdOiAxCi0JIWlyMjogaXIyCi0JaW5kWzFdOiBlMgotCWlyMjogZTMKLS0tLQotbmFtZTogbmFtZXJlZi0yZGEKLWRlc2NyaXB0aW9uOgotCVRlc3RzdWl0ZSBmb3IgbmFtZXJlZiAoYm91bmQgdmFyaWFibGVzKQotCUZ1bmN0aW9ucywgYXJndW1lbnQgZ2l2ZW4gZGlyZWN0bHksIGFmdGVyIGxvY2FsCi1zdGRpbjoKLQlmdW5jdGlvbiBmb28gewotCQl0eXBlc2V0IGJhcj1sb2thbCBiYXo9YXVjaAotCQl0eXBlc2V0IC1uIHY9YmFyCi0JCWVjaG8gZW50ZXJpbmcKLQkJZWNobyAhdjogJHshdn0KLQkJZWNobyAhYmFyOiAkeyFiYXJ9Ci0JCWVjaG8gIWJhejogJHshYmF6fQotCQllY2hvIGJhcjogJGJhcgotCQllY2hvIHY6ICR2Ci0JCXY9MTIzCi0JCWVjaG8gYmFyOiAkYmFyCi0JCWVjaG8gdjogJHYKLQkJZWNobyBleGl0aW5nCi0JfQotCWJhcj1nbG9iYWwKLQllY2hvIGJhcjogJGJhcgotCWZvbyBiYXIKLQllY2hvIGJhcjogJGJhcgotZXhwZWN0ZWQtc3Rkb3V0OgotCWJhcjogZ2xvYmFsCi0JZW50ZXJpbmcKLQkhdjogYmFyCi0JIWJhcjogYmFyCi0JIWJhejogYmF6Ci0JYmFyOiBsb2thbAotCXY6IGxva2FsCi0JYmFyOiAxMjMKLQl2OiAxMjMKLQlleGl0aW5nCi0JYmFyOiBnbG9iYWwKLS0tLQotbmFtZTogbmFtZXJlZi0zCi1kZXNjcmlwdGlvbjoKLQlBZHZhbmNlZCB0ZXN0c3VpdGUgZm9yIGJvdW5kIHZhcmlhYmxlcyAoa3NoOTMgZmFpbHMgdGhpcykKLXN0ZGluOgotCXR5cGVzZXQgLW4gZm9vPWJhcltpXQotCXNldCAtQSBiYXIgLS0gYiBjIGEKLQlmb3IgaSBpbiAwIDEgMiAzOyBkbwotCQlwcmludCAkaSAkZm9vIC4KLQlkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMCBiIC4KLQkxIGMgLgotCTIgYSAuCi0JMyAuCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtMWEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWlmICggKGVjaG8gZnViYXIpIHwgdHIgdSB4KTsgdGhlbgotCQllY2hvIGphCi0JZWxzZQotCQllY2hvIG5laW4KLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyCi0JamEKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy0xYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JZWNobyAkKCAoZWNobyBmdWJhcikgfCB0ciB1IHgpICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JZnhiYXIgMAotLS0tCi1uYW1lOiBiZXR0ZXItcGFyZW5zLTJhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCi1zdGRpbjoKLQlpZiAoKGVjaG8gZnViYXIpIHwgdHIgdSB4KTsgdGhlbgotCQllY2hvIGphCi0JZWxzZQotCQllY2hvIG5laW4KLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyCi0JamEKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy0yYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JZWNobyAkKChlY2hvIGZ1YmFyKSB8IHRyIHUgeCkgJD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhciAwCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtM2EKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWlmICggKGVjaG8gZnViYXIpIHwgKHRyIHUgeCkpOyB0aGVuCi0JCWVjaG8gamEKLQllbHNlCi0JCWVjaG8gbmVpbgotCWZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZnhiYXIKLQlqYQotLS0tCi1uYW1lOiBiZXR0ZXItcGFyZW5zLTNiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCi1zdGRpbjoKLQllY2hvICQoIChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKSAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyIDAKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy00YQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JaWYgKChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKTsgdGhlbgotCQllY2hvIGphCi0JZWxzZQotCQllY2hvIG5laW4KLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyCi0JamEKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy00YgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JZWNobyAkKChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKSAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyIDAKLS0tLQotbmFtZTogZWNoby10ZXN0LTEKLWRlc2NyaXB0aW9uOgotCVRlc3Qgd2hhdCB0aGUgZWNobyBidWlsdGluIGRvZXMgKG1rc2gpCi1zdGRpbjoKLQllY2hvIC1uICdmb29ceDQwYmFyJwotCWVjaG8gLWUgJ1x0YmF6JwotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvb0BiYXIJYmF6Ci0tLS0KLW5hbWU6IGVjaG8tdGVzdC0yCi1kZXNjcmlwdGlvbjoKLQlUZXN0IHdoYXQgdGhlIGVjaG8gYnVpbHRpbiBkb2VzIChQT1NJWCkKLQlOb3RlOiB0aGlzIGZvbGxvd3MgRGViaWFuIFBvbGljeSAxMC40IHdoaWNoIG1hbmRhdGVzCi0JdGhhdCAtbiBzaGFsbCBiZSB0cmVhdGVkIGFzIGFuIG9wdGlvbiwgbm90IFhTSSB3aGljaAotCW1hbmRhdGVzIGl0IHNoYWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5nIGJ1dCBlc2NhcGVzCi0Jc2hhbGwgYmUgZXhwYW5kZWQuCi1zdGRpbjoKLQl0ZXN0IC1uICIkUE9TSF9WRVJTSU9OIiB8fCBzZXQgLW8gc2gKLQllY2hvIC1uICdmb29ceDQwYmFyJwotCWVjaG8gLWUgJ1x0YmF6JwotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvb1x4NDBiYXItZSBcdGJhegotLS0tCi1uYW1lOiB1dGlsaXRpZXMtZ2V0b3B0cy0xCi1kZXNjcmlwdGlvbjoKLQlnZXRvcHRzIHNldHMgT1BUSU5EIGNvcnJlY3RseSBmb3IgdW5wYXJzZWQgb3B0aW9uCi1zdGRpbjoKLQlzZXQgLS0gLWEgLWEgLXgKLQl3aGlsZSBnZXRvcHRzIDphIG9wdGM7IGRvCi0JICAgIGVjaG8gIk9QVEFSRz0kT1BUQVJHLCBPUFRJTkQ9JE9QVElORCwgb3B0Yz0kb3B0Yy4iCi0JZG9uZQotCWVjaG8gZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCU9QVEFSRz0sIE9QVElORD0yLCBvcHRjPWEuCi0JT1BUQVJHPSwgT1BUSU5EPTMsIG9wdGM9YS4KLQlPUFRBUkc9eCwgT1BUSU5EPTQsIG9wdGM9Py4KLQlkb25lCi0tLS0KLW5hbWU6IHV0aWxpdGllcy1nZXRvcHRzLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIE9QVEFSRwotc3RkaW46Ci0Jc2V0IC0tIC1hIE1hcnkgLXgKLQl3aGlsZSBnZXRvcHRzIGE6IG9wdGM7IGRvCi0JICAgIGVjaG8gIk9QVEFSRz0kT1BUQVJHLCBPUFRJTkQ9JE9QVElORCwgb3B0Yz0kb3B0Yy4iCi0JZG9uZQotCWVjaG8gZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCU9QVEFSRz1NYXJ5LCBPUFRJTkQ9Mywgb3B0Yz1hLgotCU9QVEFSRz0sIE9QVElORD00LCBvcHRjPT8uCi0JZG9uZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi14LipvcHRpb24vCi0tLS0KLW5hbWU6IHdjc3dpZHRoLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoZSBuZXcgd2Nzd2lkdGggZmVhdHVyZQotc3RkaW46Ci0Jcz3kvZUKLQlzZXQgK1UKLQlwcmludCBvY3RldHM6ICR7I3N9IC4KLQlwcmludCA4LWJpdCB3aWR0aDogJHslc30gLgotCXNldCAtVQotCXByaW50IGNoYXJhY3RlcnM6ICR7I3N9IC4KLQlwcmludCBjb2x1bW5zOiAkeyVzfSAuCi0Jcz3vv70KLQlzZXQgK1UKLQlwcmludCBvY3RldHM6ICR7I3N9IC4KLQlwcmludCA4LWJpdCB3aWR0aDogJHslc30gLgotCXNldCAtVQotCXByaW50IGNoYXJhY3RlcnM6ICR7I3N9IC4KLQlwcmludCBjb2x1bW5zOiAkeyVzfSAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb2N0ZXRzOiAzIC4KLQk4LWJpdCB3aWR0aDogLTEgLgotCWNoYXJhY3RlcnM6IDEgLgotCWNvbHVtbnM6IDIgLgotCW9jdGV0czogMyAuCi0JOC1iaXQgd2lkdGg6IDMgLgotCWNoYXJhY3RlcnM6IDEgLgotCWNvbHVtbnM6IDEgLgotLS0tCi1uYW1lOiB3Y3N3aWR0aC0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JcHJpbnQgJSAkJSAuCi0Jc2V0IC1VCi0JeD0nYQliJwotCXByaW50IGMgJHsleH0gLgotCXNldCArVQotCXg9J2EJYicKLQlwcmludCBkICR7JXh9IC4KLWV4cGVjdGVkLXN0ZG91dDoKLQklICQlIC4KLQljIC0xIC4KLQlkIC0xIC4KLS0tLQotbmFtZTogd2Nzd2lkdGgtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCXByaW50ICR7JX0gLgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHdjc3dpZHRoLTRhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JcHJpbnQgJHslKn0gLgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHdjc3dpZHRoLTRiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JcHJpbnQgJHslQH0gLgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2JhZCBzdWJzdGl0dXRpb24vCi1leHBlY3RlZC1leGl0OiAxCi0tLS0KLW5hbWU6IHdjc3dpZHRoLTRjCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lIGNvcm5lciBjYXNlcwotc3RkaW46Ci0JOgotCXByaW50ICR7JT99IC4KLWV4cGVjdGVkLXN0ZG91dDoKLQkxIC4KLS0tLQotbmFtZTogcmVhbHBhdGgtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcHJvcGVyIHJldHVybiB2YWx1ZXMgZm9yIHJlYWxwYXRoCi1jYXRlZ29yeTogb3M6bWlyYnNkCi1zdGRpbjoKLQl3ZD0kKHJlYWxwYXRoIC4pCi0JbWtkaXIgZGlyCi0JOj5maWxlCi0JOj5kaXIvZmlsZQotCWxuIC1zIGRpciBsbmRpcgotCWxuIC1zIGZpbGUgbG5maWxlCi0JbG4gLXMgbml4IGxubml4Ci0JbG4gLXMgLiBsbnNlbGYKLQlpPTAKLQljaGsoKSB7Ci0JCXR5cGVzZXQgeCB5Ci0JCXg9JChyZWFscGF0aCAiJHdkLyQxIiAyPiYxKTsgeT0kPwotCQlwcmludCAkKCgrK2kpKSAiPyQxIiA9JHt4IyMqJHdkL30gISR5Ci0JfQotCWNoayBkaXIKLQljaGsgZGlyLwotCWNoayBkaXIvZmlsZQotCWNoayBkaXIvbml4Ci0JY2hrIGZpbGUKLQljaGsgZmlsZS8KLQljaGsgZmlsZS9maWxlCi0JY2hrIGZpbGUvbml4Ci0JY2hrIG5peAotCWNoayBuaXgvCi0JY2hrIG5peC9maWxlCi0JY2hrIG5peC9uaXgKLQljaGsgbG5kaXIKLQljaGsgbG5kaXIvCi0JY2hrIGxuZGlyL2ZpbGUKLQljaGsgbG5kaXIvbml4Ci0JY2hrIGxuZmlsZQotCWNoayBsbmZpbGUvCi0JY2hrIGxuZmlsZS9maWxlCi0JY2hrIGxuZmlsZS9uaXgKLQljaGsgbG5uaXgKLQljaGsgbG5uaXgvCi0JY2hrIGxubml4L2ZpbGUKLQljaGsgbG5uaXgvbml4Ci0JY2hrIGxuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZgotCXJtIGxuc2VsZgotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgP2RpciA9ZGlyICEwCi0JMiA/ZGlyLyA9ZGlyICEwCi0JMyA/ZGlyL2ZpbGUgPWRpci9maWxlICEwCi0JNCA/ZGlyL25peCA9ZGlyL25peCAhMAotCTUgP2ZpbGUgPWZpbGUgITAKLQk2ID9maWxlLyA9ZmlsZS86IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQk3ID9maWxlL2ZpbGUgPWZpbGUvZmlsZTogTm90IGEgZGlyZWN0b3J5ICEyMAotCTggP2ZpbGUvbml4ID1maWxlL25peDogTm90IGEgZGlyZWN0b3J5ICEyMAotCTkgP25peCA9bml4ICEwCi0JMTAgP25peC8gPW5peCAhMAotCTExID9uaXgvZmlsZSA9bml4L2ZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKLQkxMiA/bml4L25peCA9bml4L25peDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAhMgotCTEzID9sbmRpciA9ZGlyICEwCi0JMTQgP2xuZGlyLyA9ZGlyICEwCi0JMTUgP2xuZGlyL2ZpbGUgPWRpci9maWxlICEwCi0JMTYgP2xuZGlyL25peCA9ZGlyL25peCAhMAotCTE3ID9sbmZpbGUgPWZpbGUgITAKLQkxOCA/bG5maWxlLyA9bG5maWxlLzogTm90IGEgZGlyZWN0b3J5ICEyMAotCTE5ID9sbmZpbGUvZmlsZSA9bG5maWxlL2ZpbGU6IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQkyMCA/bG5maWxlL25peCA9bG5maWxlL25peDogTm90IGEgZGlyZWN0b3J5ICEyMAotCTIxID9sbm5peCA9bml4ICEwCi0JMjIgP2xubml4LyA9bml4ICEwCi0JMjMgP2xubml4L2ZpbGUgPWxubml4L2ZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKLQkyNCA/bG5uaXgvbml4ID1sbm5peC9uaXg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKLQkyNSA/bG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmID1sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGY6IFRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyAhNjIKLS0tLQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZWRpdC5jIGIvbWtzaC9zcmMvZWRpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDVkZTdlLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2VkaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNDkgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGVkaXQuYyx2IDEuMzQgMjAxMC8wNS8yMCAwMToxMzowNyBmZ3NjaCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IGVkaXQuaCx2IDEuOCAyMDA1LzAzLzI4IDIxOjI4OjIyIGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBlbWFjcy5jLHYgMS40MiAyMDA5LzA2LzAyIDA2OjQ3OjQ3IGhhbGV4IEV4cCAkCSovCi0vKgkkT3BlbkJTRDogdmkuYyx2IDEuMjYgMjAwOS8wNi8yOSAyMjo1MDoxOSBtYXJ0eW5hcyBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2VkaXQuYyx2IDEuMTk2IDIwMTAvMDcvMjUgMTE6MzU6NDAgdGcgRXhwICQiKTsKLQotLyoKLSAqIGluIGxhdGVyIHZlcnNpb25zIHdlIG1pZ2h0IHVzZSBsaWJ0ZXJtY2FwIGZvciB0aGlzLCBidXQgc2luY2UgZXh0ZXJuYWwKLSAqIGRlcGVuZGVuY2llcyBhcmUgcHJvYmxlbWF0aWMsIHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBkZWNpZGVkIG9uOyBhbm90aGVyCi0gKiBnb29kIHN0cmluZyBpcyAiXDAzM2MiIGV4Y2VwdCBvbiBoYXJkd2FyZSB0ZXJtaW5hbHMgbGlrZSB0aGUgREVDIFZUNDIwCi0gKiB3aGljaCBkbyBhIGZ1bGwgcG93ZXIgY3ljbGUgdGhlbi4uLgotICovCi0jaWZuZGVmIE1LU0hfQ0xTX1NUUklORwotI2RlZmluZSBNS1NIX0NMU19TVFJJTkcJCSJcMDMzWztIXDAzM1tKIgotI2VuZGlmCi0jaWZuZGVmIE1LU0hfQ0xSVE9FT0xfU1RSSU5HCi0jZGVmaW5lIE1LU0hfQ0xSVE9FT0xfU1RSSU5HCSJcMDMzW0siCi0jZW5kaWYKLQotLyogdHR5IGRyaXZlciBjaGFyYWN0ZXJzIHdlIGFyZSBpbnRlcmVzdGVkIGluICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGVyYXNlOwotCWludCBraWxsOwotCWludCB3ZXJhc2U7Ci0JaW50IGludHI7Ci0JaW50IHF1aXQ7Ci0JaW50IGVvZjsKLX0gWF9jaGFyczsKLQotc3RhdGljIFhfY2hhcnMgZWRjaGFyczsKLQotLyogeF9mY19nbG9iKCkgZmxhZ3MgKi8KLSNkZWZpbmUgWENGX0NPTU1BTkQJQklUKDApCS8qIERvIGNvbW1hbmQgY29tcGxldGlvbiAqLwotI2RlZmluZSBYQ0ZfRklMRQlCSVQoMSkJLyogRG8gZmlsZSBjb21wbGV0aW9uICovCi0jZGVmaW5lIFhDRl9GVUxMUEFUSAlCSVQoMikJLyogY29tbWFuZCBjb21wbGV0aW9uOiBzdG9yZSBmdWxsIHBhdGggKi8KLSNkZWZpbmUgWENGX0NPTU1BTkRfRklMRSAoWENGX0NPTU1BTkR8WENGX0ZJTEUpCi0KLXN0YXRpYyBjaGFyIGVkaXRtb2RlOwotc3RhdGljIGludCB4eF9jb2xzOwkJCS8qIGZvciBFbWFjcyBtb2RlICovCi1zdGF0aWMgaW50IG1vZGlmaWVkOwkJCS8qIGJ1ZmZlciBoYXMgYmVlbiAibW9kaWZpZWQiICovCi1zdGF0aWMgY2hhciBob2xkYnVmW0xJTkVdOwkJLyogcGxhY2UgdG8gaG9sZCBsYXN0IGVkaXQgYnVmZmVyICovCi0KLXN0YXRpYyBpbnQgeF9nZXRjKHZvaWQpOwotc3RhdGljIHZvaWQgeF9wdXRjZihpbnQpOwotc3RhdGljIGJvb2wgeF9tb2RlKGJvb2wpOwotc3RhdGljIGludCB4X2RvX2NvbW1lbnQoY2hhciAqLCBpbnQsIGludCAqKTsKLXN0YXRpYyB2b2lkIHhfcHJpbnRfZXhwYW5zaW9ucyhpbnQsIGNoYXIgKmNvbnN0ICosIGJvb2wpOwotc3RhdGljIGludCB4X2NmX2dsb2IoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQgKiwgaW50ICosIGNoYXIgKioqLAotICAgIGJvb2wgKik7Ci1zdGF0aWMgaW50IHhfbG9uZ2VzdF9wcmVmaXgoaW50LCBjaGFyICpjb25zdCAqKTsKLXN0YXRpYyBpbnQgeF9iYXNlbmFtZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB4X2ZyZWVfd29yZHMoaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgeF9lc2NhcGUoY29uc3QgY2hhciAqLCBzaXplX3QsIGludCAoKikoY29uc3QgY2hhciAqLCBzaXplX3QpKTsKLXN0YXRpYyBpbnQgeF9lbWFjcyhjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgdm9pZCB4X2luaXRfZW1hY3Modm9pZCk7Ci1zdGF0aWMgdm9pZCB4X2luaXRfcHJvbXB0KHZvaWQpOwotI2lmICFNS1NIX1NfTk9WSQotc3RhdGljIGludCB4X3ZpKGNoYXIgKiwgc2l6ZV90KTsKLSNlbmRpZgotCi0jZGVmaW5lIHhfZmx1c2goKQlzaGZfZmx1c2goc2hsX291dCkKLSNpZmRlZiBNS1NIX1NNQUxMCi0jZGVmaW5lIHhfcHV0YyhjKQl4X3B1dGNmKGMpCi0jZWxzZQotI2RlZmluZSB4X3B1dGMoYykJc2hmX3B1dGMoKGMpLCBzaGxfb3V0KQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcGF0aF9vcmRlcl9jbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKTsKLXN0YXRpYyBjaGFyICphZGRfZ2xvYihjb25zdCBjaGFyICosIGludCkKLSAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMSkpKQotICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMSwgMik7Ci1zdGF0aWMgdm9pZCBnbG9iX3RhYmxlKGNvbnN0IGNoYXIgKiwgWFB0clYgKiwgc3RydWN0IHRhYmxlICopOwotc3RhdGljIHZvaWQgZ2xvYl9wYXRoKGludCBmbGFncywgY29uc3QgY2hhciAqLCBYUHRyViAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGludCB4X2ZpbGVfZ2xvYihpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICoqKikKLSAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMikpKQotICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMiwgMyk7Ci1zdGF0aWMgaW50IHhfY29tbWFuZF9nbG9iKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGNoYXIgKioqKQotICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgyKSkpCi0gICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAyLCAzKTsKLXN0YXRpYyBpbnQgeF9sb2NhdGVfd29yZChjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQgKiwgYm9vbCAqKTsKLQotc3RhdGljIGludCB4X2VfZ2V0bWJjKGNoYXIgKik7Ci1zdGF0aWMgaW50IHhfZV9yZWJ1aWxkbGluZShjb25zdCBjaGFyICopOwotCi0vKiArKysgZ2VuZXJpYyBlZGl0aW5nIGZ1bmN0aW9ucyArKysgKi8KLQotLyogQ2FsbGVkIGZyb20gbWFpbiAqLwotdm9pZAoteF9pbml0KHZvaWQpCi17Ci0JLyogc2V0IHRvIC0yIHRvIGZvcmNlIGluaXRpYWwgYmluZGluZyAqLwotCWVkY2hhcnMuZXJhc2UgPSBlZGNoYXJzLmtpbGwgPSBlZGNoYXJzLmludHIgPSBlZGNoYXJzLnF1aXQgPQotCSAgICBlZGNoYXJzLmVvZiA9IC0yOwotCS8qIGRlZmF1bHQgdmFsdWUgZm9yIGRlZmljaWVudCBzeXN0ZW1zICovCi0JZWRjaGFycy53ZXJhc2UgPSAwMjc7CS8qIF5XICovCi0JeF9pbml0X2VtYWNzKCk7Ci19Ci0KLS8qCi0gKiByZWFkIGFuIGVkaXRlZCBjb21tYW5kIGxpbmUKLSAqLwotaW50Ci14X3JlYWQoY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCWludCBpOwotCi0JeF9tb2RlKHRydWUpOwotCW1vZGlmaWVkID0gMTsKLQlpZiAoRmxhZyhGRU1BQ1MpIHx8IEZsYWcoRkdNQUNTKSkKLQkJaSA9IHhfZW1hY3MoYnVmLCBsZW4pOwotI2lmICFNS1NIX1NfTk9WSQotCWVsc2UgaWYgKEZsYWcoRlZJKSkKLQkJaSA9IHhfdmkoYnVmLCBsZW4pOwotI2VuZGlmCi0JZWxzZQotCQlpID0gLTE7CQkvKiBpbnRlcm5hbCBlcnJvciAqLwotCWVkaXRtb2RlID0gMDsKLQl4X21vZGUoZmFsc2UpOwotCXJldHVybiAoaSk7Ci19Ci0KLS8qIHR0eSBJL08gKi8KLQotc3RhdGljIGludAoteF9nZXRjKHZvaWQpCi17Ci0JY2hhciBjOwotCWludCBuOwotCi0Jd2hpbGUgKChuID0gYmxvY2tpbmdfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSkgPCAwICYmIGVycm5vID09IEVJTlRSKQotCQlpZiAodHJhcCkgewotCQkJeF9tb2RlKGZhbHNlKTsKLQkJCXJ1bnRyYXBzKDApOwotI2lmZGVmIFNJR1dJTkNICi0JCQlpZiAoZ290X3dpbmNoKSB7Ci0JCQkJY2hhbmdlX3dpbnN6KCk7Ci0JCQkJaWYgKHhfY29scyAhPSB4eF9jb2xzICYmIGVkaXRtb2RlID09IDEpIHsKLQkJCQkJLyogcmVkcmF3IGxpbmUgaW4gRW1hY3MgbW9kZSAqLwotCQkJCQl4eF9jb2xzID0geF9jb2xzOwotCQkJCQl4X2VfcmVidWlsZGxpbmUoTUtTSF9DTFJUT0VPTF9TVFJJTkcpOwotCQkJCX0KLQkJCX0KLSNlbmRpZgotCQkJeF9tb2RlKHRydWUpOwotCQl9Ci0JcmV0dXJuICgobiA9PSAxKSA/IChpbnQpKHVuc2lnbmVkIGNoYXIpYyA6IC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfcHV0Y2YoaW50IGMpCi17Ci0Jc2hmX3B1dGMoYywgc2hsX291dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1pc2MgY29tbW9uIGNvZGUgZm9yIHZpL2VtYWNzICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhhbmRsZSB0aGUgY29tbWVudGluZy91bmNvbW1lbnRpbmcgb2YgYSBsaW5lLgotICogUmV0dXJuczoKLSAqCTEgaWYgYSBjYXJyaWFnZSByZXR1cm4gaXMgaW5kaWNhdGVkIChjb21tZW50IGFkZGVkKQotICoJMCBpZiBubyByZXR1cm4gKGNvbW1lbnQgcmVtb3ZlZCkKLSAqCS0xIGlmIHRoZXJlIGlzIGFuIGVycm9yIChub3QgZW5vdWdoIHJvb20gZm9yIGNvbW1lbnQgY2hhcnMpCi0gKiBJZiBzdWNjZXNzZnVsLCAqbGVucCBjb250YWlucyB0aGUgbmV3IGxlbmd0aC4gTm90ZTogY3Vyc29yIHNob3VsZCBiZQotICogbW92ZWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGFmdGVyICh1biljb21tZW50aW5nLgotICovCi1zdGF0aWMgaW50Ci14X2RvX2NvbW1lbnQoY2hhciAqYnVmLCBpbnQgYnNpemUsIGludCAqbGVucCkKLXsKLQlpbnQgaSwgaiwgbGVuID0gKmxlbnA7Ci0KLQlpZiAobGVuID09IDApCi0JCXJldHVybiAoMSk7IC8qIHNvbWV3aGF0IGFyYml0cmFyeSAtIGl0J3Mgd2hhdCBBVCZUIGtzaCBkb2VzICovCi0KLQkvKiBBbHJlYWR5IGNvbW1lbnRlZD8gKi8KLQlpZiAoYnVmWzBdID09ICcjJykgewotCQlib29sIHNhd19ubCA9IGZhbHNlOwotCi0JCWZvciAoaiA9IDAsIGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghc2F3X25sIHx8IGJ1ZltpXSAhPSAnIycpCi0JCQkJYnVmW2orK10gPSBidWZbaV07Ci0JCQlzYXdfbmwgPSBidWZbaV0gPT0gJ1xuJzsKLQkJfQotCQkqbGVucCA9IGo7Ci0JCXJldHVybiAoMCk7Ci0JfSBlbHNlIHsKLQkJaW50IG4gPSAxOwotCi0JCS8qIFNlZSBpZiB0aGVyZSdzIHJvb20gZm9yIHRoZSAjcyAtIDEgcGVyIFxuICovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCWlmIChidWZbaV0gPT0gJ1xuJykKLQkJCQluKys7Ci0JCWlmIChsZW4gKyBuID49IGJzaXplKQotCQkJcmV0dXJuICgtMSk7Ci0JCS8qIE5vdyBhZGQgdGhlbS4uLiAqLwotCQlmb3IgKGkgPSBsZW4sIGogPSBsZW4gKyBuOyAtLWkgPj0gMDsgKSB7Ci0JCQlpZiAoYnVmW2ldID09ICdcbicpCi0JCQkJYnVmWy0tal0gPSAnIyc7Ci0JCQlidWZbLS1qXSA9IGJ1ZltpXTsKLQkJfQotCQlidWZbMF0gPSAnIyc7Ci0JCSpsZW5wICs9IG47Ci0JCXJldHVybiAoMSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbW9uIGZpbGUvY29tbWFuZCBjb21wbGV0aW9uIGNvZGUgZm9yIHZpL2VtYWNzICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAoteF9wcmludF9leHBhbnNpb25zKGludCBud29yZHMsIGNoYXIgKiBjb25zdCAqd29yZHMsIGJvb2wgaXNfY29tbWFuZCkKLXsKLQlib29sIHVzZV9jb3B5ID0gZmFsc2U7Ci0JaW50IHByZWZpeF9sZW47Ci0JWFB0clYgbCA9IHsgTlVMTCwgTlVMTCwgTlVMTCB9OwotCi0JLyogQ2hlY2sgaWYgYWxsIG1hdGNoZXMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSAoaW4gdGhpcwotCSAqIGNhc2UsIHdlIHdhbnQgdG8gb21pdCB0aGUgZGlyZWN0b3J5IG5hbWUpCi0JICovCi0JaWYgKCFpc19jb21tYW5kICYmCi0JICAgIChwcmVmaXhfbGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKSkgPiAwKSB7Ci0JCWludCBpOwotCi0JCS8qIFNwZWNpYWwgY2FzZSBmb3IgMSBtYXRjaCAocHJlZml4IGlzIHdob2xlIHdvcmQpICovCi0JCWlmIChud29yZHMgPT0gMSkKLQkJCXByZWZpeF9sZW4gPSB4X2Jhc2VuYW1lKHdvcmRzWzBdLCBOVUxMKTsKLQkJLyogQW55IChub24tdHJhaWxpbmcpIHNsYXNoZXMgaW4gbm9uLWNvbW1vbiB3b3JkIHN1ZmZpeGVzPyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCi0JCQlpZiAoeF9iYXNlbmFtZSh3b3Jkc1tpXSArIHByZWZpeF9sZW4sIE5VTEwpID4KLQkJCSAgICBwcmVmaXhfbGVuKQotCQkJCWJyZWFrOwotCQkvKiBBbGwgaW4gc2FtZSBkaXJlY3Rvcnk/ICovCi0JCWlmIChpID09IG53b3JkcykgewotCQkJd2hpbGUgKHByZWZpeF9sZW4gPiAwICYmIHdvcmRzWzBdW3ByZWZpeF9sZW4gLSAxXSAhPSAnLycpCi0JCQkJcHJlZml4X2xlbi0tOwotCQkJdXNlX2NvcHkgPSB0cnVlOwotCQkJWFBpbml0KGwsIG53b3JkcyArIDEpOwotCQkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQotCQkJCVhQcHV0KGwsIHdvcmRzW2ldICsgcHJlZml4X2xlbik7Ci0JCQlYUHB1dChsLCBOVUxMKTsKLQkJfQotCX0KLQkvKgotCSAqIEVudW1lcmF0ZSBleHBhbnNpb25zCi0JICovCi0JeF9wdXRjKCdccicpOwotCXhfcHV0YygnXG4nKTsKLQlwcl9saXN0KHVzZV9jb3B5ID8gKGNoYXIgKiopWFBwdHJ2KGwpIDogd29yZHMpOwotCi0JaWYgKHVzZV9jb3B5KQotCQlYUGZyZWUobCk7IC8qIG5vdCB4X2ZyZWVfd29yZHMoKSAqLwotfQotCi0vKioKLSAqIERvIGZpbGUgZ2xvYmJpbmc6Ci0gKgktIGFwcGVuZHMgKiB0byAoY29weSBvZikgc3RyIGlmIG5vIGdsb2JiaW5nIGNoYXJzIGZvdW5kCi0gKgktIGRvZXMgZXhwYW5zaW9uLCBjaGVja3MgZm9yIG5vIG1hdGNoLCBldGMuCi0gKgktIHNldHMgKndvcmRzcCB0byBhcnJheSBvZiBtYXRjaGluZyBzdHJpbmdzCi0gKgktIHJldHVybnMgbnVtYmVyIG9mIG1hdGNoaW5nIHN0cmluZ3MKLSAqLwotc3RhdGljIGludAoteF9maWxlX2dsb2IoaW50IGZsYWdzIE1LU0hfQV9VTlVTRUQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4sIGNoYXIgKioqd29yZHNwKQotewotCWNoYXIgKnRvZ2xvYiwgKip3b3JkczsKLQlpbnQgbndvcmRzLCBpLCBpZHg7Ci0JYm9vbCBlc2NhcGluZzsKLQlYUHRyViB3OwotCXN0cnVjdCBzb3VyY2UgKnMsICpzb2xkOwotCi0JaWYgKHNsZW4gPCAwKQotCQlyZXR1cm4gKDApOwotCi0JdG9nbG9iID0gYWRkX2dsb2Ioc3RyLCBzbGVuKTsKLQotCS8qIHJlbW92ZSBhbGwgZXNjYXBpbmcgYmFja3dhcmQgc2xhc2hlcyAqLwotCWVzY2FwaW5nID0gZmFsc2U7Ci0JZm9yIChpID0gMCwgaWR4ID0gMDsgdG9nbG9iW2ldOyBpKyspIHsKLQkJaWYgKHRvZ2xvYltpXSA9PSAnXFwnICYmICFlc2NhcGluZykgewotCQkJZXNjYXBpbmcgPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogc3BlY2lhbGx5IGVzY2FwZSBlc2NhcGVkIFsgb3IgJCBvciBgIGZvciBnbG9iYmluZyAqLwotCQlpZiAoZXNjYXBpbmcgJiYgKHRvZ2xvYltpXSA9PSAnWycgfHwKLQkJICAgIHRvZ2xvYltpXSA9PSAnJCcgfHwgdG9nbG9iW2ldID09ICdgJykpCi0JCQl0b2dsb2JbaWR4KytdID0gUUNIQVI7Ci0KLQkJdG9nbG9iW2lkeF0gPSB0b2dsb2JbaV07Ci0JCWlkeCsrOwotCQlpZiAoZXNjYXBpbmcpCi0JCQllc2NhcGluZyA9IGZhbHNlOwotCX0KLQl0b2dsb2JbaWR4XSA9ICdcMCc7Ci0KLQkvKgotCSAqIENvbnZlcnQgImZvbyoiICh0b2dsb2IpIHRvIGFuIGFycmF5IG9mIHN0cmluZ3MgKHdvcmRzKQotCSAqLwotCXNvbGQgPSBzb3VyY2U7Ci0JcyA9IHB1c2hzKFNXU1RSLCBBVEVNUCk7Ci0Jcy0+c3RhcnQgPSBzLT5zdHIgPSB0b2dsb2I7Ci0Jc291cmNlID0gczsKLQlpZiAoeXlsZXgoT05FV09SRCB8IExRQ0hBUikgIT0gTFdPUkQpIHsKLQkJc291cmNlID0gc29sZDsKLQkJaW50ZXJuYWxfd2FybmluZ2YoImZpbGVnbG9iOiBzdWJzdGl0dXRlIGVycm9yIik7Ci0JCXJldHVybiAoMCk7Ci0JfQotCXNvdXJjZSA9IHNvbGQ7Ci0JWFBpbml0KHcsIDMyKTsKLQlleHBhbmQoeXlsdmFsLmNwLCAmdywgRE9HTE9CIHwgRE9USUxERSB8IERPTUFSS0RJUlMpOwotCVhQcHV0KHcsIE5VTEwpOwotCXdvcmRzID0gKGNoYXIgKiopWFBjbG9zZSh3KTsKLQotCWZvciAobndvcmRzID0gMDsgd29yZHNbbndvcmRzXTsgbndvcmRzKyspCi0JCTsKLQlpZiAobndvcmRzID09IDEpIHsKLQkJc3RydWN0IHN0YXQgc3RhdGI7Ci0KLQkJLyogQ2hlY2sgaWYgZ2xvYmJpbmcgZmFpbGVkIChyZXR1cm5lZCBnbG9iIHBhdHRlcm4pLAotCQkgKiBidXQgYmUgY2FyZWZ1bCAoRS5nLiB0b2dsb2IgPT0gImFiKiIgd2hlbiB0aGUgZmlsZQotCQkgKiAiYWIqIiBleGlzdHMgaXMgbm90IGFuIGVycm9yKS4KLQkJICogQWxzbywgY2hlY2sgZm9yIGVtcHR5IHJlc3VsdCAtIGhhcHBlbnMgaWYgd2UgdHJpZWQKLQkJICogdG8gZ2xvYiBzb21ldGhpbmcgd2hpY2ggZXZhbHVhdGVkIHRvIGFuIGVtcHR5Ci0JCSAqIHN0cmluZyAoZS5nLiwgIiRGT08iIHdoZW4gdGhlcmUgaXMgbm8gRk9PLCBldGMpLgotCQkgKi8KLQkJaWYgKChzdHJjbXAod29yZHNbMF0sIHRvZ2xvYikgPT0gMCAmJgotCQkgICAgc3RhdCh3b3Jkc1swXSwgJnN0YXRiKSA8IDApIHx8Ci0JCSAgICB3b3Jkc1swXVswXSA9PSAnXDAnKSB7Ci0JCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7Ci0JCQl3b3JkcyA9IE5VTEw7Ci0JCQlud29yZHMgPSAwOwotCQl9Ci0JfQotCWFmcmVlKHRvZ2xvYiwgQVRFTVApOwotCi0JaWYgKCgqd29yZHNwID0gbndvcmRzID8gd29yZHMgOiBOVUxMKSA9PSBOVUxMICYmIHdvcmRzICE9IE5VTEwpCi0JCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKLQotCXJldHVybiAobndvcmRzKTsKLX0KLQotLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbiB4X2NvbW1hbmRfZ2xvYigpICovCi1zdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvIHsKLQljaGFyICp3b3JkOwotCWludCBiYXNlOwotCWludCBwYXRoX29yZGVyOwotfTsKLQotLyogQ29tcGFyZSByb3V0aW5lIHVzZWQgaW4geF9jb21tYW5kX2dsb2IoKSAqLwotc3RhdGljIGludAotcGF0aF9vcmRlcl9jbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQotewotCWNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmEgPSAoY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKWFhOwotCWNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmIgPSAoY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKWJiOwotCWludCB0OwotCi0JdCA9IHN0cmNtcChhLT53b3JkICsgYS0+YmFzZSwgYi0+d29yZCArIGItPmJhc2UpOwotCXJldHVybiAodCA/IHQgOiBhLT5wYXRoX29yZGVyIC0gYi0+cGF0aF9vcmRlcik7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfY29tbWFuZF9nbG9iKGludCBmbGFncywgY29uc3QgY2hhciAqc3RyLCBpbnQgc2xlbiwgY2hhciAqKip3b3Jkc3ApCi17Ci0JY2hhciAqdG9nbG9iLCAqcGF0LCAqZnBhdGg7Ci0JaW50IG53b3JkczsKLQlYUHRyViB3OwotCXN0cnVjdCBibG9jayAqbDsKLQotCWlmIChzbGVuIDwgMCkKLQkJcmV0dXJuICgwKTsKLQotCXRvZ2xvYiA9IGFkZF9nbG9iKHN0ciwgc2xlbik7Ci0KLQkvKiBDb252ZXJ0ICJmb28qIiAodG9nbG9iKSB0byBhIHBhdHRlcm4gZm9yIGZ1dHVyZSB1c2UgKi8KLQlwYXQgPSBldmFsc3RyKHRvZ2xvYiwgRE9QQVQgfCBET1RJTERFKTsKLQlhZnJlZSh0b2dsb2IsIEFURU1QKTsKLQotCVhQaW5pdCh3LCAzMik7Ci0KLQlnbG9iX3RhYmxlKHBhdCwgJncsICZrZXl3b3Jkcyk7Ci0JZ2xvYl90YWJsZShwYXQsICZ3LCAmYWxpYXNlcyk7Ci0JZ2xvYl90YWJsZShwYXQsICZ3LCAmYnVpbHRpbnMpOwotCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpCi0JCWdsb2JfdGFibGUocGF0LCAmdywgJmwtPmZ1bnMpOwotCi0JZ2xvYl9wYXRoKGZsYWdzLCBwYXQsICZ3LCBwYXRoKTsKLQlpZiAoKGZwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkZQQVRIIikpKSAhPSBudWxsKQotCQlnbG9iX3BhdGgoZmxhZ3MsIHBhdCwgJncsIGZwYXRoKTsKLQotCW53b3JkcyA9IFhQc2l6ZSh3KTsKLQotCWlmICghbndvcmRzKSB7Ci0JCSp3b3Jkc3AgPSBOVUxMOwotCQlYUGZyZWUodyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCS8qIFNvcnQgZW50cmllcyAqLwotCWlmIChmbGFncyAmIFhDRl9GVUxMUEFUSCkgewotCQkvKiBTb3J0IGJ5IGJhc2VuYW1lLCB0aGVuIHBhdGggb3JkZXIgKi8KLQkJc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqaW5mbywgKmxhc3RfaW5mbyA9IE5VTEw7Ci0JCWNoYXIgKip3b3JkcyA9IChjaGFyICoqKVhQcHRydih3KTsKLQkJaW50IGksIHBhdGhfb3JkZXIgPSAwOwotCi0JCWluZm8gPSAoc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKQotCQkgICAgYWxsb2MobndvcmRzICogc2l6ZW9mKHN0cnVjdCBwYXRoX29yZGVyX2luZm8pLCBBVEVNUCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykgewotCQkJaW5mb1tpXS53b3JkID0gd29yZHNbaV07Ci0JCQlpbmZvW2ldLmJhc2UgPSB4X2Jhc2VuYW1lKHdvcmRzW2ldLCBOVUxMKTsKLQkJCWlmICghbGFzdF9pbmZvIHx8IGluZm9baV0uYmFzZSAhPSBsYXN0X2luZm8tPmJhc2UgfHwKLQkJCSAgICBzdHJuY21wKHdvcmRzW2ldLCBsYXN0X2luZm8tPndvcmQsIGluZm9baV0uYmFzZSkgIT0gMCkgewotCQkJCWxhc3RfaW5mbyA9ICZpbmZvW2ldOwotCQkJCXBhdGhfb3JkZXIrKzsKLQkJCX0KLQkJCWluZm9baV0ucGF0aF9vcmRlciA9IHBhdGhfb3JkZXI7Ci0JCX0KLQkJcXNvcnQoaW5mbywgbndvcmRzLCBzaXplb2Yoc3RydWN0IHBhdGhfb3JkZXJfaW5mbyksCi0JCSAgICBwYXRoX29yZGVyX2NtcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKLQkJCXdvcmRzW2ldID0gaW5mb1tpXS53b3JkOwotCQlhZnJlZShpbmZvLCBBVEVNUCk7Ci0JfSBlbHNlIHsKLQkJLyogU29ydCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzICovCi0JCWNoYXIgKip3b3JkcyA9IChjaGFyICoqKVhQcHRydih3KTsKLQkJaW50IGksIGo7Ci0KLQkJcXNvcnQod29yZHMsIG53b3Jkcywgc2l6ZW9mKHZvaWQgKiksIHhzdHJjbXApOwotCQlmb3IgKGkgPSBqID0gMDsgaSA8IG53b3JkcyAtIDE7IGkrKykgewotCQkJaWYgKHN0cmNtcCh3b3Jkc1tpXSwgd29yZHNbaSArIDFdKSkKLQkJCQl3b3Jkc1tqKytdID0gd29yZHNbaV07Ci0JCQllbHNlCi0JCQkJYWZyZWUod29yZHNbaV0sIEFURU1QKTsKLQkJfQotCQl3b3Jkc1tqKytdID0gd29yZHNbaV07Ci0JCW53b3JkcyA9IGo7Ci0JCXcuY3VyID0gKHZvaWQgKiopJndvcmRzW2pdOwotCX0KLQotCVhQcHV0KHcsIE5VTEwpOwotCSp3b3Jkc3AgPSAoY2hhciAqKilYUGNsb3NlKHcpOwotCi0JcmV0dXJuIChud29yZHMpOwotfQotCi0jZGVmaW5lIElTX1dPUkRDKGMpCSghY3R5cGUoYywgQ19MRVgxKSAmJiAoYykgIT0gJ1wnJyAmJiAoYykgIT0gJyInICYmIFwKLQkJCSAgICAoYykgIT0gJ2AnICYmIChjKSAhPSAnPScgJiYgKGMpICE9ICc6JykKLQotc3RhdGljIGludAoteF9sb2NhdGVfd29yZChjb25zdCBjaGFyICpidWYsIGludCBidWZsZW4sIGludCBwb3MsIGludCAqc3RhcnRwLAotICAgIGJvb2wgKmlzX2NvbW1hbmRwKQotewotCWludCBzdGFydCwgZW5kOwotCi0JLyogQmFkIGNhbGw/IFByb2JhYmx5IHNob3VsZCByZXBvcnQgZXJyb3IgKi8KLQlpZiAocG9zIDwgMCB8fCBwb3MgPiBidWZsZW4pIHsKLQkJKnN0YXJ0cCA9IHBvczsKLQkJKmlzX2NvbW1hbmRwID0gZmFsc2U7Ci0JCXJldHVybiAoMCk7Ci0JfQotCS8qIFRoZSBjYXNlIHdoZXJlIHBvcyA9PSBidWZsZW4gaGFwcGVucyB0byB0YWtlIGNhcmUgb2YgaXRzZWxmLi4uICovCi0KLQlzdGFydCA9IHBvczsKLQkvKiBLZWVwIGdvaW5nIGJhY2t3YXJkcyB0byBzdGFydCBvZiB3b3JkIChoYXMgZWZmZWN0IG9mIGFsbG93aW5nCi0JICogb25lIGJsYW5rIGFmdGVyIHRoZSBlbmQgb2YgYSB3b3JkKQotCSAqLwotCWZvciAoOyAoc3RhcnQgPiAwICYmIElTX1dPUkRDKGJ1ZltzdGFydCAtIDFdKSkgfHwKLQkgICAgKHN0YXJ0ID4gMSAmJiBidWZbc3RhcnQgLSAyXSA9PSAnXFwnKTsgc3RhcnQtLSkKLQkJOwotCS8qIEdvIGZvcndhcmRzIHRvIGVuZCBvZiB3b3JkICovCi0JZm9yIChlbmQgPSBzdGFydDsgZW5kIDwgYnVmbGVuICYmIElTX1dPUkRDKGJ1ZltlbmRdKTsgZW5kKyspIHsKLQkJaWYgKGJ1ZltlbmRdID09ICdcXCcgJiYgKGVuZCArIDEpIDwgYnVmbGVuKQotCQkJZW5kKys7Ci0JfQotCi0JaWYgKGlzX2NvbW1hbmRwKSB7Ci0JCWJvb2wgaXNjbWQ7Ci0JCWludCBwID0gc3RhcnQgLSAxOwotCi0JCS8qIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhIGNvbW1hbmQgKi8KLQkJd2hpbGUgKHAgPj0gMCAmJiBrc2hfaXNzcGFjZShidWZbcF0pKQotCQkJcC0tOwotCQlpc2NtZCA9IHAgPCAwIHx8IHZzdHJjaHIoIjt8JigpYCIsIGJ1ZltwXSk7Ci0JCWlmIChpc2NtZCkgewotCQkJLyogSWYgY29tbWFuZCBoYXMgYSAvLCBwYXRoLCBldGMuIGlzIG5vdCBzZWFyY2hlZDsKLQkJCSAqIG9ubHkgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQgd2hpY2ggaXMganVzdAotCQkJICogbGlrZSBmaWxlIGdsb2JiaW5nLgotCQkJICovCi0JCQlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrKQotCQkJCWlmIChidWZbcF0gPT0gJy8nKQotCQkJCQlicmVhazsKLQkJCWlzY21kID0gcCA9PSBlbmQ7Ci0JCX0KLQkJKmlzX2NvbW1hbmRwID0gaXNjbWQ7Ci0JfQotCSpzdGFydHAgPSBzdGFydDsKLQotCXJldHVybiAoZW5kIC0gc3RhcnQpOwotfQotCi1zdGF0aWMgaW50Ci14X2NmX2dsb2IoaW50IGZsYWdzLCBjb25zdCBjaGFyICpidWYsIGludCBidWZsZW4sIGludCBwb3MsIGludCAqc3RhcnRwLAotICAgIGludCAqZW5kcCwgY2hhciAqKip3b3Jkc3AsIGJvb2wgKmlzX2NvbW1hbmRwKQotewotCWludCBsZW4sIG53b3JkczsKLQljaGFyICoqd29yZHMgPSBOVUxMOwotCWJvb2wgaXNfY29tbWFuZDsKLQotCWxlbiA9IHhfbG9jYXRlX3dvcmQoYnVmLCBidWZsZW4sIHBvcywgc3RhcnRwLCAmaXNfY29tbWFuZCk7Ci0JaWYgKCEoZmxhZ3MgJiBYQ0ZfQ09NTUFORCkpCi0JCWlzX2NvbW1hbmQgPSBmYWxzZTsKLQkvKiBEb24ndCBkbyBjb21tYW5kIGdsb2Jpbmcgb24gemVybyBsZW5ndGggc3RyaW5ncyAtIGl0IHRha2VzIHRvbwotCSAqIGxvbmcgYW5kIGlzbid0IHZlcnkgdXNlZnVsLiBGaWxlIGdsb2JzIGFyZSBtb3JlIGxpa2VseSB0byBiZQotCSAqIHVzZWZ1bCwgc28gYWxsb3cgdGhlc2UuCi0JICovCi0JaWYgKGxlbiA9PSAwICYmIGlzX2NvbW1hbmQpCi0JCXJldHVybiAoMCk7Ci0KLQlud29yZHMgPSBpc19jb21tYW5kID8KLQkgICAgeF9jb21tYW5kX2dsb2IoZmxhZ3MsIGJ1ZiArICpzdGFydHAsIGxlbiwgJndvcmRzKSA6Ci0JICAgIHhfZmlsZV9nbG9iKGZsYWdzLCBidWYgKyAqc3RhcnRwLCBsZW4sICZ3b3Jkcyk7Ci0JaWYgKG53b3JkcyA9PSAwKSB7Ci0JCSp3b3Jkc3AgPSBOVUxMOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoaXNfY29tbWFuZHApCi0JCSppc19jb21tYW5kcCA9IGlzX2NvbW1hbmQ7Ci0JKndvcmRzcCA9IHdvcmRzOwotCSplbmRwID0gKnN0YXJ0cCArIGxlbjsKLQotCXJldHVybiAobndvcmRzKTsKLX0KLQotLyogR2l2ZW4gYSBzdHJpbmcsIGNvcHkgaXQgYW5kIHBvc3NpYmx5IGFkZCBhICcqJyB0byB0aGUgZW5kLgotICogVGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWFkZF9nbG9iKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4pCi17Ci0JY2hhciAqdG9nbG9iLCAqczsKLQlib29sIHNhd19zbGFzaCA9IGZhbHNlOwotCi0JaWYgKHNsZW4gPCAwKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JLyogZm9yIGNsYW5nJ3Mgc3RhdGljIGFuYWx5c2VyLCB0aGUgbm9ubnVsbCBhdHRyaWJ1dGUgaXNuJ3QgZW5vdWdoICovCi0JbWtzc2VydChzdHIgIT0gTlVMTCk7Ci0KLQlzdHJuZHVweCh0b2dsb2IsIHN0ciwgc2xlbiArIDEsIEFURU1QKTsgLyogKyAxIGZvciAiKiIgKi8KLQl0b2dsb2Jbc2xlbl0gPSAnXDAnOwotCi0JLyoKLQkgKiBJZiB0aGUgcGF0aG5hbWUgY29udGFpbnMgYSB3aWxkY2FyZCAoYW4gdW5xdW90ZWQgJyonLAotCSAqICc/Jywgb3IgJ1snKSBvciBwYXJhbWV0ZXIgZXhwYW5zaW9uICgnJCcpLCBvciBhIH51c2VybmFtZQotCSAqIHdpdGggbm8gdHJhaWxpbmcgc2xhc2gsIHRoZW4gaXQgaXMgZ2xvYmJlZCBiYXNlZCBvbiB0aGF0Ci0JICogdmFsdWUgKGkuZS4sIHdpdGhvdXQgdGhlIGFwcGVuZGVkICcqJykuCi0JICovCi0JZm9yIChzID0gdG9nbG9iOyAqczsgcysrKSB7Ci0JCWlmICgqcyA9PSAnXFwnICYmIHNbMV0pCi0JCQlzKys7Ci0JCWVsc2UgaWYgKCpzID09ICcqJyB8fCAqcyA9PSAnWycgfHwgKnMgPT0gJz8nIHx8ICpzID09ICckJyB8fAotCQkgICAgKHNbMV0gPT0gJygnIC8qKSovICYmIC8qICpzIGluICcqJywnPycgYWxyZWFkeSBjaGVja2VkICovCi0JCSAgICAoKnMgPT0gJysnIHx8ICpzID09ICdAJyB8fCAqcyA9PSAnIScpKSkKLQkJCWJyZWFrOwotCQllbHNlIGlmICgqcyA9PSAnLycpCi0JCQlzYXdfc2xhc2ggPSB0cnVlOwotCX0KLQlpZiAoISpzICYmICgqdG9nbG9iICE9ICd+JyB8fCBzYXdfc2xhc2gpKSB7Ci0JCXRvZ2xvYltzbGVuXSA9ICcqJzsKLQkJdG9nbG9iW3NsZW4gKyAxXSA9ICdcMCc7Ci0JfQotCXJldHVybiAodG9nbG9iKTsKLX0KLQotLyoKLSAqIEZpbmQgbG9uZ2VzdCBjb21tb24gcHJlZml4Ci0gKi8KLXN0YXRpYyBpbnQKLXhfbG9uZ2VzdF9wcmVmaXgoaW50IG53b3JkcywgY2hhciAqIGNvbnN0ICogd29yZHMpCi17Ci0JaW50IGksIGosIHByZWZpeF9sZW47Ci0JY2hhciAqcDsKLQotCWlmIChud29yZHMgPD0gMCkKLQkJcmV0dXJuICgwKTsKLQotCXByZWZpeF9sZW4gPSBzdHJsZW4od29yZHNbMF0pOwotCWZvciAoaSA9IDE7IGkgPCBud29yZHM7IGkrKykKLQkJZm9yIChqID0gMCwgcCA9IHdvcmRzW2ldOyBqIDwgcHJlZml4X2xlbjsgaisrKQotCQkJaWYgKHBbal0gIT0gd29yZHNbMF1bal0pIHsKLQkJCQlwcmVmaXhfbGVuID0gajsKLQkJCQlicmVhazsKLQkJCX0KLQlyZXR1cm4gKHByZWZpeF9sZW4pOwotfQotCi1zdGF0aWMgdm9pZAoteF9mcmVlX3dvcmRzKGludCBud29yZHMsIGNoYXIgKip3b3JkcykKLXsKLQl3aGlsZSAobndvcmRzKQotCQlhZnJlZSh3b3Jkc1stLW53b3Jkc10sIEFURU1QKTsKLQlhZnJlZSh3b3JkcywgQVRFTVApOwotfQotCi0vKiBSZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgYmFzZW5hbWUgb2Ygc3RyaW5nIHMgKHdoaWNoIGVuZHMgYXQgc2UgLSBuZWVkIG5vdAotICogYmUgbnVsbCB0ZXJtaW5hdGVkKS4gVHJhaWxpbmcgc2xhc2hlcyBhcmUgaWdub3JlZC4gSWYgcyBpcyBqdXN0IGEgc2xhc2gsCi0gKiB0aGVuIHRoZSBvZmZzZXQgaXMgMCAoYWN0dWFsbHksIGxlbmd0aCAtIDEpLgotICoJcwkJUmV0dXJuCi0gKgkvZXRjCQkxCi0gKgkvZXRjLwkJMQotICoJL2V0Yy8vCQkxCi0gKgkvZXRjL2ZvCQk1Ci0gKglmb28JCTAKLSAqCS8vLwkJMgotICoJCQkwCi0gKi8KLXN0YXRpYyBpbnQKLXhfYmFzZW5hbWUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqc2UpCi17Ci0JY29uc3QgY2hhciAqcDsKLQotCWlmIChzZSA9PSBOVUxMKQotCQlzZSA9IHMgKyBzdHJsZW4ocyk7Ci0JaWYgKHMgPT0gc2UpCi0JCXJldHVybiAoMCk7Ci0KLQkvKiBTa2lwIHRyYWlsaW5nIHNsYXNoZXMgKi8KLQlmb3IgKHAgPSBzZSAtIDE7IHAgPiBzICYmICpwID09ICcvJzsgcC0tKQotCQk7Ci0JZm9yICg7IHAgPiBzICYmICpwICE9ICcvJzsgcC0tKQotCQk7Ci0JaWYgKCpwID09ICcvJyAmJiBwICsgMSA8IHNlKQotCQlwKys7Ci0KLQlyZXR1cm4gKHAgLSBzKTsKLX0KLQotLyoKLSAqIEFwcGx5IHBhdHRlcm4gbWF0Y2hpbmcgdG8gYSB0YWJsZTogYWxsIHRhYmxlIGVudHJpZXMgdGhhdCBtYXRjaCBhIHBhdHRlcm4KLSAqIGFyZSBhZGRlZCB0byB3cC4KLSAqLwotc3RhdGljIHZvaWQKLWdsb2JfdGFibGUoY29uc3QgY2hhciAqcGF0LCBYUHRyViAqd3AsIHN0cnVjdCB0YWJsZSAqdHApCi17Ci0Jc3RydWN0IHRzdGF0ZSB0czsKLQlzdHJ1Y3QgdGJsICp0ZTsKLQotCWt0d2FsaygmdHMsIHRwKTsKLQl3aGlsZSAoKHRlID0ga3RuZXh0KCZ0cykpKQotCQlpZiAoZ21hdGNoeCh0ZS0+bmFtZSwgcGF0LCBmYWxzZSkpIHsKLQkJCWNoYXIgKmNwOwotCi0JCQlzdHJkdXB4KGNwLCB0ZS0+bmFtZSwgQVRFTVApOwotCQkJWFBwdXQoKndwLCBjcCk7Ci0JCX0KLX0KLQotc3RhdGljIHZvaWQKLWdsb2JfcGF0aChpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnBhdCwgWFB0clYgKndwLCBjb25zdCBjaGFyICpscGF0aCkKLXsKLQljb25zdCBjaGFyICpzcCwgKnA7Ci0JY2hhciAqeHAsICoqd29yZHM7Ci0JaW50IHN0YXRlcnIsIHBhdGhsZW4sIHBhdGxlbiwgb2xkc2l6ZSwgbmV3c2l6ZSwgaSwgajsKLQlYU3RyaW5nIHhzOwotCi0JcGF0bGVuID0gc3RybGVuKHBhdCkgKyAxOwotCXNwID0gbHBhdGg7Ci0JWGluaXQoeHMsIHhwLCBwYXRsZW4gKyAxMjgsIEFURU1QKTsKLQl3aGlsZSAoc3ApIHsKLQkJeHAgPSBYc3RyaW5nKHhzLCB4cCk7Ci0JCWlmICghKHAgPSBjc3RyY2hyKHNwLCAnOicpKSkKLQkJCXAgPSBzcCArIHN0cmxlbihzcCk7Ci0JCXBhdGhsZW4gPSBwIC0gc3A7Ci0JCWlmIChwYXRobGVuKSB7Ci0JCQkvKiBDb3B5IHNwIGludG8geHAsIHN0dWZmaW5nIGFueSBNQUdJQyBjaGFyYWN0ZXJzCi0JCQkgKiBvbiB0aGUgd2F5Ci0JCQkgKi8KLQkJCWNvbnN0IGNoYXIgKnMgPSBzcDsKLQotCQkJWGNoZWNrTih4cywgeHAsIHBhdGhsZW4gKiAyKTsKLQkJCXdoaWxlIChzIDwgcCkgewotCQkJCWlmIChJU01BR0lDKCpzKSkKLQkJCQkJKnhwKysgPSBNQUdJQzsKLQkJCQkqeHArKyA9ICpzKys7Ci0JCQl9Ci0JCQkqeHArKyA9ICcvJzsKLQkJCXBhdGhsZW4rKzsKLQkJfQotCQlzcCA9IHA7Ci0JCVhjaGVja04oeHMsIHhwLCBwYXRsZW4pOwotCQltZW1jcHkoeHAsIHBhdCwgcGF0bGVuKTsKLQotCQlvbGRzaXplID0gWFBzaXplKCp3cCk7Ci0JCWdsb2Jfc3RyKFhzdHJpbmcoeHMsIHhwKSwgd3AsIDEpOyAvKiBtYXJrIGRpcnMgKi8KLQkJbmV3c2l6ZSA9IFhQc2l6ZSgqd3ApOwotCi0JCS8qIENoZWNrIHRoYXQgZWFjaCBtYXRjaCBpcyBleGVjdXRhYmxlLi4uICovCi0JCXdvcmRzID0gKGNoYXIgKiopWFBwdHJ2KCp3cCk7Ci0JCWZvciAoaSA9IGogPSBvbGRzaXplOyBpIDwgbmV3c2l6ZTsgaSsrKSB7Ci0JCQlzdGF0ZXJyID0gMDsKLQkJCWlmICgoc2VhcmNoX2FjY2Vzcyh3b3Jkc1tpXSwgWF9PSywgJnN0YXRlcnIpID49IDApIHx8Ci0JCQkgICAgKHN0YXRlcnIgPT0gRUlTRElSKSkgewotCQkJCXdvcmRzW2pdID0gd29yZHNbaV07Ci0JCQkJaWYgKCEoZmxhZ3MgJiBYQ0ZfRlVMTFBBVEgpKQotCQkJCQltZW1tb3ZlKHdvcmRzW2pdLCB3b3Jkc1tqXSArIHBhdGhsZW4sCi0JCQkJCSAgICBzdHJsZW4od29yZHNbal0gKyBwYXRobGVuKSArIDEpOwotCQkJCWorKzsKLQkJCX0gZWxzZQotCQkJCWFmcmVlKHdvcmRzW2ldLCBBVEVNUCk7Ci0JCX0KLQkJd3AtPmN1ciA9ICh2b2lkICoqKSZ3b3Jkc1tqXTsKLQotCQlpZiAoISpzcCsrKQotCQkJYnJlYWs7Ci0JfQotCVhmcmVlKHhzLCB4cCk7Ci19Ci0KLS8qCi0gKiBpZiBhcmd1bWVudCBzdHJpbmcgY29udGFpbnMgYW55IHNwZWNpYWwgY2hhcmFjdGVycywgdGhleSB3aWxsCi0gKiBiZSBlc2NhcGVkIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgcHV0IGludG8gZWRpdCBidWZmZXIgYnkKLSAqIGtleWJpbmRpbmctc3BlY2lmaWMgZnVuY3Rpb24KLSAqLwotc3RhdGljIGludAoteF9lc2NhcGUoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50ICgqcHV0YnVmX2Z1bmMpKGNvbnN0IGNoYXIgKiwgc2l6ZV90KSkKLXsKLQlzaXplX3QgYWRkID0gMCwgd2xlbiA9IGxlbjsKLQljb25zdCBjaGFyICppZnMgPSBzdHJfdmFsKGxvY2FsKCJJRlMiLCAwKSk7Ci0JaW50IHJ2YWwgPSAwOwotCi0Jd2hpbGUgKHdsZW4gLSBhZGQgPiAwKQotCQlpZiAodnN0cmNocigiXCIjJCYnKCkqOjs8PT4/W1xcYHt8fSIsIHNbYWRkXSkgfHwKLQkJICAgIHZzdHJjaHIoaWZzLCBzW2FkZF0pKSB7Ci0JCQlpZiAocHV0YnVmX2Z1bmMocywgYWRkKSAhPSAwKSB7Ci0JCQkJcnZhbCA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcHV0YnVmX2Z1bmMoc1thZGRdID09ICdcbicgPyAiJyIgOiAiXFwiLCAxKTsKLQkJCXB1dGJ1Zl9mdW5jKCZzW2FkZF0sIDEpOwotCQkJaWYgKHNbYWRkXSA9PSAnXG4nKQotCQkJCXB1dGJ1Zl9mdW5jKCInIiwgMSk7Ci0KLQkJCWFkZCsrOwotCQkJd2xlbiAtPSBhZGQ7Ci0JCQlzICs9IGFkZDsKLQkJCWFkZCA9IDA7Ci0JCX0gZWxzZQotCQkJKythZGQ7Ci0JaWYgKHdsZW4gPiAwICYmIHJ2YWwgPT0gMCkKLQkJcnZhbCA9IHB1dGJ1Zl9mdW5jKHMsIHdsZW4pOwotCi0JcmV0dXJuIChydmFsKTsKLX0KLQotCi0vKiArKysgZW1hY3MgZWRpdGluZyBtb2RlICsrKyAqLwotCi1zdGF0aWMJQXJlYQlhZWRpdDsKLSNkZWZpbmUJQUVESVQJJmFlZGl0CQkvKiBhcmVhIGZvciBraWxsIHJpbmcgYW5kIG1hY3JvIGRlZm5zICovCi0KLS8qIHZhbHVlcyByZXR1cm5lZCBieSBrZXlib2FyZCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUJS1NURAkwCi0jZGVmaW5lCUtFT0wJMQkJLyogXk0sIF5KICovCi0jZGVmaW5lCUtJTlRSCTIJCS8qIF5HLCBeQyAqLwotCi1zdHJ1Y3QgeF9mdGFiIHsKLQlpbnQgKCp4Zl9mdW5jKShpbnQgYyk7Ci0JY29uc3QgY2hhciAqeGZfbmFtZTsKLQlzaG9ydCB4Zl9mbGFnczsKLX07Ci0KLXN0cnVjdCB4X2RlZmJpbmRpbmdzIHsKLQl1bnNpZ25lZCBjaGFyIHhkYl9mdW5jOwkvKiBYRlVOQ18qICovCi0JdW5zaWduZWQgY2hhciB4ZGJfdGFiOwotCXVuc2lnbmVkIGNoYXIgeGRiX2NoYXI7Ci19OwotCi0jZGVmaW5lIFhGX0FSRwkJMQkvKiBjb21tYW5kIHRha2VzIG51bWJlciBwcmVmaXggKi8KLSNkZWZpbmUJWEZfTk9CSU5ECTIJLyogbm90IGFsbG93ZWQgdG8gYmluZCB0byBmdW5jdGlvbiAqLwotI2RlZmluZQlYRl9QUkVGSVgJNAkvKiBmdW5jdGlvbiBzZXRzIHByZWZpeCAqLwotCi0vKiBTZXBhcmF0b3IgZm9yIGNvbXBsZXRpb24gKi8KLSNkZWZpbmUJaXNfY2ZzKGMpCSgoYykgPT0gJyAnIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnIicgfHwgKGMpID09ICdcJycpCi0vKiBTZXBhcmF0b3IgZm9yIG1vdGlvbiAqLwotI2RlZmluZQlpc19tZnMoYykJKCEoa3NoX2lzYWxudXgoYykgfHwgKGMpID09ICckJyB8fCAoKGMpICYgMHg4MCkpKQotCi0jZGVmaW5lIFhfTlRBQlMJCTMJCQkvKiBub3JtYWwsIG1ldGExLCBtZXRhMiAqLwotI2RlZmluZSBYX1RBQlNaCQkyNTYJCQkvKiBzaXplIG9mIGtleWRlZiB0YWJsZXMgZXRjICovCi0KLS8qIEFyZ3VtZW50cyBmb3IgZG9fY29tcGxldGUoKQotICogMCA9IGVudW1lcmF0ZQlNLT0JY29tcGxldGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhbmQgdGhlbiBsaXN0Ci0gKiAxID0gY29tcGxldGUJCU0tRXNjCi0gKiAyID0gbGlzdAkJTS0/Ci0gKi8KLXR5cGVkZWYgZW51bSB7Ci0JQ1RfTElTVCwJLyogbGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgKi8KLQlDVF9DT01QTEVURSwJLyogY29tcGxldGUgdG8gbG9uZ2VzdCBwcmVmaXggKi8KLQlDVF9DT01QTElTVAkvKiBjb21wbGV0ZSBhbmQgdGhlbiBsaXN0IChpZiBub24tZXhhY3QpICovCi19IENvbXBfdHlwZTsKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIG15IGhvcml6b250YWwgc2Nyb2xsaW5nIHN0dWZmCi0gKi8KLXN0YXRpYyBjaGFyICp4YnVmOwkJLyogYmVnIGlucHV0IGJ1ZmZlciAqLwotc3RhdGljIGNoYXIgKnhlbmQ7CQkvKiBlbmQgaW5wdXQgYnVmZmVyICovCi1zdGF0aWMgY2hhciAqeGNwOwkJLyogY3VycmVudCBwb3NpdGlvbiAqLwotc3RhdGljIGNoYXIgKnhlcDsJCS8qIGN1cnJlbnQgZW5kICovCi1zdGF0aWMgY2hhciAqeGJwOwkJLyogc3RhcnQgb2YgdmlzaWJsZSBwb3J0aW9uIG9mIGlucHV0IGJ1ZmZlciAqLwotc3RhdGljIGNoYXIgKnhscDsJCS8qIGxhc3QgY2hhciB2aXNpYmxlIG9uIHNjcmVlbiAqLwotc3RhdGljIGludCB4X2Fkal9vazsKLS8qCi0gKiB3ZSB1c2UgeF9hZGpfZG9uZSBzbyB0aGF0IGZ1bmN0aW9ucyBjYW4gdGVsbAotICogd2hldGhlciB4X2FkanVzdCgpIGhhcyBiZWVuIGNhbGxlZCB3aGlsZSB0aGV5IGFyZSBhY3RpdmUuCi0gKi8KLXN0YXRpYyBpbnQgeF9hZGpfZG9uZTsKLQotc3RhdGljIGludCB4X2NvbDsKLXN0YXRpYyBpbnQgeF9kaXNwbGVuOwotc3RhdGljIGludCB4X2FyZzsJCS8qIGdlbmVyYWwgcHVycG9zZSBhcmcgKi8KLXN0YXRpYyBpbnQgeF9hcmdfZGVmYXVsdGVkOwkvKiB4X2FyZyBub3QgZXhwbGljaXRseSBzZXQ7IGRlZmF1bHRlZCB0byAxICovCi0KLXN0YXRpYyBpbnQgeGxwX3ZhbGlkOwotCi1zdGF0aWMgY2hhciAqKnhfaGlzdHA7CQkvKiBoaXN0b3J5IHBvc2l0aW9uICovCi1zdGF0aWMgaW50IHhfbmV4dGNtZDsJCS8qIGZvciBuZXdsaW5lLWFuZC1uZXh0ICovCi1zdGF0aWMgY2hhciAqeG1wOwkJLyogbWFyayBwb2ludGVyICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciB4X2xhc3RfY29tbWFuZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICgqeF90YWIpW1hfVEFCU1pdOwkvKiBrZXkgZGVmaW5pdGlvbiAqLwotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgY2hhciAqKCp4X2F0YWIpW1hfVEFCU1pdOwkvKiBtYWNybyBkZWZpbml0aW9ucyAqLwotI2VuZGlmCi1zdGF0aWMgdW5zaWduZWQgY2hhciB4X2JvdW5kWyhYX1RBQlNaICogWF9OVEFCUyArIDcpIC8gOF07Ci0jZGVmaW5lIEtJTExTSVpFCTIwCi1zdGF0aWMgY2hhciAqa2lsbHN0YWNrW0tJTExTSVpFXTsKLXN0YXRpYyBpbnQga2lsbHNwLCBraWxsdHA7Ci1zdGF0aWMgaW50IHhfY3VycHJlZml4OwotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgY2hhciAqbWFjcm9wdHIgPSBOVUxMOwkvKiBiaW5kIGtleSBtYWNybyBhY3RpdmU/ICovCi0jZW5kaWYKLSNpZiAhTUtTSF9TX05PVkkKLXN0YXRpYyBpbnQgY3VyX2NvbDsJCS8qIGN1cnJlbnQgY29sdW1uIG9uIGxpbmUgKi8KLXN0YXRpYyBpbnQgcHdpZHRoOwkJLyogd2lkdGggb2YgcHJvbXB0ICovCi1zdGF0aWMgaW50IHByb21wdF90cnVuYzsJLyogaG93IG11Y2ggb2YgcHJvbXB0IHRvIHRydW5jYXRlICovCi1zdGF0aWMgaW50IHdpbndpZHRoOwkJLyogd2lkdGggb2Ygd2luZG93ICovCi1zdGF0aWMgY2hhciAqd2J1ZlsyXTsJCS8qIHdpbmRvdyBidWZmZXJzICovCi1zdGF0aWMgaW50IHdidWZfbGVuOwkJLyogbGVuZ3RoIG9mIHdpbmRvdyBidWZmZXJzICh4X2NvbHMgLSAzKSAqLwotc3RhdGljIGludCB3aW47CQkJLyogd2luZG93IGJ1ZmZlciBpbiB1c2UgKi8KLXN0YXRpYyBjaGFyIG1vcmVjOwkJLyogbW9yZSBjaGFyYWN0ZXIgYXQgcmlnaHQgb2Ygd2luZG93ICovCi1zdGF0aWMgaW50IGxhc3RyZWY7CQkvKiBhcmd1bWVudCB0byBsYXN0IHJlZnJlc2goKSAqLwotc3RhdGljIGludCBob2xkbGVuOwkJLyogbGVuZ3RoIG9mIGhvbGRidWYgKi8KLSNlbmRpZgotc3RhdGljIGludCBwcm9tcHRfcmVkcmF3OwkvKiAwIGlmIG5ld2xpbmUgZm9yY2VkIGFmdGVyIHByb21wdCAqLwotCi1zdGF0aWMgaW50IHhfaW5zKGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB4X2RlbGV0ZShpbnQsIGludCk7Ci1zdGF0aWMgaW50IHhfYndvcmQodm9pZCk7Ci1zdGF0aWMgaW50IHhfZndvcmQoaW50KTsKLXN0YXRpYyB2b2lkIHhfZ290byhjaGFyICopOwotc3RhdGljIHZvaWQgeF9iczMoY2hhciAqKik7Ci1zdGF0aWMgaW50IHhfc2l6ZV9zdHIoY2hhciAqKTsKLXN0YXRpYyBpbnQgeF9zaXplMihjaGFyICosIGNoYXIgKiopOwotc3RhdGljIHZvaWQgeF96b3RzKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB4X3pvdGMyKGludCk7Ci1zdGF0aWMgdm9pZCB4X3pvdGMzKGNoYXIgKiopOwotc3RhdGljIHZvaWQgeF9sb2FkX2hpc3QoY2hhciAqKik7Ci1zdGF0aWMgaW50IHhfc2VhcmNoKGNoYXIgKiwgaW50LCBpbnQpOwotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgaW50IHhfc2VhcmNoX2RpcihpbnQpOwotI2VuZGlmCi1zdGF0aWMgaW50IHhfbWF0Y2goY2hhciAqLCBjaGFyICopOwotc3RhdGljIHZvaWQgeF9yZWRyYXcoaW50KTsKLXN0YXRpYyB2b2lkIHhfcHVzaChpbnQpOwotc3RhdGljIGNoYXIgKnhfbWFwaW4oY29uc3QgY2hhciAqLCBBcmVhICopCi0gICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSk7Ci1zdGF0aWMgY2hhciAqeF9tYXBvdXQoaW50KTsKLXN0YXRpYyB2b2lkIHhfbWFwb3V0MihpbnQsIGNoYXIgKiopOwotc3RhdGljIHZvaWQgeF9wcmludChpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCB4X2FkanVzdCh2b2lkKTsKLXN0YXRpYyB2b2lkIHhfZV91bmdldGMoaW50KTsKLXN0YXRpYyBpbnQgeF9lX2dldGModm9pZCk7Ci1zdGF0aWMgdm9pZCB4X2VfcHV0YzIoaW50KTsKLXN0YXRpYyB2b2lkIHhfZV9wdXRjMyhjb25zdCBjaGFyICoqKTsKLXN0YXRpYyB2b2lkIHhfZV9wdXRzKGNvbnN0IGNoYXIgKik7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLXN0YXRpYyBpbnQgeF9mb2xkX2Nhc2UoaW50KTsKLSNlbmRpZgotc3RhdGljIGNoYXIgKnhfbGFzdGNwKHZvaWQpOwotc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW50LCBDb21wX3R5cGUpOwotCi1zdGF0aWMgaW50IHVuZ2V0X2NoYXIgPSAtMTsKLQotc3RhdGljIGludCB4X2RvX2lucyhjb25zdCBjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgdm9pZCBiaW5kX2lmX25vdF9ib3VuZChpbnQsIGludCwgaW50KTsKLQotZW51bSBlbWFjc19mdW5jcyB7Ci0jZGVmaW5lIEVNQUNTRk5fRU5VTVMKLSNpbmNsdWRlICJlbWFjc2ZuLmgiCi0JWEZVTkNfTUFYCi19OwotCi0jZGVmaW5lIEVNQUNTRk5fREVGTlMKLSNpbmNsdWRlICJlbWFjc2ZuLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeF9mdGFiIHhfZnRhYltdID0gewotI2RlZmluZSBFTUFDU0ZOX0lURU1TCi0jaW5jbHVkZSAiZW1hY3Nmbi5oIgotCXsgMCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHhfZGVmYmluZGluZ3MgY29uc3QgeF9kZWZiaW5kaW5nc1tdID0gewotCXsgWEZVTkNfZGVsX2JhY2ssCQkwLCBDVFJMKCc/JykJfSwKLQl7IFhGVU5DX2RlbF9id29yZCwJCTEsIENUUkwoJz8nKQl9LAotCXsgWEZVTkNfZW90X2RlbCwJCTAsIENUUkwoJ0QnKQl9LAotCXsgWEZVTkNfZGVsX2JhY2ssCQkwLCBDVFJMKCdIJykJfSwKLQl7IFhGVU5DX2RlbF9id29yZCwJCTEsIENUUkwoJ0gnKQl9LAotCXsgWEZVTkNfZGVsX2J3b3JkLAkJMSwJJ2gnCX0sCi0JeyBYRlVOQ19tdl9id29yZCwJCTEsCSdiJwl9LAotCXsgWEZVTkNfbXZfZndvcmQsCQkxLAknZicJfSwKLQl7IFhGVU5DX2RlbF9md29yZCwJCTEsCSdkJwl9LAotCXsgWEZVTkNfbXZfYmFjaywJCTAsIENUUkwoJ0InKQl9LAotCXsgWEZVTkNfbXZfZm9ydywJCTAsIENUUkwoJ0YnKQl9LAotCXsgWEZVTkNfc2VhcmNoX2NoYXJfZm9ydywJMCwgQ1RSTCgnXScpCX0sCi0JeyBYRlVOQ19zZWFyY2hfY2hhcl9iYWNrLAkxLCBDVFJMKCddJykJfSwKLQl7IFhGVU5DX25ld2xpbmUsCQkwLCBDVFJMKCdNJykJfSwKLQl7IFhGVU5DX25ld2xpbmUsCQkwLCBDVFJMKCdKJykJfSwKLQl7IFhGVU5DX2VuZF9vZl90ZXh0LAkJMCwgQ1RSTCgnXycpCX0sCi0JeyBYRlVOQ19hYm9ydCwJCQkwLCBDVFJMKCdHJykJfSwKLQl7IFhGVU5DX3ByZXZfY29tLAkJMCwgQ1RSTCgnUCcpCX0sCi0JeyBYRlVOQ19uZXh0X2NvbSwJCTAsIENUUkwoJ04nKQl9LAotCXsgWEZVTkNfbmxfbmV4dF9jb20sCQkwLCBDVFJMKCdPJykJfSwKLQl7IFhGVU5DX3NlYXJjaF9oaXN0LAkJMCwgQ1RSTCgnUicpCX0sCi0JeyBYRlVOQ19iZWdfaGlzdCwJCTEsCSc8Jwl9LAotCXsgWEZVTkNfZW5kX2hpc3QsCQkxLAknPicJfSwKLQl7IFhGVU5DX2dvdG9faGlzdCwJCTEsCSdnJwl9LAotCXsgWEZVTkNfbXZfZW5kLAkJCTAsIENUUkwoJ0UnKQl9LAotCXsgWEZVTkNfbXZfYmVnaW4sCQkwLCBDVFJMKCdBJykJfSwKLQl7IFhGVU5DX2RyYXdfbGluZSwJCTAsIENUUkwoJ0wnKQl9LAotCXsgWEZVTkNfY2xzLAkJCTEsIENUUkwoJ0wnKQl9LAotCXsgWEZVTkNfbWV0YTEsCQkJMCwgQ1RSTCgnWycpCX0sCi0JeyBYRlVOQ19tZXRhMiwJCQkwLCBDVFJMKCdYJykJfSwKLQl7IFhGVU5DX2tpbGwsCQkJMCwgQ1RSTCgnSycpCX0sCi0JeyBYRlVOQ195YW5rLAkJCTAsIENUUkwoJ1knKQl9LAotCXsgWEZVTkNfbWV0YV95YW5rLAkJMSwJJ3knCX0sCi0JeyBYRlVOQ19saXRlcmFsLAkJMCwgQ1RSTCgnXicpCX0sCi0JeyBYRlVOQ19jb21tZW50LAkJMSwJJyMnCX0sCi0JeyBYRlVOQ190cmFuc3Bvc2UsCQkwLCBDVFJMKCdUJykJfSwKLQl7IFhGVU5DX2NvbXBsZXRlLAkJMSwgQ1RSTCgnWycpCX0sCi0JeyBYRlVOQ19jb21wX2xpc3QsCQkwLCBDVFJMKCdJJykJfSwKLQl7IFhGVU5DX2NvbXBfbGlzdCwJCTEsCSc9Jwl9LAotCXsgWEZVTkNfZW51bWVyYXRlLAkJMSwJJz8nCX0sCi0JeyBYRlVOQ19leHBhbmQsCQkJMSwJJyonCX0sCi0JeyBYRlVOQ19jb21wX2ZpbGUsCQkxLCBDVFJMKCdYJykJfSwKLQl7IFhGVU5DX2NvbXBfY29tbSwJCTIsIENUUkwoJ1snKQl9LAotCXsgWEZVTkNfbGlzdF9jb21tLAkJMiwJJz8nCX0sCi0JeyBYRlVOQ19saXN0X2ZpbGUsCQkyLCBDVFJMKCdZJykJfSwKLQl7IFhGVU5DX3NldF9tYXJrLAkJMSwJJyAnCX0sCi0JeyBYRlVOQ19raWxsX3JlZ2lvbiwJCTAsIENUUkwoJ1cnKQl9LAotCXsgWEZVTkNfeGNoZ19wb2ludF9tYXJrLAkyLCBDVFJMKCdYJykJfSwKLQl7IFhGVU5DX2xpdGVyYWwsCQkwLCBDVFJMKCdWJykJfSwKLQl7IFhGVU5DX3ZlcnNpb24sCQkxLCBDVFJMKCdWJykJfSwKLQl7IFhGVU5DX3ByZXZfaGlzdHdvcmQsCQkxLAknLicJfSwKLQl7IFhGVU5DX3ByZXZfaGlzdHdvcmQsCQkxLAknXycJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknMCcJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknMScJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknMicJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknMycJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknNCcJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknNScJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknNicJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknNycJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknOCcJfSwKLQl7IFhGVU5DX3NldF9hcmcsCQkxLAknOScJfSwKLSNpZm5kZWYgTUtTSF9TTUFMTAotCXsgWEZVTkNfZm9sZF91cHBlciwJCTEsCSdVJwl9LAotCXsgWEZVTkNfZm9sZF91cHBlciwJCTEsCSd1Jwl9LAotCXsgWEZVTkNfZm9sZF9sb3dlciwJCTEsCSdMJwl9LAotCXsgWEZVTkNfZm9sZF9sb3dlciwJCTEsCSdsJwl9LAotCXsgWEZVTkNfZm9sZF9jYXBpdGFsaXNlLAkxLAknQycJfSwKLQl7IFhGVU5DX2ZvbGRfY2FwaXRhbGlzZSwJMSwJJ2MnCX0sCi0jZW5kaWYKLQkvKiBUaGVzZSBmb3IgYW5zaSBhcnJvdyBrZXlzOiBhcmd1YWJsZWx5IHNob3VsZG4ndCBiZSBoZXJlIGJ5Ci0JICogZGVmYXVsdCwgYnV0IGl0cyBzaW1wbGVyL2Zhc3Rlci9zbWFsbGVyIHRoYW4gdXNpbmcgdGVybWNhcAotCSAqIGVudHJpZXMuCi0JICovCi0JeyBYRlVOQ19tZXRhMiwJCQkxLAknWycJfSwKLQl7IFhGVU5DX21ldGEyLAkJCTEsCSdPJwl9LAotCXsgWEZVTkNfcHJldl9jb20sCQkyLAknQScJfSwKLQl7IFhGVU5DX25leHRfY29tLAkJMiwJJ0InCX0sCi0JeyBYRlVOQ19tdl9mb3J3LAkJMiwJJ0MnCX0sCi0JeyBYRlVOQ19tdl9iYWNrLAkJMiwJJ0QnCX0sCi0jaWZuZGVmIE1LU0hfU01BTEwKLQl7IFhGVU5DX3Z0X2hhY2ssCQkyLAknMScJfSwKLQl7IFhGVU5DX212X2JlZ2luIHwgMHg4MCwJMiwJJzcnCX0sCi0JeyBYRlVOQ19tdl9iZWdpbiwJCTIsCSdIJwl9LAotCXsgWEZVTkNfbXZfZW5kIHwgMHg4MCwJCTIsCSc0Jwl9LAotCXsgWEZVTkNfbXZfZW5kIHwgMHg4MCwJCTIsCSc4Jwl9LAotCXsgWEZVTkNfbXZfZW5kLAkJCTIsCSdGJwl9LAotCXsgWEZVTkNfZGVsX2NoYXIgfCAweDgwLAkyLAknMycJfSwKLQl7IFhGVU5DX3NlYXJjaF9oaXN0X3VwIHwgMHg4MCwJMiwJJzUnCX0sCi0JeyBYRlVOQ19zZWFyY2hfaGlzdF9kbiB8IDB4ODAsCTIsCSc2Jwl9LAotCS8qIG1vcmUgbm9uLXN0YW5kYXJkIG9uZXMgKi8KLQl7IFhGVU5DX2VkaXRfbGluZSwJCTIsCSdlJwl9Ci0jZW5kaWYKLX07Ci0KLSNpZmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgdm9pZCB4X21vZGlmaWVkKHZvaWQpOwotc3RhdGljIHZvaWQKLXhfbW9kaWZpZWQodm9pZCkKLXsKLQlpZiAoIW1vZGlmaWVkKSB7Ci0JCXhfaGlzdHAgPSBoaXN0cHRyICsgMTsKLQkJbW9kaWZpZWQgPSAxOwotCX0KLX0KLSNkZWZpbmUgWEZVTkNfVkFMVUUoZikgKGYpCi0jZWxzZQotI2RlZmluZSB4X21vZGlmaWVkKCkgZG8gewkJCVwKLQlpZiAoIW1vZGlmaWVkKSB7CQkJXAotCQl4X2hpc3RwID0gaGlzdHB0ciArIDE7CQlcCi0JCW1vZGlmaWVkID0gMTsJCQlcCi0JfQkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZGVmaW5lIFhGVU5DX1ZBTFVFKGYpIChmICYgMHg3RikKLSNlbmRpZgotCi1zdGF0aWMgaW50Ci14X2VfZ2V0bWJjKGNoYXIgKnNidWYpCi17Ci0JaW50IGMsIHBvcyA9IDA7Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKilzYnVmOwotCi0JbWVtc2V0KGJ1ZiwgMCwgNCk7Ci0JYnVmW3BvcysrXSA9IGMgPSB4X2VfZ2V0YygpOwotCWlmIChjID09IC0xKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoVVRGTU9ERSkgewotCQlpZiAoKGJ1ZlswXSA+PSAweEMyKSAmJiAoYnVmWzBdIDwgMHhGMCkpIHsKLQkJCWMgPSB4X2VfZ2V0YygpOwotCQkJaWYgKGMgPT0gLTEpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7Ci0JCQkJeF9lX3VuZ2V0YyhjKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJYnVmW3BvcysrXSA9IGM7Ci0JCX0KLQkJaWYgKChidWZbMF0gPj0gMHhFMCkgJiYgKGJ1ZlswXSA8IDB4RjApKSB7Ci0JCQkvKiBYWFggeF9lX3VuZ2V0YyBpcyBvbmUtb2N0ZXQgb25seSAqLwotCQkJYnVmW3BvcysrXSA9IGMgPSB4X2VfZ2V0YygpOwotCQkJaWYgKGMgPT0gLTEpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChwb3MpOwotfQotCi1zdGF0aWMgdm9pZAoteF9pbml0X3Byb21wdCh2b2lkKQotewotCXhfY29sID0gcHJvbXB0bGVuKHByb21wdCk7Ci0JeF9hZGpfb2sgPSAxOwotCXByb21wdF9yZWRyYXcgPSAxOwotCWlmICh4X2NvbCA+PSB4eF9jb2xzKQotCQl4X2NvbCAlPSB4eF9jb2xzOwotCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyIC0geF9jb2w7Ci0JeF9hZGpfZG9uZSA9IDA7Ci0KLQlwcHJvbXB0KHByb21wdCwgMCk7Ci0JaWYgKHhfZGlzcGxlbiA8IDEpIHsKLQkJeF9jb2wgPSAwOwotCQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMjsKLQkJeF9lX3B1dGMyKCdcbicpOwotCQlwcm9tcHRfcmVkcmF3ID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZW1hY3MoY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCWludCBjLCBpOwotCXVuc2lnbmVkIGNoYXIgZjsKLQotCXhicCA9IHhidWYgPSBidWY7IHhlbmQgPSBidWYgKyBsZW47Ci0JeGxwID0geGNwID0geGVwID0gYnVmOwotCSp4Y3AgPSAwOwotCXhscF92YWxpZCA9IHRydWU7Ci0JeG1wID0gTlVMTDsKLQl4X2N1cnByZWZpeCA9IDA7Ci0JeF9oaXN0cCA9IGhpc3RwdHIgKyAxOwotCXhfbGFzdF9jb21tYW5kID0gWEZVTkNfZXJyb3I7Ci0KLQl4eF9jb2xzID0geF9jb2xzOwotCXhfaW5pdF9wcm9tcHQoKTsKLQotCWlmICh4X25leHRjbWQgPj0gMCkgewotCQlpbnQgb2ZmID0gc291cmNlLT5saW5lIC0geF9uZXh0Y21kOwotCQlpZiAoaGlzdHB0ciAtIGhpc3RvcnkgPj0gb2ZmKQotCQkJeF9sb2FkX2hpc3QoaGlzdHB0ciAtIG9mZik7Ci0JCXhfbmV4dGNtZCA9IC0xOwotCX0KLQllZGl0bW9kZSA9IDE7Ci0Jd2hpbGUgKDEpIHsKLQkJeF9mbHVzaCgpOwotCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCi0JCQlyZXR1cm4gKDApOwotCi0JCWYgPSB4X2N1cnByZWZpeCA9PSAtMSA/IFhGVU5DX2luc2VydCA6Ci0JCSAgICB4X3RhYlt4X2N1cnByZWZpeF1bY107Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJaWYgKGYgJiAweDgwKSB7Ci0JCQlmICY9IDB4N0Y7Ci0JCQlpZiAoKGkgPSB4X2VfZ2V0YygpKSAhPSAnficpCi0JCQkJeF9lX3VuZ2V0YyhpKTsKLQkJfQotCi0JCS8qIGF2b2lkIGJpbmQga2V5IG1hY3JvIHJlY3Vyc2lvbiAqLwotCQlpZiAobWFjcm9wdHIgJiYgZiA9PSBYRlVOQ19pbnNfc3RyaW5nKQotCQkJZiA9IFhGVU5DX2luc2VydDsKLSNlbmRpZgotCi0JCWlmICghKHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX1BSRUZJWCkgJiYKLQkJICAgIHhfbGFzdF9jb21tYW5kICE9IFhGVU5DX3NldF9hcmcpIHsKLQkJCXhfYXJnID0gMTsKLQkJCXhfYXJnX2RlZmF1bHRlZCA9IDE7Ci0JCX0KLQkJaSA9IGMgfCAoeF9jdXJwcmVmaXggPDwgOCk7Ci0JCXhfY3VycHJlZml4ID0gMDsKLQkJc3dpdGNoICgoKnhfZnRhYltmXS54Zl9mdW5jKShpKSkgewotCQljYXNlIEtTVEQ6Ci0JCQlpZiAoISh4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9QUkVGSVgpKQotCQkJCXhfbGFzdF9jb21tYW5kID0gZjsKLQkJCWJyZWFrOwotCQljYXNlIEtFT0w6Ci0JCQlpID0geGVwIC0geGJ1ZjsKLQkJCXJldHVybiAoaSk7Ci0JCWNhc2UgS0lOVFI6CS8qIHNwZWNpYWwgY2FzZSBmb3IgaW50ZXJydXB0ICovCi0JCQl0cmFwc2lnKFNJR0lOVCk7Ci0JCQl4X21vZGUoZmFsc2UpOwotCQkJdW53aW5kKExTSEVMTCk7Ci0JCX0KLQkJLyogYWQtaG9jIGhhY2sgZm9yIGZpeGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uICovCi0JCXhfZ290byh4Y3ApOwotCX0KLX0KLQotc3RhdGljIGludAoteF9pbnNlcnQoaW50IGMpCi17Ci0Jc3RhdGljIGludCBsZWZ0ID0gMCwgcG9zLCBzYXZlX2FyZzsKLQlzdGF0aWMgY2hhciBzdHJbNF07Ci0KLQkvKgotCSAqIFNob3VsZCBhbGxvdyB0YWIgYW5kIGNvbnRyb2wgY2hhcnMuCi0JICovCi0JaWYgKGMgPT0gMCkgewotIGludm1iczoKLQkJbGVmdCA9IDA7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JaWYgKFVURk1PREUpIHsKLQkJaWYgKCgoYyAmIDB4QzApID09IDB4ODApICYmIGxlZnQpIHsKLQkJCXN0cltwb3MrK10gPSBjOwotCQkJaWYgKCEtLWxlZnQpIHsKLQkJCQlzdHJbcG9zXSA9ICdcMCc7Ci0JCQkJeF9hcmcgPSBzYXZlX2FyZzsKLQkJCQl3aGlsZSAoeF9hcmctLSkKLQkJCQkJeF9pbnMoc3RyKTsKLQkJCX0KLQkJCXJldHVybiAoS1NURCk7Ci0JCX0KLQkJaWYgKGxlZnQpIHsKLQkJCWlmICh4X2N1cnByZWZpeCA9PSAtMSkgewotCQkJCS8qIGZsdXNoIGludmFsaWQgbXVsdGlieXRlICovCi0JCQkJc3RyW3Bvc10gPSAnXDAnOwotCQkJCXdoaWxlIChzYXZlX2FyZy0tKQotCQkJCQl4X2lucyhzdHIpOwotCQkJfQotCQl9Ci0JCWlmICgoYyA+PSAweEMyKSAmJiAoYyA8IDB4RTApKQotCQkJbGVmdCA9IDE7Ci0JCWVsc2UgaWYgKChjID49IDB4RTApICYmIChjIDwgMHhGMCkpCi0JCQlsZWZ0ID0gMjsKLQkJZWxzZSBpZiAoYyA+IDB4N0YpCi0JCQlnb3RvIGludm1iczsKLQkJZWxzZQotCQkJbGVmdCA9IDA7Ci0JCWlmIChsZWZ0KSB7Ci0JCQlzYXZlX2FyZyA9IHhfYXJnOwotCQkJcG9zID0gMTsKLQkJCXN0clswXSA9IGM7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JfQotCWxlZnQgPSAwOwotCXN0clswXSA9IGM7Ci0Jc3RyWzFdID0gJ1wwJzsKLQl3aGlsZSAoeF9hcmctLSkKLQkJeF9pbnMoc3RyKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi0jaWZuZGVmIE1LU0hfU01BTEwKLXN0YXRpYyBpbnQKLXhfaW5zX3N0cmluZyhpbnQgYykKLXsKLQltYWNyb3B0ciA9IHhfYXRhYltjID4+IDhdW2MgJiAyNTVdOwotCS8qCi0JICogd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYm90aGVyIGNoZWNraW5nIGlmIG1hY3JvcHRyIGlzCi0JICogbm90IE5VTEwgYnV0IGZpcnN0IGNoYXIgaXMgTlVMOyB4X2VfZ2V0YygpIGRvZXMgaXQKLQkgKi8KLQlyZXR1cm4gKEtTVEQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXhfZG9faW5zKGNvbnN0IGNoYXIgKmNwLCBzaXplX3QgbGVuKQotewotCWlmICh4ZXAgKyBsZW4gPj0geGVuZCkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQltZW1tb3ZlKHhjcCArIGxlbiwgeGNwLCB4ZXAgLSB4Y3AgKyAxKTsKLQltZW1tb3ZlKHhjcCwgY3AsIGxlbik7Ci0JeGNwICs9IGxlbjsKLQl4ZXAgKz0gbGVuOwotCXhfbW9kaWZpZWQoKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci14X2lucyhjb25zdCBjaGFyICpzKQotewotCWNoYXIgKmNwID0geGNwOwotCWludCBhZGogPSB4X2Fkal9kb25lOwotCi0JaWYgKHhfZG9faW5zKHMsIHN0cmxlbihzKSkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQkvKgotCSAqIHhfem90cygpIG1heSByZXN1bHQgaW4gYSBjYWxsIHRvIHhfYWRqdXN0KCkKLQkgKiB3ZSB3YW50IHhjcCB0byByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24uCi0JICovCi0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JeF9sYXN0Y3AoKTsKLQl4X2Fkal9vayA9ICh4Y3AgPj0geGxwKTsKLQl4X3pvdHMoY3ApOwotCWlmIChhZGogPT0geF9hZGpfZG9uZSkgewkvKiBoYXMgeF9hZGp1c3QoKSBiZWVuIGNhbGxlZD8gKi8KLQkJLyogbm8gKi8KLQkJY3AgPSB4bHA7Ci0JCXdoaWxlIChjcCA+IHhjcCkKLQkJCXhfYnMzKCZjcCk7Ci0JfQotCWlmICh4bHAgPT0geGVwIC0gMSkKLQkJeF9yZWRyYXcoeHhfY29scyk7Ci0JeF9hZGpfb2sgPSAxOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZGVsX2JhY2soaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoeGNwID09IHhidWYpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQlkbyB7Ci0JCXhfZ290byh4Y3AgLSAxKTsKLQl9IHdoaWxlICgoKytpIDwgeF9hcmcpICYmICh4Y3AgIT0geGJ1ZikpOwotCXhfZGVsZXRlKGksIGZhbHNlKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2RlbF9jaGFyKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqY3AsICpjcDI7Ci0JaW50IGkgPSAwOwotCi0JY3AgPSB4Y3A7Ci0Jd2hpbGUgKGkgPCB4X2FyZykgewotCQl1dGZfcHRyYWRqeChjcCwgY3AyKTsKLQkJaWYgKGNwMiA+IHhlcCkKLQkJCWJyZWFrOwotCQljcCA9IGNwMjsKLQkJaSsrOwotCX0KLQotCWlmICghaSkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXhfZGVsZXRlKGksIGZhbHNlKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi0vKiBEZWxldGUgbmMgY2hhcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgKGluY2x1ZGluZyBjdXJzb3IgcG9zaXRpb24pICovCi1zdGF0aWMgdm9pZAoteF9kZWxldGUoaW50IG5jLCBpbnQgcHVzaCkKLXsKLQlpbnQgaSwgbmIsIG53OwotCWNoYXIgKmNwOwotCi0JaWYgKG5jID09IDApCi0JCXJldHVybjsKLQotCW53ID0gMDsKLQljcCA9IHhjcDsKLQlmb3IgKGkgPSAwOyBpIDwgbmM7ICsraSkgewotCQljaGFyICpjcDI7Ci0JCWludCBqOwotCi0JCWogPSB4X3NpemUyKGNwLCAmY3AyKTsKLQkJaWYgKGNwMiA+IHhlcCkKLQkJCWJyZWFrOwotCQljcCA9IGNwMjsKLQkJbncgKz0gajsKLQl9Ci0JbmIgPSBjcCAtIHhjcDsKLQkvKiBuYyA9IGk7ICovCi0KLQlpZiAoeG1wICE9IE5VTEwgJiYgeG1wID4geGNwKSB7Ci0JCWlmICh4Y3AgKyBuYiA+IHhtcCkKLQkJCXhtcCA9IHhjcDsKLQkJZWxzZQotCQkJeG1wIC09IG5iOwotCX0KLQkvKgotCSAqIFRoaXMgbGV0cyB1cyB5YW5rIGEgd29yZCB3ZSBoYXZlIGRlbGV0ZWQuCi0JICovCi0JaWYgKHB1c2gpCi0JCXhfcHVzaChuYik7Ci0KLQl4ZXAgLT0gbmI7Ci0JbWVtbW92ZSh4Y3AsIHhjcCArIG5iLCB4ZXAgLSB4Y3AgKyAxKTsJLyogQ29waWVzIHRoZSBOVUwgKi8KLQl4X2Fkal9vayA9IDA7CQkJLyogZG9uJ3QgcmVkcmF3ICovCi0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JeF96b3RzKHhjcCk7Ci0JLyoKLQkgKiBpZiB3ZSBhcmUgYWxyZWFkeSBmaWxsaW5nIHRoZSBsaW5lLAotCSAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gJyAnLCdcYicuCi0JICogQnV0IGlmIHdlIG11c3QsIG1ha2Ugc3VyZSB3ZSBkbyB0aGUgbWluaW11bS4KLQkgKi8KLQlpZiAoKGkgPSB4eF9jb2xzIC0gMiAtIHhfY29sKSA+IDAgfHwgeGVwIC0geGxwID09IDApIHsKLQkJbncgPSBpID0gKG53IDwgaSkgPyBudyA6IGk7Ci0JCXdoaWxlIChpLS0pCi0JCQl4X2VfcHV0YzIoJyAnKTsKLQkJaWYgKHhfY29sID09IHh4X2NvbHMgLSAyKSB7Ci0JCQl4X2VfcHV0YzIoKHhlcCA+IHhscCkgPyAnPicgOiAoeGJwID4geGJ1ZikgPyAnPCcgOiAnICcpOwotCQkJKytudzsKLQkJfQotCQl3aGlsZSAobnctLSkKLQkJCXhfZV9wdXRjMignXGInKTsKLQl9Ci0JLyp4X2dvdG8oeGNwKTsqLwotCXhfYWRqX29rID0gMTsKLQl4bHBfdmFsaWQgPSBmYWxzZTsKLQljcCA9IHhfbGFzdGNwKCk7Ci0Jd2hpbGUgKGNwID4geGNwKQotCQl4X2JzMygmY3ApOwotCi0JeF9tb2RpZmllZCgpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludAoteF9kZWxfYndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2RlbGV0ZSh4X2J3b3JkKCksIHRydWUpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfYndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2J3b3JkKCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9tdl9md29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfZndvcmQoMSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9kZWxfZndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2RlbGV0ZSh4X2Z3b3JkKDApLCB0cnVlKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2J3b3JkKHZvaWQpCi17Ci0JaW50IG5jID0gMCwgbmIgPSAwOwotCWNoYXIgKmNwID0geGNwOwotCi0JaWYgKGNwID09IHhidWYpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKDApOwotCX0KLQl3aGlsZSAoeF9hcmctLSkgewotCQl3aGlsZSAoY3AgIT0geGJ1ZiAmJiBpc19tZnMoY3BbLTFdKSkgewotCQkJY3AtLTsKLQkJCW5iKys7Ci0JCX0KLQkJd2hpbGUgKGNwICE9IHhidWYgJiYgIWlzX21mcyhjcFstMV0pKSB7Ci0JCQljcC0tOwotCQkJbmIrKzsKLQkJfQotCX0KLQl4X2dvdG8oY3ApOwotCWZvciAoY3AgPSB4Y3A7IGNwIDwgKHhjcCArIG5iKTsgKytuYykKLQkJY3AgKz0gdXRmX3B0cmFkaihjcCk7Ci0JcmV0dXJuIChuYyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZndvcmQoaW50IG1vdmUpCi17Ci0JaW50IG5jID0gMDsKLQljaGFyICpjcCA9IHhjcCwgKmNwMjsKLQotCWlmIChjcCA9PSB4ZXApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKDApOwotCX0KLQl3aGlsZSAoeF9hcmctLSkgewotCQl3aGlsZSAoY3AgIT0geGVwICYmIGlzX21mcygqY3ApKQotCQkJY3ArKzsKLQkJd2hpbGUgKGNwICE9IHhlcCAmJiAhaXNfbWZzKCpjcCkpCi0JCQljcCsrOwotCX0KLQlmb3IgKGNwMiA9IHhjcDsgY3AyIDwgY3A7ICsrbmMpCi0JCWNwMiArPSB1dGZfcHRyYWRqKGNwMik7Ci0JaWYgKG1vdmUpCi0JCXhfZ290byhjcCk7Ci0JcmV0dXJuIChuYyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X2dvdG8oY2hhciAqY3ApCi17Ci0JaWYgKFVURk1PREUpCi0JCXdoaWxlICgoY3AgPiB4YnVmKSAmJiAoKCpjcCAmIDB4QzApID09IDB4ODApKQotCQkJLS1jcDsKLQlpZiAoY3AgPCB4YnAgfHwgY3AgPj0gdXRmX3NraXBjb2xzKHhicCwgeF9kaXNwbGVuKSkgewotCQkvKiB3ZSBhcmUgaGVhZGluZyBvZmYgc2NyZWVuICovCi0JCXhjcCA9IGNwOwotCQl4X2FkanVzdCgpOwotCX0gZWxzZSBpZiAoY3AgPCB4Y3ApIHsJCS8qIG1vdmUgYmFjayAqLwotCQl3aGlsZSAoY3AgPCB4Y3ApCi0JCQl4X2JzMygmeGNwKTsKLQl9IGVsc2UgaWYgKGNwID4geGNwKSB7CQkvKiBtb3ZlIGZvcndhcmQgKi8KLQkJd2hpbGUgKGNwID4geGNwKQotCQkJeF96b3RjMygmeGNwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi14X2JzMyhjaGFyICoqcCkKLXsKLQlpbnQgaTsKLQotCSgqcCktLTsKLQlpZiAoVVRGTU9ERSkKLQkJd2hpbGUgKCgodW5zaWduZWQgY2hhcikqKnAgJiAweEMwKSA9PSAweDgwKQotCQkJKCpwKS0tOwotCi0JaSA9IHhfc2l6ZTIoKnAsIE5VTEwpOwotCXdoaWxlIChpLS0pCi0JCXhfZV9wdXRjMignXGInKTsKLX0KLQotc3RhdGljIGludAoteF9zaXplX3N0cihjaGFyICpjcCkKLXsKLQlpbnQgc2l6ZSA9IDA7Ci0Jd2hpbGUgKCpjcCkKLQkJc2l6ZSArPSB4X3NpemUyKGNwLCAmY3ApOwotCXJldHVybiAoc2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfc2l6ZTIoY2hhciAqY3AsIGNoYXIgKipkY3ApCi17Ci0JaW50IGMgPSAqKHVuc2lnbmVkIGNoYXIgKiljcDsKLQotCWlmIChVVEZNT0RFICYmIChjID4gMHg3RikpCi0JCXJldHVybiAodXRmX3dpZHRoYWRqKGNwLCAoY29uc3QgY2hhciAqKilkY3ApKTsKLQlpZiAoZGNwKQotCQkqZGNwID0gY3AgKyAxOwotCWlmIChjID09ICdcdCcpCi0JCXJldHVybiAoNCk7CS8qIEtsdWRnZSwgdGFicyBhcmUgYWx3YXlzIGZvdXIgc3BhY2VzLiAqLwotCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikKLQkJcmV0dXJuICgyKTsJLyogY29udHJvbCB1bnNpZ25lZCBjaGFyICovCi0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfem90cyhjaGFyICpzdHIpCi17Ci0JaW50IGFkaiA9IHhfYWRqX2RvbmU7Ci0KLQl4X2xhc3RjcCgpOwotCXdoaWxlICgqc3RyICYmIHN0ciA8IHhscCAmJiBhZGogPT0geF9hZGpfZG9uZSkKLQkJeF96b3RjMygmc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfem90YzIoaW50IGMpCi17Ci0JaWYgKGMgPT0gJ1x0JykgewotCQkvKiBLbHVkZ2UsIHRhYnMgYXJlIGFsd2F5cyBmb3VyIHNwYWNlcy4gKi8KLQkJeF9lX3B1dHMoIiAgICAiKTsKLQl9IGVsc2UgaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7Ci0JCXhfZV9wdXRjMignXicpOwotCQl4X2VfcHV0YzIoVU5DVFJMKGMpKTsKLQl9IGVsc2UKLQkJeF9lX3B1dGMyKGMpOwotfQotCi1zdGF0aWMgdm9pZAoteF96b3RjMyhjaGFyICoqY3ApCi17Ci0JdW5zaWduZWQgY2hhciBjID0gKioodW5zaWduZWQgY2hhciAqKiljcDsKLQotCWlmIChjID09ICdcdCcpIHsKLQkJLyogS2x1ZGdlLCB0YWJzIGFyZSBhbHdheXMgZm91ciBzcGFjZXMuICovCi0JCXhfZV9wdXRzKCIgICAgIik7Ci0JCSgqY3ApKys7Ci0JfSBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgewotCQl4X2VfcHV0YzIoJ14nKTsKLQkJeF9lX3B1dGMyKFVOQ1RSTChjKSk7Ci0JCSgqY3ApKys7Ci0JfSBlbHNlCi0JCXhfZV9wdXRjMygoY29uc3QgY2hhciAqKiljcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfYmFjayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWlmICh4Y3AgPT0geGJ1ZikgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXdoaWxlICh4X2FyZy0tKSB7Ci0JCXhfZ290byh4Y3AgLSAxKTsKLQkJaWYgKHhjcCA9PSB4YnVmKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfZm9ydyhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKmNwID0geGNwLCAqY3AyOwotCi0JaWYgKHhjcCA9PSB4ZXApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl3aGlsZSAoeF9hcmctLSkgewotCQl1dGZfcHRyYWRqeChjcCwgY3AyKTsKLQkJaWYgKGNwMiA+IHhlcCkKLQkJCWJyZWFrOwotCQljcCA9IGNwMjsKLQl9Ci0JeF9nb3RvKGNwKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X3NlYXJjaF9jaGFyX2ZvcncoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQljaGFyICpjcCA9IHhjcDsKLQljaGFyIHRtcFs0XTsKLQotCSp4ZXAgPSAnXDAnOwotCWlmICh4X2VfZ2V0bWJjKHRtcCkgPCAwKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0Jd2hpbGUgKHhfYXJnLS0pIHsKLQkJaWYgKChjcCA9IChjcCA9PSB4ZXApID8gTlVMTCA6IHN0cnN0cihjcCArIDEsIHRtcCkpID09IE5VTEwgJiYKLQkJICAgIChjcCA9IHN0cnN0cih4YnVmLCB0bXApKSA9PSBOVUxMKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JfQotCXhfZ290byhjcCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9zZWFyY2hfY2hhcl9iYWNrKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqY3AgPSB4Y3AsICpwLCB0bXBbNF07Ci0JYm9vbCBiOwotCi0JaWYgKHhfZV9nZXRtYmModG1wKSA8IDApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQlmb3IgKDsgeF9hcmctLTsgY3AgPSBwKQotCQlmb3IgKHAgPSBjcDsgOyApIHsKLQkJCWlmIChwLS0gPT0geGJ1ZikKLQkJCQlwID0geGVwOwotCQkJaWYgKHAgPT0gY3ApIHsKLQkJCQl4X2VfcHV0YzIoNyk7Ci0JCQkJcmV0dXJuIChLU1REKTsKLQkJCX0KLQkJCWlmICgodG1wWzFdICYmICgocCsxKSA+IHhlcCkpIHx8Ci0JCQkgICAgKHRtcFsyXSAmJiAoKHArMikgPiB4ZXApKSkKLQkJCQljb250aW51ZTsKLQkJCWIgPSB0cnVlOwotCQkJaWYgKCpwICE9IHRtcFswXSkKLQkJCQliID0gZmFsc2U7Ci0JCQlpZiAoYiAmJiB0bXBbMV0gJiYgcFsxXSAhPSB0bXBbMV0pCi0JCQkJYiA9IGZhbHNlOwotCQkJaWYgKGIgJiYgdG1wWzJdICYmIHBbMl0gIT0gdG1wWzJdKQotCQkJCWIgPSBmYWxzZTsKLQkJCWlmIChiKQotCQkJCWJyZWFrOwotCQl9Ci0JeF9nb3RvKGNwKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X25ld2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2VfcHV0YzIoJ1xyJyk7Ci0JeF9lX3B1dGMyKCdcbicpOwotCXhfZmx1c2goKTsKLQkqeGVwKysgPSAnXG4nOwotCXJldHVybiAoS0VPTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZW5kX29mX3RleHQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X3pvdGMyKGVkY2hhcnMuZW9mKTsKLQl4X3B1dGMoJ1xyJyk7Ci0JeF9wdXRjKCdcbicpOwotCXhfZmx1c2goKTsKLQlyZXR1cm4gKEtFT0wpOwotfQotCi1zdGF0aWMgaW50Ci14X2JlZ19oaXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9sb2FkX2hpc3QoaGlzdG9yeSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9lbmRfaGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfbG9hZF9oaXN0KGhpc3RwdHIpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfcHJldl9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2xvYWRfaGlzdCh4X2hpc3RwIC0geF9hcmcpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbmV4dF9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2xvYWRfaGlzdCh4X2hpc3RwICsgeF9hcmcpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLS8qIEdvdG8gYSBwYXJ0aWN1bGFyIGhpc3RvcnkgbnVtYmVyIG9idGFpbmVkIGZyb20gYXJndW1lbnQuCi0gKiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiBoaXN0b3J5IDEgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91Ci0gKiB3YW50IHNvIHdlJ2xsIHNpbXBseSBnbyB0byB0aGUgb2xkZXN0IG9uZS4KLSAqLwotc3RhdGljIGludAoteF9nb3RvX2hpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpZiAoeF9hcmdfZGVmYXVsdGVkKQotCQl4X2xvYWRfaGlzdChoaXN0b3J5KTsKLQllbHNlCi0JCXhfbG9hZF9oaXN0KGhpc3RwdHIgKyB4X2FyZyAtIHNvdXJjZS0+bGluZSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfbG9hZF9oaXN0KGNoYXIgKipocCkKLXsKLQlpbnQgb2xkc2l6ZTsKLQljaGFyICpzcCA9IE5VTEw7Ci0KLQlpZiAoaHAgPT0gaGlzdHB0ciArIDEpIHsKLQkJc3AgPSBob2xkYnVmOwotCQltb2RpZmllZCA9IDA7Ci0JfSBlbHNlIGlmIChocCA8IGhpc3RvcnkgfHwgaHAgPiBoaXN0cHRyKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc3AgPT0gTlVMTCkKLQkJc3AgPSAqaHA7Ci0JeF9oaXN0cCA9IGhwOwotCW9sZHNpemUgPSB4X3NpemVfc3RyKHhidWYpOwotCWlmIChtb2RpZmllZCkKLQkJc3RybGNweShob2xkYnVmLCB4YnVmLCBzaXplb2YoaG9sZGJ1ZikpOwotCXN0cmxjcHkoeGJ1Ziwgc3AsIHhlbmQgLSB4YnVmKTsKLQl4YnAgPSB4YnVmOwotCXhlcCA9IHhjcCA9IHhidWYgKyBzdHJsZW4oeGJ1Zik7Ci0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JaWYgKHhlcCA8PSB4X2xhc3RjcCgpKSB7Ci0JCXhfcmVkcmF3KG9sZHNpemUpOwotCX0KLQl4X2dvdG8oeGVwKTsKLQltb2RpZmllZCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbmxfbmV4dF9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X25leHRjbWQgPSBzb3VyY2UtPmxpbmUgLSAoaGlzdHB0ciAtIHhfaGlzdHApICsgMTsKLQlyZXR1cm4gKHhfbmV3bGluZSgnXG4nKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZW90X2RlbChpbnQgYykKLXsKLQlpZiAoeGVwID09IHhidWYgJiYgeF9hcmdfZGVmYXVsdGVkKQotCQlyZXR1cm4gKHhfZW5kX29mX3RleHQoYykpOwotCWVsc2UKLQkJcmV0dXJuICh4X2RlbF9jaGFyKGMpKTsKLX0KLQotLyogcmV2ZXJzZSBpbmNyZW1lbnRhbCBoaXN0b3J5IHNlYXJjaCAqLwotc3RhdGljIGludAoteF9zZWFyY2hfaGlzdChpbnQgYykKLXsKLQlpbnQgb2Zmc2V0ID0gLTE7CS8qIG9mZnNldCBvZiBtYXRjaCBpbiB4YnVmLCBlbHNlIC0xICovCi0JY2hhciBwYXRbMjU2ICsgMV07CS8qIHBhdHRlcm4gYnVmZmVyICovCi0JY2hhciAqcCA9IHBhdDsKLQl1bnNpZ25lZCBjaGFyIGY7Ci0KLQkqcCA9ICdcMCc7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXhfZV9wdXRzKCJcbkktc2VhcmNoOiAiKTsKLQkJCXhfZV9wdXRzKHBhdCk7Ci0JCX0KLQkJeF9mbHVzaCgpOwotCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCi0JCQlyZXR1cm4gKEtTVEQpOwotCQlmID0geF90YWJbMF1bY107Ci0JCWlmIChjID09IENUUkwoJ1snKSkgewotCQkJaWYgKChmICYgMHg3RikgPT0gWEZVTkNfbWV0YTEpIHsKLQkJCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCi0JCQkJCXJldHVybiAoS1NURCk7Ci0JCQkJZiA9IHhfdGFiWzFdW2NdICYgMHg3RjsKLQkJCQlpZiAoZiA9PSBYRlVOQ19tZXRhMSB8fCBmID09IFhGVU5DX21ldGEyKQotCQkJCQl4X21ldGExKENUUkwoJ1snKSk7Ci0JCQkJeF9lX3VuZ2V0YyhjKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJaWYgKGYgJiAweDgwKSB7Ci0JCQlmICY9IDB4N0Y7Ci0JCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSAhPSAnficpCi0JCQkJeF9lX3VuZ2V0YyhjKTsKLQkJfQotI2VuZGlmCi0JCWlmIChmID09IFhGVU5DX3NlYXJjaF9oaXN0KQotCQkJb2Zmc2V0ID0geF9zZWFyY2gocGF0LCAwLCBvZmZzZXQpOwotCQllbHNlIGlmIChmID09IFhGVU5DX2RlbF9iYWNrKSB7Ci0JCQlpZiAocCA9PSBwYXQpIHsKLQkJCQlvZmZzZXQgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwID4gcGF0KQotCQkJCSotLXAgPSAnXDAnOwotCQkJaWYgKHAgPT0gcGF0KQotCQkJCW9mZnNldCA9IC0xOwotCQkJZWxzZQotCQkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMSwgb2Zmc2V0KTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGYgPT0gWEZVTkNfaW5zZXJ0KSB7Ci0JCQkvKiBhZGQgY2hhciB0byBwYXR0ZXJuICovCi0JCQkvKiBvdmVyZmxvdyBjaGVjay4uLiAqLwotCQkJaWYgKHAgPj0gJnBhdFtzaXplb2YocGF0KSAtIDFdKSB7Ci0JCQkJeF9lX3B1dGMyKDcpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJKnArKyA9IGMsICpwID0gJ1wwJzsKLQkJCWlmIChvZmZzZXQgPj0gMCkgewotCQkJCS8qIGFscmVhZHkgaGF2ZSBwYXJ0aWFsIG1hdGNoICovCi0JCQkJb2Zmc2V0ID0geF9tYXRjaCh4YnVmLCBwYXQpOwotCQkJCWlmIChvZmZzZXQgPj0gMCkgewotCQkJCQl4X2dvdG8oeGJ1ZiArIG9mZnNldCArIChwIC0gcGF0KSAtCi0JCQkJCSAgICAoKnBhdCA9PSAnXicpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJb2Zmc2V0ID0geF9zZWFyY2gocGF0LCAwLCBvZmZzZXQpOwotCQl9IGVsc2UgaWYgKGYgPT0gWEZVTkNfYWJvcnQpIHsKLQkJCWlmIChvZmZzZXQgPj0gMCkKLQkJCQl4X2xvYWRfaGlzdChoaXN0cHRyICsgMSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsgLyogb3RoZXIgY29tbWFuZCAqLwotCQkJeF9lX3VuZ2V0YyhjKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChvZmZzZXQgPCAwKQotCQl4X3JlZHJhdygtMSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotLyogc2VhcmNoIGJhY2t3YXJkIGZyb20gY3VycmVudCBsaW5lICovCi1zdGF0aWMgaW50Ci14X3NlYXJjaChjaGFyICpwYXQsIGludCBzYW1lbGluZSwgaW50IG9mZnNldCkKLXsKLQljaGFyICoqaHA7Ci0JaW50IGk7Ci0KLQlmb3IgKGhwID0geF9oaXN0cCAtIChzYW1lbGluZSA/IDAgOiAxKTsgaHAgPj0gaGlzdG9yeTsgLS1ocCkgewotCQlpID0geF9tYXRjaCgqaHAsIHBhdCk7Ci0JCWlmIChpID49IDApIHsKLQkJCWlmIChvZmZzZXQgPCAwKQotCQkJCXhfZV9wdXRjMignXG4nKTsKLQkJCXhfbG9hZF9oaXN0KGhwKTsKLQkJCXhfZ290byh4YnVmICsgaSArIHN0cmxlbihwYXQpIC0gKCpwYXQgPT0gJ14nKSk7Ci0JCQlyZXR1cm4gKGkpOwotCQl9Ci0JfQotCXhfZV9wdXRjMig3KTsKLQl4X2hpc3RwID0gaGlzdHB0cjsKLQlyZXR1cm4gKC0xKTsKLX0KLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0vKiBhbmNob3JlZCBzZWFyY2ggdXAgZnJvbSBjdXJyZW50IGxpbmUgKi8KLXN0YXRpYyBpbnQKLXhfc2VhcmNoX2hpc3RfdXAoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKHhfc2VhcmNoX2RpcigtMSkpOwotfQotCi0vKiBhbmNob3JlZCBzZWFyY2ggZG93biBmcm9tIGN1cnJlbnQgbGluZSAqLwotc3RhdGljIGludAoteF9zZWFyY2hfaGlzdF9kbihpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXJldHVybiAoeF9zZWFyY2hfZGlyKDEpKTsKLX0KLQotLyogYW5jaG9yZWQgc2VhcmNoIGluIHRoZSBpbmRpY2F0ZWQgZGlyZWN0aW9uICovCi1zdGF0aWMgaW50Ci14X3NlYXJjaF9kaXIoaW50IHNlYXJjaF9kaXIgLyogc2hvdWxkJ3ZlIGJlZW4gYm9vbCAqLykKLXsKLQljaGFyICoqaHAgPSB4X2hpc3RwICsgc2VhcmNoX2RpcjsKLQlzaXplX3QgY3VycyA9IHhjcCAtIHhidWY7Ci0KLQl3aGlsZSAoaGlzdHB0ciA+PSBocCAmJiBocCA+PSBoaXN0b3J5KSB7Ci0JCWlmIChzdHJuY21wKHhidWYsICpocCwgY3VycykgPT0gMCkgewotCQkJeF9sb2FkX2hpc3QoaHApOwotCQkJeF9nb3RvKHhidWYgKyBjdXJzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWhwICs9IHNlYXJjaF9kaXI7Ci0JfQotCXJldHVybiAoS1NURCk7Ci19Ci0jZW5kaWYKLQotLyogcmV0dXJuIHBvc2l0aW9uIG9mIGZpcnN0IG1hdGNoIG9mIHBhdHRlcm4gaW4gc3RyaW5nLCBlbHNlIC0xICovCi1zdGF0aWMgaW50Ci14X21hdGNoKGNoYXIgKnN0ciwgY2hhciAqcGF0KQotewotCWlmICgqcGF0ID09ICdeJykgewotCQlyZXR1cm4gKChzdHJuY21wKHN0ciwgcGF0ICsgMSwgc3RybGVuKHBhdCArIDEpKSA9PSAwKSA/IDAgOiAtMSk7Ci0JfSBlbHNlIHsKLQkJY2hhciAqcSA9IHN0cnN0cihzdHIsIHBhdCk7Ci0JCXJldHVybiAoKHEgPT0gTlVMTCkgPyAtMSA6IHEgLSBzdHIpOwotCX0KLX0KLQotc3RhdGljIGludAoteF9kZWxfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWludCBpLCBqOwotCi0JKnhlcCA9IDA7Ci0JaSA9IHhlcCAtIHhidWY7Ci0JaiA9IHhfc2l6ZV9zdHIoeGJ1Zik7Ci0JeGNwID0geGJ1ZjsKLQl4X3B1c2goaSk7Ci0JeGxwID0geGJwID0geGVwID0geGJ1ZjsKLQl4bHBfdmFsaWQgPSB0cnVlOwotCSp4Y3AgPSAwOwotCXhtcCA9IE5VTEw7Ci0JeF9yZWRyYXcoaik7Ci0JeF9tb2RpZmllZCgpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfZW5kKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9nb3RvKHhlcCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9tdl9iZWdpbihpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfZ290byh4YnVmKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2RyYXdfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfcmVkcmF3KC0xKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2VfcmVidWlsZGxpbmUoY29uc3QgY2hhciAqY2xyc3RyKQotewotCXNoZl9wdXRzKGNscnN0ciwgc2hsX291dCk7Ci0JeF9hZGp1c3QoKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2NscyhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXJldHVybiAoeF9lX3JlYnVpbGRsaW5lKE1LU0hfQ0xTX1NUUklORykpOwotfQotCi0vKiBSZWRyYXcgKHBhcnQgb2YpIHRoZSBsaW5lLiBJZiBsaW1pdCBpcyA8IDAsIHRoZSBldmVyeXRoaW5nIGlzIHJlZHJhd24KLSAqIG9uIGEgTkVXIGxpbmUsIG90aGVyd2lzZSBsaW1pdCBpcyB0aGUgc2NyZWVuIGNvbHVtbiB1cCB0byB3aGljaCBuZWVkcwotICogcmVkcmF3aW5nLgotICovCi1zdGF0aWMgdm9pZAoteF9yZWRyYXcoaW50IGxpbWl0KQotewotCWludCBpLCBqLCB4X3RydW5jID0gMDsKLQljaGFyICpjcDsKLQotCXhfYWRqX29rID0gMDsKLQlpZiAobGltaXQgPT0gLTEpCi0JCXhfZV9wdXRjMignXG4nKTsKLQllbHNlCi0JCXhfZV9wdXRjMignXHInKTsKLQl4X2ZsdXNoKCk7Ci0JaWYgKHhicCA9PSB4YnVmKSB7Ci0JCXhfY29sID0gcHJvbXB0bGVuKHByb21wdCk7Ci0JCWlmICh4X2NvbCA+PSB4eF9jb2xzKQotCQkJeF90cnVuYyA9ICh4X2NvbCAvIHh4X2NvbHMpICogeHhfY29sczsKLQkJaWYgKHByb21wdF9yZWRyYXcpCi0JCQlwcHJvbXB0KHByb21wdCwgeF90cnVuYyk7Ci0JfQotCWlmICh4X2NvbCA+PSB4eF9jb2xzKQotCQl4X2NvbCAlPSB4eF9jb2xzOwotCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyIC0geF9jb2w7Ci0JaWYgKHhfZGlzcGxlbiA8IDEpIHsKLQkJeF9jb2wgPSAwOwotCQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMjsKLQl9Ci0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JeF9sYXN0Y3AoKTsKLQl4X3pvdHMoeGJwKTsKLQlpZiAoeGJwICE9IHhidWYgfHwgeGVwID4geGxwKQotCQlsaW1pdCA9IHh4X2NvbHM7Ci0JaWYgKGxpbWl0ID49IDApIHsKLQkJaWYgKHhlcCA+IHhscCkKLQkJCWkgPSAwOwkJCS8qIHdlIGZpbGwgdGhlIGxpbmUgKi8KLQkJZWxzZSB7Ci0JCQljaGFyICpjcGwgPSB4YnA7Ci0KLQkJCWkgPSBsaW1pdDsKLQkJCXdoaWxlIChjcGwgPCB4bHApCi0JCQkJaSAtPSB4X3NpemUyKGNwbCwgJmNwbCk7Ci0JCX0KLQotCQlqID0gMDsKLQkJd2hpbGUgKChqIDwgaSkgfHwgKHhfY29sIDwgKHh4X2NvbHMgLSAyKSkpIHsKLQkJCWlmICghKHhfY29sIDwgKHh4X2NvbHMgLSAyKSkpCi0JCQkJYnJlYWs7Ci0JCQl4X2VfcHV0YzIoJyAnKTsKLQkJCWorKzsKLQkJfQotCQlpID0gJyAnOwotCQlpZiAoeGVwID4geGxwKSB7CQkvKiBtb3JlIG9mZiBzY3JlZW4gKi8KLQkJCWlmICh4YnAgPiB4YnVmKQotCQkJCWkgPSAnKic7Ci0JCQllbHNlCi0JCQkJaSA9ICc+JzsKLQkJfSBlbHNlIGlmICh4YnAgPiB4YnVmKQotCQkJaSA9ICc8JzsKLQkJeF9lX3B1dGMyKGkpOwotCQlqKys7Ci0JCXdoaWxlIChqLS0pCi0JCQl4X2VfcHV0YzIoJ1xiJyk7Ci0JfQotCWNwID0geGxwOwotCXdoaWxlIChjcCA+IHhjcCkKLQkJeF9iczMoJmNwKTsKLQl4X2Fkal9vayA9IDE7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci14X3RyYW5zcG9zZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXVuc2lnbmVkIGludCB0bXBhLCB0bXBiOwotCi0JLyogV2hhdCB0cmFuc3Bvc2UgaXMgbWVhbnQgdG8gZG8gc2VlbXMgdG8gYmUgdXAgZm9yIGRlYmF0ZS4gVGhpcwotCSAqIGlzIGEgZ2VuZXJhbCBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zOyB0aGUgdGV4dCBpcyBhYmNkIHdpdGggdGhlCi0JICogdXBwZXIgY2FzZSBjaGFyYWN0ZXIgb3IgdW5kZXJzY29yZSBpbmRpY2F0aW5nIHRoZSBjdXJzb3IgcG9zaXRpb246Ci0JICoJV2hvCQkJQmVmb3JlCUFmdGVyCUJlZm9yZQlBZnRlcgotCSAqCUFUJlQga3NoIGluIGVtYWNzIG1vZGU6CWFiQ2QJYWJkQwlhYmNkXwkoYmVsbCkKLQkgKglBVCZUIGtzaCBpbiBnbWFjcyBtb2RlOglhYkNkCWJhQ2QJYWJjZF8JYWJkY18KLQkgKglnbnUgZW1hY3M6CQlhYkNkCWFjYkQJYWJjZF8JYWJkY18KLQkgKiBQZGtzaCBjdXJyZW50bHkgZ29lcyB3aXRoIEdOVSBiZWhhdmlvciBzaW5jZSBJIGJlbGlldmUgdGhpcyBpcyB0aGUKLQkgKiBtb3N0IGNvbW1vbiB2ZXJzaW9uIG9mIGVtYWNzLCB1bmxlc3MgaW4gZ21hY3MgbW9kZSwgaW4gd2hpY2ggY2FzZQotCSAqIGl0IGRvZXMgdGhlIEFUJlQga3NoIGdtYWNzIG1vZGUuCi0JICogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGJyb2tlbiB1cCBpbnRvIDMgZnVuY3Rpb25zIHNvIHVzZXJzIGNhbiBiaW5kCi0JICogdG8gdGhlIG9uZSB0aGV5IHdhbnQuCi0JICovCi0JaWYgKHhjcCA9PSB4YnVmKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9IGVsc2UgaWYgKHhjcCA9PSB4ZXAgfHwgRmxhZyhGR01BQ1MpKSB7Ci0JCWlmICh4Y3AgLSB4YnVmID09IDEpIHsKLQkJCXhfZV9wdXRjMig3KTsKLQkJCXJldHVybiAoS1NURCk7Ci0JCX0KLQkJLyogR29zbGluZy9VbmlwcmVzcyBlbWFjcyBzdHlsZTogU3dhcCB0d28gY2hhcmFjdGVycyBiZWZvcmUgdGhlCi0JCSAqIGN1cnNvciwgZG8gbm90IGNoYW5nZSBjdXJzb3IgcG9zaXRpb24KLQkJICovCi0JCXhfYnMzKCZ4Y3ApOwotCQlpZiAodXRmX21idG93YygmdG1wYSwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCXhfYnMzKCZ4Y3ApOwotCQlpZiAodXRmX21idG93YygmdG1wYiwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCXV0Zl93Y3RvbWIoeGNwLCB0bXBhKTsKLQkJeF96b3RjMygmeGNwKTsKLQkJdXRmX3djdG9tYih4Y3AsIHRtcGIpOwotCQl4X3pvdGMzKCZ4Y3ApOwotCX0gZWxzZSB7Ci0JCS8qIEdOVSBlbWFjcyBzdHlsZTogU3dhcCB0aGUgY2hhcmFjdGVycyBiZWZvcmUgYW5kIHVuZGVyIHRoZQotCQkgKiBjdXJzb3IsIG1vdmUgY3Vyc29yIHBvc2l0aW9uIGFsb25nIG9uZS4KLQkJICovCi0JCWlmICh1dGZfbWJ0b3djKCZ0bXBhLCB4Y3ApID09IChzaXplX3QpLTEpIHsKLQkJCXhfZV9wdXRjMig3KTsKLQkJCXJldHVybiAoS1NURCk7Ci0JCX0KLQkJeF9iczMoJnhjcCk7Ci0JCWlmICh1dGZfbWJ0b3djKCZ0bXBiLCB4Y3ApID09IChzaXplX3QpLTEpIHsKLQkJCXhfZV9wdXRjMig3KTsKLQkJCXJldHVybiAoS1NURCk7Ci0JCX0KLQkJdXRmX3djdG9tYih4Y3AsIHRtcGEpOwotCQl4X3pvdGMzKCZ4Y3ApOwotCQl1dGZfd2N0b21iKHhjcCwgdG1wYik7Ci0JCXhfem90YzMoJnhjcCk7Ci0JfQotCXhfbW9kaWZpZWQoKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2xpdGVyYWwoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2N1cnByZWZpeCA9IC0xOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbWV0YTEoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2N1cnByZWZpeCA9IDE7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9tZXRhMihpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfY3VycHJlZml4ID0gMjsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2tpbGwoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgY29sID0geGNwIC0geGJ1ZjsKLQlpbnQgbGFzdGNvbCA9IHhlcCAtIHhidWY7Ci0JaW50IG5kZWw7Ci0KLQlpZiAoeF9hcmdfZGVmYXVsdGVkKQotCQl4X2FyZyA9IGxhc3Rjb2w7Ci0JZWxzZSBpZiAoeF9hcmcgPiBsYXN0Y29sKQotCQl4X2FyZyA9IGxhc3Rjb2w7Ci0JbmRlbCA9IHhfYXJnIC0gY29sOwotCWlmIChuZGVsIDwgMCkgewotCQl4X2dvdG8oeGJ1ZiArIHhfYXJnKTsKLQkJbmRlbCA9IC1uZGVsOwotCX0KLQl4X2RlbGV0ZShuZGVsLCB0cnVlKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgdm9pZAoteF9wdXNoKGludCBuY2hhcnMpCi17Ci0JY2hhciAqY3A7Ci0KLQlzdHJuZHVweChjcCwgeGNwLCBuY2hhcnMsIEFFRElUKTsKLQlpZiAoa2lsbHN0YWNrW2tpbGxzcF0pCi0JCWFmcmVlKGtpbGxzdGFja1traWxsc3BdLCBBRURJVCk7Ci0Ja2lsbHN0YWNrW2tpbGxzcF0gPSBjcDsKLQlraWxsc3AgPSAoa2lsbHNwICsgMSkgJSBLSUxMU0laRTsKLX0KLQotc3RhdGljIGludAoteF95YW5rKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaWYgKGtpbGxzcCA9PSAwKQotCQlraWxsdHAgPSBLSUxMU0laRTsKLQllbHNlCi0JCWtpbGx0cCA9IGtpbGxzcDsKLQlraWxsdHAtLTsKLQlpZiAoa2lsbHN0YWNrW2tpbGx0cF0gPT0gMCkgewotCQl4X2VfcHV0cygiXG5ub3RoaW5nIHRvIHlhbmsiKTsKLQkJeF9yZWRyYXcoLTEpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl4bXAgPSB4Y3A7Ci0JeF9pbnMoa2lsbHN0YWNrW2tpbGx0cF0pOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbWV0YV95YW5rKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IGxlbjsKLQotCWlmICgoeF9sYXN0X2NvbW1hbmQgIT0gWEZVTkNfeWFuayAmJiB4X2xhc3RfY29tbWFuZCAhPSBYRlVOQ19tZXRhX3lhbmspIHx8Ci0JICAgIGtpbGxzdGFja1traWxsdHBdID09IDApIHsKLQkJa2lsbHRwID0ga2lsbHNwOwotCQl4X2VfcHV0cygiXG55YW5rIHNvbWV0aGluZyBmaXJzdCIpOwotCQl4X3JlZHJhdygtMSk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCWxlbiA9IHN0cmxlbihraWxsc3RhY2tba2lsbHRwXSk7Ci0JeF9nb3RvKHhjcCAtIGxlbik7Ci0JeF9kZWxldGUobGVuLCBmYWxzZSk7Ci0JZG8gewotCQlpZiAoa2lsbHRwID09IDApCi0JCQlraWxsdHAgPSBLSUxMU0laRSAtIDE7Ci0JCWVsc2UKLQkJCWtpbGx0cC0tOwotCX0gd2hpbGUgKGtpbGxzdGFja1traWxsdHBdID09IDApOwotCXhfaW5zKGtpbGxzdGFja1traWxsdHBdKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2Fib3J0KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JLyogeF96b3RjKGMpOyAqLwotCXhscCA9IHhlcCA9IHhjcCA9IHhicCA9IHhidWY7Ci0JeGxwX3ZhbGlkID0gdHJ1ZTsKLQkqeGNwID0gMDsKLQl4X21vZGlmaWVkKCk7Ci0JcmV0dXJuIChLSU5UUik7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZXJyb3IoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2VfcHV0YzIoNyk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0vKiBzcGVjaWFsIFZUMTAwIHN0eWxlIGtleSBzZXF1ZW5jZSBoYWNrICovCi1zdGF0aWMgaW50Ci14X3Z0X2hhY2soaW50IGMpCi17Ci0JLyogd2Ugb25seSBzdXBwb3J0IFBGMi0nMScgZm9yIG5vdyAqLwotCWlmIChjICE9ICgyIDw8IDggfCAnMScpKQotCQlyZXR1cm4gKHhfZXJyb3IoYykpOwotCi0JLyogd2hhdCdzIHRoZSBuZXh0IGNoYXJhY3Rlcj8gKi8KLQlzd2l0Y2ggKChjID0geF9lX2dldGMoKSkpIHsKLQljYXNlICd+JzoKLQkJeF9hcmcgPSAxOwotCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOwotCQlyZXR1cm4gKHhfbXZfYmVnaW4oMCkpOwotCWNhc2UgJzsnOgotCQkvKiAiaW50ZXJlc3RpbmciIHNlcXVlbmNlIGRldGVjdGVkICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gdW53aW5kX2VycjsKLQl9Ci0KLQkvKiBYWFggeF9lX3VuZ2V0YyBpcyBvbmUtb2N0ZXQgb25seSAqLwotCWlmICgoYyA9IHhfZV9nZXRjKCkpICE9ICc1JyAmJiBjICE9ICczJykKLQkJZ290byB1bndpbmRfZXJyOwotCi0JLyotCi0JICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSByZWFkIHRoZSBmb2xsb3dpbmcgb2N0ZXRzIHNvIGZhcjoKLQkgKiAtIEVTQytbIG9yIEVTQytPIG9yIEN0cmwtWCAoUHLDpmZpeCAyKQotCSAqIC0gMSAodnRfaGFjaykKLQkgKiAtIDsKLQkgKiAtIDUgKEN0cmwga2V5IGNvbWJpbmVyKSBvciAzIChBbHQga2V5IGNvbWJpbmVyKQotCSAqIFdlIGNhbiBub3cgYWNjZXB0IG9uZSBtb3JlIG9jdGV0IGRlc2lnbmF0aW5nIHRoZSBrZXkuCi0JICovCi0KLQlzd2l0Y2ggKChjID0geF9lX2dldGMoKSkpIHsKLQljYXNlICdDJzoKLQkJcmV0dXJuICh4X212X2Z3b3JkKGMpKTsKLQljYXNlICdEJzoKLQkJcmV0dXJuICh4X212X2J3b3JkKGMpKTsKLQl9Ci0KLSB1bndpbmRfZXJyOgotCXhfZV91bmdldGMoYyk7Ci0JcmV0dXJuICh4X2Vycm9yKGMpKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqCi14X21hcGluKGNvbnN0IGNoYXIgKmNwLCBBcmVhICphcCkKLXsKLQljaGFyICpuZXdzLCAqb3A7Ci0KLQkvKiBmb3IgY2xhbmcncyBzdGF0aWMgYW5hbHlzZXIsIHRoZSBub25udWxsIGF0dHJpYnV0ZSBpc24ndCBlbm91Z2ggKi8KLQlta3NzZXJ0KGNwICE9IE5VTEwpOwotCi0Jc3RyZHVweChuZXdzLCBjcCwgYXApOwotCW9wID0gbmV3czsKLQl3aGlsZSAoKmNwKSB7Ci0JCS8qIFhYWCAtLSBzaG91bGQgaGFuZGxlIFxeIGVzY2FwZT8gKi8KLQkJaWYgKCpjcCA9PSAnXicpIHsKLQkJCWNwKys7Ci0JCQlpZiAoKmNwID49ICc/JykJLyogaW5jbHVkZXMgJz8nOyBBU0NJSSAqLwotCQkJCSpvcCsrID0gQ1RSTCgqY3ApOwotCQkJZWxzZSB7Ci0JCQkJKm9wKysgPSAnXic7Ci0JCQkJY3AtLTsKLQkJCX0KLQkJfSBlbHNlCi0JCQkqb3ArKyA9ICpjcDsKLQkJY3ArKzsKLQl9Ci0JKm9wID0gJ1wwJzsKLQotCXJldHVybiAobmV3cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X21hcG91dDIoaW50IGMsIGNoYXIgKipidWYpCi17Ci0JY2hhciAqcCA9ICpidWY7Ci0KLQlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKLQkJKnArKyA9ICdeJzsKLQkJKnArKyA9IFVOQ1RSTChjKTsKLQl9IGVsc2UKLQkJKnArKyA9IGM7Ci0JKnAgPSAwOwotCSpidWYgPSBwOwotfQotCi1zdGF0aWMgY2hhciAqCi14X21hcG91dChpbnQgYykKLXsKLQlzdGF0aWMgY2hhciBidWZbOF07Ci0JY2hhciAqYnAgPSBidWY7Ci0KLQl4X21hcG91dDIoYywgJmJwKTsKLQlyZXR1cm4gKGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X3ByaW50KGludCBwcmVmaXgsIGludCBrZXkpCi17Ci0JaW50IGYgPSB4X3RhYltwcmVmaXhdW2tleV07Ci0KLQlpZiAocHJlZml4KQotCQkvKiBwcmVmaXggPT0gMSB8fCBwcmVmaXggPT0gMiAqLwotCQlzaGZfcHV0cyh4X21hcG91dChwcmVmaXggPT0gMSA/Ci0JCSAgICBDVFJMKCdbJykgOiBDVFJMKCdYJykpLCBzaGxfc3Rkb3V0KTsKLSNpZmRlZiBNS1NIX1NNQUxMCi0Jc2hwcmludGYoIiVzID0gIiwgeF9tYXBvdXQoa2V5KSk7Ci0jZWxzZQotCXNocHJpbnRmKCIlcyVzID0gIiwgeF9tYXBvdXQoa2V5KSwgKGYgJiAweDgwKSA/ICJ+IiA6ICIiKTsKLQlpZiAoWEZVTkNfVkFMVUUoZikgIT0gWEZVTkNfaW5zX3N0cmluZykKLSNlbmRpZgotCQlzaHByaW50ZigiJXNcbiIsIHhfZnRhYltYRlVOQ19WQUxVRShmKV0ueGZfbmFtZSk7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQllbHNlCi0JCXNocHJpbnRmKCInJXMnXG4iLCB4X2F0YWJbcHJlZml4XVtrZXldKTsKLSNlbmRpZgotfQotCi1pbnQKLXhfYmluZChjb25zdCBjaGFyICphMSwgY29uc3QgY2hhciAqYTIsCi0jaWZuZGVmIE1LU0hfU01BTEwKLSAgICBib29sIG1hY3JvLAkJCS8qIGJpbmQgLW0gKi8KLSNlbmRpZgotICAgIGJvb2wgbGlzdCkJCQkvKiBiaW5kIC1sICovCi17Ci0JdW5zaWduZWQgY2hhciBmOwotCWludCBwcmVmaXgsIGtleTsKLQljaGFyICptMSwgKm0yOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JY2hhciAqc3AgPSBOVUxMOwotCWJvb2wgaGFzdGlsZGU7Ci0jZW5kaWYKLQotCWlmICh4X3RhYiA9PSBOVUxMKSB7Ci0JCWJpX2Vycm9yZigiY2Fubm90IGJpbmQsIG5vdCBhIHR0eSIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQkvKiBMaXN0IGZ1bmN0aW9uIG5hbWVzICovCi0JaWYgKGxpc3QpIHsKLQkJZm9yIChmID0gMDsgZiA8IE5FTEVNKHhfZnRhYik7IGYrKykKLQkJCWlmICh4X2Z0YWJbZl0ueGZfbmFtZSAmJgotCQkJICAgICEoeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfTk9CSU5EKSkKLQkJCQlzaHByaW50ZigiJXNcbiIsIHhfZnRhYltmXS54Zl9uYW1lKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGExID09IE5VTEwpIHsKLQkJZm9yIChwcmVmaXggPSAwOyBwcmVmaXggPCBYX05UQUJTOyBwcmVmaXgrKykKLQkJCWZvciAoa2V5ID0gMDsga2V5IDwgWF9UQUJTWjsga2V5KyspIHsKLQkJCQlmID0gWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKTsKLQkJCQlpZiAoZiA9PSBYRlVOQ19pbnNlcnQgfHwgZiA9PSBYRlVOQ19lcnJvcgotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCQkJICAgIHx8IChtYWNybyAmJiBmICE9IFhGVU5DX2luc19zdHJpbmcpCi0jZW5kaWYKLQkJCQkgICAgKQotCQkJCQljb250aW51ZTsKLQkJCQl4X3ByaW50KHByZWZpeCwga2V5KTsKLQkJCX0KLQkJcmV0dXJuICgwKTsKLQl9Ci0JbTIgPSBtMSA9IHhfbWFwaW4oYTEsIEFURU1QKTsKLQlwcmVmaXggPSAwOwotCWZvciAoOzsgbTErKykgewotCQlrZXkgPSAodW5zaWduZWQgY2hhcikqbTE7Ci0JCWYgPSBYRlVOQ19WQUxVRSh4X3RhYltwcmVmaXhdW2tleV0pOwotCQlpZiAoZiA9PSBYRlVOQ19tZXRhMSkKLQkJCXByZWZpeCA9IDE7Ci0JCWVsc2UgaWYgKGYgPT0gWEZVTkNfbWV0YTIpCi0JCQlwcmVmaXggPSAyOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0JaWYgKCorK20xCi0jaWZuZGVmIE1LU0hfU01BTEwKLQkgICAgJiYgKCgqbTEgIT0gJ34nKSB8fCAqKG0xICsgMSkpCi0jZW5kaWYKLQkgICAgKSB7Ci0JCWNoYXIgbXNnWzI1Nl0gPSAia2V5IHNlcXVlbmNlICciOwotCQljb25zdCBjaGFyICpjID0gYTE7Ci0JCW0xID0gbXNnICsgc3RybGVuKG1zZyk7Ci0JCXdoaWxlICgqYyAmJiBtMSA8IChtc2cgKyBzaXplb2YobXNnKSAtIDMpKQotCQkJeF9tYXBvdXQyKCpjKyssICZtMSk7Ci0JCWJpX2Vycm9yZigiJXMnIHRvbyBsb25nIiwgbXNnKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQloYXN0aWxkZSA9ICptMTsKLSNlbmRpZgotCWFmcmVlKG0yLCBBVEVNUCk7Ci0KLQlpZiAoYTIgPT0gTlVMTCkgewotCQl4X3ByaW50KHByZWZpeCwga2V5KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKCphMiA9PSAwKSB7Ci0JCWYgPSBYRlVOQ19pbnNlcnQ7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQl9IGVsc2UgaWYgKG1hY3JvKSB7Ci0JCWYgPSBYRlVOQ19pbnNfc3RyaW5nOwotCQlzcCA9IHhfbWFwaW4oYTIsIEFFRElUKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCWZvciAoZiA9IDA7IGYgPCBORUxFTSh4X2Z0YWIpOyBmKyspCi0JCQlpZiAoeF9mdGFiW2ZdLnhmX25hbWUgJiYKLQkJCSAgICBzdHJjbXAoeF9mdGFiW2ZdLnhmX25hbWUsIGEyKSA9PSAwKQotCQkJCWJyZWFrOwotCQlpZiAoZiA9PSBORUxFTSh4X2Z0YWIpIHx8IHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX05PQklORCkgewotCQkJYmlfZXJyb3JmKCIlczogbm8gc3VjaCBmdW5jdGlvbiIsIGEyKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl9Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCWlmIChYRlVOQ19WQUxVRSh4X3RhYltwcmVmaXhdW2tleV0pID09IFhGVU5DX2luc19zdHJpbmcgJiYKLQkgICAgeF9hdGFiW3ByZWZpeF1ba2V5XSkKLQkJYWZyZWUoeF9hdGFiW3ByZWZpeF1ba2V5XSwgQUVESVQpOwotI2VuZGlmCi0JeF90YWJbcHJlZml4XVtrZXldID0gZgotI2lmbmRlZiBNS1NIX1NNQUxMCi0JICAgIHwgKGhhc3RpbGRlID8gMHg4MCA6IDApCi0jZW5kaWYKLQkgICAgOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JeF9hdGFiW3ByZWZpeF1ba2V5XSA9IHNwOwotI2VuZGlmCi0KLQkvKiBUcmFjayB3aGF0IHRoZSB1c2VyIGhhcyBib3VuZCBzbyB4X21vZGUodHJ1ZSkgd29uJ3QgdG9hc3QgdGhpbmdzICovCi0JaWYgKGYgPT0gWEZVTkNfaW5zZXJ0KQotCQl4X2JvdW5kWyhwcmVmaXggKiBYX1RBQlNaICsga2V5KSAvIDhdICY9Ci0JCSAgICB+KDEgPDwgKChwcmVmaXggKiBYX1RBQlNaICsga2V5KSAlIDgpKTsKLQllbHNlCi0JCXhfYm91bmRbKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpIC8gOF0gfD0KLQkJICAgICgxIDw8ICgocHJlZml4ICogWF9UQUJTWiArIGtleSkgJSA4KSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAoteF9pbml0X2VtYWNzKHZvaWQpCi17Ci0JaW50IGksIGo7Ci0KLQlhaW5pdChBRURJVCk7Ci0JeF9uZXh0Y21kID0gLTE7Ci0KLQl4X3RhYiA9IGFsbG9jKFhfTlRBQlMgKiBzaXplb2YoKnhfdGFiKSwgQUVESVQpOwotCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCi0JCXhfdGFiWzBdW2pdID0gWEZVTkNfaW5zZXJ0OwotCWZvciAoaSA9IDE7IGkgPCBYX05UQUJTOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCi0JCQl4X3RhYltpXVtqXSA9IFhGVU5DX2Vycm9yOwotCWZvciAoaSA9IDA7IGkgPCAoaW50KU5FTEVNKHhfZGVmYmluZGluZ3MpOyBpKyspCi0JCXhfdGFiW3hfZGVmYmluZGluZ3NbaV0ueGRiX3RhYl1beF9kZWZiaW5kaW5nc1tpXS54ZGJfY2hhcl0KLQkJICAgID0geF9kZWZiaW5kaW5nc1tpXS54ZGJfZnVuYzsKLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JeF9hdGFiID0gYWxsb2MoWF9OVEFCUyAqIHNpemVvZigqeF9hdGFiKSwgQUVESVQpOwotCWZvciAoaSA9IDE7IGkgPCBYX05UQUJTOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCi0JCQl4X2F0YWJbaV1bal0gPSBOVUxMOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1iaW5kX2lmX25vdF9ib3VuZChpbnQgcCwgaW50IGssIGludCBmdW5jKQotewotCS8qIEhhcyB1c2VyIGFscmVhZHkgYm91bmQgdGhpcyBrZXk/IElmIHNvLCBkb24ndCBvdmVycmlkZSBpdCAqLwotCWlmICh4X2JvdW5kWygocCkgKiBYX1RBQlNaICsgKGspKSAvIDhdICYKLQkgICAgKDEgPDwgKCgocCkgKiBYX1RBQlNaICsgKGspKSAlIDgpKSkKLQkJcmV0dXJuOwotCi0JeF90YWJbcF1ba10gPSBmdW5jOwotfQotCi1zdGF0aWMgaW50Ci14X3NldF9tYXJrKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeG1wID0geGNwOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfa2lsbF9yZWdpb24oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgcnNpemU7Ci0JY2hhciAqeHI7Ci0KLQlpZiAoeG1wID09IE5VTEwpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQlpZiAoeG1wID4geGNwKSB7Ci0JCXJzaXplID0geG1wIC0geGNwOwotCQl4ciA9IHhjcDsKLQl9IGVsc2UgewotCQlyc2l6ZSA9IHhjcCAtIHhtcDsKLQkJeHIgPSB4bXA7Ci0JfQotCXhfZ290byh4cik7Ci0JeF9kZWxldGUocnNpemUsIHRydWUpOwotCXhtcCA9IHhyOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfeGNoZ19wb2ludF9tYXJrKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqdG1wOwotCi0JaWYgKHhtcCA9PSBOVUxMKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JdG1wID0geG1wOwotCXhtcCA9IHhjcDsKLQl4X2dvdG8odG1wKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X25vb3AoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi0vKgotICoJRmlsZS9jb21tYW5kIG5hbWUgY29tcGxldGlvbiByb3V0aW5lcwotICovCi1zdGF0aWMgaW50Ci14X2NvbXBfY29tbShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5ELCBDVF9DT01QTEVURSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9saXN0X2NvbW0oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORCwgQ1RfTElTVCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9jb21wbGV0ZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0NPTVBMRVRFKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2VudW1lcmF0ZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0xJU1QpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfY29tcF9maWxlKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JZG9fY29tcGxldGUoWENGX0ZJTEUsIENUX0NPTVBMRVRFKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2xpc3RfZmlsZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9GSUxFLCBDVF9MSVNUKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2NvbXBfbGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0NPTVBMSVNUKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2V4cGFuZChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKip3b3JkczsKLQlpbnQgc3RhcnQsIGVuZCwgbndvcmRzLCBpOwotCWJvb2wgaXNfY29tbWFuZDsKLQotCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfRklMRSwgeGJ1ZiwgeGVwIC0geGJ1ZiwgeGNwIC0geGJ1ZiwKLQkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKLQotCWlmIChud29yZHMgPT0gMCkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXhfZ290byh4YnVmICsgc3RhcnQpOwotCXhfZGVsZXRlKGVuZCAtIHN0YXJ0LCBmYWxzZSk7Ci0JZm9yIChpID0gMDsgaSA8IG53b3JkczspIHsKLQkJaWYgKHhfZXNjYXBlKHdvcmRzW2ldLCBzdHJsZW4od29yZHNbaV0pLCB4X2RvX2lucykgPCAwIHx8Ci0JCSAgICAoKytpIDwgbndvcmRzICYmIHhfaW5zKCIgIikgPCAwKSkgewotCQkJeF9lX3B1dGMyKDcpOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCX0KLQl4X2FkanVzdCgpOwotCi0JcmV0dXJuIChLU1REKTsKLX0KLQotLyogdHlwZSA9PSAwIGZvciBsaXN0LCAxIGZvciBjb21wbGV0ZSBhbmQgMiBmb3IgY29tcGxldGUtbGlzdCAqLwotc3RhdGljIHZvaWQKLWRvX2NvbXBsZXRlKGludCBmbGFncywJLyogWENGX3tDT01NQU5ELEZJTEUsQ09NTUFORF9GSUxFfSAqLwotICAgIENvbXBfdHlwZSB0eXBlKQotewotCWNoYXIgKip3b3JkczsKLQlpbnQgc3RhcnQsIGVuZCwgbmxlbiwgb2xlbiwgbndvcmRzOwotCWJvb2wgaXNfY29tbWFuZCwgY29tcGxldGVkID0gZmFsc2U7Ci0KLQlud29yZHMgPSB4X2NmX2dsb2IoZmxhZ3MsIHhidWYsIHhlcCAtIHhidWYsIHhjcCAtIHhidWYsCi0JICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7Ci0JLyogbm8gbWF0Y2ggKi8KLQlpZiAobndvcmRzID09IDApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm47Ci0JfQotCWlmICh0eXBlID09IENUX0xJU1QpIHsKLQkJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOwotCQl4X3JlZHJhdygwKTsKLQkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOwotCQlyZXR1cm47Ci0JfQotCW9sZW4gPSBlbmQgLSBzdGFydDsKLQlubGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKTsKLQkvKiBjb21wbGV0ZSAqLwotCWlmIChud29yZHMgPT0gMSB8fCBubGVuID4gb2xlbikgewotCQl4X2dvdG8oeGJ1ZiArIHN0YXJ0KTsKLQkJeF9kZWxldGUob2xlbiwgZmFsc2UpOwotCQl4X2VzY2FwZSh3b3Jkc1swXSwgbmxlbiwgeF9kb19pbnMpOwotCQl4X2FkanVzdCgpOwotCQljb21wbGV0ZWQgPSB0cnVlOwotCX0KLQkvKiBhZGQgc3BhY2UgaWYgc2luZ2xlIG5vbi1kaXIgbWF0Y2ggKi8KLQlpZiAobndvcmRzID09IDEgJiYgd29yZHNbMF1bbmxlbiAtIDFdICE9ICcvJykgewotCQl4X2lucygiICIpOwotCQljb21wbGV0ZWQgPSB0cnVlOwotCX0KLQlpZiAodHlwZSA9PSBDVF9DT01QTElTVCAmJiAhY29tcGxldGVkKSB7Ci0JCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKLQkJY29tcGxldGVkID0gdHJ1ZTsKLQl9Ci0JaWYgKGNvbXBsZXRlZCkKLQkJeF9yZWRyYXcoMCk7Ci0KLQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7Ci19Ci0KLS8qIE5BTUU6Ci0gKgl4X2FkanVzdCAtIHJlZHJhdyB0aGUgbGluZSBhZGp1c3Rpbmcgc3RhcnRpbmcgcG9pbnQgZXRjLgotICoKLSAqIERFU0NSSVBUSU9OOgotICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGV4Y2VlZGVkIHRoZSBib3VuZHMKLSAqCW9mIHRoZSBlZGl0IHdpbmRvdy4gSXQgaW5jcmVtZW50cyB4X2Fkal9kb25lIHNvIHRoYXQKLSAqCWZ1bmN0aW9ucyBsaWtlIHhfaW5zIGFuZCB4X2RlbGV0ZSBrbm93IHRoYXQgd2UgaGF2ZSBiZWVuCi0gKgljYWxsZWQgYW5kIGNhbiBza2lwIHRoZSB4X2JzKCkgc3R1ZmYgd2hpY2ggaGFzIGFscmVhZHkKLSAqCWJlZW4gZG9uZSBieSB4X3JlZHJhdy4KLSAqCi0gKiBSRVRVUk4gVkFMVUU6Ci0gKglOb25lCi0gKi8KLXN0YXRpYyB2b2lkCi14X2FkanVzdCh2b2lkKQotewotCXhfYWRqX2RvbmUrKzsJCQkvKiBmbGFnIHRoZSBmYWN0IHRoYXQgd2Ugd2VyZSBjYWxsZWQuICovCi0JLyoKLQkgKiB3ZSBoYWQgYSBwcm9ibGVtIGlmIHRoZSBwcm9tcHQgbGVuZ3RoID4geHhfY29scyAvIDIKLQkgKi8KLQlpZiAoKHhicCA9IHhjcCAtICh4X2Rpc3BsZW4gLyAyKSkgPCB4YnVmKQotCQl4YnAgPSB4YnVmOwotCWlmIChVVEZNT0RFKQotCQl3aGlsZSAoKHhicCA+IHhidWYpICYmICgoKnhicCAmIDB4QzApID09IDB4ODApKQotCQkJLS14YnA7Ci0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JeF9yZWRyYXcoeHhfY29scyk7Ci0JeF9mbHVzaCgpOwotfQotCi1zdGF0aWMgdm9pZAoteF9lX3VuZ2V0YyhpbnQgYykKLXsKLQl1bmdldF9jaGFyID0gYyA8IDAgPyAtMSA6IChjICYgMjU1KTsKLX0KLQotc3RhdGljIGludAoteF9lX2dldGModm9pZCkKLXsKLQlpbnQgYzsKLQotCWlmICh1bmdldF9jaGFyID49IDApIHsKLQkJYyA9IHVuZ2V0X2NoYXI7Ci0JCXVuZ2V0X2NoYXIgPSAtMTsKLQkJcmV0dXJuIChjKTsKLQl9Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCWlmIChtYWNyb3B0cikgewotCQlpZiAoKGMgPSAodW5zaWduZWQgY2hhcikqbWFjcm9wdHIrKykpCi0JCQlyZXR1cm4gKGMpOwotCQltYWNyb3B0ciA9IE5VTEw7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gKHhfZ2V0YygpKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfZV9wdXRjMihpbnQgYykKLXsKLQlpbnQgd2lkdGggPSAxOwotCi0JaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCXhfY29sID0gMDsKLQlpZiAoeF9jb2wgPCB4eF9jb2xzKSB7Ci0JCWlmIChVVEZNT0RFICYmIChjID4gMHg3RikpIHsKLQkJCWNoYXIgdXRmX3RtcFszXTsKLQkJCXNpemVfdCB4OwotCi0JCQlpZiAoYyA8IDB4QTApCi0JCQkJYyA9IDB4RkZGRDsKLQkJCXggPSB1dGZfd2N0b21iKHV0Zl90bXAsIGMpOwotCQkJeF9wdXRjKHV0Zl90bXBbMF0pOwotCQkJaWYgKHggPiAxKQotCQkJCXhfcHV0Yyh1dGZfdG1wWzFdKTsKLQkJCWlmICh4ID4gMikKLQkJCQl4X3B1dGModXRmX3RtcFsyXSk7Ci0JCQl3aWR0aCA9IHV0Zl93Y3dpZHRoKGMpOwotCQl9IGVsc2UKLQkJCXhfcHV0YyhjKTsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgNzoKLQkJCWJyZWFrOwotCQljYXNlICdccic6Ci0JCWNhc2UgJ1xuJzoKLQkJCWJyZWFrOwotCQljYXNlICdcYic6Ci0JCQl4X2NvbC0tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl4X2NvbCArPSB3aWR0aDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICh4X2Fkal9vayAmJiAoeF9jb2wgPCAwIHx8IHhfY29sID49ICh4eF9jb2xzIC0gMikpKQotCQl4X2FkanVzdCgpOwotfQotCi1zdGF0aWMgdm9pZAoteF9lX3B1dGMzKGNvbnN0IGNoYXIgKipjcCkKLXsKLQlpbnQgd2lkdGggPSAxLCBjID0gKiooY29uc3QgdW5zaWduZWQgY2hhciAqKiljcDsKLQotCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCQl4X2NvbCA9IDA7Ci0JaWYgKHhfY29sIDwgeHhfY29scykgewotCQlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKSB7Ci0JCQljaGFyICpjcDI7Ci0KLQkJCXdpZHRoID0gdXRmX3dpZHRoYWRqKCpjcCwgKGNvbnN0IGNoYXIgKiopJmNwMik7Ci0JCQl3aGlsZSAoKmNwIDwgY3AyKQotCQkJCXhfcHV0Y2YoKigqY3ApKyspOwotCQl9IGVsc2UgewotCQkJKCpjcCkrKzsKLQkJCXhfcHV0YyhjKTsKLQkJfQotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSA3OgotCQkJYnJlYWs7Ci0JCWNhc2UgJ1xyJzoKLQkJY2FzZSAnXG4nOgotCQkJYnJlYWs7Ci0JCWNhc2UgJ1xiJzoKLQkJCXhfY29sLS07Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXhfY29sICs9IHdpZHRoOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHhfYWRqX29rICYmICh4X2NvbCA8IDAgfHwgeF9jb2wgPj0gKHh4X2NvbHMgLSAyKSkpCi0JCXhfYWRqdXN0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X2VfcHV0cyhjb25zdCBjaGFyICpzKQotewotCWludCBhZGogPSB4X2Fkal9kb25lOwotCi0Jd2hpbGUgKCpzICYmIGFkaiA9PSB4X2Fkal9kb25lKQotCQl4X2VfcHV0YzMoJnMpOwotfQotCi0vKiBOQU1FOgotICoJeF9zZXRfYXJnIC0gc2V0IGFuIGFyZyB2YWx1ZSBmb3IgbmV4dCBmdW5jdGlvbgotICoKLSAqIERFU0NSSVBUSU9OOgotICoJVGhpcyBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBNLVswLTldLgotICoKLSAqIFJFVFVSTiBWQUxVRToKLSAqCUtTVEQKLSAqLwotc3RhdGljIGludAoteF9zZXRfYXJnKGludCBjKQotewotCWludCBuID0gMCwgZmlyc3QgPSAxOwotCi0JYyAmPSAyNTU7CS8qIHN0cmlwIGNvbW1hbmQgcHJlZml4ICovCi0JZm9yICg7IGMgPj0gMCAmJiBrc2hfaXNkaWdpdChjKTsgYyA9IHhfZV9nZXRjKCksIGZpcnN0ID0gMCkKLQkJbiA9IG4gKiAxMCArIChjIC0gJzAnKTsKLQlpZiAoYyA8IDAgfHwgZmlyc3QpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQl4X2FyZyA9IDE7Ci0JCXhfYXJnX2RlZmF1bHRlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJeF9lX3VuZ2V0YyhjKTsKLQkJeF9hcmcgPSBuOwotCQl4X2FyZ19kZWZhdWx0ZWQgPSAwOwotCX0KLQlyZXR1cm4gKEtTVEQpOwotfQotCi0vKiBDb21tZW50IG9yIHVuY29tbWVudCB0aGUgY3VycmVudCBsaW5lLiAqLwotc3RhdGljIGludAoteF9jb21tZW50KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IG9sZHNpemUgPSB4X3NpemVfc3RyKHhidWYpOwotCWludCBsZW4gPSB4ZXAgLSB4YnVmOwotCWludCByZXQgPSB4X2RvX2NvbW1lbnQoeGJ1ZiwgeGVuZCAtIHhidWYsICZsZW4pOwotCi0JaWYgKHJldCA8IDApCi0JCXhfZV9wdXRjMig3KTsKLQllbHNlIHsKLQkJeF9tb2RpZmllZCgpOwotCQl4ZXAgPSB4YnVmICsgbGVuOwotCQkqeGVwID0gJ1wwJzsKLQkJeGNwID0geGJwID0geGJ1ZjsKLQkJeF9yZWRyYXcob2xkc2l6ZSk7Ci0JCWlmIChyZXQgPiAwKQotCQkJcmV0dXJuICh4X25ld2xpbmUoJ1xuJykpOwotCX0KLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X3ZlcnNpb24oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQljaGFyICpvX3hidWYgPSB4YnVmLCAqb194ZW5kID0geGVuZDsKLQljaGFyICpvX3hicCA9IHhicCwgKm9feGVwID0geGVwLCAqb194Y3AgPSB4Y3A7Ci0JaW50IHZsZW4sIGxpbSA9IHhfbGFzdGNwKCkgLSB4YnA7Ci0JY2hhciAqdjsKLQotCXN0cmR1cHgodiwgS1NIX1ZFUlNJT04sIEFURU1QKTsKLQotCXhidWYgPSB4YnAgPSB4Y3AgPSB2OwotCXhlbmQgPSB4ZXAgPSB2ICsgKHZsZW4gPSBzdHJsZW4odikpOwotCXhfcmVkcmF3KGxpbSk7Ci0JeF9mbHVzaCgpOwotCi0JYyA9IHhfZV9nZXRjKCk7Ci0JeGJ1ZiA9IG9feGJ1ZjsKLQl4ZW5kID0gb194ZW5kOwotCXhicCA9IG9feGJwOwotCXhlcCA9IG9feGVwOwotCXhjcCA9IG9feGNwOwotCXhfcmVkcmF3KHZsZW4pOwotCi0JaWYgKGMgPCAwKQotCQlyZXR1cm4gKEtTVEQpOwotCS8qIFRoaXMgaXMgd2hhdCBBVCZUIGtzaCBzZWVtcyB0byBkby4uLiBWZXJ5IGJpemFycmUgKi8KLQlpZiAoYyAhPSAnICcpCi0JCXhfZV91bmdldGMoYyk7Ci0KLQlhZnJlZSh2LCBBVEVNUCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgaW50Ci14X2VkaXRfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWlmICh4X2FyZ19kZWZhdWx0ZWQpIHsKLQkJaWYgKHhlcCA9PSB4YnVmKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCWlmIChtb2RpZmllZCkgewotCQkJKnhlcCA9ICdcMCc7Ci0JCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCB4YnVmLCB0cnVlLCB0cnVlKTsKLQkJCXhfYXJnID0gMDsKLQkJfSBlbHNlCi0JCQl4X2FyZyA9IHNvdXJjZS0+bGluZSAtIChoaXN0cHRyIC0geF9oaXN0cCk7Ci0JfQotCWlmICh4X2FyZykKLQkJc2hmX3NucHJpbnRmKHhidWYsIHhlbmQgLSB4YnVmLCAiJXMgJWQiLAotCQkgICAgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsIHhfYXJnKTsKLQllbHNlCi0JCXN0cmxjcHkoeGJ1ZiwgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsIHhlbmQgLSB4YnVmKTsKLQl4ZXAgPSB4YnVmICsgc3RybGVuKHhidWYpOwotCXJldHVybiAoeF9uZXdsaW5lKCdcbicpKTsKLX0KLSNlbmRpZgotCi0vKiBOQU1FOgotICoJeF9wcmV2X2hpc3R3b3JkIC0gcmVjb3ZlciB3b3JkIGZyb20gcHJldiBjb21tYW5kCi0gKgotICogREVTQ1JJUFRJT046Ci0gKglUaGlzIGZ1bmN0aW9uIHJlY292ZXJzIHRoZSBsYXN0IHdvcmQgZnJvbSB0aGUgcHJldmlvdXMKLSAqCWNvbW1hbmQgYW5kIGluc2VydHMgaXQgaW50byB0aGUgY3VycmVudCBlZGl0IGxpbmUuIElmIGEKLSAqCW51bWVyaWMgYXJnIGlzIHN1cHBsaWVkIHRoZW4gdGhlIG4ndGggd29yZCBmcm9tIHRoZQotICoJc3RhcnQgb2YgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgdXNlZC4KLSAqCUFzIGEgc2lkZSBlZmZlY3QsIHRyYXNoZXMgdGhlIG1hcmsgaW4gb3JkZXIgdG8gYWNoaWV2ZQotICoJYmVpbmcgY2FsbGVkIGluIGEgcmVwZWF0YWJsZSBmYXNoaW9uLgotICoKLSAqCUJvdW5kIHRvIE0tLgotICoKLSAqIFJFVFVSTiBWQUxVRToKLSAqCUtTVEQKLSAqLwotc3RhdGljIGludAoteF9wcmV2X2hpc3R3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqcmNwLCAqY3A7Ci0JY2hhciAqKnhocDsKLQlpbnQgbTsKLQotCWlmICh4bXAgJiYgbW9kaWZpZWQgPiAxKQotCQl4X2tpbGxfcmVnaW9uKDApOwotCW0gPSBtb2RpZmllZCA/IG1vZGlmaWVkIDogMTsKLQl4aHAgPSBoaXN0cHRyIC0gKG0gLSAxKTsKLQlpZiAoKHhocCA8IGhpc3RvcnkpIHx8ICEoY3AgPSAqeGhwKSkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXhfbW9kaWZpZWQoKTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JeF9zZXRfbWFyaygwKTsKLQlpZiAoeF9hcmdfZGVmYXVsdGVkKSB7Ci0JCXJjcCA9ICZjcFtzdHJsZW4oY3ApIC0gMV07Ci0JCS8qCi0JCSAqIGlnbm9yZSB3aGl0ZS1zcGFjZSBhZnRlciB0aGUgbGFzdCB3b3JkCi0JCSAqLwotCQl3aGlsZSAocmNwID4gY3AgJiYgaXNfY2ZzKCpyY3ApKQotCQkJcmNwLS07Ci0JCXdoaWxlIChyY3AgPiBjcCAmJiAhaXNfY2ZzKCpyY3ApKQotCQkJcmNwLS07Ci0JCWlmIChpc19jZnMoKnJjcCkpCi0JCQlyY3ArKzsKLQkJeF9pbnMocmNwKTsKLQl9IGVsc2UgewotCQljaGFyIGNoOwotCi0JCXJjcCA9IGNwOwotCQkvKgotCQkgKiBpZ25vcmUgd2hpdGUtc3BhY2UgYXQgc3RhcnQgb2YgbGluZQotCQkgKi8KLQkJd2hpbGUgKCpyY3AgJiYgaXNfY2ZzKCpyY3ApKQotCQkJcmNwKys7Ci0JCXdoaWxlICh4X2FyZy0tID4gMSkgewotCQkJd2hpbGUgKCpyY3AgJiYgIWlzX2NmcygqcmNwKSkKLQkJCQlyY3ArKzsKLQkJCXdoaWxlICgqcmNwICYmIGlzX2NmcygqcmNwKSkKLQkJCQlyY3ArKzsKLQkJfQotCQljcCA9IHJjcDsKLQkJd2hpbGUgKCpyY3AgJiYgIWlzX2NmcygqcmNwKSkKLQkJCXJjcCsrOwotCQljaCA9ICpyY3A7Ci0JCSpyY3AgPSAnXDAnOwotCQl4X2lucyhjcCk7Ci0JCSpyY3AgPSBjaDsKLQl9Ci0JbW9kaWZpZWQgPSBtICsgMTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi0jaWZuZGVmIE1LU0hfU01BTEwKLS8qIFVwcGVyY2FzZSBOKDEpIHdvcmRzICovCi1zdGF0aWMgaW50Ci14X2ZvbGRfdXBwZXIoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKHhfZm9sZF9jYXNlKCdVJykpOwotfQotCi0vKiBMb3dlcmNhc2UgTigxKSB3b3JkcyAqLwotc3RhdGljIGludAoteF9mb2xkX2xvd2VyKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuICh4X2ZvbGRfY2FzZSgnTCcpKTsKLX0KLQotLyogTG93ZXJjYXNlIE4oMSkgd29yZHMgKi8KLXN0YXRpYyBpbnQKLXhfZm9sZF9jYXBpdGFsaXNlKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuICh4X2ZvbGRfY2FzZSgnQycpKTsKLX0KLQotLyogTkFNRToKLSAqCXhfZm9sZF9jYXNlIC0gY29udmVydCB3b3JkIHRvIFVQUEVSL2xvd2VyL0NhcGl0YWwgY2FzZQotICoKLSAqIERFU0NSSVBUSU9OOgotICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGltcGxlbWVudCBNLVUsTS11LE0tTCxNLWwsTS1DIGFuZCBNLWMKLSAqCXRvIFVQUEVSIGNhc2UsIGxvd2VyIGNhc2Ugb3IgQ2FwaXRhbGlzZSB3b3Jkcy4KLSAqCi0gKiBSRVRVUk4gVkFMVUU6Ci0gKglOb25lCi0gKi8KLXN0YXRpYyBpbnQKLXhfZm9sZF9jYXNlKGludCBjKQotewotCWNoYXIgKmNwID0geGNwOwotCi0JaWYgKGNwID09IHhlcCkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXdoaWxlICh4X2FyZy0tKSB7Ci0JCS8qCi0JCSAqIGZpcnN0IHNraXAgb3ZlciBhbnkgd2hpdGUtc3BhY2UKLQkJICovCi0JCXdoaWxlIChjcCAhPSB4ZXAgJiYgaXNfbWZzKCpjcCkpCi0JCQljcCsrOwotCQkvKgotCQkgKiBkbyB0aGUgZmlyc3QgY2hhciBvbiBpdHMgb3duIHNpbmNlIGl0IG1heSBiZQotCQkgKiBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiBmb3IgdGhlIHJlc3QuCi0JCSAqLwotCQlpZiAoY3AgIT0geGVwKSB7Ci0JCQlpZiAoYyA9PSAnTCcpCQkvKiBsb3dlcmNhc2UgKi8KLQkJCQkqY3AgPSBrc2hfdG9sb3dlcigqY3ApOwotCQkJZWxzZQkJCS8qIHVwcGVyY2FzZSwgY2FwaXRhbGlzZSAqLwotCQkJCSpjcCA9IGtzaF90b3VwcGVyKCpjcCk7Ci0JCQljcCsrOwotCQl9Ci0JCS8qCi0JCSAqIG5vdyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdvcmQKLQkJICovCi0JCXdoaWxlIChjcCAhPSB4ZXAgJiYgIWlzX21mcygqY3ApKSB7Ci0JCQlpZiAoYyA9PSAnVScpCQkvKiB1cHBlcmNhc2UgKi8KLQkJCQkqY3AgPSBrc2hfdG91cHBlcigqY3ApOwotCQkJZWxzZQkJCS8qIGxvd2VyY2FzZSwgY2FwaXRhbGlzZSAqLwotCQkJCSpjcCA9IGtzaF90b2xvd2VyKCpjcCk7Ci0JCQljcCsrOwotCQl9Ci0JfQotCXhfZ290byhjcCk7Ci0JeF9tb2RpZmllZCgpOwotCXJldHVybiAoS1NURCk7Ci19Ci0jZW5kaWYKLQotLyogTkFNRToKLSAqCXhfbGFzdGNwIC0gbGFzdCB2aXNpYmxlIGNoYXIKLSAqCi0gKiBTWU5PUFNJUzoKLSAqCXhfbGFzdGNwKCkKLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhhdCBjaGFyIGluIHRoZQotICoJZWRpdCBidWZmZXIgdGhhdCB3aWxsIGJlIHRoZSBsYXN0IGRpc3BsYXllZCBvbiB0aGUKLSAqCXNjcmVlbi4gVGhlIHNlcXVlbmNlOgotICoKLSAqCWNwID0geF9sYXN0Y3AoKTsKLSAqCXdoaWxlIChjcCA+IHhjcCkKLSAqCQl4X2JzMygmY3ApOwotICoKLSAqCVdpbGwgcG9zaXRpb24gdGhlIGN1cnNvciBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbi4KLSAqCi0gKiBSRVRVUk4gVkFMVUU6Ci0gKgljcCBvciBOVUxMCi0gKi8KLXN0YXRpYyBjaGFyICoKLXhfbGFzdGNwKHZvaWQpCi17Ci0JaWYgKCF4bHBfdmFsaWQpIHsKLQkJaW50IGkgPSAwLCBqOwotCQljaGFyICp4bHAyOwotCi0JCXhscCA9IHhicDsKLQkJd2hpbGUgKHhscCA8IHhlcCkgewotCQkJaiA9IHhfc2l6ZTIoeGxwLCAmeGxwMik7Ci0JCQlpZiAoKGkgKyBqKSA+IHhfZGlzcGxlbikKLQkJCQlicmVhazsKLQkJCWkgKz0gajsKLQkJCXhscCA9IHhscDI7Ci0JCX0KLQl9Ci0JeGxwX3ZhbGlkID0gdHJ1ZTsKLQlyZXR1cm4gKHhscCk7Ci19Ci0KLXN0YXRpYyBib29sCi14X21vZGUoYm9vbCBvbm9mZikKLXsKLQlzdGF0aWMgYm9vbCB4X2N1cl9tb2RlOwotCWJvb2wgcHJldjsKLQotCWlmICh4X2N1cl9tb2RlID09IG9ub2ZmKQotCQlyZXR1cm4gKHhfY3VyX21vZGUpOwotCXByZXYgPSB4X2N1cl9tb2RlOwotCXhfY3VyX21vZGUgPSBvbm9mZjsKLQotCWlmIChvbm9mZikgewotCQlzdHJ1Y3QgdGVybWlvcyBjYjsKLQotCQljYiA9IHR0eV9zdGF0ZTsKLQotCQllZGNoYXJzLmVyYXNlID0gY2IuY19jY1tWRVJBU0VdOwotCQllZGNoYXJzLmtpbGwgPSBjYi5jX2NjW1ZLSUxMXTsKLQkJZWRjaGFycy5pbnRyID0gY2IuY19jY1tWSU5UUl07Ci0JCWVkY2hhcnMucXVpdCA9IGNiLmNfY2NbVlFVSVRdOwotCQllZGNoYXJzLmVvZiA9IGNiLmNfY2NbVkVPRl07Ci0jaWZkZWYgVldFUkFTRQotCQllZGNoYXJzLndlcmFzZSA9IGNiLmNfY2NbVldFUkFTRV07Ci0jZW5kaWYKLQkJY2IuY19pZmxhZyAmPSB+KElOTENSIHwgSUNSTkwpOwotCQljYi5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8pOwotI2lmIGRlZmluZWQoVkxORVhUKSAmJiBkZWZpbmVkKF9QT1NJWF9WRElTQUJMRSkKLQkJLyogb3NmLzEgcHJvY2Vzc2VzIGxuZXh0IHdoZW4gfmljYW5vbiAqLwotCQljYi5jX2NjW1ZMTkVYVF0gPSBfUE9TSVhfVkRJU0FCTEU7Ci0jZW5kaWYKLQkJLyogc3Vub3MgNC4xLnggJiBvc2YvMSBwcm9jZXNzZXMgZGlzY2FyZChmbHVzaCkgd2hlbiB+aWNhbm9uICovCi0jaWYgZGVmaW5lZChWRElTQ0FSRCkgJiYgZGVmaW5lZChfUE9TSVhfVkRJU0FCTEUpCi0JCWNiLmNfY2NbVkRJU0NBUkRdID0gX1BPU0lYX1ZESVNBQkxFOwotI2VuZGlmCi0JCWNiLmNfY2NbVlRJTUVdID0gMDsKLQkJY2IuY19jY1tWTUlOXSA9IDE7Ci0KLQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmY2IpOwotCi0jaWZkZWYgX1BPU0lYX1ZESVNBQkxFCi0JCS8qIENvbnZlcnQgdW5zZXQgdmFsdWVzIHRvIGludGVybmFsICd1bnNldCcgdmFsdWUgKi8KLQkJaWYgKGVkY2hhcnMuZXJhc2UgPT0gX1BPU0lYX1ZESVNBQkxFKQotCQkJZWRjaGFycy5lcmFzZSA9IC0xOwotCQlpZiAoZWRjaGFycy5raWxsID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMua2lsbCA9IC0xOwotCQlpZiAoZWRjaGFycy5pbnRyID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMuaW50ciA9IC0xOwotCQlpZiAoZWRjaGFycy5xdWl0ID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMucXVpdCA9IC0xOwotCQlpZiAoZWRjaGFycy5lb2YgPT0gX1BPU0lYX1ZESVNBQkxFKQotCQkJZWRjaGFycy5lb2YgPSAtMTsKLQkJaWYgKGVkY2hhcnMud2VyYXNlID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMud2VyYXNlID0gLTE7Ci0jZW5kaWYKLQotCQlpZiAoZWRjaGFycy5lcmFzZSA+PSAwKSB7Ci0JCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmVyYXNlLCBYRlVOQ19kZWxfYmFjayk7Ci0JCQliaW5kX2lmX25vdF9ib3VuZCgxLCBlZGNoYXJzLmVyYXNlLCBYRlVOQ19kZWxfYndvcmQpOwotCQl9Ci0JCWlmIChlZGNoYXJzLmtpbGwgPj0gMCkKLQkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMua2lsbCwgWEZVTkNfZGVsX2xpbmUpOwotCQlpZiAoZWRjaGFycy53ZXJhc2UgPj0gMCkKLQkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMud2VyYXNlLCBYRlVOQ19kZWxfYndvcmQpOwotCQlpZiAoZWRjaGFycy5pbnRyID49IDApCi0JCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmludHIsIFhGVU5DX2Fib3J0KTsKLQkJaWYgKGVkY2hhcnMucXVpdCA+PSAwKQotCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5xdWl0LCBYRlVOQ19ub29wKTsKLQl9IGVsc2UKLQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKLQotCXJldHVybiAocHJldik7Ci19Ci0KLSNpZiAhTUtTSF9TX05PVkkKLS8qICsrKyB2aSBlZGl0aW5nIG1vZGUgKysrICovCi0KLSNkZWZpbmUgQ3RybChjKQkJKGMmMHgxZikKLQotc3RydWN0IGVkc3RhdGUgewotCWNoYXIgKmNidWY7Ci0JaW50IHdpbmxlZnQ7Ci0JaW50IGNidWZzaXplOwotCWludCBsaW5lbGVuOwotCWludCBjdXJzb3I7Ci19OwotCi1zdGF0aWMgaW50IHZpX2hvb2soaW50KTsKLXN0YXRpYyBpbnQgbmV4dHN0YXRlKGludCk7Ci1zdGF0aWMgaW50IHZpX2luc2VydChpbnQpOwotc3RhdGljIGludCB2aV9jbWQoaW50LCBjb25zdCBjaGFyICopOwotc3RhdGljIGludCBkb21vdmUoaW50LCBjb25zdCBjaGFyICosIGludCk7Ci1zdGF0aWMgaW50IHJlZG9faW5zZXJ0KGludCk7Ci1zdGF0aWMgdm9pZCB5YW5rX3JhbmdlKGludCwgaW50KTsKLXN0YXRpYyBpbnQgYnJhY2t0eXBlKGludCk7Ci1zdGF0aWMgdm9pZCBzYXZlX2NidWYodm9pZCk7Ci1zdGF0aWMgdm9pZCByZXN0b3JlX2NidWYodm9pZCk7Ci1zdGF0aWMgaW50IHB1dGJ1Zihjb25zdCBjaGFyICosIGludCwgaW50KTsKLXN0YXRpYyB2b2lkIGRlbF9yYW5nZShpbnQsIGludCk7Ci1zdGF0aWMgaW50IGZpbmRjaChpbnQsIGludCwgaW50LCBpbnQpOwotc3RhdGljIGludCBmb3J3d29yZChpbnQpOwotc3RhdGljIGludCBiYWNrd29yZChpbnQpOwotc3RhdGljIGludCBlbmR3b3JkKGludCk7Ci1zdGF0aWMgaW50IEZvcnd3b3JkKGludCk7Ci1zdGF0aWMgaW50IEJhY2t3b3JkKGludCk7Ci1zdGF0aWMgaW50IEVuZHdvcmQoaW50KTsKLXN0YXRpYyBpbnQgZ3JhYmhpc3QoaW50LCBpbnQpOwotc3RhdGljIGludCBncmFic2VhcmNoKGludCwgaW50LCBpbnQsIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCByZWRyYXdfbGluZShpbnQpOwotc3RhdGljIHZvaWQgcmVmcmVzaChpbnQpOwotc3RhdGljIGludCBvdXRvZndpbih2b2lkKTsKLXN0YXRpYyB2b2lkIHJld2luZG93KHZvaWQpOwotc3RhdGljIGludCBuZXdjb2woaW50LCBpbnQpOwotc3RhdGljIHZvaWQgZGlzcGxheShjaGFyICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGVkX21vdl9vcHQoaW50LCBjaGFyICopOwotc3RhdGljIGludCBleHBhbmRfd29yZChpbnQpOwotc3RhdGljIGludCBjb21wbGV0ZV93b3JkKGludCwgaW50KTsKLXN0YXRpYyBpbnQgcHJpbnRfZXhwYW5zaW9ucyhzdHJ1Y3QgZWRzdGF0ZSAqLCBpbnQpOwotI2RlZmluZSBjaGFyX2xlbihjKQkoKGMpIDwgJyAnIHx8IChjKSA9PSAweDdGID8gMiA6IDEpCi1zdGF0aWMgdm9pZCB4X3ZpX3pvdGMoaW50KTsKLXN0YXRpYyB2b2lkIHZpX2Vycm9yKHZvaWQpOwotc3RhdGljIHZvaWQgdmlfbWFjcm9fcmVzZXQodm9pZCk7Ci1zdGF0aWMgaW50IHhfdmlfcHV0YnVmKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLQotI2RlZmluZSBDXwkweDEJCS8qIGEgdmFsaWQgY29tbWFuZCB0aGF0IGlzbid0IGEgTV8sIEVfLCBVXyAqLwotI2RlZmluZSBNXwkweDIJCS8qIG1vdmVtZW50IGNvbW1hbmQgKGgsIGwsIGV0Yy4pICovCi0jZGVmaW5lIEVfCTB4NAkJLyogZXh0ZW5kZWQgY29tbWFuZCAoYywgZCwgeSkgKi8KLSNkZWZpbmUgWF8JMHg4CQkvKiBsb25nIGNvbW1hbmQgKEAsIGYsIEYsIHQsIFQsIGV0Yy4pICovCi0jZGVmaW5lIFVfCTB4MTAJCS8qIGFuIFVOLXVuZG9hYmxlIGNvbW1hbmQgKHRoYXQgaXNuJ3QgYSBNXykgKi8KLSNkZWZpbmUgQl8JMHgyMAkJLyogYmFkIGNvbW1hbmQgKF5AKSAqLwotI2RlZmluZSBaXwkweDQwCQkvKiByZXBlYXQgY291bnQgZGVmYXVsdHMgdG8gMCAobm90IDEpICovCi0jZGVmaW5lIFNfCTB4ODAJCS8qIHNlYXJjaCAoLywgPykgKi8KLQotI2RlZmluZSBpc19iYWQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZCXykKLSNkZWZpbmUgaXNfY21kKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mKE1ffEVffENffFVfKSkKLSNkZWZpbmUgaXNfbW92ZShjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJk1fKQotI2RlZmluZSBpc19leHRlbmQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZFXykKLSNkZWZpbmUgaXNfbG9uZyhjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlhfKQotI2RlZmluZSBpc191bmRvYWJsZShjKQkoIShjbGFzc2lmeVsoYykmMHg3Zl0mVV8pKQotI2RlZmluZSBpc19zcmNoKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mU18pCi0jZGVmaW5lIGlzX3plcm9jb3VudChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlpfKQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjbGFzc2lmeVsxMjhdID0gewotLyoJIDAJMQkyCTMJNAk1CTYJNwkqLwotLyogMAleQAleQQleQgleQwleRAleRQleRgleRwkqLwotCUJfLAkwLAkwLAkwLAkwLAlDX3xVXywJQ198Wl8sCTAsCi0vKiAxCV5ICV5JCV5KCV5LCV5MCV5NCV5OCV5PCSovCi0JTV8sCUNffFpfLAkwLAkwLAlDX3xVXywJMCwJQ18sCTAsCi0vKiAyCV5QCV5RCV5SCV5TCV5UCV5VCV5WCV5XCSovCi0JQ18sCTAsCUNffFVfLAkwLAkwLAkwLAlDXywJMCwKLS8qIDMJXlgJXlkJXloJXlsJXlwJXl0JXl4JXl8JKi8KLQlDXywJMCwJMCwJQ198Wl8sCTAsCTAsCTAsCTAsCi0vKiA0CTxzcGFjZT4JIQkiCSMJJAklCSYJJwkqLwotCU1fLAkwLAkwLAlDXywJTV8sCU1fLAkwLAkwLAotLyogNQkoCSkJKgkrCSwJLQkuCS8JKi8KLQkwLAkwLAlDXywJQ18sCU1fLAlDXywJMCwJQ198U18sCi0vKiA2CTAJMQkyCTMJNAk1CTYJNwkqLwotCU1fLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotLyogNwk4CTkJOgk7CTwJPQk+CT8JKi8KLQkwLAkwLAkwLAlNXywJMCwJQ18sCTAsCUNffFNfLAotLyogOAlACUEJQglDCUQJRQlGCUcJKi8KLQlDX3xYXywJQ18sCU1fLAlDXywJQ18sCU1fLAlNX3xYXywJQ198VV98Wl8sCi0vKiA5CUgJSQlKCUsJTAlNCU4JTwkqLwotCTAsCUNfLAkwLAkwLAkwLAkwLAlDX3xVXywJMCwKLS8qIEEJUAlRCVIJUwlUCVUJVglXCSovCi0JQ18sCTAsCUNfLAlDXywJTV98WF8sCUNfLAkwLAlNXywKLS8qIEIJWAlZCVoJWwlcCV0JXglfCSovCi0JQ18sCUNffFVfLAkwLAkwLAlDX3xaXywJMCwJTV8sCUNffFpfLAotLyogQwlgCWEJYgljCWQJZQlmCWcJKi8KLQkwLAlDXywJTV8sCUVfLAlFXywJTV8sCU1ffFhfLAlDX3xaXywKLS8qIEQJaAlpCWoJawlsCW0JbglvCSovCi0JTV8sCUNfLAlDX3xVXywJQ198VV8sCU1fLAkwLAlDX3xVXywJMCwKLS8qIEUJcAlxCXIJcwl0CXUJdgl3CSovCi0JQ18sCTAsCVhfLAlDXywJTV98WF8sCUNffFVfLAlDX3xVX3xaXywgTV8sCi0vKiBGCXgJeQl6CXsJfAl9CX4JXj8JKi8KLQlDXywJRV98VV8sCTAsCTAsCU1ffFpfLAkwLAlDXywJMAotfTsKLQotI2RlZmluZSBNQVhWSUNNRAkzCi0jZGVmaW5lIFNSQ0hMRU4JCTQwCi0KLSNkZWZpbmUgSU5TRVJUCQkxCi0jZGVmaW5lIFJFUExBQ0UJCTIKLQotI2RlZmluZSBWTk9STUFMCQkwCQkvKiBjb21tYW5kLCBpbnNlcnQgb3IgcmVwbGFjZSBtb2RlICovCi0jZGVmaW5lIFZBUkcxCQkxCQkvKiBkaWdpdCBwcmVmaXggKGZpcnN0LCBlZywgNWwpICovCi0jZGVmaW5lIFZFWFRDTUQJCTIJCS8qIGNtZCArIG1vdmVtZW50IChlZywgY2wpICovCi0jZGVmaW5lIFZBUkcyCQkzCQkvKiBkaWdpdCBwcmVmaXggKHNlY29uZCwgZWcsIDJjM2wpICovCi0jZGVmaW5lIFZYQ0gJCTQJCS8qIGYsIEYsIHQsIFQsIEAgKi8KLSNkZWZpbmUgVkZBSUwJCTUJCS8qIGJhZCBjb21tYW5kICovCi0jZGVmaW5lIFZDTUQJCTYJCS8qIHNpbmdsZSBjaGFyIGNvbW1hbmQgKGVnLCBYKSAqLwotI2RlZmluZSBWUkVETwkJNwkJLyogLiAqLwotI2RlZmluZSBWTElUCQk4CQkvKiBeViAqLwotI2RlZmluZSBWU0VBUkNICQk5CQkvKiAvLCA/ICovCi0jZGVmaW5lIFZWRVJTSU9OCTEwCQkvKiA8RVNDPiBeViAqLwotCi1zdGF0aWMgY2hhcgkJdW5kb2NidWZbTElORV07Ci0KLXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQkqc2F2ZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpOwotc3RhdGljIHZvaWQJCXJlc3RvcmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkLCBzdHJ1Y3QgZWRzdGF0ZSAqbmV3cyk7Ci1zdGF0aWMgdm9pZAkJZnJlZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpOwotCi1zdGF0aWMgc3RydWN0IGVkc3RhdGUJZWJ1ZjsKLXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQl1bmRvYnVmID0geyB1bmRvY2J1ZiwgMCwgTElORSwgMCwgMCB9OwotCi1zdGF0aWMgc3RydWN0IGVkc3RhdGUJKmVzOwkJCS8qIGN1cnJlbnQgZWRpdG9yIHN0YXRlICovCi1zdGF0aWMgc3RydWN0IGVkc3RhdGUJKnVuZG87Ci0KLXN0YXRpYyBjaGFyIGlidWZbTElORV07CQkJLyogaW5wdXQgYnVmZmVyICovCi1zdGF0aWMgaW50IGZpcnN0X2luc2VydDsJCS8qIHNldCB3aGVuIHN0YXJ0aW5nIGluIGluc2VydCBtb2RlICovCi1zdGF0aWMgaW50IHNhdmVkX2luc2xlbjsJCS8qIHNhdmVkIGluc2xlbiBmb3IgZmlyc3QgaW5zZXJ0ICovCi1zdGF0aWMgaW50IGluc2xlbjsJCQkvKiBsZW5ndGggb2YgaW5wdXQgYnVmZmVyICovCi1zdGF0aWMgaW50IHNyY2hsZW47CQkJLyogbGVuZ3RoIG9mIGN1cnJlbnQgc2VhcmNoIHBhdHRlcm4gKi8KLXN0YXRpYyBjaGFyIHlidWZbTElORV07CQkJLyogeWFuayBidWZmZXIgKi8KLXN0YXRpYyBpbnQgeWFua2xlbjsJCQkvKiBsZW5ndGggb2YgeWFuayBidWZmZXIgKi8KLXN0YXRpYyBpbnQgZnNhdmVjbWQgPSAnICc7CQkvKiBsYXN0IGZpbmQgY29tbWFuZCAqLwotc3RhdGljIGludCBmc2F2ZWNoOwkJCS8qIGNoYXJhY3RlciB0byBmaW5kICovCi1zdGF0aWMgY2hhciBsYXN0Y21kW01BWFZJQ01EXTsJCS8qIGxhc3Qgbm9uLW1vdmUgY29tbWFuZCAqLwotc3RhdGljIGludCBsYXN0YWM7CQkJLyogYXJnY250IGZvciBsYXN0Y21kICovCi1zdGF0aWMgaW50IGxhc3RzZWFyY2ggPSAnICc7CQkvKiBsYXN0IHNlYXJjaCBjb21tYW5kICovCi1zdGF0aWMgY2hhciBzcmNocGF0W1NSQ0hMRU5dOwkJLyogbGFzdCBzZWFyY2ggcGF0dGVybiAqLwotc3RhdGljIGludCBpbnNlcnQ7CQkJLyogbm9uLXplcm8gaW4gaW5zZXJ0IG1vZGUgKi8KLXN0YXRpYyBpbnQgaG51bTsJCQkvKiBwb3NpdGlvbiBpbiBoaXN0b3J5ICovCi1zdGF0aWMgaW50IG9obnVtOwkJCS8qIGhpc3RvcnkgbGluZSBjb3BpZWQgKGFmdGVyIG1vZCkgKi8KLXN0YXRpYyBpbnQgaGxhc3Q7CQkJLyogMSBwYXN0IGxhc3QgcG9zaXRpb24gaW4gaGlzdG9yeSAqLwotc3RhdGljIGludCBzdGF0ZTsKLQotLyogSW5mb3JtYXRpb24gZm9yIGtlZXBpbmcgdHJhY2sgb2YgbWFjcm9zIHRoYXQgYXJlIGJlaW5nIGV4cGFuZGVkLgotICogVGhlIGZvcm1hdCBvZiBidWYgaXMgdGhlIGFsaWFzIGNvbnRlbnRzIGZvbGxvd2VkIGJ5IGEgTlVMIGJ5dGUgZm9sbG93ZWQKLSAqIGJ5IHRoZSBuYW1lIChsZXR0ZXIpIG9mIHRoZSBhbGlhcy4gVGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIG1hcmtlZCBieQotICogYSBkb3VibGUgTlVMLiBUaGUgbmFtZSBvZiB0aGUgYWxpYXMgaXMgc3RvcmVkIHNvIHJlY3Vyc2l2ZSBtYWNyb3MgY2FuCi0gKiBiZSBkZXRlY3RlZC4KLSAqLwotc3RydWN0IG1hY3JvX3N0YXRlIHsKLQl1bnNpZ25lZCBjaGFyICpwOwkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZiAqLwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsJLyogcG9pbnRlciB0byBtYWNybyhzKSBiZWluZyBleHBhbmRlZCAqLwotCWludCBsZW47CQkvKiBob3cgbXVjaCBkYXRhIGluIGJ1ZmZlciAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgbWFjcm9fc3RhdGUgbWFjcm87Ci0KLWVudW0gZXhwYW5kX21vZGUgewotCU5PTkUsIEVYUEFORCwgQ09NUExFVEUsIFBSSU5UCi19Owotc3RhdGljIGVudW0gZXhwYW5kX21vZGUgZXhwYW5kZWQgPSBOT05FOwkvKiBsYXN0IGlucHV0IHdhcyBleHBhbmRlZCAqLwotCi1zdGF0aWMgaW50Ci14X3ZpKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlpbnQgYzsKLQotCXN0YXRlID0gVk5PUk1BTDsKLQlvaG51bSA9IGhudW0gPSBobGFzdCA9IGhpc3RudW0oLTEpICsgMTsKLQlpbnNlcnQgPSBJTlNFUlQ7Ci0Jc2F2ZWRfaW5zbGVuID0gaW5zbGVuOwotCWZpcnN0X2luc2VydCA9IDE7Ci0JaW5zbGVuID0gMDsKLQl2aV9tYWNyb19yZXNldCgpOwotCi0JZXMgPSAmZWJ1ZjsKLQllcy0+Y2J1ZiA9IGJ1ZjsKLQl1bmRvID0gJnVuZG9idWY7Ci0JdW5kby0+Y2J1ZnNpemUgPSBlcy0+Y2J1ZnNpemUgPSBsZW4gPiBMSU5FID8gTElORSA6IGxlbjsKLQotCWVzLT5saW5lbGVuID0gdW5kby0+bGluZWxlbiA9IDA7Ci0JZXMtPmN1cnNvciA9IHVuZG8tPmN1cnNvciA9IDA7Ci0JZXMtPndpbmxlZnQgPSB1bmRvLT53aW5sZWZ0ID0gMDsKLQotCWN1cl9jb2wgPSBwcm9tcHRsZW4ocHJvbXB0KTsKLQlwcm9tcHRfdHJ1bmMgPSAoY3VyX2NvbCAvIHhfY29scykgKiB4X2NvbHM7Ci0JY3VyX2NvbCAtPSBwcm9tcHRfdHJ1bmM7Ci0KLQlwcHJvbXB0KHByb21wdCwgMCk7Ci0JaWYgKGN1cl9jb2wgPiB4X2NvbHMgLSAzIC0gTUlOX0VESVRfU1BBQ0UpIHsKLQkJcHJvbXB0X3JlZHJhdyA9IGN1cl9jb2wgPSAwOwotCQl4X3B1dGMoJ1xuJyk7Ci0JfSBlbHNlCi0JCXByb21wdF9yZWRyYXcgPSAxOwotCXB3aWR0aCA9IGN1cl9jb2w7Ci0KLQlpZiAoIXdidWZfbGVuIHx8IHdidWZfbGVuICE9IHhfY29scyAtIDMpIHsKLQkJd2J1Zl9sZW4gPSB4X2NvbHMgLSAzOwotCQl3YnVmWzBdID0gYXJlc2l6ZSh3YnVmWzBdLCB3YnVmX2xlbiwgQVBFUk0pOwotCQl3YnVmWzFdID0gYXJlc2l6ZSh3YnVmWzFdLCB3YnVmX2xlbiwgQVBFUk0pOwotCX0KLQkodm9pZCltZW1zZXQod2J1ZlswXSwgJyAnLCB3YnVmX2xlbik7Ci0JKHZvaWQpbWVtc2V0KHdidWZbMV0sICcgJywgd2J1Zl9sZW4pOwotCXdpbndpZHRoID0geF9jb2xzIC0gcHdpZHRoIC0gMzsKLQl3aW4gPSAwOwotCW1vcmVjID0gJyAnOwotCWxhc3RyZWYgPSAxOwotCWhvbGRsZW4gPSAwOwotCi0JZWRpdG1vZGUgPSAyOwotCXhfZmx1c2goKTsKLQl3aGlsZSAoMSkgewotCQlpZiAobWFjcm8ucCkgewotCQkJYyA9ICptYWNyby5wKys7Ci0JCQkvKiBlbmQgb2YgY3VycmVudCBtYWNybz8gKi8KLQkJCWlmICghYykgewotCQkJCS8qIG1vcmUgbWFjcm9zIGxlZnQgdG8gZmluaXNoPyAqLwotCQkJCWlmICgqbWFjcm8ucCsrKQotCQkJCQljb250aW51ZTsKLQkJCQkvKiBtdXN0IGJlIHRoZSBlbmQgb2YgYWxsIHRoZSBtYWNyb3MgKi8KLQkJCQl2aV9tYWNyb19yZXNldCgpOwotCQkJCWMgPSB4X2dldGMoKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQljID0geF9nZXRjKCk7Ci0KLQkJaWYgKGMgPT0gLTEpCi0JCQlicmVhazsKLQkJaWYgKHN0YXRlICE9IFZMSVQpIHsKLQkJCWlmIChjID09IGVkY2hhcnMuaW50ciB8fCBjID09IGVkY2hhcnMucXVpdCkgewotCQkJCS8qIHByZXRlbmQgd2UgZ290IGFuIGludGVycnVwdCAqLwotCQkJCXhfdmlfem90YyhjKTsKLQkJCQl4X2ZsdXNoKCk7Ci0JCQkJdHJhcHNpZyhjID09IGVkY2hhcnMuaW50ciA/IFNJR0lOVCA6IFNJR1FVSVQpOwotCQkJCXhfbW9kZShmYWxzZSk7Ci0JCQkJdW53aW5kKExTSEVMTCk7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gZWRjaGFycy5lb2YgJiYgc3RhdGUgIT0gVlZFUlNJT04pIHsKLQkJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkgewotCQkJCQl4X3ZpX3pvdGMoZWRjaGFycy5lb2YpOwotCQkJCQljID0gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAodmlfaG9vayhjKSkKLQkJCWJyZWFrOwotCQl4X2ZsdXNoKCk7Ci0JfQotCi0JeF9wdXRjKCdccicpOwotCXhfcHV0YygnXG4nKTsKLQl4X2ZsdXNoKCk7Ci0KLQlpZiAoYyA9PSAtMSB8fCAoc3NpemVfdClsZW4gPD0gZXMtPmxpbmVsZW4pCi0JCXJldHVybiAoLTEpOwotCi0JaWYgKGVzLT5jYnVmICE9IGJ1ZikKLQkJbWVtbW92ZShidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7Ci0KLQlidWZbZXMtPmxpbmVsZW4rK10gPSAnXG4nOwotCi0JcmV0dXJuIChlcy0+bGluZWxlbik7Ci19Ci0KLXN0YXRpYyBpbnQKLXZpX2hvb2soaW50IGNoKQotewotCXN0YXRpYyBjaGFyIGN1cmNtZFtNQVhWSUNNRF0sIGxvY3BhdFtTUkNITEVOXTsKLQlzdGF0aWMgaW50IGNtZGxlbiwgYXJnYzEsIGFyZ2MyOwotCi0Jc3dpdGNoIChzdGF0ZSkgewotCi0JY2FzZSBWTk9STUFMOgotCQlpZiAoaW5zZXJ0ICE9IDApIHsKLQkJCWlmIChjaCA9PSBDdHJsKCd2JykpIHsKLQkJCQlzdGF0ZSA9IFZMSVQ7Ci0JCQkJY2ggPSAnXic7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHZpX2luc2VydChjaCkpIHsKLQkJCWNhc2UgLTE6Ci0JCQkJdmlfZXJyb3IoKTsKLQkJCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQkJaWYgKHN0YXRlID09IFZMSVQpIHsKLQkJCQkJZXMtPmN1cnNvci0tOwotCQkJCQlyZWZyZXNoKDApOwotCQkJCX0gZWxzZQotCQkJCQlyZWZyZXNoKGluc2VydCAhPSAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKLQkJCQlyZXR1cm4gKDEpOwotCQkJY21kbGVuID0gMDsKLQkJCWFyZ2MxID0gMDsKLQkJCWlmIChjaCA+PSAnMScgJiYgY2ggPD0gJzknKSB7Ci0JCQkJYXJnYzEgPSBjaCAtICcwJzsKLQkJCQlzdGF0ZSA9IFZBUkcxOwotCQkJfSBlbHNlIHsKLQkJCQljdXJjbWRbY21kbGVuKytdID0gY2g7Ci0JCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOwotCQkJCWlmIChzdGF0ZSA9PSBWU0VBUkNIKSB7Ci0JCQkJCXNhdmVfY2J1ZigpOwotCQkJCQllcy0+Y3Vyc29yID0gMDsKLQkJCQkJZXMtPmxpbmVsZW4gPSAwOwotCQkJCQlpZiAoY2ggPT0gJy8nKSB7Ci0JCQkJCQlpZiAocHV0YnVmKCIvIiwgMSwgMCkgIT0gMCkKLQkJCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQkJfSBlbHNlIGlmIChwdXRidWYoIj8iLCAxLCAwKSAhPSAwKQotCQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJCXJlZnJlc2goMCk7Ci0JCQkJfQotCQkJCWlmIChzdGF0ZSA9PSBWVkVSU0lPTikgewotCQkJCQlzYXZlX2NidWYoKTsKLQkJCQkJZXMtPmN1cnNvciA9IDA7Ci0JCQkJCWVzLT5saW5lbGVuID0gMDsKLQkJCQkJcHV0YnVmKEtTSF9WRVJTSU9OLAotCQkJCQkgICAgc3RybGVuKEtTSF9WRVJTSU9OKSwgMCk7Ci0JCQkJCXJlZnJlc2goMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWTElUOgotCQlpZiAoaXNfYmFkKGNoKSkgewotCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyAxKTsKLQkJCXZpX2Vycm9yKCk7Ci0JCX0gZWxzZQotCQkJZXMtPmNidWZbZXMtPmN1cnNvcisrXSA9IGNoOwotCQlyZWZyZXNoKDEpOwotCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBWVkVSU0lPTjoKLQkJcmVzdG9yZV9jYnVmKCk7Ci0JCXN0YXRlID0gVk5PUk1BTDsKLQkJcmVmcmVzaCgwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZBUkcxOgotCQlpZiAoa3NoX2lzZGlnaXQoY2gpKQotCQkJYXJnYzEgPSBhcmdjMSAqIDEwICsgY2ggLSAnMCc7Ci0JCWVsc2UgewotCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOwotCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRVhUQ01EOgotCQlhcmdjMiA9IDA7Ci0JCWlmIChjaCA+PSAnMScgJiYgY2ggPD0gJzknKSB7Ci0JCQlhcmdjMiA9IGNoIC0gJzAnOwotCQkJc3RhdGUgPSBWQVJHMjsKLQkJCXJldHVybiAoMCk7Ci0JCX0gZWxzZSB7Ci0JCQljdXJjbWRbY21kbGVuKytdID0gY2g7Ci0JCQlpZiAoY2ggPT0gY3VyY21kWzBdKQotCQkJCXN0YXRlID0gVkNNRDsKLQkJCWVsc2UgaWYgKGlzX21vdmUoY2gpKQotCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IFZGQUlMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWQVJHMjoKLQkJaWYgKGtzaF9pc2RpZ2l0KGNoKSkKLQkJCWFyZ2MyID0gYXJnYzIgKiAxMCArIGNoIC0gJzAnOwotCQllbHNlIHsKLQkJCWlmIChhcmdjMSA9PSAwKQotCQkJCWFyZ2MxID0gYXJnYzI7Ci0JCQllbHNlCi0JCQkJYXJnYzEgKj0gYXJnYzI7Ci0JCQljdXJjbWRbY21kbGVuKytdID0gY2g7Ci0JCQlpZiAoY2ggPT0gY3VyY21kWzBdKQotCQkJCXN0YXRlID0gVkNNRDsKLQkJCWVsc2UgaWYgKGlzX21vdmUoY2gpKQotCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IFZGQUlMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWWENIOgotCQlpZiAoY2ggPT0gQ3RybCgnWycpKQotCQkJc3RhdGUgPSBWTk9STUFMOwotCQllbHNlIHsKLQkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKLQkJCXN0YXRlID0gVkNNRDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVlNFQVJDSDoKLQkJaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJyAvKnx8IGNoID09IEN0cmwoJ1snKSovICkgewotCQkJcmVzdG9yZV9jYnVmKCk7Ci0JCQkvKiBSZXBlYXQgbGFzdCBzZWFyY2g/ICovCi0JCQlpZiAoc3JjaGxlbiA9PSAwKSB7Ci0JCQkJaWYgKCFzcmNocGF0WzBdKSB7Ci0JCQkJCXZpX2Vycm9yKCk7Ci0JCQkJCXN0YXRlID0gVk5PUk1BTDsKLQkJCQkJcmVmcmVzaCgwKTsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvY3BhdFtzcmNobGVuXSA9ICdcMCc7Ci0JCQkJbWVtY3B5KHNyY2hwYXQsIGxvY3BhdCwgc3JjaGxlbiArIDEpOwotCQkJfQotCQkJc3RhdGUgPSBWQ01EOwotCQl9IGVsc2UgaWYgKGNoID09IGVkY2hhcnMuZXJhc2UgfHwgY2ggPT0gQ3RybCgnaCcpKSB7Ci0JCQlpZiAoc3JjaGxlbiAhPSAwKSB7Ci0JCQkJc3JjaGxlbi0tOwotCQkJCWVzLT5saW5lbGVuIC09IGNoYXJfbGVuKCh1bnNpZ25lZCBjaGFyKWxvY3BhdFtzcmNobGVuXSk7Ci0JCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOwotCQkJCXJlZnJlc2goMCk7Ci0JCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXJlc3RvcmVfY2J1ZigpOwotCQkJc3RhdGUgPSBWTk9STUFMOwotCQkJcmVmcmVzaCgwKTsKLQkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLmtpbGwpIHsKLQkJCXNyY2hsZW4gPSAwOwotCQkJZXMtPmxpbmVsZW4gPSAxOwotCQkJZXMtPmN1cnNvciA9IDE7Ci0JCQlyZWZyZXNoKDApOwotCQkJcmV0dXJuICgwKTsKLQkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLndlcmFzZSkgewotCQkJaW50IGksIG4gPSBzcmNobGVuOwotCQkJc3RydWN0IGVkc3RhdGUgbmV3X2VzLCAqc2F2ZV9lczsKLQotCQkJbmV3X2VzLmN1cnNvciA9IG47Ci0JCQluZXdfZXMuY2J1ZiA9IGxvY3BhdDsKLQotCQkJc2F2ZV9lcyA9IGVzOwotCQkJZXMgPSAmbmV3X2VzOwotCQkJbiA9IGJhY2t3b3JkKDEpOwotCQkJZXMgPSBzYXZlX2VzOwotCi0JCQlmb3IgKGkgPSBzcmNobGVuOyAtLWkgPj0gbjsgKQotCQkJCWVzLT5saW5lbGVuIC09IGNoYXJfbGVuKCh1bnNpZ25lZCBjaGFyKWxvY3BhdFtpXSk7Ci0JCQlzcmNobGVuID0gbjsKLQkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKLQkJCXJlZnJlc2goMCk7Ci0JCQlyZXR1cm4gKDApOwotCQl9IGVsc2UgewotCQkJaWYgKHNyY2hsZW4gPT0gU1JDSExFTiAtIDEpCi0JCQkJdmlfZXJyb3IoKTsKLQkJCWVsc2UgewotCQkJCWxvY3BhdFtzcmNobGVuKytdID0gY2g7Ci0JCQkJaWYgKGNoIDwgJyAnIHx8IGNoID09IDB4N2YpIHsKLQkJCQkJaWYgKGVzLT5saW5lbGVuICsgMiA+IGVzLT5jYnVmc2l6ZSkKLQkJCQkJCXZpX2Vycm9yKCk7Ci0JCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuKytdID0gJ14nOwotCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9IGNoIF4gJ0AnOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChlcy0+bGluZWxlbiA+PSBlcy0+Y2J1ZnNpemUpCi0JCQkJCQl2aV9lcnJvcigpOwotCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9IGNoOwotCQkJCX0KLQkJCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47Ci0JCQkJcmVmcmVzaCgwKTsKLQkJCX0KLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgVkNNRDoKLQkJc3RhdGUgPSBWTk9STUFMOwotCQlzd2l0Y2ggKHZpX2NtZChhcmdjMSwgY3VyY21kKSkgewotCQljYXNlIC0xOgotCQkJdmlfZXJyb3IoKTsKLQkJCXJlZnJlc2goMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQkJaWYgKGluc2VydCAhPSAwKQotCQkJCWluc2xlbiA9IDA7Ci0JCQlyZWZyZXNoKGluc2VydCAhPSAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlyZWZyZXNoKDApOwotCQkJcmV0dXJuICgxKTsKLQkJY2FzZSAyOgotCQkJLyogYmFjayBmcm9tIGEgJ3YnIGNvbW1hbmQgLSBkb24ndCByZWRyYXcgdGhlIHNjcmVlbiAqLwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVlJFRE86Ci0JCXN0YXRlID0gVk5PUk1BTDsKLQkJaWYgKGFyZ2MxICE9IDApCi0JCQlsYXN0YWMgPSBhcmdjMTsKLQkJc3dpdGNoICh2aV9jbWQobGFzdGFjLCBsYXN0Y21kKSkgewotCQljYXNlIC0xOgotCQkJdmlfZXJyb3IoKTsKLQkJCXJlZnJlc2goMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQkJaWYgKGluc2VydCAhPSAwKSB7Ci0JCQkJaWYgKGxhc3RjbWRbMF0gPT0gJ3MnIHx8IGxhc3RjbWRbMF0gPT0gJ2MnIHx8Ci0JCQkJICAgIGxhc3RjbWRbMF0gPT0gJ0MnKSB7Ci0JCQkJCWlmIChyZWRvX2luc2VydCgxKSAhPSAwKQotCQkJCQkJdmlfZXJyb3IoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVkb19pbnNlcnQobGFzdGFjKSAhPSAwKQotCQkJCQkJdmlfZXJyb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWZyZXNoKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlZnJlc2goMCk7Ci0JCQlyZXR1cm4gKDEpOwotCQljYXNlIDI6Ci0JCQkvKiBiYWNrIGZyb20gYSAndicgY29tbWFuZCAtIGNhbid0IGhhcHBlbiAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGQUlMOgotCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCXZpX2Vycm9yKCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1uZXh0c3RhdGUoaW50IGNoKQotewotCWlmIChpc19leHRlbmQoY2gpKQotCQlyZXR1cm4gKFZFWFRDTUQpOwotCWVsc2UgaWYgKGlzX3NyY2goY2gpKQotCQlyZXR1cm4gKFZTRUFSQ0gpOwotCWVsc2UgaWYgKGlzX2xvbmcoY2gpKQotCQlyZXR1cm4gKFZYQ0gpOwotCWVsc2UgaWYgKGNoID09ICcuJykKLQkJcmV0dXJuIChWUkVETyk7Ci0JZWxzZSBpZiAoY2ggPT0gQ3RybCgndicpKQotCQlyZXR1cm4gKFZWRVJTSU9OKTsKLQllbHNlIGlmIChpc19jbWQoY2gpKQotCQlyZXR1cm4gKFZDTUQpOwotCWVsc2UKLQkJcmV0dXJuIChWRkFJTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZpX2luc2VydChpbnQgY2gpCi17Ci0JaW50IHRjdXJzb3I7Ci0KLQlpZiAoY2ggPT0gZWRjaGFycy5lcmFzZSB8fCBjaCA9PSBDdHJsKCdoJykpIHsKLQkJaWYgKGluc2VydCA9PSBSRVBMQUNFKSB7Ci0JCQlpZiAoZXMtPmN1cnNvciA9PSB1bmRvLT5jdXJzb3IpIHsKLQkJCQl2aV9lcnJvcigpOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlpZiAoaW5zbGVuID4gMCkKLQkJCQlpbnNsZW4tLTsKLQkJCWVzLT5jdXJzb3ItLTsKLQkJCWlmIChlcy0+Y3Vyc29yID49IHVuZG8tPmxpbmVsZW4pCi0JCQkJZXMtPmxpbmVsZW4tLTsKLQkJCWVsc2UKLQkJCQllcy0+Y2J1Zltlcy0+Y3Vyc29yXSA9IHVuZG8tPmNidWZbZXMtPmN1cnNvcl07Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXMtPmN1cnNvciA9PSAwKQotCQkJCXJldHVybiAoMCk7Ci0JCQlpZiAoaW5zbGVuID4gMCkKLQkJCQlpbnNsZW4tLTsKLQkJCWVzLT5jdXJzb3ItLTsKLQkJCWVzLT5saW5lbGVuLS07Ci0JCQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3IgKyAxXSwKLQkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IgKyAxKTsKLQkJfQotCQlleHBhbmRlZCA9IE5PTkU7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChjaCA9PSBlZGNoYXJzLmtpbGwpIHsKLQkJaWYgKGVzLT5jdXJzb3IgIT0gMCkgewotCQkJaW5zbGVuID0gMDsKLQkJCW1lbW1vdmUoZXMtPmNidWYsICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKLQkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IpOwotCQkJZXMtPmxpbmVsZW4gLT0gZXMtPmN1cnNvcjsKLQkJCWVzLT5jdXJzb3IgPSAwOwotCQl9Ci0JCWV4cGFuZGVkID0gTk9ORTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGNoID09IGVkY2hhcnMud2VyYXNlKSB7Ci0JCWlmIChlcy0+Y3Vyc29yICE9IDApIHsKLQkJCXRjdXJzb3IgPSBiYWNrd29yZCgxKTsKLQkJCW1lbW1vdmUoJmVzLT5jYnVmW3RjdXJzb3JdLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCi0JCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKLQkJCWVzLT5saW5lbGVuIC09IGVzLT5jdXJzb3IgLSB0Y3Vyc29yOwotCQkJaWYgKGluc2xlbiA8IGVzLT5jdXJzb3IgLSB0Y3Vyc29yKQotCQkJCWluc2xlbiA9IDA7Ci0JCQllbHNlCi0JCQkJaW5zbGVuIC09IGVzLT5jdXJzb3IgLSB0Y3Vyc29yOwotCQkJZXMtPmN1cnNvciA9IHRjdXJzb3I7Ci0JCX0KLQkJZXhwYW5kZWQgPSBOT05FOwotCQlyZXR1cm4gKDApOwotCX0KLQkvKiBJZiBhbnkgY2hhcnMgYXJlIGVudGVyZWQgYmVmb3JlIGVzY2FwZSwgdHJhc2ggdGhlIHNhdmVkIGluc2VydAotCSAqIGJ1ZmZlciAoaWYgdXNlciBpbnNlcnRzICYgZGVsZXRlcyBjaGFyLCBpYnVmIGdldHMgdHJhc2hlZCBhbmQKLQkgKiB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdCkKLQkgKi8KLQlpZiAoZmlyc3RfaW5zZXJ0ICYmIGNoICE9IEN0cmwoJ1snKSkKLQkJc2F2ZWRfaW5zbGVuID0gMDsKLQlzd2l0Y2ggKGNoKSB7Ci0JY2FzZSAnXDAnOgotCQlyZXR1cm4gKC0xKTsKLQotCWNhc2UgJ1xyJzoKLQljYXNlICdcbic6Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEN0cmwoJ1snKToKLQkJZXhwYW5kZWQgPSBOT05FOwotCQlpZiAoZmlyc3RfaW5zZXJ0KSB7Ci0JCQlmaXJzdF9pbnNlcnQgPSAwOwotCQkJaWYgKGluc2xlbiA9PSAwKSB7Ci0JCQkJaW5zbGVuID0gc2F2ZWRfaW5zbGVuOwotCQkJCXJldHVybiAocmVkb19pbnNlcnQoMCkpOwotCQkJfQotCQkJbGFzdGNtZFswXSA9ICdhJzsKLQkJCWxhc3RhYyA9IDE7Ci0JCX0KLQkJaWYgKGxhc3RjbWRbMF0gPT0gJ3MnIHx8IGxhc3RjbWRbMF0gPT0gJ2MnIHx8Ci0JCSAgICBsYXN0Y21kWzBdID09ICdDJykKLQkJCXJldHVybiAocmVkb19pbnNlcnQoMCkpOwotCQllbHNlCi0JCQlyZXR1cm4gKHJlZG9faW5zZXJ0KGxhc3RhYyAtIDEpKTsKLQotCS8qIHsgQmVnaW4gbm9uc3RhbmRhcmQgdmkgY29tbWFuZHMgKi8KLQljYXNlIEN0cmwoJ3gnKToKLQkJZXhwYW5kX3dvcmQoMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDdHJsKCdmJyk6Ci0JCWNvbXBsZXRlX3dvcmQoMCwgMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDdHJsKCdlJyk6Ci0JCXByaW50X2V4cGFuc2lvbnMoZXMsIDApOwotCQlicmVhazsKLQotCWNhc2UgQ3RybCgnaScpOgotCQlpZiAoRmxhZyhGVklUQUJDT01QTEVURSkpIHsKLQkJCWNvbXBsZXRlX3dvcmQoMCwgMCk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBGQUxMVEhST1VHSCAqLwotCS8qIEVuZCBub25zdGFuZGFyZCB2aSBjb21tYW5kcyB9ICovCi0KLQlkZWZhdWx0OgotCQlpZiAoZXMtPmxpbmVsZW4gPj0gZXMtPmNidWZzaXplIC0gMSkKLQkJCXJldHVybiAoLTEpOwotCQlpYnVmW2luc2xlbisrXSA9IGNoOwotCQlpZiAoaW5zZXJ0ID09IElOU0VSVCkgewotCQkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvciArIDFdLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCi0JCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKLQkJCWVzLT5saW5lbGVuKys7Ci0JCX0KLQkJZXMtPmNidWZbZXMtPmN1cnNvcisrXSA9IGNoOwotCQlpZiAoaW5zZXJ0ID09IFJFUExBQ0UgJiYgZXMtPmN1cnNvciA+IGVzLT5saW5lbGVuKQotCQkJZXMtPmxpbmVsZW4rKzsKLQkJZXhwYW5kZWQgPSBOT05FOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci12aV9jbWQoaW50IGFyZ2NudCwgY29uc3QgY2hhciAqY21kKQotewotCWludCBuY3Vyc29yOwotCWludCBjdXIsIGMxLCBjMiwgYzMgPSAwOwotCWludCBhbnk7Ci0Jc3RydWN0IGVkc3RhdGUgKnQ7Ci0KLQlpZiAoYXJnY250ID09IDAgJiYgIWlzX3plcm9jb3VudCgqY21kKSkKLQkJYXJnY250ID0gMTsKLQotCWlmIChpc19tb3ZlKCpjbWQpKSB7Ci0JCWlmICgoY3VyID0gZG9tb3ZlKGFyZ2NudCwgY21kLCAwKSkgPj0gMCkgewotCQkJaWYgKGN1ciA9PSBlcy0+bGluZWxlbiAmJiBjdXIgIT0gMCkKLQkJCQljdXItLTsKLQkJCWVzLT5jdXJzb3IgPSBjdXI7Ci0JCX0gZWxzZQotCQkJcmV0dXJuICgtMSk7Ci0JfSBlbHNlIHsKLQkJLyogRG9uJ3Qgc2F2ZSBzdGF0ZSBpbiBtaWRkbGUgb2YgbWFjcm8uLiAqLwotCQlpZiAoaXNfdW5kb2FibGUoKmNtZCkgJiYgIW1hY3JvLnApIHsKLQkJCXVuZG8tPndpbmxlZnQgPSBlcy0+d2lubGVmdDsKLQkJCW1lbW1vdmUodW5kby0+Y2J1ZiwgZXMtPmNidWYsIGVzLT5saW5lbGVuKTsKLQkJCXVuZG8tPmxpbmVsZW4gPSBlcy0+bGluZWxlbjsKLQkJCXVuZG8tPmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0JCQlsYXN0YWMgPSBhcmdjbnQ7Ci0JCQltZW1tb3ZlKGxhc3RjbWQsIGNtZCwgTUFYVklDTUQpOwotCQl9Ci0JCXN3aXRjaCAoKmNtZCkgewotCi0JCWNhc2UgQ3RybCgnbCcpOgotCQljYXNlIEN0cmwoJ3InKToKLQkJCXJlZHJhd19saW5lKDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnQCc6Ci0JCQl7Ci0JCQkJc3RhdGljIGNoYXIgYWxpYXNbXSA9ICJfXDAiOwotCQkJCXN0cnVjdCB0YmwgKmFwOwotCQkJCWludCBvbGVuLCBubGVuOwotCQkJCWNoYXIgKnAsICpuYnVmOwotCi0JCQkJLyogbG9va3VwIGxldHRlciBpbiBhbGlhcyBsaXN0Li4uICovCi0JCQkJYWxpYXNbMV0gPSBjbWRbMV07Ci0JCQkJYXAgPSBrdHNlYXJjaCgmYWxpYXNlcywgYWxpYXMsIGhhc2goYWxpYXMpKTsKLQkJCQlpZiAoIWNtZFsxXSB8fCAhYXAgfHwgIShhcC0+ZmxhZyAmIElTU0VUKSkKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHJlY3Vyc2l2ZSBjYWxsLi4uICovCi0JCQkJaWYgKChwID0gKGNoYXIgKiltYWNyby5wKSkKLQkJCQkJd2hpbGUgKChwID0gc3RybnVsKHApKSAmJiBwWzFdKQotCQkJCQkJaWYgKCorK3AgPT0gY21kWzFdKQotCQkJCQkJCXJldHVybiAoLTEpOwotCQkJCS8qIGluc2VydCBhbGlhcyBpbnRvIG1hY3JvIGJ1ZmZlciAqLwotCQkJCW5sZW4gPSBzdHJsZW4oYXAtPnZhbC5zKSArIDE7Ci0JCQkJb2xlbiA9ICFtYWNyby5wID8gMiA6Ci0JCQkJICAgIG1hY3JvLmxlbiAtIChtYWNyby5wIC0gbWFjcm8uYnVmKTsKLQkJCQluYnVmID0gYWxsb2MobmxlbiArIDEgKyBvbGVuLCBBUEVSTSk7Ci0JCQkJbWVtY3B5KG5idWYsIGFwLT52YWwucywgbmxlbik7Ci0JCQkJbmJ1ZltubGVuKytdID0gY21kWzFdOwotCQkJCWlmIChtYWNyby5wKSB7Ci0JCQkJCW1lbWNweShuYnVmICsgbmxlbiwgbWFjcm8ucCwgb2xlbik7Ci0JCQkJCWFmcmVlKG1hY3JvLmJ1ZiwgQVBFUk0pOwotCQkJCQlubGVuICs9IG9sZW47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmJ1ZltubGVuKytdID0gJ1wwJzsKLQkJCQkJbmJ1ZltubGVuKytdID0gJ1wwJzsKLQkJCQl9Ci0JCQkJbWFjcm8ucCA9IG1hY3JvLmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopbmJ1ZjsKLQkJCQltYWNyby5sZW4gPSBubGVuOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkKLQkJCQllcy0+Y3Vyc29yKys7Ci0JCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdBJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWRlbF9yYW5nZSgwLCAwKTsKLQkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKLQkJCWluc2VydCA9IElOU0VSVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkJZXMtPmN1cnNvciA9IGRvbW92ZSgxLCAiXiIsIDEpOwotCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWluc2VydCA9IElOU0VSVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1knOgotCQkJY21kID0gInkkIjsKLQkJCS8qIGFoaGhoaGguLi4gKi8KLQkJY2FzZSAnYyc6Ci0JCWNhc2UgJ2QnOgotCQljYXNlICd5JzoKLQkJCWlmICgqY21kID09IGNtZFsxXSkgewotCQkJCWMxID0gKmNtZCA9PSAnYycgPyBkb21vdmUoMSwgIl4iLCAxKSA6IDA7Ci0JCQkJYzIgPSBlcy0+bGluZWxlbjsKLQkJCX0gZWxzZSBpZiAoIWlzX21vdmUoY21kWzFdKSkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWVsc2UgewotCQkJCWlmICgobmN1cnNvciA9IGRvbW92ZShhcmdjbnQsICZjbWRbMV0sIDEpKSA8IDApCi0JCQkJCXJldHVybiAoLTEpOwotCQkJCWlmICgqY21kID09ICdjJyAmJgotCQkJCSAgICAoY21kWzFdID09ICd3JyB8fCBjbWRbMV0gPT0gJ1cnKSAmJgotCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbZXMtPmN1cnNvcl0pKSB7Ci0JCQkJCWRvIHsKLQkJCQkJCS0tbmN1cnNvcjsKLQkJCQkJfSB3aGlsZSAoa3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKTsKLQkJCQkJbmN1cnNvcisrOwotCQkJCX0KLQkJCQlpZiAobmN1cnNvciA+IGVzLT5jdXJzb3IpIHsKLQkJCQkJYzEgPSBlcy0+Y3Vyc29yOwotCQkJCQljMiA9IG5jdXJzb3I7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYzEgPSBuY3Vyc29yOwotCQkJCQljMiA9IGVzLT5jdXJzb3I7Ci0JCQkJCWlmIChjbWRbMV0gPT0gJyUnKQotCQkJCQkJYzIrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKmNtZCAhPSAnYycgJiYgYzEgIT0gYzIpCi0JCQkJeWFua19yYW5nZShjMSwgYzIpOwotCQkJaWYgKCpjbWQgIT0gJ3knKSB7Ci0JCQkJZGVsX3JhbmdlKGMxLCBjMik7Ci0JCQkJZXMtPmN1cnNvciA9IGMxOwotCQkJfQotCQkJaWYgKCpjbWQgPT0gJ2MnKSB7Ci0JCQkJbW9kaWZpZWQgPSAxOwotCQkJCWhudW0gPSBobGFzdDsKLQkJCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdwJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWlmIChlcy0+bGluZWxlbiAhPSAwKQotCQkJCWVzLT5jdXJzb3IrKzsKLQkJCXdoaWxlIChwdXRidWYoeWJ1ZiwgeWFua2xlbiwgMCkgPT0gMCAmJiAtLWFyZ2NudCA+IDApCi0JCQkJOwotCQkJaWYgKGVzLT5jdXJzb3IgIT0gMCkKLQkJCQllcy0+Y3Vyc29yLS07Ci0JCQlpZiAoYXJnY250ICE9IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlicmVhazsKLQotCQljYXNlICdQJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWFueSA9IDA7Ci0JCQl3aGlsZSAocHV0YnVmKHlidWYsIHlhbmtsZW4sIDApID09IDAgJiYgLS1hcmdjbnQgPiAwKQotCQkJCWFueSA9IDE7Ci0JCQlpZiAoYW55ICYmIGVzLT5jdXJzb3IgIT0gMCkKLQkJCQllcy0+Y3Vyc29yLS07Ci0JCQlpZiAoYXJnY250ICE9IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlicmVhazsKLQotCQljYXNlICdDJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7Ci0JCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdEJzoKLQkJCXlhbmtfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOwotCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKLQkJCWlmIChlcy0+Y3Vyc29yICE9IDApCi0JCQkJZXMtPmN1cnNvci0tOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnZyc6Ci0JCQlpZiAoIWFyZ2NudCkKLQkJCQlhcmdjbnQgPSBobGFzdDsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgJ0cnOgotCQkJaWYgKCFhcmdjbnQpCi0JCQkJYXJnY250ID0gMTsKLQkJCWVsc2UKLQkJCQlhcmdjbnQgPSBobGFzdCAtIChzb3VyY2UtPmxpbmUgLSBhcmdjbnQpOwotCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBhcmdjbnQgLSAxKSA8IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQllbHNlIHsKLQkJCQltb2RpZmllZCA9IDA7Ci0JCQkJaG51bSA9IGFyZ2NudCAtIDE7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdpJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWluc2VydCA9IElOU0VSVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkJbW9kaWZpZWQgPSAxOwotCQkJaG51bSA9IGhsYXN0OwotCQkJZXMtPmN1cnNvciA9IGRvbW92ZSgxLCAiXiIsIDEpOwotCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnaic6Ci0JCWNhc2UgJysnOgotCQljYXNlIEN0cmwoJ24nKToKLQkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgaG51bSArIGFyZ2NudCkgPCAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSAwOwotCQkJCWhudW0gKz0gYXJnY250OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnayc6Ci0JCWNhc2UgJy0nOgotCQljYXNlIEN0cmwoJ3AnKToKLQkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgaG51bSAtIGFyZ2NudCkgPCAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSAwOwotCQkJCWhudW0gLT0gYXJnY250OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWlmIChjbWRbMV0gPT0gMCkKLQkJCQl2aV9lcnJvcigpOwotCQkJZWxzZSB7Ci0JCQkJaW50IG47Ci0KLQkJCQlpZiAoZXMtPmN1cnNvciArIGFyZ2NudCA+IGVzLT5saW5lbGVuKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlmb3IgKG4gPSAwOyBuIDwgYXJnY250OyArK24pCi0JCQkJCWVzLT5jYnVmW2VzLT5jdXJzb3IgKyBuXSA9IGNtZFsxXTsKLQkJCQllcy0+Y3Vyc29yICs9IG4gLSAxOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnUic6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpbnNlcnQgPSBSRVBMQUNFOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncyc6Ci0JCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWlmIChlcy0+Y3Vyc29yICsgYXJnY250ID4gZXMtPmxpbmVsZW4pCi0JCQkJYXJnY250ID0gZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yOwotCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOwotCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAndic6Ci0JCQlpZiAoIWFyZ2NudCkgewotCQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlpZiAobW9kaWZpZWQpIHsKLQkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW5dID0gJ1wwJzsKLQkJCQkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgZXMtPmNidWYsIHRydWUsCi0JCQkJCSAgICB0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXJnY250ID0gc291cmNlLT5saW5lICsgMSAtCi0JCQkJCSAgICAoaGxhc3QgLSBobnVtKTsKLQkJCX0KLQkJCWlmIChhcmdjbnQpCi0JCQkJc2hmX3NucHJpbnRmKGVzLT5jYnVmLCBlcy0+Y2J1ZnNpemUsICIlcyAlZCIsCi0JCQkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLAotCQkJCSAgICBhcmdjbnQpOwotCQkJZWxzZQotCQkJCXN0cmxjcHkoZXMtPmNidWYsCi0JCQkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLAotCQkJCSAgICBlcy0+Y2J1ZnNpemUpOwotCQkJZXMtPmxpbmVsZW4gPSBzdHJsZW4oZXMtPmNidWYpOwotCQkJcmV0dXJuICgyKTsKLQotCQljYXNlICd4JzoKLQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJbW9kaWZpZWQgPSAxOwotCQkJaG51bSA9IGhsYXN0OwotCQkJaWYgKGVzLT5jdXJzb3IgKyBhcmdjbnQgPiBlcy0+bGluZWxlbikKLQkJCQlhcmdjbnQgPSBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3I7Ci0JCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOwotCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCQlpZiAoZXMtPmN1cnNvciA+IDApIHsKLQkJCQltb2RpZmllZCA9IDE7Ci0JCQkJaG51bSA9IGhsYXN0OwotCQkJCWlmIChlcy0+Y3Vyc29yIDwgYXJnY250KQotCQkJCQlhcmdjbnQgPSBlcy0+Y3Vyc29yOwotCQkJCXlhbmtfcmFuZ2UoZXMtPmN1cnNvciAtIGFyZ2NudCwgZXMtPmN1cnNvcik7Ci0JCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IgLSBhcmdjbnQsIGVzLT5jdXJzb3IpOwotCQkJCWVzLT5jdXJzb3IgLT0gYXJnY250OwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlicmVhazsKLQotCQljYXNlICd1JzoKLQkJCXQgPSBlczsKLQkJCWVzID0gdW5kbzsKLQkJCXVuZG8gPSB0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnVSc6Ci0JCQlpZiAoIW1vZGlmaWVkKQotCQkJCXJldHVybiAoLTEpOwotCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBvaG51bSkgPCAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJbW9kaWZpZWQgPSAwOwotCQkJaG51bSA9IG9obnVtOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnPyc6Ci0JCQlpZiAoaG51bSA9PSBobGFzdCkKLQkJCQlobnVtID0gLTE7Ci0JCQkvKiBhaGhoICovCi0JCWNhc2UgJy8nOgotCQkJYzMgPSAxOwotCQkJc3JjaGxlbiA9IDA7Ci0JCQlsYXN0c2VhcmNoID0gKmNtZDsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgJ24nOgotCQljYXNlICdOJzoKLQkJCWlmIChsYXN0c2VhcmNoID09ICcgJykKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWlmIChsYXN0c2VhcmNoID09ICc/JykKLQkJCQljMSA9IDE7Ci0JCQllbHNlCi0JCQkJYzEgPSAwOwotCQkJaWYgKCpjbWQgPT0gJ04nKQotCQkJCWMxID0gIWMxOwotCQkJaWYgKChjMiA9IGdyYWJzZWFyY2gobW9kaWZpZWQsIGhudW0sCi0JCQkgICAgYzEsIHNyY2hwYXQpKSA8IDApIHsKLQkJCQlpZiAoYzMpIHsKLQkJCQkJcmVzdG9yZV9jYnVmKCk7Ci0JCQkJCXJlZnJlc2goMCk7Ci0JCQkJfQotCQkJCXJldHVybiAoLTEpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RpZmllZCA9IDA7Ci0JCQkJaG51bSA9IGMyOwotCQkJCW9obnVtID0gaG51bTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdfJzoKLQkJCXsKLQkJCQlpbnQgaW5zcGFjZTsKLQkJCQljaGFyICpwLCAqc3A7Ci0KLQkJCQlpZiAoaGlzdG51bSgtMSkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlwID0gKmhpc3Rwb3MoKTsKLSNkZWZpbmUgaXNzcChjKQkJKGtzaF9pc3NwYWNlKGMpIHx8IChjKSA9PSAnXG4nKQotCQkJCWlmIChhcmdjbnQpIHsKLQkJCQkJd2hpbGUgKCpwICYmIGlzc3AoKnApKQotCQkJCQkJcCsrOwotCQkJCQl3aGlsZSAoKnAgJiYgLS1hcmdjbnQpIHsKLQkJCQkJCXdoaWxlICgqcCAmJiAhaXNzcCgqcCkpCi0JCQkJCQkJcCsrOwotCQkJCQkJd2hpbGUgKCpwICYmIGlzc3AoKnApKQotCQkJCQkJCXArKzsKLQkJCQkJfQotCQkJCQlpZiAoISpwKQotCQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJCXNwID0gcDsKLQkJCQl9IGVsc2UgewotCQkJCQlzcCA9IHA7Ci0JCQkJCWluc3BhY2UgPSAwOwotCQkJCQl3aGlsZSAoKnApIHsKLQkJCQkJCWlmIChpc3NwKCpwKSkKLQkJCQkJCQlpbnNwYWNlID0gMTsKLQkJCQkJCWVsc2UgaWYgKGluc3BhY2UpIHsKLQkJCQkJCQlpbnNwYWNlID0gMDsKLQkJCQkJCQlzcCA9IHA7Ci0JCQkJCQl9Ci0JCQkJCQlwKys7Ci0JCQkJCX0KLQkJCQkJcCA9IHNwOwotCQkJCX0KLQkJCQltb2RpZmllZCA9IDE7Ci0JCQkJaG51bSA9IGhsYXN0OwotCQkJCWlmIChlcy0+Y3Vyc29yICE9IGVzLT5saW5lbGVuKQotCQkJCQllcy0+Y3Vyc29yKys7Ci0JCQkJd2hpbGUgKCpwICYmICFpc3NwKCpwKSkgewotCQkJCQlhcmdjbnQrKzsKLQkJCQkJcCsrOwotCQkJCX0KLQkJCQlpZiAocHV0YnVmKCIgIiwgMSwgMCkgIT0gMCkKLQkJCQkJYXJnY250ID0gLTE7Ci0JCQkJZWxzZSBpZiAocHV0YnVmKHNwLCBhcmdjbnQsIDApICE9IDApCi0JCQkJCWFyZ2NudCA9IC0xOwotCQkJCWlmIChhcmdjbnQgPCAwKSB7Ci0JCQkJCWlmIChlcy0+Y3Vyc29yICE9IDApCi0JCQkJCQllcy0+Y3Vyc29yLS07Ci0JCQkJCXJldHVybiAoLTEpOwotCQkJCX0KLQkJCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICd+JzoKLQkJCXsKLQkJCQljaGFyICpwOwotCQkJCWludCBpOwotCi0JCQkJaWYgKGVzLT5saW5lbGVuID09IDApCi0JCQkJCXJldHVybiAoLTEpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBhcmdjbnQ7IGkrKykgewotCQkJCQlwID0gJmVzLT5jYnVmW2VzLT5jdXJzb3JdOwotCQkJCQlpZiAoa3NoX2lzbG93ZXIoKnApKSB7Ci0JCQkJCQltb2RpZmllZCA9IDE7Ci0JCQkJCQlobnVtID0gaGxhc3Q7Ci0JCQkJCQkqcCA9IGtzaF90b3VwcGVyKCpwKTsKLQkJCQkJfSBlbHNlIGlmIChrc2hfaXN1cHBlcigqcCkpIHsKLQkJCQkJCW1vZGlmaWVkID0gMTsKLQkJCQkJCWhudW0gPSBobGFzdDsKLQkJCQkJCSpwID0ga3NoX3RvbG93ZXIoKnApOwotCQkJCQl9Ci0JCQkJCWlmIChlcy0+Y3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKQotCQkJCQkJZXMtPmN1cnNvcisrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQljYXNlICcjJzoKLQkJCXsKLQkJCQlpbnQgcmV0ID0geF9kb19jb21tZW50KGVzLT5jYnVmLCBlcy0+Y2J1ZnNpemUsCi0JCQkJICAgICZlcy0+bGluZWxlbik7Ci0JCQkJaWYgKHJldCA+PSAwKQotCQkJCQllcy0+Y3Vyc29yID0gMDsKLQkJCQlyZXR1cm4gKHJldCk7Ci0JCQl9Ci0KLQkJY2FzZSAnPSc6CQkJLyogQVQmVCBrc2ggKi8KLQkJY2FzZSBDdHJsKCdlJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCi0JCQlwcmludF9leHBhbnNpb25zKGVzLCAxKTsKLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBDdHJsKCdpJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCi0JCQlpZiAoIUZsYWcoRlZJVEFCQ09NUExFVEUpKQotCQkJCXJldHVybiAoLTEpOwotCQkJY29tcGxldGVfd29yZCgxLCBhcmdjbnQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDdHJsKCdbJyk6CQkJLyogc29tZSBhbm5veWluZyBBVCZUIGtzaHMgKi8KLQkJCWlmICghRmxhZyhGVklFU0NDT01QTEVURSkpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCWNhc2UgJ1xcJzoJCQkvKiBBVCZUIGtzaCAqLwotCQljYXNlIEN0cmwoJ2YnKToJCQkvKiBOb25zdGFuZGFyZCB2aS9rc2ggKi8KLQkJCWNvbXBsZXRlX3dvcmQoMSwgYXJnY250KTsKLQkJCWJyZWFrOwotCi0KLQkJY2FzZSAnKic6CQkJLyogQVQmVCBrc2ggKi8KLQkJY2FzZSBDdHJsKCd4Jyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCi0JCQlleHBhbmRfd29yZCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbnNlcnQgPT0gMCAmJiBlcy0+Y3Vyc29yICE9IDAgJiYgZXMtPmN1cnNvciA+PSBlcy0+bGluZWxlbikKLQkJCWVzLT5jdXJzb3ItLTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotZG9tb3ZlKGludCBhcmdjbnQsIGNvbnN0IGNoYXIgKmNtZCwgaW50IHN1YikKLXsKLQlpbnQgYmNvdW50LCBpID0gMCwgdDsKLQlpbnQgbmN1cnNvciA9IDA7Ci0KLQlzd2l0Y2ggKCpjbWQpIHsKLQljYXNlICdiJzoKLQkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciA9PSAwKQotCQkJcmV0dXJuICgtMSk7Ci0JCW5jdXJzb3IgPSBiYWNrd29yZChhcmdjbnQpOwotCQlicmVhazsKLQotCWNhc2UgJ0InOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yID09IDApCi0JCQlyZXR1cm4gKC0xKTsKLQkJbmN1cnNvciA9IEJhY2t3b3JkKGFyZ2NudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAnZSc6Ci0JCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQotCQkJcmV0dXJuICgtMSk7Ci0JCW5jdXJzb3IgPSBlbmR3b3JkKGFyZ2NudCk7Ci0JCWlmIChzdWIgJiYgbmN1cnNvciA8IGVzLT5saW5lbGVuKQotCQkJbmN1cnNvcisrOwotCQlicmVhazsKLQotCWNhc2UgJ0UnOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gRW5kd29yZChhcmdjbnQpOwotCQlpZiAoc3ViICYmIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IrKzsKLQkJYnJlYWs7Ci0KLQljYXNlICdmJzoKLQljYXNlICdGJzoKLQljYXNlICd0JzoKLQljYXNlICdUJzoKLQkJZnNhdmVjbWQgPSAqY21kOwotCQlmc2F2ZWNoID0gY21kWzFdOwotCQkvKiBkcm9wIHRocm91Z2ggKi8KLQotCWNhc2UgJywnOgotCWNhc2UgJzsnOgotCQlpZiAoZnNhdmVjbWQgPT0gJyAnKQotCQkJcmV0dXJuICgtMSk7Ci0JCWkgPSBmc2F2ZWNtZCA9PSAnZicgfHwgZnNhdmVjbWQgPT0gJ0YnOwotCQl0ID0gZnNhdmVjbWQgPiAnYSc7Ci0JCWlmICgqY21kID09ICcsJykKLQkJCXQgPSAhdDsKLQkJaWYgKChuY3Vyc29yID0gZmluZGNoKGZzYXZlY2gsIGFyZ2NudCwgdCwgaSkpIDwgMCkKLQkJCXJldHVybiAoLTEpOwotCQlpZiAoc3ViICYmIHQpCi0JCQluY3Vyc29yKys7Ci0JCWJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JY2FzZSBDdHJsKCdoJyk6Ci0JCWlmICghc3ViICYmIGVzLT5jdXJzb3IgPT0gMCkKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gZXMtPmN1cnNvciAtIGFyZ2NudDsKLQkJaWYgKG5jdXJzb3IgPCAwKQotCQkJbmN1cnNvciA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSAnICc6Ci0JY2FzZSAnbCc6Ci0JCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQotCQkJcmV0dXJuICgtMSk7Ci0JCWlmIChlcy0+bGluZWxlbiAhPSAwKSB7Ci0JCQluY3Vyc29yID0gZXMtPmN1cnNvciArIGFyZ2NudDsKLQkJCWlmIChuY3Vyc29yID4gZXMtPmxpbmVsZW4pCi0JCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAndyc6Ci0JCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQotCQkJcmV0dXJuICgtMSk7Ci0JCW5jdXJzb3IgPSBmb3J3d29yZChhcmdjbnQpOwotCQlicmVhazsKLQotCWNhc2UgJ1cnOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gRm9yd3dvcmQoYXJnY250KTsKLQkJYnJlYWs7Ci0KLQljYXNlICcwJzoKLQkJbmN1cnNvciA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSAnXic6Ci0JCW5jdXJzb3IgPSAwOwotCQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgotCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJbmN1cnNvcisrOwotCQlicmVhazsKLQotCWNhc2UgJ3wnOgotCQluY3Vyc29yID0gYXJnY250OwotCQlpZiAobmN1cnNvciA+IGVzLT5saW5lbGVuKQotCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOwotCQlpZiAobmN1cnNvcikKLQkJCW5jdXJzb3ItLTsKLQkJYnJlYWs7Ci0KLQljYXNlICckJzoKLQkJaWYgKGVzLT5saW5lbGVuICE9IDApCi0JCQluY3Vyc29yID0gZXMtPmxpbmVsZW47Ci0JCWVsc2UKLQkJCW5jdXJzb3IgPSAwOwotCQlicmVhazsKLQotCWNhc2UgJyUnOgotCQluY3Vyc29yID0gZXMtPmN1cnNvcjsKLQkJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgotCQkgICAgKGkgPSBicmFja3R5cGUoZXMtPmNidWZbbmN1cnNvcl0pKSA9PSAwKQotCQkJbmN1cnNvcisrOwotCQlpZiAobmN1cnNvciA9PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQliY291bnQgPSAxOwotCQlkbyB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlpZiAoKytuY3Vyc29yID49IGVzLT5saW5lbGVuKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKC0tbmN1cnNvciA8IDApCi0JCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQkJdCA9IGJyYWNrdHlwZShlcy0+Y2J1ZltuY3Vyc29yXSk7Ci0JCQlpZiAodCA9PSBpKQotCQkJCWJjb3VudCsrOwotCQkJZWxzZSBpZiAodCA9PSAtaSkKLQkJCQliY291bnQtLTsKLQkJfSB3aGlsZSAoYmNvdW50ICE9IDApOwotCQlpZiAoc3ViICYmIGkgPiAwKQotCQkJbmN1cnNvcisrOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAoLTEpOwotCX0KLQlyZXR1cm4gKG5jdXJzb3IpOwotfQotCi1zdGF0aWMgaW50Ci1yZWRvX2luc2VydChpbnQgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKQotCQlpZiAocHV0YnVmKGlidWYsIGluc2xlbiwgaW5zZXJ0ID09IFJFUExBQ0UpICE9IDApCi0JCQlyZXR1cm4gKC0xKTsKLQlpZiAoZXMtPmN1cnNvciA+IDApCi0JCWVzLT5jdXJzb3ItLTsKLQlpbnNlcnQgPSAwOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi15YW5rX3JhbmdlKGludCBhLCBpbnQgYikKLXsKLQl5YW5rbGVuID0gYiAtIGE7Ci0JaWYgKHlhbmtsZW4gIT0gMCkKLQkJbWVtbW92ZSh5YnVmLCAmZXMtPmNidWZbYV0sIHlhbmtsZW4pOwotfQotCi1zdGF0aWMgaW50Ci1icmFja3R5cGUoaW50IGNoKQotewotCXN3aXRjaCAoY2gpIHsKLQotCWNhc2UgJygnOgotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSAnWyc6Ci0JCXJldHVybiAoMik7Ci0KLQljYXNlICd7JzoKLQkJcmV0dXJuICgzKTsKLQotCWNhc2UgJyknOgotCQlyZXR1cm4gKC0xKTsKLQotCWNhc2UgJ10nOgotCQlyZXR1cm4gKC0yKTsKLQotCWNhc2UgJ30nOgotCQlyZXR1cm4gKC0zKTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotCi0vKgotICoJTm9uIHVzZXIgaW50ZXJmYWNlIGVkaXRvciByb3V0aW5lcyBiZWxvdyBoZXJlCi0gKi8KLQotc3RhdGljIHZvaWQKLXNhdmVfY2J1Zih2b2lkKQotewotCW1lbW1vdmUoaG9sZGJ1ZiwgZXMtPmNidWYsIGVzLT5saW5lbGVuKTsKLQlob2xkbGVuID0gZXMtPmxpbmVsZW47Ci0JaG9sZGJ1Zltob2xkbGVuXSA9ICdcMCc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXN0b3JlX2NidWYodm9pZCkKLXsKLQllcy0+Y3Vyc29yID0gMDsKLQllcy0+bGluZWxlbiA9IGhvbGRsZW47Ci0JbWVtbW92ZShlcy0+Y2J1ZiwgaG9sZGJ1ZiwgaG9sZGxlbik7Ci19Ci0KLS8qIHJldHVybiBhIG5ldyBlZHN0YXRlICovCi1zdGF0aWMgc3RydWN0IGVkc3RhdGUgKgotc2F2ZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpCi17Ci0Jc3RydWN0IGVkc3RhdGUgKm5ld3M7Ci0KLQluZXdzID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBlZHN0YXRlKSwgQVBFUk0pOwotCW5ld3MtPmNidWYgPSBhbGxvYyhvbGQtPmNidWZzaXplLCBBUEVSTSk7Ci0JbWVtY3B5KG5ld3MtPmNidWYsIG9sZC0+Y2J1Ziwgb2xkLT5saW5lbGVuKTsKLQluZXdzLT5jYnVmc2l6ZSA9IG9sZC0+Y2J1ZnNpemU7Ci0JbmV3cy0+bGluZWxlbiA9IG9sZC0+bGluZWxlbjsKLQluZXdzLT5jdXJzb3IgPSBvbGQtPmN1cnNvcjsKLQluZXdzLT53aW5sZWZ0ID0gb2xkLT53aW5sZWZ0OwotCXJldHVybiAobmV3cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXN0b3JlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm5ld3MsIHN0cnVjdCBlZHN0YXRlICpvbGQpCi17Ci0JbWVtY3B5KG5ld3MtPmNidWYsIG9sZC0+Y2J1Ziwgb2xkLT5saW5lbGVuKTsKLQluZXdzLT5saW5lbGVuID0gb2xkLT5saW5lbGVuOwotCW5ld3MtPmN1cnNvciA9IG9sZC0+Y3Vyc29yOwotCW5ld3MtPndpbmxlZnQgPSBvbGQtPndpbmxlZnQ7Ci0JZnJlZV9lZHN0YXRlKG9sZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCkKLXsKLQlhZnJlZShvbGQtPmNidWYsIEFQRVJNKTsKLQlhZnJlZShvbGQsIEFQRVJNKTsKLX0KLQotLyoKLSAqIHRoaXMgaXMgdXNlZCBmb3IgY2FsbGluZyB4X2VzY2FwZSgpIGluIGNvbXBsZXRlX3dvcmQoKQotICovCi1zdGF0aWMgaW50Ci14X3ZpX3B1dGJ1Zihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQotewotCXJldHVybiAocHV0YnVmKHMsIGxlbiwgMCkpOwotfQotCi1zdGF0aWMgaW50Ci1wdXRidWYoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVwbCkKLXsKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAoMCk7Ci0JaWYgKHJlcGwpIHsKLQkJaWYgKGVzLT5jdXJzb3IgKyBsZW4gPj0gZXMtPmNidWZzaXplKQotCQkJcmV0dXJuICgtMSk7Ci0JCWlmIChlcy0+Y3Vyc29yICsgbGVuID4gZXMtPmxpbmVsZW4pCi0JCQllcy0+bGluZWxlbiA9IGVzLT5jdXJzb3IgKyBsZW47Ci0JfSBlbHNlIHsKLQkJaWYgKGVzLT5saW5lbGVuICsgbGVuID49IGVzLT5jYnVmc2l6ZSkKLQkJCXJldHVybiAoLTEpOwotCQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yICsgbGVuXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAotCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKLQkJZXMtPmxpbmVsZW4gKz0gbGVuOwotCX0KLQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwgYnVmLCBsZW4pOwotCWVzLT5jdXJzb3IgKz0gbGVuOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWxfcmFuZ2UoaW50IGEsIGludCBiKQotewotCWlmIChlcy0+bGluZWxlbiAhPSBiKQotCQltZW1tb3ZlKCZlcy0+Y2J1ZlthXSwgJmVzLT5jYnVmW2JdLCBlcy0+bGluZWxlbiAtIGIpOwotCWVzLT5saW5lbGVuIC09IGIgLSBhOwotfQotCi1zdGF0aWMgaW50Ci1maW5kY2goaW50IGNoLCBpbnQgY250LCBpbnQgZm9ydywgaW50IGluY2wpCi17Ci0JaW50IG5jdXJzb3I7Ci0KLQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKLQkJcmV0dXJuICgtMSk7Ci0JbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0Jd2hpbGUgKGNudC0tKSB7Ci0JCWRvIHsKLQkJCWlmIChmb3J3KSB7Ci0JCQkJaWYgKCsrbmN1cnNvciA9PSBlcy0+bGluZWxlbikKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgtLW5jdXJzb3IgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJfSB3aGlsZSAoZXMtPmNidWZbbmN1cnNvcl0gIT0gY2gpOwotCX0KLQlpZiAoIWluY2wpIHsKLQkJaWYgKGZvcncpCi0JCQluY3Vyc29yLS07Ci0JCWVsc2UKLQkJCW5jdXJzb3IrKzsKLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotZm9yd3dvcmQoaW50IGFyZ2NudCkKLXsKLQlpbnQgbmN1cnNvcjsKLQotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKLQkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCXdoaWxlIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCi0JCQkJbmN1cnNvcisrOwotCQllbHNlIGlmICgha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJd2hpbGUgKCFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCi0JCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQotCQkJCW5jdXJzb3IrKzsKLQkJd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgotCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQotCQkJbmN1cnNvcisrOwotCX0KLQlyZXR1cm4gKG5jdXJzb3IpOwotfQotCi1zdGF0aWMgaW50Ci1iYWNrd29yZChpbnQgYXJnY250KQotewotCWludCBuY3Vyc29yOwotCi0JbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0Jd2hpbGUgKG5jdXJzb3IgPiAwICYmIGFyZ2NudC0tKSB7Ci0JCXdoaWxlICgtLW5jdXJzb3IgPiAwICYmIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCTsKLQkJaWYgKG5jdXJzb3IgPiAwKSB7Ci0JCQlpZiAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCXdoaWxlICgtLW5jdXJzb3IgPj0gMCAmJgotCQkJCSAgICBrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQkJCTsKLQkJCWVsc2UKLQkJCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYKLQkJCQkgICAgIWtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgotCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCQk7Ci0JCQluY3Vyc29yKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotZW5kd29yZChpbnQgYXJnY250KQotewotCWludCBuY3Vyc29yOwotCi0JbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0Jd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJiBhcmdjbnQtLSkgewotCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmCi0JCSAgICBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQk7Ci0JCWlmIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKSB7Ci0JCQlpZiAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgotCQkJCSAgICBrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQkJCTsKLQkJCWVsc2UKLQkJCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKLQkJCQkgICAgIWtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgotCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCQk7Ci0JCQluY3Vyc29yLS07Ci0JCX0KLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotRm9yd3dvcmQoaW50IGFyZ2NudCkKLXsKLQlpbnQgbmN1cnNvcjsKLQotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKLQkJd2hpbGUgKCFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IrKzsKLQkJd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgotCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQotCQkJbmN1cnNvcisrOwotCX0KLQlyZXR1cm4gKG5jdXJzb3IpOwotfQotCi1zdGF0aWMgaW50Ci1CYWNrd29yZChpbnQgYXJnY250KQotewotCWludCBuY3Vyc29yOwotCi0JbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0Jd2hpbGUgKG5jdXJzb3IgPiAwICYmIGFyZ2NudC0tKSB7Ci0JCXdoaWxlICgtLW5jdXJzb3IgPj0gMCAmJiBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQk7Ci0JCXdoaWxlIChuY3Vyc29yID49IDAgJiYgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCW5jdXJzb3ItLTsKLQkJbmN1cnNvcisrOwotCX0KLQlyZXR1cm4gKG5jdXJzb3IpOwotfQotCi1zdGF0aWMgaW50Ci1FbmR3b3JkKGludCBhcmdjbnQpCi17Ci0JaW50IG5jdXJzb3I7Ci0KLQluY3Vyc29yID0gZXMtPmN1cnNvcjsKLQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJiBhcmdjbnQtLSkgewotCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmCi0JCSAgICBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQk7Ci0JCWlmIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKSB7Ci0JCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKLQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCTsKLQkJCW5jdXJzb3ItLTsKLQkJfQotCX0KLQlyZXR1cm4gKG5jdXJzb3IpOwotfQotCi1zdGF0aWMgaW50Ci1ncmFiaGlzdChpbnQgc2F2ZSwgaW50IG4pCi17Ci0JY2hhciAqaHB0cjsKLQotCWlmIChuIDwgMCB8fCBuID4gaGxhc3QpCi0JCXJldHVybiAoLTEpOwotCWlmIChuID09IGhsYXN0KSB7Ci0JCXJlc3RvcmVfY2J1ZigpOwotCQlvaG51bSA9IG47Ci0JCXJldHVybiAoMCk7Ci0JfQotCSh2b2lkKWhpc3RudW0obik7Ci0JaWYgKChocHRyID0gKmhpc3Rwb3MoKSkgPT0gTlVMTCkgewotCQlpbnRlcm5hbF93YXJuaW5nZigiZ3JhYmhpc3Q6IGJhZCBoaXN0b3J5IGFycmF5Iik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoc2F2ZSkKLQkJc2F2ZV9jYnVmKCk7Ci0JaWYgKChlcy0+bGluZWxlbiA9IHN0cmxlbihocHRyKSkgPj0gZXMtPmNidWZzaXplKQotCQllcy0+bGluZWxlbiA9IGVzLT5jYnVmc2l6ZSAtIDE7Ci0JbWVtbW92ZShlcy0+Y2J1ZiwgaHB0ciwgZXMtPmxpbmVsZW4pOwotCWVzLT5jdXJzb3IgPSAwOwotCW9obnVtID0gbjsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1ncmFic2VhcmNoKGludCBzYXZlLCBpbnQgc3RhcnQsIGludCBmd2QsIGNoYXIgKnBhdCkKLXsKLQljaGFyICpocHRyOwotCWludCBoaXN0OwotCWludCBhbmNob3JlZDsKLQotCWlmICgoc3RhcnQgPT0gMCAmJiBmd2QgPT0gMCkgfHwgKHN0YXJ0ID49IGhsYXN0IC0gMSAmJiBmd2QgPT0gMSkpCi0JCXJldHVybiAoLTEpOwotCWlmIChmd2QpCi0JCXN0YXJ0Kys7Ci0JZWxzZQotCQlzdGFydC0tOwotCWFuY2hvcmVkID0gKnBhdCA9PSAnXicgPyAoKytwYXQsIDEpIDogMDsKLQlpZiAoKGhpc3QgPSBmaW5kaGlzdChzdGFydCwgZndkLCBwYXQsIGFuY2hvcmVkKSkgPCAwKSB7Ci0JCS8qIGlmIChzdGFydCAhPSAwICYmIGZ3ZCAmJiBtYXRjaChob2xkYnVmLCBwYXQpID49IDApIHsgKi8KLQkJLyogWFhYIHNob3VsZCBzdHJjbXAgYmUgc3RybmNtcD8gKi8KLQkJaWYgKHN0YXJ0ICE9IDAgJiYgZndkICYmIHN0cmNtcChob2xkYnVmLCBwYXQpID49IDApIHsKLQkJCXJlc3RvcmVfY2J1ZigpOwotCQkJcmV0dXJuICgwKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKHNhdmUpCi0JCXNhdmVfY2J1ZigpOwotCWhpc3RudW0oaGlzdCk7Ci0JaHB0ciA9ICpoaXN0cG9zKCk7Ci0JaWYgKChlcy0+bGluZWxlbiA9IHN0cmxlbihocHRyKSkgPj0gZXMtPmNidWZzaXplKQotCQllcy0+bGluZWxlbiA9IGVzLT5jYnVmc2l6ZSAtIDE7Ci0JbWVtbW92ZShlcy0+Y2J1ZiwgaHB0ciwgZXMtPmxpbmVsZW4pOwotCWVzLT5jdXJzb3IgPSAwOwotCXJldHVybiAoaGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWRyYXdfbGluZShpbnQgbmV3bCkKLXsKLQkodm9pZCltZW1zZXQod2J1Zlt3aW5dLCAnICcsIHdidWZfbGVuKTsKLQlpZiAobmV3bCkgewotCQl4X3B1dGMoJ1xyJyk7Ci0JCXhfcHV0YygnXG4nKTsKLQl9Ci0JaWYgKHByb21wdF9yZWRyYXcpCi0JCXBwcm9tcHQocHJvbXB0LCBwcm9tcHRfdHJ1bmMpOwotCWN1cl9jb2wgPSBwd2lkdGg7Ci0JbW9yZWMgPSAnICc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWZyZXNoKGludCBsZWZ0c2lkZSkKLXsKLQlpZiAobGVmdHNpZGUgPCAwKQotCQlsZWZ0c2lkZSA9IGxhc3RyZWY7Ci0JZWxzZQotCQlsYXN0cmVmID0gbGVmdHNpZGU7Ci0JaWYgKG91dG9md2luKCkpCi0JCXJld2luZG93KCk7Ci0JZGlzcGxheSh3YnVmWzEgLSB3aW5dLCB3YnVmW3dpbl0sIGxlZnRzaWRlKTsKLQl3aW4gPSAxIC0gd2luOwotfQotCi1zdGF0aWMgaW50Ci1vdXRvZndpbih2b2lkKQotewotCWludCBjdXIsIGNvbDsKLQotCWlmIChlcy0+Y3Vyc29yIDwgZXMtPndpbmxlZnQpCi0JCXJldHVybiAoMSk7Ci0JY29sID0gMDsKLQljdXIgPSBlcy0+d2lubGVmdDsKLQl3aGlsZSAoY3VyIDwgZXMtPmN1cnNvcikKLQkJY29sID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW2N1cisrXSwgY29sKTsKLQlpZiAoY29sID49IHdpbndpZHRoKQotCQlyZXR1cm4gKDEpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXdpbmRvdyh2b2lkKQotewotCWludCB0Y3VyLCB0Y29sOwotCWludCBob2xkY3VyMSwgaG9sZGNvbDE7Ci0JaW50IGhvbGRjdXIyLCBob2xkY29sMjsKLQotCWhvbGRjdXIxID0gaG9sZGN1cjIgPSB0Y3VyID0gMDsKLQlob2xkY29sMSA9IGhvbGRjb2wyID0gdGNvbCA9IDA7Ci0Jd2hpbGUgKHRjdXIgPCBlcy0+Y3Vyc29yKSB7Ci0JCWlmICh0Y29sIC0gaG9sZGNvbDIgPiB3aW53aWR0aCAvIDIpIHsKLQkJCWhvbGRjdXIxID0gaG9sZGN1cjI7Ci0JCQlob2xkY29sMSA9IGhvbGRjb2wyOwotCQkJaG9sZGN1cjIgPSB0Y3VyOwotCQkJaG9sZGNvbDIgPSB0Y29sOwotCQl9Ci0JCXRjb2wgPSBuZXdjb2woKHVuc2lnbmVkIGNoYXIpZXMtPmNidWZbdGN1cisrXSwgdGNvbCk7Ci0JfQotCXdoaWxlICh0Y29sIC0gaG9sZGNvbDEgPiB3aW53aWR0aCAvIDIpCi0JCWhvbGRjb2wxID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW2hvbGRjdXIxKytdLAotCQkgICAgaG9sZGNvbDEpOwotCWVzLT53aW5sZWZ0ID0gaG9sZGN1cjE7Ci19Ci0KLXN0YXRpYyBpbnQKLW5ld2NvbChpbnQgY2gsIGludCBjb2wpCi17Ci0JaWYgKGNoID09ICdcdCcpCi0JCXJldHVybiAoKGNvbCB8IDcpICsgMSk7Ci0JcmV0dXJuIChjb2wgKyBjaGFyX2xlbihjaCkpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheShjaGFyICp3YjEsIGNoYXIgKndiMiwgaW50IGxlZnRzaWRlKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JY2hhciAqdHdiMSwgKnR3YjIsIG1jOwotCWludCBjdXIsIGNvbCwgY250OwotCWludCBuY29sID0gMDsKLQlpbnQgbW9yZXJpZ2h0OwotCi0JY29sID0gMDsKLQljdXIgPSBlcy0+d2lubGVmdDsKLQltb3JlcmlnaHQgPSAwOwotCXR3YjEgPSB3YjE7Ci0Jd2hpbGUgKGNvbCA8IHdpbndpZHRoICYmIGN1ciA8IGVzLT5saW5lbGVuKSB7Ci0JCWlmIChjdXIgPT0gZXMtPmN1cnNvciAmJiBsZWZ0c2lkZSkKLQkJCW5jb2wgPSBjb2wgKyBwd2lkdGg7Ci0JCWlmICgoY2ggPSBlcy0+Y2J1ZltjdXJdKSA9PSAnXHQnKQotCQkJZG8gewotCQkJCSp0d2IxKysgPSAnICc7Ci0JCQl9IHdoaWxlICgrK2NvbCA8IHdpbndpZHRoICYmIChjb2wgJiA3KSAhPSAwKTsKLQkJZWxzZSBpZiAoY29sIDwgd2lud2lkdGgpIHsKLQkJCWlmIChjaCA8ICcgJyB8fCBjaCA9PSAweDdmKSB7Ci0JCQkJKnR3YjErKyA9ICdeJzsKLQkJCQlpZiAoKytjb2wgPCB3aW53aWR0aCkgewotCQkJCQkqdHdiMSsrID0gY2ggXiAnQCc7Ci0JCQkJCWNvbCsrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJKnR3YjErKyA9IGNoOwotCQkJCWNvbCsrOwotCQkJfQotCQl9Ci0JCWlmIChjdXIgPT0gZXMtPmN1cnNvciAmJiAhbGVmdHNpZGUpCi0JCQluY29sID0gY29sICsgcHdpZHRoIC0gMTsKLQkJY3VyKys7Ci0JfQotCWlmIChjdXIgPT0gZXMtPmN1cnNvcikKLQkJbmNvbCA9IGNvbCArIHB3aWR0aDsKLQlpZiAoY29sIDwgd2lud2lkdGgpIHsKLQkJd2hpbGUgKGNvbCA8IHdpbndpZHRoKSB7Ci0JCQkqdHdiMSsrID0gJyAnOwotCQkJY29sKys7Ci0JCX0KLQl9IGVsc2UKLQkJbW9yZXJpZ2h0Kys7Ci0JKnR3YjEgPSAnICc7Ci0KLQljb2wgPSBwd2lkdGg7Ci0JY250ID0gd2lud2lkdGg7Ci0JdHdiMSA9IHdiMTsKLQl0d2IyID0gd2IyOwotCXdoaWxlIChjbnQtLSkgewotCQlpZiAoKnR3YjEgIT0gKnR3YjIpIHsKLQkJCWlmIChjdXJfY29sICE9IGNvbCkKLQkJCQllZF9tb3Zfb3B0KGNvbCwgd2IxKTsKLQkJCXhfcHV0YygqdHdiMSk7Ci0JCQljdXJfY29sKys7Ci0JCX0KLQkJdHdiMSsrOwotCQl0d2IyKys7Ci0JCWNvbCsrOwotCX0KLQlpZiAoZXMtPndpbmxlZnQgPiAwICYmIG1vcmVyaWdodCkKLQkJLyogUE9TSVggc2F5cyB0byB1c2UgKiBmb3IgdGhpcyBidXQgdGhhdCBpcyBhIGdsb2JiaW5nCi0JCSAqIGNoYXJhY3RlciBhbmQgbWF5IGNvbmZ1c2UgcGVvcGxlOyArIGlzIG1vcmUgaW5ub2N1b3VzCi0JCSAqLwotCQltYyA9ICcrJzsKLQllbHNlIGlmIChlcy0+d2lubGVmdCA+IDApCi0JCW1jID0gJzwnOwotCWVsc2UgaWYgKG1vcmVyaWdodCkKLQkJbWMgPSAnPic7Ci0JZWxzZQotCQltYyA9ICcgJzsKLQlpZiAobWMgIT0gbW9yZWMpIHsKLQkJZWRfbW92X29wdChwd2lkdGggKyB3aW53aWR0aCArIDEsIHdiMSk7Ci0JCXhfcHV0YyhtYyk7Ci0JCWN1cl9jb2wrKzsKLQkJbW9yZWMgPSBtYzsKLQl9Ci0JaWYgKGN1cl9jb2wgIT0gbmNvbCkKLQkJZWRfbW92X29wdChuY29sLCB3YjEpOwotfQotCi1zdGF0aWMgdm9pZAotZWRfbW92X29wdChpbnQgY29sLCBjaGFyICp3YikKLXsKLQlpZiAoY29sIDwgY3VyX2NvbCkgewotCQlpZiAoY29sICsgMSA8IGN1cl9jb2wgLSBjb2wpIHsKLQkJCXhfcHV0YygnXHInKTsKLQkJCWlmIChwcm9tcHRfcmVkcmF3KQotCQkJCXBwcm9tcHQocHJvbXB0LCBwcm9tcHRfdHJ1bmMpOwotCQkJY3VyX2NvbCA9IHB3aWR0aDsKLQkJCXdoaWxlIChjdXJfY29sKysgPCBjb2wpCi0JCQkJeF9wdXRjZigqd2IrKyk7Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoY3VyX2NvbC0tID4gY29sKQotCQkJCXhfcHV0YygnXGInKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXdiID0gJndiW2N1cl9jb2wgLSBwd2lkdGhdOwotCQl3aGlsZSAoY3VyX2NvbCsrIDwgY29sKQotCQkJeF9wdXRjZigqd2IrKyk7Ci0JfQotCWN1cl9jb2wgPSBjb2w7Ci19Ci0KLQotLyogcmVwbGFjZSB3b3JkIHdpdGggYWxsIGV4cGFuc2lvbnMgKGllLCBleHBhbmQgd29yZCopICovCi1zdGF0aWMgaW50Ci1leHBhbmRfd29yZChpbnQgY21kKQotewotCXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZSAqYnVmOwotCWludCBydmFsID0gMDsKLQlpbnQgbndvcmRzOwotCWludCBzdGFydCwgZW5kOwotCWNoYXIgKip3b3JkczsKLQlpbnQgaTsKLQotCS8qIFVuZG8gcHJldmlvdXMgZXhwYW5zaW9uICovCi0JaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IEVYUEFORCAmJiBidWYpIHsKLQkJcmVzdG9yZV9lZHN0YXRlKGVzLCBidWYpOwotCQlidWYgPSAwOwotCQlleHBhbmRlZCA9IE5PTkU7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChidWYpIHsKLQkJZnJlZV9lZHN0YXRlKGJ1Zik7Ci0JCWJ1ZiA9IDA7Ci0JfQotCi0JbndvcmRzID0geF9jZl9nbG9iKFhDRl9DT01NQU5EX0ZJTEV8WENGX0ZVTExQQVRILAotCSAgICBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4sIGVzLT5jdXJzb3IsCi0JICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCBOVUxMKTsKLQlpZiAobndvcmRzID09IDApIHsKLQkJdmlfZXJyb3IoKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JYnVmID0gc2F2ZV9lZHN0YXRlKGVzKTsKLQlleHBhbmRlZCA9IEVYUEFORDsKLQlkZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7Ci0JZXMtPmN1cnNvciA9IHN0YXJ0OwotCWZvciAoaSA9IDA7IGkgPCBud29yZHM7ICkgewotCQlpZiAoeF9lc2NhcGUod29yZHNbaV0sIHN0cmxlbih3b3Jkc1tpXSksIHhfdmlfcHV0YnVmKSAhPSAwKSB7Ci0JCQlydmFsID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoKytpIDwgbndvcmRzICYmIHB1dGJ1ZigiICIsIDEsIDApICE9IDApIHsKLQkJCXJ2YWwgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWkgPSBidWYtPmN1cnNvciAtIGVuZDsKLQlpZiAocnZhbCA9PSAwICYmIGkgPiAwKQotCQllcy0+Y3Vyc29yICs9IGk7Ci0JbW9kaWZpZWQgPSAxOwotCWhudW0gPSBobGFzdDsKLQlpbnNlcnQgPSBJTlNFUlQ7Ci0JbGFzdGFjID0gMDsKLQlyZWZyZXNoKDApOwotCXJldHVybiAocnZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXBsZXRlX3dvcmQoaW50IGNtZCwgaW50IGNvdW50KQotewotCXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZSAqYnVmOwotCWludCBydmFsLCBud29yZHMsIHN0YXJ0LCBlbmQsIG1hdGNoX2xlbjsKLQljaGFyICoqd29yZHM7Ci0JY2hhciAqbWF0Y2g7Ci0JYm9vbCBpc19jb21tYW5kLCBpc191bmlxdWU7Ci0KLQkvKiBVbmRvIHByZXZpb3VzIGNvbXBsZXRpb24gKi8KLQlpZiAoY21kID09IDAgJiYgZXhwYW5kZWQgPT0gQ09NUExFVEUgJiYgYnVmKSB7Ci0JCXByaW50X2V4cGFuc2lvbnMoYnVmLCAwKTsKLQkJZXhwYW5kZWQgPSBQUklOVDsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IFBSSU5UICYmIGJ1ZikgewotCQlyZXN0b3JlX2Vkc3RhdGUoZXMsIGJ1Zik7Ci0JCWJ1ZiA9IDA7Ci0JCWV4cGFuZGVkID0gTk9ORTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGJ1ZikgewotCQlmcmVlX2Vkc3RhdGUoYnVmKTsKLQkJYnVmID0gMDsKLQl9Ci0KLQkvKiBYQ0ZfRlVMTFBBVEggZm9yIGNvdW50ICdjYXVzZSB0aGUgbWVudSBwcmludGVkIGJ5IHByaW50X2V4cGFuc2lvbnMoKQotCSAqIHdhcyBkb25lIHRoaXMgd2F5LgotCSAqLwotCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfQ09NTUFORF9GSUxFIHwgKGNvdW50ID8gWENGX0ZVTExQQVRIIDogMCksCi0JICAgIGVzLT5jYnVmLCBlcy0+bGluZWxlbiwgZXMtPmN1cnNvciwKLQkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKLQlpZiAobndvcmRzID09IDApIHsKLQkJdmlfZXJyb3IoKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChjb3VudCkgewotCQlpbnQgaTsKLQotCQljb3VudC0tOwotCQlpZiAoY291bnQgPj0gbndvcmRzKSB7Ci0JCQl2aV9lcnJvcigpOwotCQkJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOwotCQkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOwotCQkJcmVkcmF3X2xpbmUoMCk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQkvKgotCQkgKiBFeHBhbmQgdGhlIGNvdW50J3RoIHdvcmQgdG8gaXRzIGJhc2VuYW1lCi0JCSAqLwotCQlpZiAoaXNfY29tbWFuZCkgewotCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF0gKwotCQkJICAgIHhfYmFzZW5hbWUod29yZHNbY291bnRdLCBOVUxMKTsKLQkJCS8qIElmIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgbWF0Y2gsIHVzZSBmdWxsIHBhdGggKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKLQkJCQlpZiAoaSAhPSBjb3VudCAmJgotCQkJCSAgICBzdHJjbXAod29yZHNbaV0gKyB4X2Jhc2VuYW1lKHdvcmRzW2ldLAotCQkJCSAgICBOVUxMKSwgbWF0Y2gpID09IDApIHsKLQkJCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJfSBlbHNlCi0JCQltYXRjaCA9IHdvcmRzW2NvdW50XTsKLQkJbWF0Y2hfbGVuID0gc3RybGVuKG1hdGNoKTsKLQkJaXNfdW5pcXVlID0gdHJ1ZTsKLQkJLyogZXhwYW5kZWQgPSBQUklOVDsJbmV4dCBjYWxsIHVuZG8gKi8KLQl9IGVsc2UgewotCQltYXRjaCA9IHdvcmRzWzBdOwotCQltYXRjaF9sZW4gPSB4X2xvbmdlc3RfcHJlZml4KG53b3Jkcywgd29yZHMpOwotCQlleHBhbmRlZCA9IENPTVBMRVRFOwkvKiBuZXh0IGNhbGwgd2lsbCBsaXN0IGNvbXBsZXRpb25zICovCi0JCWlzX3VuaXF1ZSA9IG53b3JkcyA9PSAxOwotCX0KLQotCWJ1ZiA9IHNhdmVfZWRzdGF0ZShlcyk7Ci0JZGVsX3JhbmdlKHN0YXJ0LCBlbmQpOwotCWVzLT5jdXJzb3IgPSBzdGFydDsKLQotCS8qIGVzY2FwZSBhbGwgc2hlbGwtc2Vuc2l0aXZlIGNoYXJhY3RlcnMgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8KLQkgKiBjb21tYW5kIGJ1ZmZlciAqLwotCXJ2YWwgPSB4X2VzY2FwZShtYXRjaCwgbWF0Y2hfbGVuLCB4X3ZpX3B1dGJ1Zik7Ci0KLQlpZiAocnZhbCA9PSAwICYmIGlzX3VuaXF1ZSkgewotCQkvKiBJZiBleGFjdCBtYXRjaCwgZG9uJ3QgdW5kby4gQWxsb3dzIGRpcmVjdG9yeSBjb21wbGV0aW9ucwotCQkgKiB0byBiZSB1c2VkIChpZSwgY29tcGxldGUgdGhlIG5leHQgcG9ydGlvbiBvZiB0aGUgcGF0aCkuCi0JCSAqLwotCQlleHBhbmRlZCA9IE5PTkU7Ci0KLQkJLyogSWYgbm90IGEgZGlyZWN0b3J5LCBhZGQgYSBzcGFjZSB0byB0aGUgZW5kLi4uICovCi0JCWlmIChtYXRjaF9sZW4gPiAwICYmIG1hdGNoW21hdGNoX2xlbiAtIDFdICE9ICcvJykKLQkJCXJ2YWwgPSBwdXRidWYoIiAiLCAxLCAwKTsKLQl9Ci0JeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOwotCi0JbW9kaWZpZWQgPSAxOwotCWhudW0gPSBobGFzdDsKLQlpbnNlcnQgPSBJTlNFUlQ7Ci0JbGFzdGFjID0gMDsJIC8qIHByZXZlbnQgdGhpcyBmcm9tIGJlaW5nIHJlZG9uZS4uLiAqLwotCXJlZnJlc2goMCk7Ci0KLQlyZXR1cm4gKHJ2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9leHBhbnNpb25zKHN0cnVjdCBlZHN0YXRlICplc3QsIGludCBjbWQgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgc3RhcnQsIGVuZCwgbndvcmRzOwotCWNoYXIgKip3b3JkczsKLQlib29sIGlzX2NvbW1hbmQ7Ci0KLQlud29yZHMgPSB4X2NmX2dsb2IoWENGX0NPTU1BTkRfRklMRSB8IFhDRl9GVUxMUEFUSCwKLQkgICAgZXN0LT5jYnVmLCBlc3QtPmxpbmVsZW4sIGVzdC0+Y3Vyc29yLAotCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOwotCWlmIChud29yZHMgPT0gMCkgewotCQl2aV9lcnJvcigpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOwotCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKLQlyZWRyYXdfbGluZSgwKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKiBTaW1pbGFyIHRvIHhfem90YyhlbWFjcy5jKSwgYnV0IG5vIHRhYiB3ZWlyZG5lc3MgKi8KLXN0YXRpYyB2b2lkCi14X3ZpX3pvdGMoaW50IGMpCi17Ci0JaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7Ci0JCXhfcHV0YygnXicpOwotCQljIF49ICdAJzsKLQl9Ci0JeF9wdXRjKGMpOwotfQotCi1zdGF0aWMgdm9pZAotdmlfZXJyb3Iodm9pZCkKLXsKLQkvKiBCZWVtIG91dCBvZiBhbnkgbWFjcm9zIGFzIHNvb24gYXMgYW4gZXJyb3Igb2NjdXJzICovCi0JdmlfbWFjcm9fcmVzZXQoKTsKLQl4X3B1dGMoNyk7Ci0JeF9mbHVzaCgpOwotfQotCi1zdGF0aWMgdm9pZAotdmlfbWFjcm9fcmVzZXQodm9pZCkKLXsKLQlpZiAobWFjcm8ucCkgewotCQlhZnJlZShtYWNyby5idWYsIEFQRVJNKTsKLQkJbWVtc2V0KChjaGFyICopJm1hY3JvLCAwLCBzaXplb2YobWFjcm8pKTsKLQl9Ci19Ci0jZW5kaWYgLyogIU1LU0hfU19OT1ZJICovCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9lbWFjc2ZuLmggYi9ta3NoL3NyYy9lbWFjc2ZuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzMzOTkuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvZW1hY3Nmbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI2lmIGRlZmluZWQoRU1BQ1NGTl9ERUZOUykKLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2VtYWNzZm4uaCx2IDEuNSAyMDEwLzA3LzE3IDIyOjA5OjMzIHRnIEV4cCAkIik7Ci0jZGVmaW5lIEZOKGNuYW1lLHNuYW1lLGZsYWdzKQlzdGF0aWMgaW50IHhfIyNjbmFtZShpbnQpOwotI2VsaWYgZGVmaW5lZChFTUFDU0ZOX0VOVU1TKQotI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJWEZVTkNfIyNjbmFtZSwKLSNkZWZpbmUgRjAoY25hbWUsc25hbWUsZmxhZ3MpCVhGVU5DXyMjY25hbWUgPSAwLAotI2VsaWYgZGVmaW5lZChFTUFDU0ZOX0lURU1TKQotI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJeyB4XyMjY25hbWUsIHNuYW1lLCBmbGFncyB9LAotI2VuZGlmCi0KLSNpZm5kZWYgRjAKLSNkZWZpbmUgRjAgRk4KLSNlbmRpZgotCi1GMChhYm9ydCwgImFib3J0IiwgMCkKLUZOKGJlZ19oaXN0LCAiYmVnaW5uaW5nLW9mLWhpc3RvcnkiLCAwKQotRk4oY2xzLCAiY2xlYXItc2NyZWVuIiwgMCkKLUZOKGNvbW1lbnQsICJjb21tZW50IiwgMCkKLUZOKGNvbXBfY29tbSwgImNvbXBsZXRlLWNvbW1hbmQiLCAwKQotRk4oY29tcF9maWxlLCAiY29tcGxldGUtZmlsZSIsIDApCi1GTihjb21wX2xpc3QsICJjb21wbGV0ZS1saXN0IiwgMCkKLUZOKGNvbXBsZXRlLCAiY29tcGxldGUiLCAwKQotRk4oZGVsX2JhY2ssICJkZWxldGUtY2hhci1iYWNrd2FyZCIsIFhGX0FSRykKLUZOKGRlbF9id29yZCwgImRlbGV0ZS13b3JkLWJhY2t3YXJkIiwgWEZfQVJHKQotRk4oZGVsX2NoYXIsICJkZWxldGUtY2hhci1mb3J3YXJkIiwgWEZfQVJHKQotRk4oZGVsX2Z3b3JkLCAiZGVsZXRlLXdvcmQtZm9yd2FyZCIsIFhGX0FSRykKLUZOKGRlbF9saW5lLCAia2lsbC1saW5lIiwgMCkKLUZOKGRyYXdfbGluZSwgInJlZHJhdyIsIDApCi0jaWZuZGVmIE1LU0hfU01BTEwKLUZOKGVkaXRfbGluZSwgImVkaXQtbGluZSIsIFhGX0FSRykKLSNlbmRpZgotRk4oZW5kX2hpc3QsICJlbmQtb2YtaGlzdG9yeSIsIDApCi1GTihlbmRfb2ZfdGV4dCwgImVvdCIsIDApCi1GTihlbnVtZXJhdGUsICJsaXN0IiwgMCkKLUZOKGVvdF9kZWwsICJlb3Qtb3ItZGVsZXRlIiwgWEZfQVJHKQotRk4oZXJyb3IsICJlcnJvciIsIDApCi1GTihleHBhbmQsICJleHBhbmQtZmlsZSIsIDApCi0jaWZuZGVmIE1LU0hfU01BTEwKLUZOKGZvbGRfY2FwaXRhbGlzZSwgImNhcGl0YWxpemUtd29yZCIsIFhGX0FSRykKLUZOKGZvbGRfbG93ZXIsICJkb3duY2FzZS13b3JkIiwgWEZfQVJHKQotRk4oZm9sZF91cHBlciwgInVwY2FzZS13b3JkIiwgWEZfQVJHKQotI2VuZGlmCi1GTihnb3RvX2hpc3QsICJnb3RvLWhpc3RvcnkiLCBYRl9BUkcpCi0jaWZuZGVmIE1LU0hfU01BTEwKLUZOKGluc19zdHJpbmcsICJtYWNyby1zdHJpbmciLCBYRl9OT0JJTkQpCi0jZW5kaWYKLUZOKGluc2VydCwgImF1dG8taW5zZXJ0IiwgWEZfQVJHKQotRk4oa2lsbCwgImtpbGwtdG8tZW9sIiwgWEZfQVJHKQotRk4oa2lsbF9yZWdpb24sICJraWxsLXJlZ2lvbiIsIDApCi1GTihsaXN0X2NvbW0sICJsaXN0LWNvbW1hbmQiLCAwKQotRk4obGlzdF9maWxlLCAibGlzdC1maWxlIiwgMCkKLUZOKGxpdGVyYWwsICJxdW90ZSIsIDApCi1GTihtZXRhMSwgInByZWZpeC0xIiwgWEZfUFJFRklYKQotRk4obWV0YTIsICJwcmVmaXgtMiIsIFhGX1BSRUZJWCkKLUZOKG1ldGFfeWFuaywgInlhbmstcG9wIiwgMCkKLUZOKG12X2JhY2ssICJiYWNrd2FyZC1jaGFyIiwgWEZfQVJHKQotRk4obXZfYmVnaW4sICJiZWdpbm5pbmctb2YtbGluZSIsIDApCi1GTihtdl9id29yZCwgImJhY2t3YXJkLXdvcmQiLCBYRl9BUkcpCi1GTihtdl9lbmQsICJlbmQtb2YtbGluZSIsIDApCi1GTihtdl9mb3J3LCAiZm9yd2FyZC1jaGFyIiwgWEZfQVJHKQotRk4obXZfZndvcmQsICJmb3J3YXJkLXdvcmQiLCBYRl9BUkcpCi1GTihuZXdsaW5lLCAibmV3bGluZSIsIDApCi1GTihuZXh0X2NvbSwgImRvd24taGlzdG9yeSIsIFhGX0FSRykKLUZOKG5sX25leHRfY29tLCAibmV3bGluZS1hbmQtbmV4dCIsIDApCi1GTihub29wLCAibm8tb3AiLCAwKQotRk4ocHJldl9jb20sICJ1cC1oaXN0b3J5IiwgWEZfQVJHKQotRk4ocHJldl9oaXN0d29yZCwgInByZXYtaGlzdC13b3JkIiwgWEZfQVJHKQotRk4oc2VhcmNoX2NoYXJfYmFjaywgInNlYXJjaC1jaGFyYWN0ZXItYmFja3dhcmQiLCBYRl9BUkcpCi1GTihzZWFyY2hfY2hhcl9mb3J3LCAic2VhcmNoLWNoYXJhY3Rlci1mb3J3YXJkIiwgWEZfQVJHKQotRk4oc2VhcmNoX2hpc3QsICJzZWFyY2gtaGlzdG9yeSIsIDApCi0jaWZuZGVmIE1LU0hfU01BTEwKLUZOKHNlYXJjaF9oaXN0X2RuLCAic2VhcmNoLWhpc3RvcnktZG93biIsIDApCi1GTihzZWFyY2hfaGlzdF91cCwgInNlYXJjaC1oaXN0b3J5LXVwIiwgMCkKLSNlbmRpZgotRk4oc2V0X2FyZywgInNldC1hcmciLCBYRl9OT0JJTkQpCi1GTihzZXRfbWFyaywgInNldC1tYXJrLWNvbW1hbmQiLCAwKQotRk4odHJhbnNwb3NlLCAidHJhbnNwb3NlLWNoYXJzIiwgMCkKLUZOKHZlcnNpb24sICJ2ZXJzaW9uIiwgMCkKLSNpZm5kZWYgTUtTSF9TTUFMTAotRk4odnRfaGFjaywgInZ0MTAwLWhhY2siLCBYRl9BUkcpCi0jZW5kaWYKLUZOKHhjaGdfcG9pbnRfbWFyaywgImV4Y2hhbmdlLXBvaW50LWFuZC1tYXJrIiwgMCkKLUZOKHlhbmssICJ5YW5rIiwgMCkKLQotI3VuZGVmIEZOCi0jdW5kZWYgRjAKLSN1bmRlZiBFTUFDU0ZOX0RFRk5TCi0jdW5kZWYgRU1BQ1NGTl9FTlVNUwotI3VuZGVmIEVNQUNTRk5fSVRFTVMKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V2YWwuYyBiL21rc2gvc3JjL2V2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyZTM0Ni4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9ldmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTgwICswLDAgQEAKLS8qCSRPcGVuQlNEOiBldmFsLmMsdiAxLjM1IDIwMTAvMDMvMjQgMDg6Mjc6MjYgZmdzY2ggRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9ldmFsLmMsdiAxLjkwIDIwMTAvMDcvMTcgMjI6MDk6MzMgdGcgRXhwICQiKTsKLQotLyoKLSAqIHN0cmluZyBleHBhbnNpb24KLSAqCi0gKiBmaXJzdCBwYXNzOiBxdW90aW5nLCBJRlMgc2VwYXJhdGlvbiwgfiwgJHt9LCAkKCkgYW5kICQoKCkpIHN1YnN0aXR1dGlvbi4KLSAqIHNlY29uZCBwYXNzOiBhbHRlcm5hdGlvbiAoeyx9KSwgZmlsZW5hbWUgZXhwYW5zaW9uICgqP1tdKS4KLSAqLwotCi0vKiBleHBhbnNpb24gZ2VuZXJhdG9yIHN0YXRlICovCi10eXBlZGVmIHN0cnVjdCBFeHBhbmQgewotCS8qIGludCB0eXBlOyAqLwkJCS8qIHNlZSBleHBhbmQoKSAqLwotCWNvbnN0IGNoYXIgKnN0cjsJCS8qIHN0cmluZyAqLwotCXVuaW9uIHsKLQkJY29uc3QgY2hhciAqKnN0cnY7CS8qIHN0cmluZ1tdICovCi0JCXN0cnVjdCBzaGYgKnNoZjsJLyogZmlsZSAqLwotCX0gdTsJCQkJLyogc291cmNlICovCi0Jc3RydWN0IHRibCAqdmFyOwkJLyogdmFyaWFibGUgaW4gJHt2YXIuLn0gKi8KLQlzaG9ydCBzcGxpdDsJCQkvKiBzcGxpdCAiJEAiIC8gY2FsbCB3YWl0bGFzdCAkKCkgKi8KLX0gRXhwYW5kOwotCi0jZGVmaW5lCVhCQVNFCQkwCS8qIHNjYW5uaW5nIG9yaWdpbmFsICovCi0jZGVmaW5lCVhTVUIJCTEJLyogZXhwYW5kaW5nICR7fSBzdHJpbmcgKi8KLSNkZWZpbmUJWEFSR1NFUAkJMgkvKiBpZnMwIGJldHdlZW4gIiQqIiAqLwotI2RlZmluZQlYQVJHCQkzCS8qIGV4cGFuZGluZyAkKiwgJEAgKi8KLSNkZWZpbmUJWENPTQkJNAkvKiBleHBhbmRpbmcgJCgpICovCi0jZGVmaW5lIFhOVUxMU1VCCTUJLyogIiRAIiB3aGVuICQjIGlzIDAgKGRvbid0IGdlbmVyYXRlIHdvcmQpICovCi0jZGVmaW5lIFhTVUJNSUQJCTYJLyogbWlkZGxlIG9mIGV4cGFuZGluZyAke30gKi8KLQotLyogU3RhdGVzIHVzZWQgZm9yIGZpZWxkIHNwbGl0dGluZyAqLwotI2RlZmluZSBJRlNfV09SRAkwCS8qIHdvcmQgaGFzIGNoYXJzIChvciBxdW90ZXMpICovCi0jZGVmaW5lIElGU19XUwkJMQkvKiBoYXZlIHNlZW4gSUZTIHdoaXRlLXNwYWNlICovCi0jZGVmaW5lIElGU19OV1MJCTIJLyogaGF2ZSBzZWVuIElGUyBub24td2hpdGUtc3BhY2UgKi8KLQotc3RhdGljIGludCB2YXJzdWIoRXhwYW5kICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICopOwotc3RhdGljIGludCBjb21zdWIoRXhwYW5kICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgY2hhciAqdHJpbXN1YihjaGFyICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGdsb2IoY2hhciAqLCBYUHRyViAqLCBpbnQpOwotc3RhdGljIHZvaWQgZ2xvYml0KFhTdHJpbmcgKiwgY2hhciAqKiwgY2hhciAqLCBYUHRyViAqLCBpbnQpOwotc3RhdGljIGNvbnN0IGNoYXIgKm1heWJlX2V4cGFuZF90aWxkZShjb25zdCBjaGFyICosIFhTdHJpbmcgKiwgY2hhciAqKiwgaW50KTsKLXN0YXRpYyBjaGFyICp0aWxkZShjaGFyICopOwotI2lmbmRlZiBNS1NIX05PUFdOQU0KLXN0YXRpYyBjaGFyICpob21lZGlyKGNoYXIgKik7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIGFsdF9leHBhbmQoWFB0clYgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyBzaXplX3QgdXRmbGVuKGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB1dGZpbmNwdHIoY29uc3QgY2hhciAqLCBta3NoX2FyaV90ICopOwotCi0vKiBVVEZNT0RFIGZ1bmN0aW9ucyAqLwotc3RhdGljIHNpemVfdAotdXRmbGVuKGNvbnN0IGNoYXIgKnMpCi17Ci0Jc2l6ZV90IG47Ci0KLQlpZiAoVVRGTU9ERSkgewotCQluID0gMDsKLQkJd2hpbGUgKCpzKSB7Ci0JCQlzICs9IHV0Zl9wdHJhZGoocyk7Ci0JCQkrK247Ci0JCX0KLQl9IGVsc2UKLQkJbiA9IHN0cmxlbihzKTsKLQlyZXR1cm4gKG4pOwotfQotCi1zdGF0aWMgdm9pZAotdXRmaW5jcHRyKGNvbnN0IGNoYXIgKnMsIG1rc2hfYXJpX3QgKmxwKQotewotCWNvbnN0IGNoYXIgKmNwID0gczsKLQotCXdoaWxlICgoKmxwKS0tKQotCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKLQkqbHAgPSBjcCAtIHM7Ci19Ci0KLS8qIGNvbXBpbGUgYW5kIGV4cGFuZCB3b3JkICovCi1jaGFyICoKLXN1YnN0aXR1dGUoY29uc3QgY2hhciAqY3AsIGludCBmKQotewotCXN0cnVjdCBzb3VyY2UgKnMsICpzb2xkOwotCi0Jc29sZCA9IHNvdXJjZTsKLQlzID0gcHVzaHMoU1dTVFIsIEFURU1QKTsKLQlzLT5zdGFydCA9IHMtPnN0ciA9IGNwOwotCXNvdXJjZSA9IHM7Ci0JaWYgKHl5bGV4KE9ORVdPUkQpICE9IExXT1JEKQotCQlpbnRlcm5hbF9lcnJvcmYoInN1YnN0aXR1dGUiKTsKLQlzb3VyY2UgPSBzb2xkOwotCWFmcmVlKHMsIEFURU1QKTsKLQlyZXR1cm4gKGV2YWxzdHIoeXlsdmFsLmNwLCBmKSk7Ci19Ci0KLS8qCi0gKiBleHBhbmQgYXJnLWxpc3QKLSAqLwotY2hhciAqKgotZXZhbChjb25zdCBjaGFyICoqYXAsIGludCBmKQotewotCVhQdHJWIHc7Ci0KLQlpZiAoKmFwID09IE5VTEwpIHsKLQkJdW5pb24gbWtzaF9jY3BoYWNrIHZhcDsKLQotCQl2YXAucm8gPSBhcDsKLQkJcmV0dXJuICh2YXAucncpOwotCX0KLQlYUGluaXQodywgMzIpOwotCVhQcHV0KHcsIE5VTEwpOwkJLyogc3BhY2UgZm9yIHNoZWxsIG5hbWUgKi8KLQl3aGlsZSAoKmFwICE9IE5VTEwpCi0JCWV4cGFuZCgqYXArKywgJncsIGYpOwotCVhQcHV0KHcsIE5VTEwpOwotCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZSh3KSArIDEpOwotfQotCi0vKgotICogZXhwYW5kIHN0cmluZwotICovCi1jaGFyICoKLWV2YWxzdHIoY29uc3QgY2hhciAqY3AsIGludCBmKQotewotCVhQdHJWIHc7Ci0JY2hhciAqZHAgPSBudWxsOwotCi0JWFBpbml0KHcsIDEpOwotCWV4cGFuZChjcCwgJncsIGYpOwotCWlmIChYUHNpemUodykpCi0JCWRwID0gKlhQcHRydih3KTsKLQlYUGZyZWUodyk7Ci0JcmV0dXJuIChkcCk7Ci19Ci0KLS8qCi0gKiBleHBhbmQgc3RyaW5nIC0gcmV0dXJuIG9ubHkgb25lIGNvbXBvbmVudAotICogdXNlZCBmcm9tIGlvc2V0dXAgdG8gZXhwYW5kIHJlZGlyZWN0aW9uIGZpbGVzCi0gKi8KLWNoYXIgKgotZXZhbG9uZXN0cihjb25zdCBjaGFyICpjcCwgaW50IGYpCi17Ci0JWFB0clYgdzsKLQljaGFyICpydjsKLQotCVhQaW5pdCh3LCAxKTsKLQlleHBhbmQoY3AsICZ3LCBmKTsKLQlzd2l0Y2ggKFhQc2l6ZSh3KSkgewotCWNhc2UgMDoKLQkJcnYgPSBudWxsOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXJ2ID0gKGNoYXIgKikgKlhQcHRydih3KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcnYgPSBldmFsc3RyKGNwLCBmJn5ET0dMT0IpOwotCQlicmVhazsKLQl9Ci0JWFBmcmVlKHcpOwotCXJldHVybiAocnYpOwotfQotCi0vKiBmb3IgbmVzdGVkIHN1YnN0aXR1dGlvbjogJHt2YXI6PSR2YXIyfSAqLwotdHlwZWRlZiBzdHJ1Y3QgU3ViVHlwZSB7Ci0Jc3RydWN0IHRibCAqdmFyOwkvKiB2YXJpYWJsZSBmb3IgJHt2YXIuLn0gKi8KLQlzdHJ1Y3QgU3ViVHlwZSAqcHJldjsJLyogb2xkIHR5cGUgKi8KLQlzdHJ1Y3QgU3ViVHlwZSAqbmV4dDsJLyogcG9wZWQgdHlwZSAodG8gYXZvaWQgcmUtYWxsb2NhdGluZykgKi8KLQlzaG9ydAlzdHlwZTsJCS8qIFs9Ky0/JSNdIGFjdGlvbiBhZnRlciBleHBhbmRlZCB3b3JkICovCi0Jc2hvcnQJYmFzZTsJCS8qIGJlZ2luIHBvc2l0aW9uIG9mIGV4cGFuZGVkIHdvcmQgKi8KLQlzaG9ydAlmOwkJLyogc2F2ZWQgdmFsdWUgb2YgZiAoRE9QQVQsIGV0YykgKi8KLQl1aW50OF90CXF1b3RlcDsJCS8qIHNhdmVkIHZhbHVlIG9mIHF1b3RlIChmb3IgJHsuLlslI10uLn0pICovCi0JdWludDhfdAlxdW90ZXc7CQkvKiBzYXZlZCB2YWx1ZSBvZiBxdW90ZSAoZm9yICR7Li5bKy09XS4ufSkgKi8KLX0gU3ViVHlwZTsKLQotdm9pZAotZXhwYW5kKGNvbnN0IGNoYXIgKmNwLAkvKiBpbnB1dCB3b3JkICovCi0gICAgWFB0clYgKndwLAkJLyogb3V0cHV0IHdvcmRzICovCi0gICAgaW50IGYpCQkvKiBETyogZmxhZ3MgKi8KLXsKLQlpbnQgYyA9IDA7Ci0JaW50IHR5cGU7CQkvKiBleHBhbnNpb24gdHlwZSAqLwotCWludCBxdW90ZSA9IDA7CQkvKiBxdW90ZWQgKi8KLQlYU3RyaW5nIGRzOwkJLyogZGVzdGluYXRpb24gc3RyaW5nICovCi0JY2hhciAqZHA7CQkvKiBkZXN0aW5hdGlvbiAqLwotCWNvbnN0IGNoYXIgKnNwOwkJLyogc291cmNlICovCi0JaW50IGZkbywgd29yZDsJCS8qIHNlY29uZCBwYXNzIGZsYWdzOyBoYXZlIHdvcmQgKi8KLQlpbnQgZG9ibGFuazsJCS8qIGZpZWxkIHNwbGl0dGluZyBvZiBwYXJhbWV0ZXIvY29tbWFuZCBzdWJzdCAqLwotCUV4cGFuZCB4ID0gewkJLyogZXhwYW5zaW9uIHZhcmlhYmxlcyAqLwotCQlOVUxMLCB7IE5VTEwgfSwgTlVMTCwgMAotCX07Ci0JU3ViVHlwZSBzdF9oZWFkLCAqc3Q7Ci0JaW50IG5ld2xpbmVzID0gMDsgLyogRm9yIHRyYWlsaW5nIG5ld2xpbmVzIGluIENPTVNVQiAqLwotCWludCBzYXdfZXEsIHRpbGRlX29rOwotCWludCBtYWtlX21hZ2ljOwotCXNpemVfdCBsZW47Ci0KLQlpZiAoY3AgPT0gTlVMTCkKLQkJaW50ZXJuYWxfZXJyb3JmKCJleHBhbmQoTlVMTCkiKTsKLQkvKiBmb3IgYWxpYXMsIHJlYWRvbmx5LCBzZXQsIHR5cGVzZXQgY29tbWFuZHMgKi8KLQlpZiAoKGYgJiBET1ZBQ0hFQ0spICYmIGlzX3dkdmFyYXNzaWduKGNwKSkgewotCQlmICY9IH4oRE9WQUNIRUNLfERPQkxBTkt8RE9HTE9CfERPVElMREUpOwotCQlmIHw9IERPQVNOVElMREU7Ci0JfQotCWlmIChGbGFnKEZOT0dMT0IpKQotCQlmICY9IH5ET0dMT0I7Ci0JaWYgKEZsYWcoRk1BUktESVJTKSkKLQkJZiB8PSBET01BUktESVJTOwotCWlmIChGbGFnKEZCUkFDRUVYUEFORCkgJiYgKGYgJiBET0dMT0IpKQotCQlmIHw9IERPQlJBQ0VfOwotCi0JWGluaXQoZHMsIGRwLCAxMjgsIEFURU1QKTsJLyogaW5pdCBkZXN0LiBzdHJpbmcgKi8KLQl0eXBlID0gWEJBU0U7Ci0Jc3AgPSBjcDsKLQlmZG8gPSAwOwotCXNhd19lcSA9IDA7Ci0JdGlsZGVfb2sgPSAoZiAmIChET1RJTERFfERPQVNOVElMREUpKSA/IDEgOiAwOyAvKiBtdXN0IGJlIDEvMCAqLwotCWRvYmxhbmsgPSAwOwotCW1ha2VfbWFnaWMgPSAwOwotCXdvcmQgPSAoZiZET0JMQU5LKSA/IElGU19XUyA6IElGU19XT1JEOwotCS8qIGNsYW5nIGRvZXNuJ3Qga25vdyBPU1VCU1QgY29tZXMgYmVmb3JlIENTVUJTVCAqLwotCW1lbXNldCgmc3RfaGVhZCwgMCwgc2l6ZW9mKHN0X2hlYWQpKTsKLQlzdCA9ICZzdF9oZWFkOwotCi0Jd2hpbGUgKDEpIHsKLQkJWGNoZWNrKGRzLCBkcCk7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgWEJBU0U6CS8qIG9yaWdpbmFsIHByZWZpeGVkIHN0cmluZyAqLwotCQkJYyA9ICpzcCsrOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlIEVPUzoKLQkJCQljID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0hBUjoKLQkJCQljID0gKnNwKys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFDSEFSOgotCQkJCXF1b3RlIHw9IDI7IC8qIHRlbXBvcmFyeSBxdW90ZSAqLwotCQkJCWMgPSAqc3ArKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT1FVT1RFOgotCQkJCXdvcmQgPSBJRlNfV09SRDsKLQkJCQl0aWxkZV9vayA9IDA7Ci0JCQkJcXVvdGUgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSBDUVVPVEU6Ci0JCQkJcXVvdGUgPSBzdC0+cXVvdGV3OwotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSBDT01TVUI6Ci0JCQkJdGlsZGVfb2sgPSAwOwotCQkJCWlmIChmICYgRE9OVFJVTkNPTU1BTkQpIHsKLQkJCQkJd29yZCA9IElGU19XT1JEOwotCQkJCQkqZHArKyA9ICckJzsgKmRwKysgPSAnKCc7Ci0JCQkJCXdoaWxlICgqc3AgIT0gJ1wwJykgewotCQkJCQkJWGNoZWNrKGRzLCBkcCk7Ci0JCQkJCQkqZHArKyA9ICpzcCsrOwotCQkJCQl9Ci0JCQkJCSpkcCsrID0gJyknOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR5cGUgPSBjb21zdWIoJngsIHNwKTsKLQkJCQkJaWYgKHR5cGUgPT0gWENPTSAmJiAoZiZET0JMQU5LKSkKLQkJCQkJCWRvYmxhbmsrKzsKLQkJCQkJc3AgPSBzdHJudWwoc3ApICsgMTsKLQkJCQkJbmV3bGluZXMgPSAwOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCWNhc2UgRVhQUlNVQjoKLQkJCQl3b3JkID0gSUZTX1dPUkQ7Ci0JCQkJdGlsZGVfb2sgPSAwOwotCQkJCWlmIChmICYgRE9OVFJVTkNPTU1BTkQpIHsKLQkJCQkJKmRwKysgPSAnJCc7ICpkcCsrID0gJygnOyAqZHArKyA9ICcoJzsKLQkJCQkJd2hpbGUgKCpzcCAhPSAnXDAnKSB7Ci0JCQkJCQlYY2hlY2soZHMsIGRwKTsKLQkJCQkJCSpkcCsrID0gKnNwKys7Ci0JCQkJCX0KLQkJCQkJKmRwKysgPSAnKSc7ICpkcCsrID0gJyknOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0cnVjdCB0YmwgdjsKLQkJCQkJY2hhciAqcDsKLQotCQkJCQl2LmZsYWcgPSBERUZJTkVEfElTU0VUfElOVEVHRVI7Ci0JCQkJCXYudHlwZSA9IDEwOyAvKiBub3QgZGVmYXVsdCAqLwotCQkJCQl2Lm5hbWVbMF0gPSAnXDAnOwotCQkJCQl2X2V2YWx1YXRlKCZ2LCBzdWJzdGl0dXRlKHNwLCAwKSwKLQkJCQkJICAgIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOwotCQkJCQlzcCA9IHN0cm51bChzcCkgKyAxOwotCQkJCQlmb3IgKHAgPSBzdHJfdmFsKCZ2KTsgKnA7ICkgewotCQkJCQkJWGNoZWNrKGRzLCBkcCk7Ci0JCQkJCQkqZHArKyA9ICpwKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQljYXNlIE9TVUJTVDogewkvKiAke3sjfXZhcns6fVs9Ky0/IyVdd29yZH0gKi8KLQkJCS8qIGZvcm1hdCBpczoKLQkJCSAqCU9TVUJTVCBbe3hdIHBsYWluLXZhcmlhYmxlLXBhcnQgXDAKLQkJCSAqCSAgICBjb21waWxlZC13b3JkLXBhcnQgQ1NVQlNUIFt9eF0KLQkJCSAqIFRoaXMgaXMgd2hlcmUgYWxsIHN5bnRheCBjaGVja2luZyBnZXRzIGRvbmUuLi4KLQkJCSAqLwotCQkJCWNvbnN0IGNoYXIgKnZhcm5hbWUgPSArK3NwOyAvKiBza2lwIHRoZSB7IG9yIHggKH0pICovCi0JCQkJaW50IHN0eXBlOwotCQkJCWludCBzbGVuID0gMDsKLQotCQkJCXNwID0gY3N0cmNocihzcCwgJ1wwJykgKyAxOyAvKiBza2lwIHZhcmlhYmxlICovCi0JCQkJdHlwZSA9IHZhcnN1YigmeCwgdmFybmFtZSwgc3AsICZzdHlwZSwgJnNsZW4pOwotCQkJCWlmICh0eXBlIDwgMCkgewotCQkJCQljaGFyICpiZWcsICplbmQsICpzdHI7Ci0KLSB1bndpbmRfc3Vic3RzeW46Ci0JCQkJCXNwID0gdmFybmFtZSAtIDI7IC8qIHJlc3RvcmUgc3AgKi8KLQkJCQkJZW5kID0gKGJlZyA9IHdkY29weShzcCwgQVRFTVApKSArCi0JCQkJCSAgICAod2RzY2FuKHNwLCBDU1VCU1QpIC0gc3ApOwotCQkJCQkvKiAoeykgdGhlIH0gb3IgeCBpcyBhbHJlYWR5IHNraXBwZWQgKi8KLQkJCQkJaWYgKGVuZCA8IHdkc2NhbihiZWcsIEVPUykpCi0JCQkJCQkqZW5kID0gRU9TOwotCQkJCQlzdHIgPSBzbnB0cmVlZihOVUxMLCA2NCwgIiVTIiwgYmVnKTsKLQkJCQkJYWZyZWUoYmVnLCBBVEVNUCk7Ci0JCQkJCWVycm9yZigiJXM6IGJhZCBzdWJzdGl0dXRpb24iLCBzdHIpOwotCQkJCX0KLQkJCQlpZiAoZiAmIERPQkxBTkspCi0JCQkJCWRvYmxhbmsrKzsKLQkJCQl0aWxkZV9vayA9IDA7Ci0JCQkJaWYgKHR5cGUgPT0gWEJBU0UpIHsJLyogZXhwYW5kPyAqLwotCQkJCQlpZiAoIXN0LT5uZXh0KSB7Ci0JCQkJCQlTdWJUeXBlICpuZXdzdDsKLQotCQkJCQkJbmV3c3QgPSBhbGxvYyhzaXplb2YoU3ViVHlwZSksIEFURU1QKTsKLQkJCQkJCW5ld3N0LT5uZXh0ID0gTlVMTDsKLQkJCQkJCW5ld3N0LT5wcmV2ID0gc3Q7Ci0JCQkJCQlzdC0+bmV4dCA9IG5ld3N0OwotCQkJCQl9Ci0JCQkJCXN0ID0gc3QtPm5leHQ7Ci0JCQkJCXN0LT5zdHlwZSA9IHN0eXBlOwotCQkJCQlzdC0+YmFzZSA9IFhzYXZlcG9zKGRzLCBkcCk7Ci0JCQkJCXN0LT5mID0gZjsKLQkJCQkJc3QtPnZhciA9IHgudmFyOwotCQkJCQlzdC0+cXVvdGV3ID0gc3QtPnF1b3RlcCA9IHF1b3RlOwotCQkJCQkvKiBza2lwIHF1YWxpZmllcihzKSAqLwotCQkJCQlpZiAoc3R5cGUpCi0JCQkJCQlzcCArPSBzbGVuOwotCQkJCQlzd2l0Y2ggKHN0eXBlICYgMHg3ZikgewotCQkJCQljYXNlICcwJzogewotCQkJCQkJY2hhciAqYmVnLCAqbWlkLCAqZW5kLCAqc3RnOwotCQkJCQkJbWtzaF9hcmlfdCBmcm9tID0gMCwgbnVtID0gLTEsIGZsZW4sIGZpbmMgPSAwOwotCi0JCQkJCQliZWcgPSB3ZGNvcHkoc3AsIEFURU1QKTsKLQkJCQkJCW1pZCA9IGJlZyArICh3ZHNjYW4oc3AsIEFERUxJTSkgLSBzcCk7Ci0JCQkJCQlzdGcgPSBiZWcgKyAod2RzY2FuKHNwLCBDU1VCU1QpIC0gc3ApOwotCQkJCQkJaWYgKG1pZCA+PSBzdGcpCi0JCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47Ci0JCQkJCQltaWRbLTJdID0gRU9TOwotCQkJCQkJaWYgKG1pZFstMV0gPT0gLyp7Ki8nfScpIHsKLQkJCQkJCQlzcCArPSBtaWQgLSBiZWcgLSAxOwotCQkJCQkJCWVuZCA9IE5VTEw7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVuZCA9IG1pZCArCi0JCQkJCQkJICAgICh3ZHNjYW4obWlkLCBBREVMSU0pIC0gbWlkKTsKLQkJCQkJCQlpZiAoZW5kID49IHN0ZykKLQkJCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47Ci0JCQkJCQkJZW5kWy0yXSA9IEVPUzsKLQkJCQkJCQlzcCArPSBlbmQgLSBiZWcgLSAxOwotCQkJCQkJfQotCQkJCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShzdGcgPSB3ZHN0cmlwKGJlZywgZmFsc2UsIGZhbHNlKSwgMCksCi0JCQkJCQkgICAgJmZyb20sIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOwotCQkJCQkJYWZyZWUoc3RnLCBBVEVNUCk7Ci0JCQkJCQlpZiAoZW5kKSB7Ci0JCQkJCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShzdGcgPSB3ZHN0cmlwKG1pZCwgZmFsc2UsIGZhbHNlKSwgMCksCi0JCQkJCQkJICAgICZudW0sIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOwotCQkJCQkJCWFmcmVlKHN0ZywgQVRFTVApOwotCQkJCQkJfQotCQkJCQkJYWZyZWUoYmVnLCBBVEVNUCk7Ci0JCQkJCQliZWcgPSBzdHJfdmFsKHN0LT52YXIpOwotCQkJCQkJZmxlbiA9IHV0ZmxlbihiZWcpOwotCQkJCQkJaWYgKGZyb20gPCAwKSB7Ci0JCQkJCQkJaWYgKC1mcm9tIDwgZmxlbikKLQkJCQkJCQkJZmluYyA9IGZsZW4gKyBmcm9tOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJZmluYyA9IGZyb20gPCBmbGVuID8gZnJvbSA6IGZsZW47Ci0JCQkJCQlpZiAoVVRGTU9ERSkKLQkJCQkJCQl1dGZpbmNwdHIoYmVnLCAmZmluYyk7Ci0JCQkJCQliZWcgKz0gZmluYzsKLQkJCQkJCWZsZW4gPSB1dGZsZW4oYmVnKTsKLQkJCQkJCWlmIChudW0gPCAwIHx8IG51bSA+IGZsZW4pCi0JCQkJCQkJbnVtID0gZmxlbjsKLQkJCQkJCWlmIChVVEZNT0RFKQotCQkJCQkJCXV0ZmluY3B0cihiZWcsICZudW0pOwotCQkJCQkJc3RybmR1cHgoeC5zdHIsIGJlZywgbnVtLCBBVEVNUCk7Ci0JCQkJCQlnb3RvIGRvX0NTVUJTVDsKLQkJCQkJfQotCQkJCQljYXNlICcvJzogewotCQkJCQkJY2hhciAqcywgKnAsICpkLCAqc2JlZywgKmVuZDsKLQkJCQkJCWNoYXIgKnBhdCwgKnJyZXA7Ci0JCQkJCQljaGFyICp0cGF0MCwgKnRwYXQxLCAqdHBhdDI7Ci0KLQkJCQkJCXMgPSB3ZGNvcHkoc3AsIEFURU1QKTsKLQkJCQkJCXAgPSBzICsgKHdkc2NhbihzcCwgQURFTElNKSAtIHNwKTsKLQkJCQkJCWQgPSBzICsgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKLQkJCQkJCWlmIChwID49IGQpCi0JCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47Ci0JCQkJCQlwWy0yXSA9IEVPUzsKLQkJCQkJCWlmIChwWy0xXSA9PSAvKnsqLyd9JykKLQkJCQkJCQlkID0gTlVMTDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkWy0yXSA9IEVPUzsKLQkJCQkJCXNwICs9IChkID8gZCA6IHApIC0gcyAtIDE7Ci0JCQkJCQl0cGF0MCA9IHdkc3RyaXAocywgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQlwYXQgPSBzdWJzdGl0dXRlKHRwYXQwLCAwKTsKLQkJCQkJCWlmIChkKSB7Ci0JCQkJCQkJZCA9IHdkc3RyaXAocCwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJCXJyZXAgPSBzdWJzdGl0dXRlKGQsIDApOwotCQkJCQkJCWFmcmVlKGQsIEFURU1QKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXJyZXAgPSBudWxsOwotCQkJCQkJYWZyZWUocywgQVRFTVApOwotCQkJCQkJcyA9IGQgPSBwYXQ7Ci0JCQkJCQl3aGlsZSAoKnMpCi0JCQkJCQkJaWYgKCpzICE9ICdcXCcgfHwKLQkJCQkJCQkgICAgc1sxXSA9PSAnJScgfHwKLQkJCQkJCQkgICAgc1sxXSA9PSAnIycgfHwKLQkJCQkJCQkgICAgc1sxXSA9PSAnXDAnIHx8Ci0JCQkJLyogWFhYIHJlYWxseT8gKi8JICAgIHNbMV0gPT0gJ1xcJyB8fAotCQkJCQkJCSAgICBzWzFdID09ICcvJykKLQkJCQkJCQkJKmQrKyA9ICpzKys7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzKys7Ci0JCQkJCQkqZCA9ICdcMCc7Ci0JCQkJCQlhZnJlZSh0cGF0MCwgQVRFTVApOwotCi0JCQkJCQkvKiByZWplY3QgZW1wdHkgcGF0dGVybiAqLwotCQkJCQkJaWYgKCEqcGF0IHx8IGdtYXRjaHgoIiIsIHBhdCwgZmFsc2UpKQotCQkJCQkJCWdvdG8gbm9fcmVwbDsKLQotCQkJCQkJLyogcHJlcGFyZSBzdHJpbmcgb24gd2hpY2ggdG8gd29yayAqLwotCQkJCQkJc3RyZHVweChzLCBzdHJfdmFsKHN0LT52YXIpLCBBVEVNUCk7Ci0JCQkJCQlzYmVnID0gczsKLQotCQkJCQkJLyogZmlyc3Qgc2VlIGlmIHdlIGhhdmUgYW55IG1hdGNoIGF0IGFsbCAqLwotCQkJCQkJdHBhdDAgPSBwYXQ7Ci0JCQkJCQlpZiAoKnBhdCA9PSAnIycpIHsKLQkJCQkJCQkvKiBhbmNob3IgYXQgdGhlIGJlZ2lubmluZyAqLwotCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlcyVjKiIsICsrdHBhdDAsIE1BR0lDKTsKLQkJCQkJCQl0cGF0MiA9IHRwYXQxOwotCQkJCQkJfSBlbHNlIGlmICgqcGF0ID09ICclJykgewotCQkJCQkJCS8qIGFuY2hvciBhdCB0aGUgZW5kICovCi0JCQkJCQkJdHBhdDEgPSBzaGZfc21wcmludGYoIiVjKiVzIiwgTUFHSUMsICsrdHBhdDApOwotCQkJCQkJCXRwYXQyID0gdHBhdDA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8qIGZsb2F0ICovCi0JCQkJCQkJdHBhdDEgPSBzaGZfc21wcmludGYoIiVjKiVzJWMqIiwgTUFHSUMsIHBhdCwgTUFHSUMpOwotCQkJCQkJCXRwYXQyID0gdHBhdDEgKyAyOwotCQkJCQkJfQotIGFnYWluX3JlcGw6Ci0JCQkJCQkvKiB0aGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgZ21hdGNoeCB3b3VsZCByZXR1cm4KLQkJCQkJCSAqIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiBhIG1hdGNoIGZvdW5kLCBsaWtlIHJlKgotCQkJCQkJICovCi0JCQkJCQlpZiAoIWdtYXRjaHgoc2JlZywgdHBhdDEsIGZhbHNlKSkKLQkJCQkJCQlnb3RvIGVuZF9yZXBsOwotCQkJCQkJZW5kID0gc3RybnVsKHMpOwotCQkJCQkJLyogbm93IGFuY2hvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYXRjaCAqLwotCQkJCQkJaWYgKCpwYXQgIT0gJyMnKQotCQkJCQkJCXdoaWxlIChzYmVnIDw9IGVuZCkgewotCQkJCQkJCQlpZiAoZ21hdGNoeChzYmVnLCB0cGF0MiwgZmFsc2UpKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXNiZWcrKzsKLQkJCQkJCQl9Ci0JCQkJCQkvKiBub3cgYW5jaG9yIHRoZSBlbmQgb2YgdGhlIG1hdGNoICovCi0JCQkJCQlwID0gZW5kOwotCQkJCQkJaWYgKCpwYXQgIT0gJyUnKQotCQkJCQkJCXdoaWxlIChwID49IHNiZWcpIHsKLQkJCQkJCQkJYm9vbCBnb3RtYXRjaDsKLQotCQkJCQkJCQljID0gKnA7ICpwID0gJ1wwJzsKLQkJCQkJCQkJZ290bWF0Y2ggPSBnbWF0Y2h4KHNiZWcsIHRwYXQwLCBmYWxzZSk7Ci0JCQkJCQkJCSpwID0gYzsKLQkJCQkJCQkJaWYgKGdvdG1hdGNoKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCXAtLTsKLQkJCQkJCQl9Ci0JCQkJCQlzdHJuZHVweChlbmQsIHMsIHNiZWcgLSBzLCBBVEVNUCk7Ci0JCQkJCQlkID0gc2hmX3NtcHJpbnRmKCIlcyVzJXMiLCBlbmQsIHJyZXAsIHApOwotCQkJCQkJYWZyZWUoZW5kLCBBVEVNUCk7Ci0JCQkJCQlzYmVnID0gZCArIChzYmVnIC0gcykgKyBzdHJsZW4ocnJlcCk7Ci0JCQkJCQlhZnJlZShzLCBBVEVNUCk7Ci0JCQkJCQlzID0gZDsKLQkJCQkJCWlmIChzdHlwZSAmIDB4ODApCi0JCQkJCQkJZ290byBhZ2Fpbl9yZXBsOwotIGVuZF9yZXBsOgotCQkJCQkJYWZyZWUodHBhdDEsIEFURU1QKTsKLQkJCQkJCXguc3RyID0gczsKLSBub19yZXBsOgotCQkJCQkJYWZyZWUocGF0LCBBVEVNUCk7Ci0JCQkJCQlpZiAocnJlcCAhPSBudWxsKQotCQkJCQkJCWFmcmVlKHJyZXAsIEFURU1QKTsKLQkJCQkJCWdvdG8gZG9fQ1NVQlNUOwotCQkJCQl9Ci0JCQkJCWNhc2UgJyMnOgotCQkJCQljYXNlICclJzoKLQkJCQkJCS8qICEgRE9CTEFOSyxET0JSQUNFXyxET1RJTERFICovCi0JCQkJCQlmID0gRE9QQVQgfCAoZiZET05UUlVOQ09NTUFORCkgfAotCQkJCQkJICAgIERPVEVNUF87Ci0JCQkJCQlzdC0+cXVvdGV3ID0gcXVvdGUgPSAwOwotCQkJCQkJLyogUHJlcGVuZCBvcGVuIHBhdHRlcm4gKHNvIHwKLQkJCQkJCSAqIGluIGEgdHJpbSB3aWxsIHdvcmsgYXMKLQkJCQkJCSAqIGV4cGVjdGVkKQotCQkJCQkJICovCi0JCQkJCQkqZHArKyA9IE1BR0lDOwotCQkJCQkJKmRwKysgPSAoY2hhcikoJ0AnIHwgMHg4MCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnPSc6Ci0JCQkJCQkvKiBFbmFibGluZyB0aWxkZSBleHBhbnNpb24KLQkJCQkJCSAqIGFmdGVyIDpzIGhlcmUgaXMKLQkJCQkJCSAqIG5vbi1zdGFuZGFyZCBrc2gsIGJ1dCBpcwotCQkJCQkJICogY29uc2lzdGVudCB3aXRoIHJ1bGVzIGZvcgotCQkJCQkJICogb3RoZXIgYXNzaWdubWVudHMuIE5vdAotCQkJCQkJICogc3VyZSB3aGF0IFBPU0lYIHRoaW5rcyBvZgotCQkJCQkJICogdGhpcy4KLQkJCQkJCSAqIE5vdCBkb2luZyB0aWxkZSBleHBhbnNpb24KLQkJCQkJCSAqIGZvciBpbnRlZ2VyIHZhcmlhYmxlcyBpcyBhCi0JCQkJCQkgKiBub24tUE9TSVggdGhpbmcgLSBtYWtlcwotCQkJCQkJICogc2Vuc2UgdGhvdWdoLCBzaW5jZSB+IGlzCi0JCQkJCQkgKiBhIGFyaXRobWV0aWMgb3BlcmF0b3IuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghKHgudmFyLT5mbGFnICYgSU5URUdFUikpCi0JCQkJCQkJZiB8PSBET0FTTlRJTERFfERPVElMREU7Ci0JCQkJCQlmIHw9IERPVEVNUF87Ci0JCQkJCQkvKiBUaGVzZSB3aWxsIGJlIGRvbmUgYWZ0ZXIgdGhlCi0JCQkJCQkgKiB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZC4KLQkJCQkJCSAqLwotCQkJCQkJZiAmPSB+KERPQkxBTkt8RE9HTE9CfERPQlJBQ0VfKTsKLQkJCQkJCXRpbGRlX29rID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICc/JzoKLQkJCQkJCWYgJj0gfkRPQkxBTks7Ci0JCQkJCQlmIHw9IERPVEVNUF87Ci0JCQkJCQkvKiBGQUxMVEhST1VHSCAqLwotCQkJCQlkZWZhdWx0OgotCQkJCQkJLyogRW5hYmxlIHRpbGRlIGV4cGFuc2lvbiAqLwotCQkJCQkJdGlsZGVfb2sgPSAxOwotCQkJCQkJZiB8PSBET1RJTERFOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCS8qIHNraXAgd29yZCAqLwotCQkJCQlzcCArPSB3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNhc2UgQ1NVQlNUOiAvKiBvbmx5IGdldCBoZXJlIGlmIGV4cGFuZGluZyB3b3JkICovCi0gZG9fQ1NVQlNUOgotCQkJCXNwKys7IC8qICh7KSBza2lwIHRoZSB9IG9yIHggKi8KLQkJCQl0aWxkZV9vayA9IDA7CS8qIGluIGNhc2Ugb2YgJHt1bnNldDotfSAqLwotCQkJCSpkcCA9ICdcMCc7Ci0JCQkJcXVvdGUgPSBzdC0+cXVvdGVwOwotCQkJCWYgPSBzdC0+ZjsKLQkJCQlpZiAoZiZET0JMQU5LKQotCQkJCQlkb2JsYW5rLS07Ci0JCQkJc3dpdGNoIChzdC0+c3R5cGUmMHg3ZikgewotCQkJCWNhc2UgJyMnOgotCQkJCWNhc2UgJyUnOgotCQkJCQkvKiBBcHBlbmQgZW5kLXBhdHRlcm4gKi8KLQkJCQkJKmRwKysgPSBNQUdJQzsgKmRwKysgPSAnKSc7ICpkcCA9ICdcMCc7Ci0JCQkJCWRwID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7Ci0JCQkJCS8qIE11c3QgdXNlIHN0LT52YXIgc2luY2UgY2FsbGluZwotCQkJCQkgKiBnbG9iYWwgd291bGQgYnJlYWsgdGhpbmdzCi0JCQkJCSAqIGxpa2UgeFtpKz0xXS4KLQkJCQkJICovCi0JCQkJCXguc3RyID0gdHJpbXN1YihzdHJfdmFsKHN0LT52YXIpLAotCQkJCQkJZHAsIHN0LT5zdHlwZSk7Ci0JCQkJCWlmICh4LnN0clswXSAhPSAnXDAnIHx8IHN0LT5xdW90ZXApCi0JCQkJCQl0eXBlID0gWFNVQjsKLQkJCQkJZWxzZQotCQkJCQkJdHlwZSA9IFhOVUxMU1VCOwotCQkJCQlpZiAoZiZET0JMQU5LKQotCQkJCQkJZG9ibGFuaysrOwotCQkJCQlzdCA9IHN0LT5wcmV2OwotCQkJCQljb250aW51ZTsKLQkJCQljYXNlICc9JzoKLQkJCQkJLyogUmVzdG9yZSBvdXIgcG9zaXRpb24gYW5kIHN1YnN0aXR1dGUKLQkJCQkJICogdGhlIHZhbHVlIG9mIHN0LT52YXIgKG1heSBub3QgYmUKLQkJCQkJICogdGhlIGFzc2lnbmVkIHZhbHVlIGluIHRoZSBwcmVzZW5jZQotCQkJCQkgKiBvZiBpbnRlZ2VyL3JpZ2h0LWFkai9ldGMgYXR0cmlidXRlcykuCi0JCQkJCSAqLwotCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOwotCQkJCQkvKiBNdXN0IHVzZSBzdC0+dmFyIHNpbmNlIGNhbGxpbmcKLQkJCQkJICogZ2xvYmFsIHdvdWxkIGNhdXNlIHdpdGggdGhpbmdzCi0JCQkJCSAqIGxpa2UgeFtpKz0xXSB0byBiZSBldmFsdWF0ZWQgdHdpY2UuCi0JCQkJCSAqLwotCQkJCQkvKiBOb3RlOiBub3QgZXhwb3J0ZWQgYnkgRkVYUE9SVAotCQkJCQkgKiBpbiBBVCZUIGtzaC4KLQkJCQkJICovCi0JCQkJCS8qIFhYWCBQT1NJWCBzYXlzIHJlYWRvbmx5IGlzIG9ubHkKLQkJCQkJICogZmF0YWwgZm9yIHNwZWNpYWwgYnVpbHRpbnMgKHNldHN0cgotCQkJCQkgKiBkb2VzIHJlYWRvbmx5IGNoZWNrKS4KLQkJCQkJICovCi0JCQkJCWxlbiA9IHN0cmxlbihkcCkgKyAxOwotCQkJCQlzZXRzdHIoc3QtPnZhciwKLQkJCQkJICAgIGRlYnVuayhhbGxvYyhsZW4sIEFURU1QKSwKLQkJCQkJICAgIGRwLCBsZW4pLCBLU0hfVU5XSU5EX0VSUk9SKTsKLQkJCQkJeC5zdHIgPSBzdHJfdmFsKHN0LT52YXIpOwotCQkJCQl0eXBlID0gWFNVQjsKLQkJCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJCWRvYmxhbmsrKzsKLQkJCQkJc3QgPSBzdC0+cHJldjsKLQkJCQkJY29udGludWU7Ci0JCQkJY2FzZSAnPyc6IHsKLQkJCQkJY2hhciAqcyA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOwotCi0JCQkJCWVycm9yZigiJXM6ICVzIiwgc3QtPnZhci0+bmFtZSwKLQkJCQkJICAgIGRwID09IHMgPwotCQkJCQkgICAgInBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQiIDoKLQkJCQkJICAgIChkZWJ1bmsocywgcywgc3RybGVuKHMpICsgMSksIHMpKTsKLQkJCQl9Ci0JCQkJY2FzZSAnMCc6Ci0JCQkJY2FzZSAnLyc6Ci0JCQkJCWRwID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7Ci0JCQkJCXR5cGUgPSBYU1VCOwotCQkJCQlpZiAoZiZET0JMQU5LKQotCQkJCQkJZG9ibGFuaysrOwotCQkJCQlzdCA9IHN0LT5wcmV2OwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJc3QgPSBzdC0+cHJldjsKLQkJCQl0eXBlID0gWEJBU0U7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgT1BBVDogLyogb3BlbiBwYXR0ZXJuOiAqKGZvb3xiYXIpICovCi0JCQkJLyogTmV4dCBjaGFyIGlzIHRoZSB0eXBlIG9mIHBhdHRlcm4gKi8KLQkJCQltYWtlX21hZ2ljID0gMTsKLQkJCQljID0gKnNwKysgKyAweDgwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNQQVQ6IC8qIHBhdHRlcm4gc2VwYXJhdG9yICh8KSAqLwotCQkJCW1ha2VfbWFnaWMgPSAxOwotCQkJCWMgPSAnfCc7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQ1BBVDogLyogY2xvc2UgcGF0dGVybiAqLwotCQkJCW1ha2VfbWFnaWMgPSAxOwotCQkJCWMgPSAvKigqLyAnKSc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFhOVUxMU1VCOgotCQkJLyogU3BlY2lhbCBjYXNlIGZvciAiJEAiIChhbmQgIiR7Zm9vW0BdfSIpIC0gbm8KLQkJCSAqIHdvcmQgaXMgZ2VuZXJhdGVkIGlmICQjIGlzIDAgKHVubGVzcyB0aGVyZSBpcwotCQkJICogb3RoZXIgc3R1ZmYgaW5zaWRlIHRoZSBxdW90ZXMpLgotCQkJICovCi0JCQl0eXBlID0gWEJBU0U7Ci0JCQlpZiAoZiZET0JMQU5LKSB7Ci0JCQkJZG9ibGFuay0tOwotCQkJCS8qIG5vdCByZWFsbHkgY29ycmVjdDogeD07ICIkeCRAIiBzaG91bGQKLQkJCQkgKiBnZW5lcmF0ZSBhIG51bGwgYXJndW1lbnQgYW5kCi0JCQkJICogc2V0IEE7ICIke0A6K30iIHNob3VsZG4ndC4KLQkJCQkgKi8KLQkJCQlpZiAoZHAgPT0gWHN0cmluZyhkcywgZHApKQotCQkJCQl3b3JkID0gSUZTX1dTOwotCQkJfQotCQkJY29udGludWU7Ci0KLQkJY2FzZSBYU1VCOgotCQljYXNlIFhTVUJNSUQ6Ci0JCQlpZiAoKGMgPSAqeC5zdHIrKykgPT0gMCkgewotCQkJCXR5cGUgPSBYQkFTRTsKLQkJCQlpZiAoZiZET0JMQU5LKQotCQkJCQlkb2JsYW5rLS07Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFhBUkdTRVA6Ci0JCQl0eXBlID0gWEFSRzsKLQkJCXF1b3RlID0gMTsKLQkJY2FzZSBYQVJHOgotCQkJaWYgKChjID0gKnguc3RyKyspID09ICdcMCcpIHsKLQkJCQkvKiBmb3JjZSBudWxsIHdvcmRzIHRvIGJlIGNyZWF0ZWQgc28KLQkJCQkgKiBzZXQgLS0gJycgMiAnJzsgZm9vICIkQCIgd2lsbCBkbwotCQkJCSAqIHRoZSByaWdodCB0aGluZwotCQkJCSAqLwotCQkJCWlmIChxdW90ZSAmJiB4LnNwbGl0KQotCQkJCQl3b3JkID0gSUZTX1dPUkQ7Ci0JCQkJaWYgKCh4LnN0ciA9ICp4LnUuc3RydisrKSA9PSBOVUxMKSB7Ci0JCQkJCXR5cGUgPSBYQkFTRTsKLQkJCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJCWRvYmxhbmstLTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWMgPSBpZnMwOwotCQkJCWlmIChjID09IDApIHsKLQkJCQkJaWYgKHF1b3RlICYmICF4LnNwbGl0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWMgPSAnICc7Ci0JCQkJfQotCQkJCWlmIChxdW90ZSAmJiB4LnNwbGl0KSB7Ci0JCQkJCS8qIHRlcm1pbmF0ZSB3b3JkIGZvciAiJEAiICovCi0JCQkJCXR5cGUgPSBYQVJHU0VQOwotCQkJCQlxdW90ZSA9IDA7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBYQ09NOgotCQkJaWYgKG5ld2xpbmVzKSB7CQkvKiBTcGl0IG91dCBzYXZlZCBOTHMgKi8KLQkJCQljID0gJ1xuJzsKLQkJCQktLW5ld2xpbmVzOwotCQkJfSBlbHNlIHsKLQkJCQl3aGlsZSAoKGMgPSBzaGZfZ2V0Yyh4LnUuc2hmKSkgPT0gMCB8fCBjID09ICdcbicpCi0JCQkJCWlmIChjID09ICdcbicpCi0JCQkJCQkvKiBTYXZlIG5ld2xpbmVzICovCi0JCQkJCQluZXdsaW5lcysrOwotCQkJCWlmIChuZXdsaW5lcyAmJiBjICE9IEVPRikgewotCQkJCQlzaGZfdW5nZXRjKGMsIHgudS5zaGYpOwotCQkJCQljID0gJ1xuJzsKLQkJCQkJLS1uZXdsaW5lczsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYyA9PSBFT0YpIHsKLQkJCQluZXdsaW5lcyA9IDA7Ci0JCQkJc2hmX2Nsb3NlKHgudS5zaGYpOwotCQkJCWlmICh4LnNwbGl0KQotCQkJCQlzdWJzdF9leHN0YXQgPSB3YWl0bGFzdCgpOwotCQkJCXR5cGUgPSBYQkFTRTsKLQkJCQlpZiAoZiZET0JMQU5LKQotCQkJCQlkb2JsYW5rLS07Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciBlbmQgb2Ygd29yZCBvciBJRlMgc2VwYXJhdGlvbiAqLwotCQlpZiAoYyA9PSAwIHx8ICghcXVvdGUgJiYgKGYgJiBET0JMQU5LKSAmJiBkb2JsYW5rICYmCi0JCSAgICAhbWFrZV9tYWdpYyAmJiBjdHlwZShjLCBDX0lGUykpKSB7Ci0JCQkvKiBIb3cgd29yZHMgYXJlIGJyb2tlbiB1cDoKLQkJCSAqCQkJfAl2YWx1ZSBvZiBjCi0JCQkgKgl3b3JkCQl8CXdzCW53cwkwCi0JCQkgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJICoJSUZTX1dPUkQJCXcvV1MJdy9OV1MJdwotCQkJICoJSUZTX1dTCQkJLS9XUwl3L05XUwktCi0JCQkgKglJRlNfTldTCQkJLS9OV1MJdy9OV1MJdwotCQkJICogKHcgbWVhbnMgZ2VuZXJhdGUgYSB3b3JkKQotCQkJICogTm90ZSB0aGF0IElGU19OV1MvMCBnZW5lcmF0ZXMgYSB3b3JkIChBVCZUIGtzaAotCQkJICogZG9lc24ndCBkbyB0aGlzLCBidXQgUE9TSVggZG9lcykuCi0JCQkgKi8KLQkJCWlmICh3b3JkID09IElGU19XT1JEIHx8Ci0JCQkgICAgKCFjdHlwZShjLCBDX0lGU1dTKSAmJiBjICYmIHdvcmQgPT0gSUZTX05XUykpIHsKLQkJCQljaGFyICpwOwotCi0JCQkJKmRwKysgPSAnXDAnOwotCQkJCXAgPSBYY2xvc2UoZHMsIGRwKTsKLQkJCQlpZiAoZmRvICYgRE9CUkFDRV8pCi0JCQkJCS8qIGFsc28gZG9lcyBnbG9iYmluZyAqLwotCQkJCQlhbHRfZXhwYW5kKHdwLCBwLCBwLAotCQkJCQkgICAgcCArIFhsZW5ndGgoZHMsIChkcCAtIDEpKSwKLQkJCQkJICAgIGZkbyB8IChmICYgRE9NQVJLRElSUykpOwotCQkJCWVsc2UgaWYgKGZkbyAmIERPR0xPQikKLQkJCQkJZ2xvYihwLCB3cCwgZiAmIERPTUFSS0RJUlMpOwotCQkJCWVsc2UgaWYgKChmICYgRE9QQVQpIHx8ICEoZmRvICYgRE9NQUdJQ18pKQotCQkJCQlYUHB1dCgqd3AsIHApOwotCQkJCWVsc2UKLQkJCQkJWFBwdXQoKndwLCBkZWJ1bmsocCwgcCwgc3RybGVuKHApICsgMSkpOwotCQkJCWZkbyA9IDA7Ci0JCQkJc2F3X2VxID0gMDsKLQkJCQl0aWxkZV9vayA9IChmICYgKERPVElMREV8RE9BU05USUxERSkpID8gMSA6IDA7Ci0JCQkJaWYgKGMgIT0gMCkKLQkJCQkJWGluaXQoZHMsIGRwLCAxMjgsIEFURU1QKTsKLQkJCX0KLQkJCWlmIChjID09IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKHdvcmQgIT0gSUZTX05XUykKLQkJCQl3b3JkID0gY3R5cGUoYywgQ19JRlNXUykgPyBJRlNfV1MgOiBJRlNfTldTOwotCQl9IGVsc2UgewotCQkJaWYgKHR5cGUgPT0gWFNVQikgewotCQkJCWlmICh3b3JkID09IElGU19OV1MgJiYKLQkJCQkgICAgWGxlbmd0aChkcywgZHApID09IDApIHsKLQkJCQkJY2hhciAqcDsKLQotCQkJCQkqKHAgPSBhbGxvYygxLCBBVEVNUCkpID0gJ1wwJzsKLQkJCQkJWFBwdXQoKndwLCBwKTsKLQkJCQl9Ci0JCQkJdHlwZSA9IFhTVUJNSUQ7Ci0JCQl9Ci0KLQkJCS8qIGFnZSB0aWxkZV9vayBpbmZvIC0gfiBjb2RlIHRlc3RzIHNlY29uZCBiaXQgKi8KLQkJCXRpbGRlX29rIDw8PSAxOwotCQkJLyogbWFyayBhbnkgc3BlY2lhbCBzZWNvbmQgcGFzcyBjaGFycyAqLwotCQkJaWYgKCFxdW90ZSkKLQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdbJzoKLQkJCQljYXNlIE5PVDoKLQkJCQljYXNlICctJzoKLQkJCQljYXNlICddJzoKLQkJCQkJLyogRm9yIGNoYXJhY3RlciBjbGFzc2VzIC0gZG9lc24ndCBodXJ0Ci0JCQkJCSAqIHRvIGhhdmUgbWFnaWMgISwtLF1zIG91dHNpZGUgb2YKLQkJCQkJICogWy4uLl0gZXhwcmVzc2lvbnMuCi0JCQkJCSAqLwotCQkJCQlpZiAoZiAmIChET1BBVCB8IERPR0xPQikpIHsKLQkJCQkJCWZkbyB8PSBET01BR0lDXzsKLQkJCQkJCWlmIChjID09ICdbJykKLQkJCQkJCQlmZG8gfD0gZiAmIERPR0xPQjsKLQkJCQkJCSpkcCsrID0gTUFHSUM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKic6Ci0JCQkJY2FzZSAnPyc6Ci0JCQkJCWlmIChmICYgKERPUEFUIHwgRE9HTE9CKSkgewotCQkJCQkJZmRvIHw9IERPTUFHSUNfIHwgKGYgJiBET0dMT0IpOwotCQkJCQkJKmRwKysgPSBNQUdJQzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE9CUkFDRToKLQkJCQljYXNlICcsJzoKLQkJCQljYXNlIENCUkFDRToKLQkJCQkJaWYgKChmICYgRE9CUkFDRV8pICYmIChjID09IE9CUkFDRSB8fAotCQkJCQkgICAgKGZkbyAmIERPQlJBQ0VfKSkpIHsKLQkJCQkJCWZkbyB8PSBET0JSQUNFX3xET01BR0lDXzsKLQkJCQkJCSpkcCsrID0gTUFHSUM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPSc6Ci0JCQkJCS8qIE5vdGUgZmlyc3QgdW5xdW90ZWQgPSBmb3IgfiAqLwotCQkJCQlpZiAoIShmICYgRE9URU1QXykgJiYgIXNhd19lcSAmJgotCQkJCQkgICAgKEZsYWcoRkJSQUNFRVhQQU5EKSB8fAotCQkJCQkgICAgKGYgJiBET0FTTlRJTERFKSkpIHsKLQkJCQkJCXNhd19lcSA9IDE7Ci0JCQkJCQl0aWxkZV9vayA9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnOic6IC8qIDogKi8KLQkJCQkJLyogTm90ZSB1bnF1b3RlZCA6IGZvciB+ICovCi0JCQkJCWlmICghKGYgJiBET1RFTVBfKSAmJiAoZiAmIERPQVNOVElMREUpKQotCQkJCQkJdGlsZGVfb2sgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICd+JzoKLQkJCQkJLyogdGlsZGVfb2sgaXMgcmVzZXQgd2hlbmV2ZXIKLQkJCQkJICogYW55IG9mICcgIiAkKCAkKCggJHsgfSBhcmUgc2Vlbi4KLQkJCQkJICogTm90ZSB0aGF0IHRpbGRlX29rIG11c3QgYmUgcHJlc2VydmVkCi0JCQkJCSAqIHRocm91Z2ggdGhlIHNlcXVlbmNlICR7QT1hPX1+Ci0JCQkJCSAqLwotCQkJCQlpZiAodHlwZSA9PSBYQkFTRSAmJgotCQkJCQkgICAgKGYgJiAoRE9USUxERXxET0FTTlRJTERFKSkgJiYKLQkJCQkJICAgICh0aWxkZV9vayAmIDIpKSB7Ci0JCQkJCQljb25zdCBjaGFyICpwOwotCQkJCQkJY2hhciAqZHBfeDsKLQotCQkJCQkJZHBfeCA9IGRwOwotCQkJCQkJcCA9IG1heWJlX2V4cGFuZF90aWxkZShzcCwKLQkJCQkJCSAgICAmZHMsICZkcF94LAotCQkJCQkJICAgIGYgJiBET0FTTlRJTERFKTsKLQkJCQkJCWlmIChwKSB7Ci0JCQkJCQkJaWYgKGRwICE9IGRwX3gpCi0JCQkJCQkJCXdvcmQgPSBJRlNfV09SRDsKLQkJCQkJCQlkcCA9IGRwX3g7Ci0JCQkJCQkJc3AgPSBwOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWVsc2UKLQkJCQlxdW90ZSAmPSB+MjsgLyogdW5kbyB0ZW1wb3JhcnkgKi8KLQotCQkJaWYgKG1ha2VfbWFnaWMpIHsKLQkJCQltYWtlX21hZ2ljID0gMDsKLQkJCQlmZG8gfD0gRE9NQUdJQ18gfCAoZiAmIERPR0xPQik7Ci0JCQkJKmRwKysgPSBNQUdJQzsKLQkJCX0gZWxzZSBpZiAoSVNNQUdJQyhjKSkgewotCQkJCWZkbyB8PSBET01BR0lDXzsKLQkJCQkqZHArKyA9IE1BR0lDOwotCQkJfQotCQkJKmRwKysgPSBjOyAvKiBzYXZlIG91dHB1dCBjaGFyICovCi0JCQl3b3JkID0gSUZTX1dPUkQ7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBQcmVwYXJlIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgJHt9IHN1YnN0aXR1dGlvbi4KLSAqLwotc3RhdGljIGludAotdmFyc3ViKEV4cGFuZCAqeHAsIGNvbnN0IGNoYXIgKnNwLCBjb25zdCBjaGFyICp3b3JkLAotICAgIGludCAqc3R5cGVwLAkvKiBiZWNvbWVzIHF1YWxpZmllciB0eXBlICovCi0gICAgaW50ICpzbGVucCkJCS8qICIgIiBsZW4gKD0sIDo9LCBldGMuKSB2YWxpZCBpZmYgKnN0eXBlcCAhPSAwICovCi17Ci0JaW50IGM7Ci0JaW50IHN0YXRlOwkvKiBuZXh0IHN0YXRlOiBYQkFTRSwgWEFSRywgWFNVQiwgWE5VTExTVUIgKi8KLQlpbnQgc3R5cGU7CS8qIHN1YnN0aXR1dGlvbiB0eXBlICovCi0JaW50IHNsZW47Ci0JY29uc3QgY2hhciAqcDsKLQlzdHJ1Y3QgdGJsICp2cDsKLQlib29sIHplcm9fb2sgPSBmYWxzZTsKLQotCWlmICgoc3R5cGUgPSBzcFswXSkgPT0gJ1wwJykJLyogQmFkIHZhcmlhYmxlIG5hbWUgKi8KLQkJcmV0dXJuICgtMSk7Ci0KLQl4cC0+dmFyID0gTlVMTDsKLQotCS8qLQotCSAqICR7I3Zhcn0sIHN0cmluZyBsZW5ndGggKC1VOiBjaGFyYWN0ZXJzLCArVTogb2N0ZXRzKSBvciBhcnJheSBzaXplCi0JICogJHsldmFyfSwgc3RyaW5nIHdpZHRoICgtVTogc2NyZWVuIGNvbHVtbnMsICtVOiBvY3RldHMpCi0JICovCi0JYyA9IHNwWzFdOwotCWlmIChzdHlwZSA9PSAnJScgJiYgYyA9PSAnXDAnKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoKHN0eXBlID09ICcjJyB8fCBzdHlwZSA9PSAnJScpICYmIGMgIT0gJ1wwJykgewotCQkvKiBDYW4ndCBoYXZlIGFueSBtb2RpZmllcnMgZm9yICR7Iy4uLn0gb3IgJHslLi4ufSAqLwotCQlpZiAoKndvcmQgIT0gQ1NVQlNUKQotCQkJcmV0dXJuICgtMSk7Ci0JCXNwKys7Ci0JCS8qIENoZWNrIGZvciBzaXplIG9mIGFycmF5ICovCi0JCWlmICgocCA9IGNzdHJjaHIoc3AsICdbJykpICYmIChwWzFdID09ICcqJyB8fCBwWzFdID09ICdAJykgJiYKLQkJICAgIHBbMl0gPT0gJ10nKSB7Ci0JCQlpbnQgbiA9IDA7Ci0KLQkJCWlmIChzdHlwZSAhPSAnIycpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQl2cCA9IGdsb2JhbChhcnJheW5hbWUoc3ApKTsKLQkJCWlmICh2cC0+ZmxhZyAmIChJU1NFVHxBUlJBWSkpCi0JCQkJemVyb19vayA9IHRydWU7Ci0JCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpCi0JCQkJaWYgKHZwLT5mbGFnICYgSVNTRVQpCi0JCQkJCW4rKzsKLQkJCWMgPSBuOwotCQl9IGVsc2UgaWYgKGMgPT0gJyonIHx8IGMgPT0gJ0AnKSB7Ci0JCQlpZiAoc3R5cGUgIT0gJyMnKQotCQkJCXJldHVybiAoLTEpOwotCQkJYyA9IGUtPmxvYy0+YXJnYzsKLQkJfSBlbHNlIHsKLQkJCXAgPSBzdHJfdmFsKGdsb2JhbChzcCkpOwotCQkJemVyb19vayA9IHAgIT0gbnVsbDsKLQkJCWlmIChzdHlwZSA9PSAnIycpCi0JCQkJYyA9IHV0ZmxlbihwKTsKLQkJCWVsc2UgewotCQkJCS8qIHBhcnRpYWwgdXRmX21ic3dpZHRoIHJlaW1wbGVtZW50YXRpb24gKi8KLQkJCQljb25zdCBjaGFyICpzID0gcDsKLQkJCQl1bnNpZ25lZCBpbnQgd2M7Ci0JCQkJc2l6ZV90IGxlbjsKLQkJCQlpbnQgY3c7Ci0KLQkJCQljID0gMDsKLQkJCQl3aGlsZSAoKnMpIHsKLQkJCQkJaWYgKCFVVEZNT0RFIHx8IChsZW4gPSB1dGZfbWJ0b3djKCZ3YywKLQkJCQkJICAgIHMpKSA9PSAoc2l6ZV90KS0xKQotCQkJCQkJLyogbm90IFVURk1PREUgb3Igbm90IFVURi04ICovCi0JCQkJCQl3YyA9ICh1bnNpZ25lZCBjaGFyKSgqcysrKTsKLQkJCQkJZWxzZQotCQkJCQkJLyogVVRGTU9ERSBhbmQgVVRGLTggKi8KLQkJCQkJCXMgKz0gbGVuOwotCQkJCQkvKiB3YyA9PSBjaGFyIG9yIHdjaGFyIGF0IHMrKyAqLwotCQkJCQlpZiAoKGN3ID0gdXRmX3djd2lkdGgod2MpKSA9PSAtMSkgewotCQkJCQkJLyogNjQ2LCA4ODU5LTEsIDEwNjQ2IEMwL0MxICovCi0JCQkJCQljID0gLTE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljICs9IGN3OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoRmxhZyhGTk9VTlNFVCkgJiYgYyA9PSAwICYmICF6ZXJvX29rKQotCQkJZXJyb3JmKCIlczogcGFyYW1ldGVyIG5vdCBzZXQiLCBzcCk7Ci0JCSpzdHlwZXAgPSAwOyAvKiB1bnF1YWxpZmllZCB2YXJpYWJsZS9zdHJpbmcgc3Vic3RpdHV0aW9uICovCi0JCXhwLT5zdHIgPSBzaGZfc21wcmludGYoIiVkIiwgYyk7Ci0JCXJldHVybiAoWFNVQik7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIHF1YWxpZmllcnMgaW4gd29yZCBwYXJ0ICovCi0Jc3R5cGUgPSAwOwotCWMgPSB3b3JkW3NsZW4gPSAwXSA9PSBDSEFSID8gd29yZFsxXSA6IDA7Ci0JaWYgKGMgPT0gJzonKSB7Ci0JCXNsZW4gKz0gMjsKLQkJc3R5cGUgPSAweDgwOwotCQljID0gd29yZFtzbGVuICsgMF0gPT0gQ0hBUiA/IHdvcmRbc2xlbiArIDFdIDogMDsKLQl9Ci0JaWYgKCFzdHlwZSAmJiBjID09ICcvJykgewotCQlzbGVuICs9IDI7Ci0JCXN0eXBlID0gYzsKLQkJaWYgKHdvcmRbc2xlbl0gPT0gQURFTElNKSB7Ci0JCQlzbGVuICs9IDI7Ci0JCQlzdHlwZSB8PSAweDgwOwotCQl9Ci0JfSBlbHNlIGlmIChzdHlwZSA9PSAweDgwICYmIChjID09ICcgJyB8fCBjID09ICcwJykpIHsKLQkJc3R5cGUgfD0gJzAnOwotCX0gZWxzZSBpZiAoY3R5cGUoYywgQ19TVUJPUDEpKSB7Ci0JCXNsZW4gKz0gMjsKLQkJc3R5cGUgfD0gYzsKLQl9IGVsc2UgaWYgKGN0eXBlKGMsIENfU1VCT1AyKSkgeyAvKiBOb3RlOiBrc2g4OCBhbGxvd3MgOiUsIDolJSwgZXRjICovCi0JCXNsZW4gKz0gMjsKLQkJc3R5cGUgPSBjOwotCQlpZiAod29yZFtzbGVuICsgMF0gPT0gQ0hBUiAmJiBjID09IHdvcmRbc2xlbiArIDFdKSB7Ci0JCQlzdHlwZSB8PSAweDgwOwotCQkJc2xlbiArPSAyOwotCQl9Ci0JfSBlbHNlIGlmIChzdHlwZSkJLyogOiBpcyBub3Qgb2sgKi8KLQkJcmV0dXJuICgtMSk7Ci0JaWYgKCFzdHlwZSAmJiAqd29yZCAhPSBDU1VCU1QpCi0JCXJldHVybiAoLTEpOwotCSpzdHlwZXAgPSBzdHlwZTsKLQkqc2xlbnAgPSBzbGVuOwotCi0JYyA9IHNwWzBdOwotCWlmIChjID09ICcqJyB8fCBjID09ICdAJykgewotCQlzd2l0Y2ggKHN0eXBlICYgMHg3ZikgewotCQljYXNlICc9JzoJLyogY2FuJ3QgYXNzaWduIHRvIGEgdmVjdG9yICovCi0JCWNhc2UgJyUnOgkvKiBjYW4ndCB0cmltIGEgdmVjdG9yICh5ZXQpICovCi0JCWNhc2UgJyMnOgotCQljYXNlICcwJzoKLQkJY2FzZSAnLyc6Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlpZiAoZS0+bG9jLT5hcmdjID09IDApIHsKLQkJCXhwLT5zdHIgPSBudWxsOwotCQkJeHAtPnZhciA9IGdsb2JhbChzcCk7Ci0JCQlzdGF0ZSA9IGMgPT0gJ0AnID8gWE5VTExTVUIgOiBYU1VCOwotCQl9IGVsc2UgewotCQkJeHAtPnUuc3RydiA9IChjb25zdCBjaGFyICoqKWUtPmxvYy0+YXJndiArIDE7Ci0JCQl4cC0+c3RyID0gKnhwLT51LnN0cnYrKzsKLQkJCXhwLT5zcGxpdCA9IGMgPT0gJ0AnOyAvKiAkQCAqLwotCQkJc3RhdGUgPSBYQVJHOwotCQl9Ci0JCXplcm9fb2sgPSB0cnVlOwkvKiBQT1NJWCAyMDA5PyAqLwotCX0gZWxzZSB7Ci0JCWlmICgocCA9IGNzdHJjaHIoc3AsICdbJykpICYmIChwWzFdID09ICcqJyB8fCBwWzFdID09ICdAJykgJiYKLQkJICAgIHBbMl0gPT0gJ10nKSB7Ci0JCQlYUHRyViB3djsKLQotCQkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKLQkJCWNhc2UgJz0nOgkvKiBjYW4ndCBhc3NpZ24gdG8gYSB2ZWN0b3IgKi8KLQkJCWNhc2UgJyUnOgkvKiBjYW4ndCB0cmltIGEgdmVjdG9yICh5ZXQpICovCi0JCQljYXNlICcjJzoKLQkJCWNhc2UgJz8nOgotCQkJY2FzZSAnMCc6Ci0JCQljYXNlICcvJzoKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJCVhQaW5pdCh3diwgMzIpOwotCQkJaWYgKChjID0gc3BbMF0pID09ICchJykKLQkJCQkrK3NwOwotCQkJdnAgPSBnbG9iYWwoYXJyYXluYW1lKHNwKSk7Ci0JCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpIHsKLQkJCQlpZiAoISh2cC0+ZmxhZyZJU1NFVCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVhQcHV0KHd2LCBjID09ICchJyA/IHNoZl9zbXByaW50ZigiJWx1IiwKLQkJCQkgICAgYXJyYXlpbmRleCh2cCkpIDoKLQkJCQkgICAgc3RyX3ZhbCh2cCkpOwotCQkJfQotCQkJaWYgKFhQc2l6ZSh3dikgPT0gMCkgewotCQkJCXhwLT5zdHIgPSBudWxsOwotCQkJCXN0YXRlID0gcFsxXSA9PSAnQCcgPyBYTlVMTFNVQiA6IFhTVUI7Ci0JCQkJWFBmcmVlKHd2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJWFBwdXQod3YsIDApOwotCQkJCXhwLT51LnN0cnYgPSAoY29uc3QgY2hhciAqKilYUHB0cnYod3YpOwotCQkJCXhwLT5zdHIgPSAqeHAtPnUuc3RydisrOwotCQkJCXhwLT5zcGxpdCA9IHBbMV0gPT0gJ0AnOyAvKiAke2Zvb1tAXX0gKi8KLQkJCQlzdGF0ZSA9IFhBUkc7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBDYW4ndCBhc3NpZ24gdGhpbmdzIGxpa2UgJCEgb3IgJDEgKi8KLQkJCWlmICgoc3R5cGUgJiAweDdmKSA9PSAnPScgJiYKLQkJCSAgICBjdHlwZSgqc3AsIENfVkFSMSB8IENfRElHSVQpKQotCQkJCXJldHVybiAoLTEpOwotCQkJaWYgKCpzcCA9PSAnIScgJiYgc3BbMV0pIHsKLQkJCQkrK3NwOwotCQkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOwotCQkJCWlmIChjc3RyY2hyKHNwLCAnWycpKSB7Ci0JCQkJCWlmICh4cC0+dmFyLT5mbGFnICYgSVNTRVQpCi0JCQkJCQl4cC0+c3RyID0gc2hmX3NtcHJpbnRmKCIlbHUiLAotCQkJCQkJICAgIGFycmF5aW5kZXgoeHAtPnZhcikpOwotCQkJCQllbHNlCi0JCQkJCQl4cC0+c3RyID0gbnVsbDsKLQkJCQl9IGVsc2UgaWYgKHhwLT52YXItPmZsYWcgJiBJU1NFVCkKLQkJCQkJeHAtPnN0ciA9IHhwLT52YXItPm5hbWU7Ci0JCQkJZWxzZQotCQkJCQl4cC0+c3RyID0gIjAiOwkvKiBrc2g5MyBjb21wYXQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJeHAtPnZhciA9IGdsb2JhbChzcCk7Ci0JCQkJeHAtPnN0ciA9IHN0cl92YWwoeHAtPnZhcik7Ci0JCQl9Ci0JCQlzdGF0ZSA9IFhTVUI7Ci0JCX0KLQl9Ci0KLQljID0gc3R5cGUmMHg3ZjsKLQkvKiB0ZXN0IHRoZSBjb21waWxlcidzIGNvZGUgZ2VuZXJhdG9yICovCi0JaWYgKGN0eXBlKGMsIENfU1VCT1AyKSB8fCBzdHlwZSA9PSAoMHg4MCB8ICcwJykgfHwgYyA9PSAnLycgfHwKLQkgICAgKCgoc3R5cGUmMHg4MCkgPyAqeHAtPnN0cj09J1wwJyA6IHhwLT5zdHI9PW51bGwpID8gLyogdW5kZWY/ICovCi0JICAgIGMgPT0gJz0nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJz8nIDogYyA9PSAnKycpKQotCQlzdGF0ZSA9IFhCQVNFOwkvKiBleHBhbmQgd29yZCBpbnN0ZWFkIG9mIHZhcmlhYmxlIHZhbHVlICovCi0JaWYgKEZsYWcoRk5PVU5TRVQpICYmIHhwLT5zdHIgPT0gbnVsbCAmJiAhemVyb19vayAmJgotCSAgICAoY3R5cGUoYywgQ19TVUJPUDIpIHx8IChzdGF0ZSAhPSBYQkFTRSAmJiBjICE9ICcrJykpKQotCQllcnJvcmYoIiVzOiBwYXJhbWV0ZXIgbm90IHNldCIsIHNwKTsKLQlyZXR1cm4gKHN0YXRlKTsKLX0KLQotLyoKLSAqIFJ1biB0aGUgY29tbWFuZCBpbiAkKC4uLikgYW5kIHJlYWQgaXRzIG91dHB1dC4KLSAqLwotc3RhdGljIGludAotY29tc3ViKEV4cGFuZCAqeHAsIGNvbnN0IGNoYXIgKmNwKQotewotCVNvdXJjZSAqcywgKnNvbGQ7Ci0Jc3RydWN0IG9wICp0OwotCXN0cnVjdCBzaGYgKnNoZjsKLQotCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7Ci0Jcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKLQlzb2xkID0gc291cmNlOwotCXQgPSBjb21waWxlKHMpOwotCWFmcmVlKHMsIEFURU1QKTsKLQlzb3VyY2UgPSBzb2xkOwotCi0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuIChYQkFTRSk7Ci0KLQlpZiAodCAhPSBOVUxMICYmIHQtPnR5cGUgPT0gVENPTSAmJiAvKiAkKDxmaWxlKSAqLwotCSAgICAqdC0+YXJncyA9PSBOVUxMICYmICp0LT52YXJzID09IE5VTEwgJiYgdC0+aW9hY3QgIT0gTlVMTCkgewotCQlzdHJ1Y3QgaW93b3JkICppbyA9ICp0LT5pb2FjdDsKLQkJY2hhciAqbmFtZTsKLQotCQlpZiAoKGlvLT5mbGFnJklPVFlQRSkgIT0gSU9SRUFEKQotCQkJZXJyb3JmKCJmdW5ueSAkKCkgY29tbWFuZDogJXMiLAotCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCBpbykpOwotCQlzaGYgPSBzaGZfb3BlbihuYW1lID0gZXZhbHN0cihpby0+bmFtZSwgRE9USUxERSksIE9fUkRPTkxZLCAwLAotCQkJU0hGX01BUEhJfFNIRl9DTEVYRUMpOwotCQlpZiAoc2hmID09IE5VTEwpCi0JCQllcnJvcmYoIiVzOiBjYW5ub3Qgb3BlbiAkKCkgaW5wdXQiLCBuYW1lKTsKLQkJeHAtPnNwbGl0ID0gMDsJLyogbm8gd2FpdGxhc3QoKSAqLwotCX0gZWxzZSB7Ci0JCWludCBvZmQxLCBwdlsyXTsKLQkJb3BlbnBpcGUocHYpOwotCQlzaGYgPSBzaGZfZmRvcGVuKHB2WzBdLCBTSEZfUkQsIE5VTEwpOwotCQlvZmQxID0gc2F2ZWZkKDEpOwotCQlpZiAocHZbMV0gIT0gMSkgewotCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsKLQkJCWNsb3NlKHB2WzFdKTsKLQkJfQotCQlleGVjdXRlKHQsIFhGT1JLfFhYQ09NfFhQSVBFTywgTlVMTCk7Ci0JCXJlc3RmZCgxLCBvZmQxKTsKLQkJc3RhcnRsYXN0KCk7Ci0JCXhwLT5zcGxpdCA9IDE7CS8qIHdhaXRsYXN0KCkgKi8KLQl9Ci0KLQl4cC0+dS5zaGYgPSBzaGY7Ci0JcmV0dXJuIChYQ09NKTsKLX0KLQotLyoKLSAqIHBlcmZvcm0gI3BhdHRlcm4gYW5kICVwYXR0ZXJuIHN1YnN0aXR1dGlvbiBpbiAke30KLSAqLwotCi1zdGF0aWMgY2hhciAqCi10cmltc3ViKGNoYXIgKnN0ciwgY2hhciAqcGF0LCBpbnQgaG93KQotewotCWNoYXIgKmVuZCA9IHN0cm51bChzdHIpOwotCWNoYXIgKnAsIGM7Ci0KLQlzd2l0Y2ggKGhvdyAmIDB4RkYpIHsKLQljYXNlICcjJzoJCS8qIHNob3J0ZXN0IGF0IGJlZ2lubmluZyAqLwotCQlmb3IgKHAgPSBzdHI7IHAgPD0gZW5kOyBwICs9IHV0Zl9wdHJhZGoocCkpIHsKLQkJCWMgPSAqcDsgKnAgPSAnXDAnOwotCQkJaWYgKGdtYXRjaHgoc3RyLCBwYXQsIGZhbHNlKSkgewotCQkJCSpwID0gYzsKLQkJCQlyZXR1cm4gKHApOwotCQkJfQotCQkJKnAgPSBjOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyMnfDB4ODA6CQkvKiBsb25nZXN0IG1hdGNoIGF0IGJlZ2lubmluZyAqLwotCQlmb3IgKHAgPSBlbmQ7IHAgPj0gc3RyOyBwLS0pIHsKLQkJCWMgPSAqcDsgKnAgPSAnXDAnOwotCQkJaWYgKGdtYXRjaHgoc3RyLCBwYXQsIGZhbHNlKSkgewotCQkJCSpwID0gYzsKLQkJCQlyZXR1cm4gKHApOwotCQkJfQotCQkJKnAgPSBjOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyUnOgkJLyogc2hvcnRlc3QgbWF0Y2ggYXQgZW5kICovCi0JCXAgPSBlbmQ7Ci0JCXdoaWxlIChwID49IHN0cikgewotCQkJaWYgKGdtYXRjaHgocCwgcGF0LCBmYWxzZSkpCi0JCQkJZ290byB0cmltc3ViX21hdGNoOwotCQkJaWYgKFVURk1PREUpIHsKLQkJCQljaGFyICpvcCA9IHA7Ci0JCQkJd2hpbGUgKChwLS0gPiBzdHIpICYmICgoKnAgJiAweEMwKSA9PSAweDgwKSkKLQkJCQkJOwotCQkJCWlmICgocCA8IHN0cikgfHwgKHAgKyB1dGZfcHRyYWRqKHApICE9IG9wKSkKLQkJCQkJcCA9IG9wIC0gMTsKLQkJCX0gZWxzZQotCQkJCS0tcDsKLQkJfQotCQlicmVhazsKLQljYXNlICclJ3wweDgwOgkJLyogbG9uZ2VzdCBtYXRjaCBhdCBlbmQgKi8KLQkJZm9yIChwID0gc3RyOyBwIDw9IGVuZDsgcCsrKQotCQkJaWYgKGdtYXRjaHgocCwgcGF0LCBmYWxzZSkpIHsKLSB0cmltc3ViX21hdGNoOgotCQkJCXN0cm5kdXB4KGVuZCwgc3RyLCBwIC0gc3RyLCBBVEVNUCk7Ci0JCQkJcmV0dXJuIChlbmQpOwotCQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKHN0cik7CQkvKiBubyBtYXRjaCwgcmV0dXJuIHN0cmluZyAqLwotfQotCi0vKgotICogZ2xvYgotICogTmFtZSBkZXJpdmVkIGZyb20gVjYncyAvZXRjL2dsb2IsIHRoZSBwcm9ncmFtIHRoYXQgZXhwYW5kZWQgZmlsZW5hbWVzLgotICovCi0KLS8qIFhYWCBjcCBub3QgY29uc3QgJ2NhdXNlIHNsYXNoZXMgYXJlIHRlbXBvcmFyaWx5IHJlcGxhY2VkIHdpdGggTlVMcy4uLiAqLwotc3RhdGljIHZvaWQKLWdsb2IoY2hhciAqY3AsIFhQdHJWICp3cCwgaW50IG1hcmtkaXJzKQotewotCWludCBvbGRzaXplID0gWFBzaXplKCp3cCk7Ci0KLQlpZiAoZ2xvYl9zdHIoY3AsIHdwLCBtYXJrZGlycykgPT0gMCkKLQkJWFBwdXQoKndwLCBkZWJ1bmsoY3AsIGNwLCBzdHJsZW4oY3ApICsgMSkpOwotCWVsc2UKLQkJcXNvcnQoWFBwdHJ2KCp3cCkgKyBvbGRzaXplLCBYUHNpemUoKndwKSAtIG9sZHNpemUsCi0JCSAgICBzaXplb2Yodm9pZCAqKSwgeHN0cmNtcCk7Ci19Ci0KLSNkZWZpbmUgR0ZfTk9ORQkJMAotI2RlZmluZSBHRl9FWENIRUNLCUJJVCgwKQkJLyogZG8gZXhpc3RlbmNlIGNoZWNrIG9uIGZpbGUgKi8KLSNkZWZpbmUgR0ZfR0xPQkJFRAlCSVQoMSkJCS8qIHNvbWUgZ2xvYmJpbmcgaGFzIGJlZW4gZG9uZSAqLwotI2RlZmluZSBHRl9NQVJLRElSCUJJVCgyKQkJLyogYWRkIHRyYWlsaW5nIC8gdG8gZGlyZWN0b3JpZXMgKi8KLQotLyogQXBwbHkgZmlsZSBnbG9iYmluZyB0byBjcCBhbmQgc3RvcmUgdGhlIG1hdGNoaW5nIGZpbGVzIGluIHdwLiBSZXR1cm5zCi0gKiB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgZm91bmQuCi0gKi8KLWludAotZ2xvYl9zdHIoY2hhciAqY3AsIFhQdHJWICp3cCwgaW50IG1hcmtkaXJzKQotewotCWludCBvbGRzaXplID0gWFBzaXplKCp3cCk7Ci0JWFN0cmluZyB4czsKLQljaGFyICp4cDsKLQotCVhpbml0KHhzLCB4cCwgMjU2LCBBVEVNUCk7Ci0JZ2xvYml0KCZ4cywgJnhwLCBjcCwgd3AsIG1hcmtkaXJzID8gR0ZfTUFSS0RJUiA6IEdGX05PTkUpOwotCVhmcmVlKHhzLCB4cCk7Ci0KLQlyZXR1cm4gKFhQc2l6ZSgqd3ApIC0gb2xkc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbG9iaXQoWFN0cmluZyAqeHMsCS8qIGRlc3Qgc3RyaW5nICovCi0gICAgY2hhciAqKnhwcCwJCS8qIHB0ciB0byBkZXN0IGVuZCAqLwotICAgIGNoYXIgKnNwLAkJLyogc291cmNlIHBhdGggKi8KLSAgICBYUHRyViAqd3AsCQkvKiBvdXRwdXQgbGlzdCAqLwotICAgIGludCBjaGVjaykJCS8qIEdGXyogZmxhZ3MgKi8KLXsKLQljaGFyICpucDsJCS8qIG5leHQgc291cmNlIGNvbXBvbmVudCAqLwotCWNoYXIgKnhwID0gKnhwcDsKLQljaGFyICpzZTsKLQljaGFyIG9kaXJzZXA7Ci0KLQkvKiBUaGlzIHRvIGFsbG93IGxvbmcgZXhwYW5zaW9ucyB0byBiZSBpbnRlcnJ1cHRlZCAqLwotCWludHJjaGVjaygpOwotCi0JaWYgKHNwID09IE5VTEwpIHsJLyogZW5kIG9mIHNvdXJjZSBwYXRoICovCi0JCS8qIFdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgaWYgYSBwYXR0ZXJuCi0JCSAqIGlzIGZvbGxvd2VkIGJ5IGEgbm9uLXBhdHRlcm4gKGVnLCBmb28qeC9iYXI7IG5vIGNoZWNrCi0JCSAqIGlzIG5lZWRlZCBmb3IgZm9vKiBzaW5jZSB0aGUgbWF0Y2ggbXVzdCBleGlzdCkgb3IgaWYKLQkJICogYW55IHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgYW5kIHRoZSBtYXJrZGlycyBvcHRpb24gaXMgc2V0LgotCQkgKiBTeW1saW5rcyBtYWtlIHRoaW5ncyBhIGJpdCB0cmlja3kuLi4KLQkJICovCi0JCWlmICgoY2hlY2sgJiBHRl9FWENIRUNLKSB8fAotCQkgICAgKChjaGVjayAmIEdGX01BUktESVIpICYmIChjaGVjayAmIEdGX0dMT0JCRUQpKSkgewotI2RlZmluZSBzdGF0X2NoZWNrKCkJKHN0YXRfZG9uZSA/IHN0YXRfZG9uZSA6IFwKLQkJCSAgICAoc3RhdF9kb25lID0gc3RhdChYc3RyaW5nKCp4cywgeHApLCAmc3RhdGIpIDwgMCBcCi0JCQkJPyAtMSA6IDEpKQotCQkJc3RydWN0IHN0YXQgbHN0YXRiLCBzdGF0YjsKLQkJCWludCBzdGF0X2RvbmUgPSAwOwkgLyogLTE6IGZhaWxlZCwgMSBvayAqLwotCi0JCQlpZiAobHN0YXQoWHN0cmluZygqeHMsIHhwKSwgJmxzdGF0YikgPCAwKQotCQkJCXJldHVybjsKLQkJCS8qIHNwZWNpYWwgY2FzZSBmb3Igc3lzdGVtcyB3aGljaCBzdHJpcCB0cmFpbGluZwotCQkJICogc2xhc2hlcyBmcm9tIHJlZ3VsYXIgZmlsZXMgKGVnLCAvZXRjL3Bhc3N3ZC8pLgotCQkJICogU3VuT1MgNC4xLjMgZG9lcyB0aGlzLi4uCi0JCQkgKi8KLQkJCWlmICgoY2hlY2sgJiBHRl9FWENIRUNLKSAmJiB4cCA+IFhzdHJpbmcoKnhzLCB4cCkgJiYKLQkJCSAgICB4cFstMV0gPT0gJy8nICYmICFTX0lTRElSKGxzdGF0Yi5zdF9tb2RlKSAmJgotCQkJICAgICghU19JU0xOSyhsc3RhdGIuc3RfbW9kZSkgfHwKLQkJCSAgICBzdGF0X2NoZWNrKCkgPCAwIHx8ICFTX0lTRElSKHN0YXRiLnN0X21vZGUpKSkKLQkJCQlyZXR1cm47Ci0JCQkvKiBQb3NzaWJseSB0YWNrIG9uIGEgdHJhaWxpbmcgLyBpZiB0aGVyZSBpc24ndCBhbHJlYWR5Ci0JCQkgKiBvbmUgYW5kIGlmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhCi0JCQkgKiBkaXJlY3RvcnkKLQkJCSAqLwotCQkJaWYgKCgoY2hlY2sgJiBHRl9NQVJLRElSKSAmJiAoY2hlY2sgJiBHRl9HTE9CQkVEKSkgJiYKLQkJCSAgICB4cCA+IFhzdHJpbmcoKnhzLCB4cCkgJiYgeHBbLTFdICE9ICcvJyAmJgotCQkJICAgIChTX0lTRElSKGxzdGF0Yi5zdF9tb2RlKSB8fAotCQkJICAgIChTX0lTTE5LKGxzdGF0Yi5zdF9tb2RlKSAmJiBzdGF0X2NoZWNrKCkgPiAwICYmCi0JCQkgICAgU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkpKSB7Ci0JCQkJKnhwKysgPSAnLyc7Ci0JCQkJKnhwID0gJ1wwJzsKLQkJCX0KLQkJfQotCQlzdHJuZHVweChucCwgWHN0cmluZygqeHMsIHhwKSwgWGxlbmd0aCgqeHMsIHhwKSwgQVRFTVApOwotCQlYUHB1dCgqd3AsIG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh4cCA+IFhzdHJpbmcoKnhzLCB4cCkpCi0JCSp4cCsrID0gJy8nOwotCXdoaWxlICgqc3AgPT0gJy8nKSB7Ci0JCVhjaGVjaygqeHMsIHhwKTsKLQkJKnhwKysgPSAqc3ArKzsKLQl9Ci0JbnAgPSBzdHJjaHIoc3AsICcvJyk7Ci0JaWYgKG5wICE9IE5VTEwpIHsKLQkJc2UgPSBucDsKLQkJb2RpcnNlcCA9ICpucDsJLyogZG9uJ3QgYXNzdW1lICcvJywgY2FuIGJlIG11bHRpcGxlIGtpbmRzICovCi0JCSpucCsrID0gJ1wwJzsKLQl9IGVsc2UgewotCQlvZGlyc2VwID0gJ1wwJzsgLyoga2VlcCBnY2MgcXVpZXQgKi8KLQkJc2UgPSBzcCArIHN0cmxlbihzcCk7Ci0JfQotCi0KLQkvKiBDaGVjayBpZiBzcCBuZWVkcyBnbG9iYmluZyAtIGRvbmUgdG8gYXZvaWQgcGF0dGVybiBjaGVja3MgZm9yIHN0cmluZ3MKLQkgKiBjb250YWluaW5nIE1BR0lDIGNoYXJhY3RlcnMsIG9wZW4gW3Mgd2l0aG91dCB0aGUgbWF0Y2hpbmcgY2xvc2UgXSwKLQkgKiBldGMuIChvdGhlcndpc2Ugb3BlbmRpcigpIHdpbGwgYmUgY2FsbGVkIHdoaWNoIG1heSBmYWlsIGJlY2F1c2UgdGhlCi0JICogZGlyZWN0b3J5IGlzbid0IHJlYWRhYmxlIC0gaWYgbm8gZ2xvYmJpbmcgaXMgbmVlZGVkLCBvbmx5IGV4ZWN1dGUKLQkgKiBwZXJtaXNzaW9uIHNob3VsZCBiZSByZXF1aXJlZCAoYXMgcGVyIFBPU0lYKSkuCi0JICovCi0JaWYgKCFoYXNfZ2xvYmJpbmcoc3AsIHNlKSkgewotCQlYY2hlY2tOKCp4cywgeHAsIHNlIC0gc3AgKyAxKTsKLQkJZGVidW5rKHhwLCBzcCwgWG5sZWZ0KCp4cywgeHApKTsKLQkJeHAgKz0gc3RybGVuKHhwKTsKLQkJKnhwcCA9IHhwOwotCQlnbG9iaXQoeHMsIHhwcCwgbnAsIHdwLCBjaGVjayk7Ci0JfSBlbHNlIHsKLQkJRElSICpkaXJwOwotCQlzdHJ1Y3QgZGlyZW50ICpkOwotCQljaGFyICpuYW1lOwotCQlpbnQgbGVuOwotCQlpbnQgcHJlZml4X2xlbjsKLQotCQkvKiB4cCA9ICp4cHA7CWNvcHlfbm9uX2dsb2IoKSBtYXkgaGF2ZSByZS1hbGxvYydkIHhzICovCi0JCSp4cCA9ICdcMCc7Ci0JCXByZWZpeF9sZW4gPSBYbGVuZ3RoKCp4cywgeHApOwotCQlkaXJwID0gb3BlbmRpcihwcmVmaXhfbGVuID8gWHN0cmluZygqeHMsIHhwKSA6ICIuIik7Ci0JCWlmIChkaXJwID09IE5VTEwpCi0JCQlnb3RvIE5vZGlyOwotCQl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7Ci0JCQluYW1lID0gZC0+ZF9uYW1lOwotCQkJaWYgKG5hbWVbMF0gPT0gJy4nICYmCi0JCQkgICAgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpCi0JCQkJY29udGludWU7IC8qIGFsd2F5cyBpZ25vcmUgLiBhbmQgLi4gKi8KLQkJCWlmICgoKm5hbWUgPT0gJy4nICYmICpzcCAhPSAnLicpIHx8Ci0JCQkgICAgIWdtYXRjaHgobmFtZSwgc3AsIHRydWUpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlsZW4gPSBzdHJsZW4oZC0+ZF9uYW1lKSArIDE7Ci0JCQlYY2hlY2tOKCp4cywgeHAsIGxlbik7Ci0JCQltZW1jcHkoeHAsIG5hbWUsIGxlbik7Ci0JCQkqeHBwID0geHAgKyBsZW4gLSAxOwotCQkJZ2xvYml0KHhzLCB4cHAsIG5wLCB3cCwKLQkJCQkoY2hlY2sgJiBHRl9NQVJLRElSKSB8IEdGX0dMT0JCRUQKLQkJCQl8IChucCA/IEdGX0VYQ0hFQ0sgOiBHRl9OT05FKSk7Ci0JCQl4cCA9IFhzdHJpbmcoKnhzLCB4cCkgKyBwcmVmaXhfbGVuOwotCQl9Ci0JCWNsb3NlZGlyKGRpcnApOwotIE5vZGlyOgotCQk7Ci0JfQotCi0JaWYgKG5wICE9IE5VTEwpCi0JCSotLW5wID0gb2RpcnNlcDsKLX0KLQotLyogcmVtb3ZlIE1BR0lDIGZyb20gc3RyaW5nICovCi1jaGFyICoKLWRlYnVuayhjaGFyICpkcCwgY29uc3QgY2hhciAqc3AsIHNpemVfdCBkbGVuKQotewotCWNoYXIgKmQ7Ci0JY29uc3QgY2hhciAqczsKLQotCWlmICgocyA9IGNzdHJjaHIoc3AsIE1BR0lDKSkpIHsKLQkJaWYgKHMgLSBzcCA+PSAoc3NpemVfdClkbGVuKQotCQkJcmV0dXJuIChkcCk7Ci0JCW1lbW1vdmUoZHAsIHNwLCBzIC0gc3ApOwotCQlmb3IgKGQgPSBkcCArIChzIC0gc3ApOyAqcyAmJiAoZCAtIGRwIDwgKHNzaXplX3QpZGxlbik7IHMrKykKLQkJCWlmICghSVNNQUdJQygqcykgfHwgISgqKytzICYgMHg4MCkgfHwKLQkJCSAgICAhdnN0cmNocigiKis/QCEgIiwgKnMgJiAweDdmKSkKLQkJCQkqZCsrID0gKnM7Ci0JCQllbHNlIHsKLQkJCQkvKiBleHRlbmRlZCBwYXR0ZXJuIG9wZXJhdG9yczogKis/QCEgKi8KLQkJCQlpZiAoKCpzICYgMHg3ZikgIT0gJyAnKQotCQkJCQkqZCsrID0gKnMgJiAweDdmOwotCQkJCWlmIChkIC0gZHAgPCAoc3NpemVfdClkbGVuKQotCQkJCQkqZCsrID0gJygnOwotCQkJfQotCQkqZCA9ICdcMCc7Ci0JfSBlbHNlIGlmIChkcCAhPSBzcCkKLQkJc3RybGNweShkcCwgc3AsIGRsZW4pOwotCXJldHVybiAoZHApOwotfQotCi0vKiBDaGVjayBpZiBwIGlzIGFuIHVucXVvdGVkIG5hbWUsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgLyBvciA6LiBJZiBzbwotICogcHV0cyB0aGUgZXhwYW5kZWQgdmVyc2lvbiBpbiAqZGNwLGRwIGFuZCByZXR1cm5zIGEgcG9pbnRlciBpbiBwIGp1c3QKLSAqIHBhc3QgdGhlIG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIDAuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1heWJlX2V4cGFuZF90aWxkZShjb25zdCBjaGFyICpwLCBYU3RyaW5nICpkc3AsIGNoYXIgKipkcHAsIGludCBpc2Fzc2lnbikKLXsKLQlYU3RyaW5nIHRzOwotCWNoYXIgKmRwID0gKmRwcDsKLQljaGFyICp0cDsKLQljb25zdCBjaGFyICpyOwotCi0JWGluaXQodHMsIHRwLCAxNiwgQVRFTVApOwotCS8qIDogb25seSBmb3IgRE9BU05USUxERSBmb3JtICovCi0Jd2hpbGUgKHBbMF0gPT0gQ0hBUiAmJiBwWzFdICE9ICcvJyAmJiAoIWlzYXNzaWduIHx8IHBbMV0gIT0gJzonKSkKLQl7Ci0JCVhjaGVjayh0cywgdHApOwotCQkqdHArKyA9IHBbMV07Ci0JCXAgKz0gMjsKLQl9Ci0JKnRwID0gJ1wwJzsKLQlyID0gKHBbMF0gPT0gRU9TIHx8IHBbMF0gPT0gQ0hBUiB8fCBwWzBdID09IENTVUJTVCkgPwotCSAgICB0aWxkZShYc3RyaW5nKHRzLCB0cCkpIDogTlVMTDsKLQlYZnJlZSh0cywgdHApOwotCWlmIChyKSB7Ci0JCXdoaWxlICgqcikgewotCQkJWGNoZWNrKCpkc3AsIGRwKTsKLQkJCWlmIChJU01BR0lDKCpyKSkKLQkJCQkqZHArKyA9IE1BR0lDOwotCQkJKmRwKysgPSAqcisrOwotCQl9Ci0JCSpkcHAgPSBkcDsKLQkJciA9IHA7Ci0JfQotCXJldHVybiAocik7Ci19Ci0KLS8qCi0gKiB0aWxkZSBleHBhbnNpb24KLSAqCi0gKiBiYXNlZCBvbiBhIHZlcnNpb24gYnkgQXJub2xkIFJvYmJpbnMKLSAqLwotCi1zdGF0aWMgY2hhciAqCi10aWxkZShjaGFyICpjcCkKLXsKLQljaGFyICpkcCA9IG51bGw7Ci0KLQlpZiAoY3BbMF0gPT0gJ1wwJykKLQkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiSE9NRSIpKTsKLQllbHNlIGlmIChjcFswXSA9PSAnKycgJiYgY3BbMV0gPT0gJ1wwJykKLQkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiUFdEIikpOwotCWVsc2UgaWYgKGNwWzBdID09ICctJyAmJiBjcFsxXSA9PSAnXDAnKQotCQlkcCA9IHN0cl92YWwoZ2xvYmFsKCJPTERQV0QiKSk7Ci0jaWZuZGVmIE1LU0hfTk9QV05BTQotCWVsc2UKLQkJZHAgPSBob21lZGlyKGNwKTsKLSNlbmRpZgotCS8qIElmIEhPTUUsIFBXRCBvciBPTERQV0QgYXJlIG5vdCBzZXQsIGRvbid0IGV4cGFuZCB+ICovCi0JcmV0dXJuIChkcCA9PSBudWxsID8gTlVMTCA6IGRwKTsKLX0KLQotI2lmbmRlZiBNS1NIX05PUFdOQU0KLS8qCi0gKiBtYXAgdXNlcmlkIHRvIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLSAqIG5vdGUgdGhhdCA0LjMncyBnZXRwdyBhZGRzIG1vcmUgdGhhbiA2SyB0byB0aGUgc2hlbGwsCi0gKiBhbmQgdGhlIFlQIHZlcnNpb24gcHJvYmFibHkgYWRkcyBtdWNoIG1vcmUuCi0gKiB3ZSBtaWdodCBjb25zaWRlciBvdXIgb3duIHZlcnNpb24gb2YgZ2V0cHduYW0oKSB0byBrZWVwIHRoZSBzaXplIGRvd24uCi0gKi8KLXN0YXRpYyBjaGFyICoKLWhvbWVkaXIoY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgdGJsICphcDsKLQotCWFwID0ga3RlbnRlcigmaG9tZWRpcnMsIG5hbWUsIGhhc2gobmFtZSkpOwotCWlmICghKGFwLT5mbGFnICYgSVNTRVQpKSB7Ci0JCXN0cnVjdCBwYXNzd2QgKnB3OwotCi0JCXB3ID0gZ2V0cHduYW0obmFtZSk7Ci0JCWlmIChwdyA9PSBOVUxMKQotCQkJcmV0dXJuIChOVUxMKTsKLQkJc3RyZHVweChhcC0+dmFsLnMsIHB3LT5wd19kaXIsIEFQRVJNKTsKLQkJYXAtPmZsYWcgfD0gREVGSU5FRHxJU1NFVHxBTExPQzsKLQl9Ci0JcmV0dXJuIChhcC0+dmFsLnMpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1hbHRfZXhwYW5kKFhQdHJWICp3cCwgY2hhciAqc3RhcnQsIGNoYXIgKmV4cF9zdGFydCwgY2hhciAqZW5kLCBpbnQgZmRvKQotewotCWludCBjb3VudCA9IDA7Ci0JY2hhciAqYnJhY2Vfc3RhcnQsICpicmFjZV9lbmQsICpjb21tYSA9IE5VTEw7Ci0JY2hhciAqZmllbGRfc3RhcnQ7Ci0JY2hhciAqcDsKLQotCS8qIHNlYXJjaCBmb3Igb3BlbiBicmFjZSAqLwotCWZvciAocCA9IGV4cF9zdGFydDsgKHAgPSBzdHJjaHIocCwgTUFHSUMpKSAmJiBwWzFdICE9IE9CUkFDRTsgcCArPSAyKQotCQk7Ci0JYnJhY2Vfc3RhcnQgPSBwOwotCi0JLyogZmluZCBtYXRjaGluZyBjbG9zZSBicmFjZSwgaWYgYW55ICovCi0JaWYgKHApIHsKLQkJY29tbWEgPSBOVUxMOwotCQljb3VudCA9IDE7Ci0JCWZvciAocCArPSAyOyAqcCAmJiBjb3VudDsgcCsrKSB7Ci0JCQlpZiAoSVNNQUdJQygqcCkpIHsKLQkJCQlpZiAoKisrcCA9PSBPQlJBQ0UpCi0JCQkJCWNvdW50Kys7Ci0JCQkJZWxzZSBpZiAoKnAgPT0gQ0JSQUNFKQotCQkJCQktLWNvdW50OwotCQkJCWVsc2UgaWYgKCpwID09ICcsJyAmJiBjb3VudCA9PSAxKQotCQkJCQljb21tYSA9IHA7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogbm8gdmFsaWQgZXhwYW5zaW9ucy4uLiAqLwotCWlmICghcCB8fCBjb3VudCAhPSAwKSB7Ci0JCS8qIE5vdGUgdGhhdCBnaXZlbiBhe3tiLGN9IHdlIGRvIG5vdCBleHBhbmQgYW55dGhpbmcgKHRoaXMgaXMKLQkJICogd2hhdCBBVCZUIGtzaCBkb2VzLiBUaGlzIG1heSBiZSBjaGFuZ2VkIHRvIGRvIHRoZSB7YixjfQotCQkgKiBleHBhbnNpb24uIH0KLQkJICovCi0JCWlmIChmZG8gJiBET0dMT0IpCi0JCQlnbG9iKHN0YXJ0LCB3cCwgZmRvICYgRE9NQVJLRElSUyk7Ci0JCWVsc2UKLQkJCVhQcHV0KCp3cCwgZGVidW5rKHN0YXJ0LCBzdGFydCwgZW5kIC0gc3RhcnQpKTsKLQkJcmV0dXJuOwotCX0KLQlicmFjZV9lbmQgPSBwOwotCWlmICghY29tbWEpIHsKLQkJYWx0X2V4cGFuZCh3cCwgc3RhcnQsIGJyYWNlX2VuZCwgZW5kLCBmZG8pOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZXhwYW5kIGV4cHJlc3Npb24gKi8KLQlmaWVsZF9zdGFydCA9IGJyYWNlX3N0YXJ0ICsgMjsKLQljb3VudCA9IDE7Ci0JZm9yIChwID0gYnJhY2Vfc3RhcnQgKyAyOyBwICE9IGJyYWNlX2VuZDsgcCsrKSB7Ci0JCWlmIChJU01BR0lDKCpwKSkgewotCQkJaWYgKCorK3AgPT0gT0JSQUNFKQotCQkJCWNvdW50Kys7Ci0JCQllbHNlIGlmICgoKnAgPT0gQ0JSQUNFICYmIC0tY291bnQgPT0gMCkgfHwKLQkJCSAgICAoKnAgPT0gJywnICYmIGNvdW50ID09IDEpKSB7Ci0JCQkJY2hhciAqbmV3czsKLQkJCQlpbnQgbDEsIGwyLCBsMzsKLQotCQkJCWwxID0gYnJhY2Vfc3RhcnQgLSBzdGFydDsKLQkJCQlsMiA9IChwIC0gMSkgLSBmaWVsZF9zdGFydDsKLQkJCQlsMyA9IGVuZCAtIGJyYWNlX2VuZDsKLQkJCQluZXdzID0gYWxsb2MobDEgKyBsMiArIGwzICsgMSwgQVRFTVApOwotCQkJCW1lbWNweShuZXdzLCBzdGFydCwgbDEpOwotCQkJCW1lbWNweShuZXdzICsgbDEsIGZpZWxkX3N0YXJ0LCBsMik7Ci0JCQkJbWVtY3B5KG5ld3MgKyBsMSArIGwyLCBicmFjZV9lbmQsIGwzKTsKLQkJCQluZXdzW2wxICsgbDIgKyBsM10gPSAnXDAnOwotCQkJCWFsdF9leHBhbmQod3AsIG5ld3MsIG5ld3MgKyBsMSwKLQkJCQkgICAgbmV3cyArIGwxICsgbDIgKyBsMywgZmRvKTsKLQkJCQlmaWVsZF9zdGFydCA9IHAgKyAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V4ZWMuYyBiL21rc2gvc3JjL2V4ZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxMzIxYS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9leGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTE4ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBleGVjLmMsdiAxLjQ5IDIwMDkvMDEvMjkgMjM6Mjc6MjYgamFyZWR5IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXhlYy5jLHYgMS43NSAyMDEwLzA3LzE3IDIyOjA5OjM0IHRnIEV4cCAkIik7Ci0KLSNpZm5kZWYgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTAotI2RlZmluZSBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMCSIvYmluL3NoIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgY29tZXhlYyhzdHJ1Y3Qgb3AgKiwgc3RydWN0IHRibCAqdm9sYXRpbGUsIGNvbnN0IGNoYXIgKiosCi0gICAgaW50IHZvbGF0aWxlLCB2b2xhdGlsZSBpbnQgKik7Ci1zdGF0aWMgdm9pZCBzY3JpcHRleGVjKHN0cnVjdCBvcCAqLCBjb25zdCBjaGFyICoqKSBNS1NIX0FfTk9SRVRVUk47Ci1zdGF0aWMgaW50IGNhbGxfYnVpbHRpbihzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKiopOwotc3RhdGljIGludCBpb3NldHVwKHN0cnVjdCBpb3dvcmQgKiwgc3RydWN0IHRibCAqKTsKLXN0YXRpYyBpbnQgaGVyZWluKGNvbnN0IGNoYXIgKiwgaW50KTsKLXN0YXRpYyBjb25zdCBjaGFyICpkb19zZWxlY3RhcmdzKGNvbnN0IGNoYXIgKiosIGJvb2wpOwotc3RhdGljIFRlc3Rfb3AgZGJ0ZXN0ZV9pc2EoVGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkYnRlc3RlX2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7Ci1zdGF0aWMgdm9pZCBkYnRlc3RlX2Vycm9yKFRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKLQotLyoKLSAqIGV4ZWN1dGUgY29tbWFuZCB0cmVlCi0gKi8KLWludAotZXhlY3V0ZShzdHJ1Y3Qgb3AgKnZvbGF0aWxlIHQsCi0gICAgdm9sYXRpbGUgaW50IGZsYWdzLAkJLyogaWYgWEVYRUMgZG9uJ3QgZm9yayAqLwotICAgIHZvbGF0aWxlIGludCAqIHZvbGF0aWxlIHhlcnJvaykKLXsKLQlpbnQgaTsKLQl2b2xhdGlsZSBpbnQgcnYgPSAwLCBkdW1teSA9IDA7Ci0JaW50IHB2WzJdOwotCWNvbnN0IGNoYXIgKiogdm9sYXRpbGUgYXA7Ci0JY2hhciAqKiB2b2xhdGlsZSB1cDsKLQljb25zdCBjaGFyICpzLCAqY3A7Ci0Jc3RydWN0IGlvd29yZCAqKmlvd3A7Ci0Jc3RydWN0IHRibCAqdHAgPSBOVUxMOwotCi0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQotCS8qIENhbGxlciBkb2Vzbid0IGNhcmUgaWYgWEVSUk9LIHNob3VsZCBwcm9wYWdhdGUuICovCi0JaWYgKHhlcnJvayA9PSBOVUxMKQotCQl4ZXJyb2sgPSAmZHVtbXk7Ci0KLQlpZiAoKGZsYWdzJlhGT1JLKSAmJiAhKGZsYWdzJlhFWEVDKSAmJiB0LT50eXBlICE9IFRQSVBFKQotCQkvKiBydW4gaW4gc3ViLXByb2Nlc3MgKi8KLQkJcmV0dXJuIChleGNoaWxkKHQsIGZsYWdzICYgflhUSU1FLCB4ZXJyb2ssIC0xKSk7Ci0KLQluZXdlbnYoRV9FWEVDKTsKLQlpZiAodHJhcCkKLQkJcnVudHJhcHMoMCk7Ci0KLQlpZiAodC0+dHlwZSA9PSBUQ09NKSB7Ci0JCS8qIENsZWFyIHN1YnN0X2V4c3RhdCBiZWZvcmUgYXJndW1lbnQgZXhwYW5zaW9uLiBVc2VkIGJ5Ci0JCSAqIG51bGwgY29tbWFuZHMgKHNlZSBjb21leGVjKCkgYW5kIGNfZXZhbCgpKSBhbmQgYnkgY19zZXQoKS4KLQkJICovCi0JCXN1YnN0X2V4c3RhdCA9IDA7Ci0KLQkJY3VycmVudF9saW5lbm8gPSB0LT5saW5lbm87CS8qIGZvciAkTElORU5PICovCi0KLQkJLyogUE9TSVggc2F5cyBleHBhbmQgY29tbWFuZCB3b3JkcyBmaXJzdCwgdGhlbiByZWRpcmVjdGlvbnMsCi0JCSAqIGFuZCBhc3NpZ25tZW50cyBsYXN0Li4KLQkJICovCi0JCXVwID0gZXZhbCh0LT5hcmdzLCB0LT51LmV2YWxmbGFncyB8IERPQkxBTksgfCBET0dMT0IgfCBET1RJTERFKTsKLQkJaWYgKGZsYWdzICYgWFRJTUUpCi0JCQkvKiBBbGxvdyBvcHRpb24gcGFyc2luZyAoYml6YXJyZSwgYnV0IFBPU0lYKSAqLwotCQkJdGltZXhfaG9vayh0LCAmdXApOwotCQlhcCA9IChjb25zdCBjaGFyICoqKXVwOwotCQlpZiAoRmxhZyhGWFRSQUNFKSAmJiBhcFswXSkgewotCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzIiwKLQkJCQlzdWJzdGl0dXRlKHN0cl92YWwoZ2xvYmFsKCJQUzQiKSksIDApKTsKLQkJCWZvciAoaSA9IDA7IGFwW2ldOyBpKyspCi0JCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzJWMiLCBhcFtpXSwKLQkJCQkgICAgYXBbaSArIDFdID8gJyAnIDogJ1xuJyk7Ci0JCQlzaGZfZmx1c2goc2hsX291dCk7Ci0JCX0KLQkJaWYgKGFwWzBdKQotCQkJdHAgPSBmaW5kY29tKGFwWzBdLCBGQ19CSXxGQ19GVU5DKTsKLQl9Ci0JZmxhZ3MgJj0gflhUSU1FOwotCi0JaWYgKHQtPmlvYWN0ICE9IE5VTEwgfHwgdC0+dHlwZSA9PSBUUElQRSB8fCB0LT50eXBlID09IFRDT1BST0MpIHsKLQkJZS0+c2F2ZWZkID0gYWxsb2MoTlVGSUxFICogc2l6ZW9mKHNob3J0KSwgQVRFTVApOwotCQkvKiBpbml0aWFsaXNlIHRvIG5vdCByZWRpcmVjdGVkICovCi0JCW1lbXNldChlLT5zYXZlZmQsIDAsIE5VRklMRSAqIHNpemVvZihzaG9ydCkpOwotCX0KLQotCS8qIGRvIHJlZGlyZWN0aW9uLCB0byBiZSByZXN0b3JlZCBpbiBxdWl0ZW52KCkgKi8KLQlpZiAodC0+aW9hY3QgIT0gTlVMTCkKLQkJZm9yIChpb3dwID0gdC0+aW9hY3Q7ICppb3dwICE9IE5VTEw7IGlvd3ArKykgewotCQkJaWYgKGlvc2V0dXAoKmlvd3AsIHRwKSA8IDApIHsKLQkJCQlleHN0YXQgPSBydiA9IDE7Ci0JCQkJLyogUmVkaXJlY3Rpb24gZmFpbHVyZXMgZm9yIHNwZWNpYWwgY29tbWFuZHMKLQkJCQkgKiBjYXVzZSAobm9uLWludGVyYWN0aXZlKSBzaGVsbCB0byBleGl0LgotCQkJCSAqLwotCQkJCWlmICh0cCAmJiB0cC0+dHlwZSA9PSBDU0hFTEwgJiYKLQkJCQkgICAgKHRwLT5mbGFnICYgU1BFQ19CSSkpCi0JCQkJCWVycm9yZnooKTsKLQkJCQkvKiBEZWFsIHdpdGggRkVSUkVYSVQsIHF1aXRlbnYoKSwgZXRjLiAqLwotCQkJCWdvdG8gQnJlYWs7Ci0JCQl9Ci0JCX0KLQotCXN3aXRjaCAodC0+dHlwZSkgewotCWNhc2UgVENPTToKLQkJcnYgPSBjb21leGVjKHQsIHRwLCAoY29uc3QgY2hhciAqKilhcCwgZmxhZ3MsIHhlcnJvayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFSRU46Ci0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyB8IFhGT1JLLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVFBJUEU6Ci0JCWZsYWdzIHw9IFhGT1JLOwotCQlmbGFncyAmPSB+WEVYRUM7Ci0JCWUtPnNhdmVmZFswXSA9IHNhdmVmZCgwKTsKLQkJZS0+c2F2ZWZkWzFdID0gc2F2ZWZkKDEpOwotCQl3aGlsZSAodC0+dHlwZSA9PSBUUElQRSkgewotCQkJb3BlbnBpcGUocHYpOwotCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsgLyogc3Rkb3V0IG9mIGN1cnIgKi8KLQkJCS8qKgotCQkJICogTGV0IGV4Y2hpbGQoKSBjbG9zZSBwdlswXSBpbiBjaGlsZAotCQkJICogKGlmIHRoaXMgaXNuJ3QgZG9uZSwgY29tbWFuZHMgbGlrZQotCQkJICoJKDogOyBjYXQgL2V0Yy90ZXJtY2FwKSB8IHNsZWVwIDEKLQkJCSAqIHdpbGwgaGFuZyBmb3JldmVyKS4KLQkJCSAqLwotCQkJZXhjaGlsZCh0LT5sZWZ0LCBmbGFncyB8IFhQSVBFTyB8IFhDQ0xPU0UsCi0JCQkgICAgTlVMTCwgcHZbMF0pOwotCQkJa3NoX2R1cDIocHZbMF0sIDAsIGZhbHNlKTsgLyogc3RkaW4gb2YgbmV4dCAqLwotCQkJY2xvc2VwaXBlKHB2KTsKLQkJCWZsYWdzIHw9IFhQSVBFSTsKLQkJCXQgPSB0LT5yaWdodDsKLQkJfQotCQlyZXN0ZmQoMSwgZS0+c2F2ZWZkWzFdKTsgLyogc3Rkb3V0IG9mIGxhc3QgKi8KLQkJZS0+c2F2ZWZkWzFdID0gMDsgLyogbm8gbmVlZCB0byByZS1yZXN0b3JlIHRoaXMgKi8KLQkJLyogTGV0IGV4Y2hpbGQoKSBjbG9zZSAwIGluIHBhcmVudCwgYWZ0ZXIgZm9yaywgYmVmb3JlIHdhaXQgKi8KLQkJaSA9IGV4Y2hpbGQodCwgZmxhZ3MgfCBYUENMT1NFLCB4ZXJyb2ssIDApOwotCQlpZiAoIShmbGFncyZYQkdORCkgJiYgIShmbGFncyZYWENPTSkpCi0JCQlydiA9IGk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUTElTVDoKLQkJd2hpbGUgKHQtPnR5cGUgPT0gVExJU1QpIHsKLQkJCWV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIE5VTEwpOwotCQkJdCA9IHQtPnJpZ2h0OwotCQl9Ci0JCXJ2ID0gZXhlY3V0ZSh0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRDT1BST0M6IHsKLQkJc2lnc2V0X3Qgb21hc2s7Ci0KLQkJLyogQmxvY2sgc2lnY2hpbGQgYXMgd2UgYXJlIHVzaW5nIHRoaW5ncyBjaGFuZ2VkIGluIHRoZQotCQkgKiBzaWduYWwgaGFuZGxlcgotCQkgKi8KLQkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQkJZS0+dHlwZSA9IEVfRVJSSDsKLQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQkJaWYgKGkpIHsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQkJcXVpdGVudihOVUxMKTsKLQkJCXVud2luZChpKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCQkvKiBBbHJlYWR5IGhhdmUgYSAobGl2ZSkgY28tcHJvY2Vzcz8gKi8KLQkJaWYgKGNvcHJvYy5qb2IgJiYgY29wcm9jLndyaXRlID49IDApCi0JCQllcnJvcmYoImNvcHJvY2VzcyBhbHJlYWR5IGV4aXN0cyIpOwotCi0JCS8qIENhbiB3ZSByZS11c2UgdGhlIGV4aXN0aW5nIGNvLXByb2Nlc3MgcGlwZT8gKi8KLQkJY29wcm9jX2NsZWFudXAodHJ1ZSk7Ci0KLQkJLyogZG8gdGhpcyBiZWZvcmUgb3BlbmluZyBwaXBlcywgaW4gY2FzZSB0aGVzZSBmYWlsICovCi0JCWUtPnNhdmVmZFswXSA9IHNhdmVmZCgwKTsKLQkJZS0+c2F2ZWZkWzFdID0gc2F2ZWZkKDEpOwotCi0JCW9wZW5waXBlKHB2KTsKLQkJaWYgKHB2WzBdICE9IDApIHsKLQkJCWtzaF9kdXAyKHB2WzBdLCAwLCBmYWxzZSk7Ci0JCQljbG9zZShwdlswXSk7Ci0JCX0KLQkJY29wcm9jLndyaXRlID0gcHZbMV07Ci0JCWNvcHJvYy5qb2IgPSBOVUxMOwotCi0JCWlmIChjb3Byb2MucmVhZHcgPj0gMCkKLQkJCWtzaF9kdXAyKGNvcHJvYy5yZWFkdywgMSwgZmFsc2UpOwotCQllbHNlIHsKLQkJCW9wZW5waXBlKHB2KTsKLQkJCWNvcHJvYy5yZWFkID0gcHZbMF07Ci0JCQlrc2hfZHVwMihwdlsxXSwgMSwgZmFsc2UpOwotCQkJY29wcm9jLnJlYWR3ID0gcHZbMV07CSAvKiBjbG9zZWQgYmVmb3JlIGZpcnN0IHJlYWQgKi8KLQkJCWNvcHJvYy5uam9icyA9IDA7Ci0JCQkvKiBjcmVhdGUgbmV3IGNvcHJvY2VzcyBpZCAqLwotCQkJKytjb3Byb2MuaWQ7Ci0JCX0KLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWUtPnR5cGUgPSBFX0VYRUM7IC8qIG5vIG1vcmUgbmVlZCBmb3IgZXJyb3IgaGFuZGxlciAqLwotCi0JCS8qIGV4Y2hpbGQoKSBjbG9zZXMgY29wcm9jLiogaW4gY2hpbGQgYWZ0ZXIgZm9yaywKLQkJICogd2lsbCBhbHNvIGluY3JlbWVudCBjb3Byb2MubmpvYnMgd2hlbiB0aGUKLQkJICogam9iIGlzIGFjdHVhbGx5IGNyZWF0ZWQuCi0JCSAqLwotCQlmbGFncyAmPSB+WEVYRUM7Ci0JCWV4Y2hpbGQodC0+bGVmdCwgZmxhZ3MgfCBYQkdORCB8IFhGT1JLIHwgWENPUFJPQyB8IFhDQ0xPU0UsCi0JCSAgICBOVUxMLCBjb3Byb2MucmVhZHcpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFRBU1lOQzoKLQkJLyogWFhYIG5vbi1vcHRpbWFsLCBJIHRoaW5rIC0gIihmb28gJikiLCBmb3JrcyBmb3IgKCksCi0JCSAqIGZvcmtzIGFnYWluIGZvciBhc3luYy4uLiBwYXJlbnQgc2hvdWxkIG9wdGltaXNlCi0JCSAqIHRoaXMgdG8gImZvbyAmIi4uLgotCQkgKi8KLQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIChmbGFncyZ+WEVYRUMpfFhCR05EfFhGT1JLLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVE9SOgotCWNhc2UgVEFORDoKLQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgeGVycm9rKTsKLQkJaWYgKChydiA9PSAwKSA9PSAodC0+dHlwZSA9PSBUQU5EKSkKLQkJCXJ2ID0gZXhlY3V0ZSh0LT5yaWdodCwgWEVSUk9LLCB4ZXJyb2spOwotCQlmbGFncyB8PSBYRVJST0s7Ci0JCWlmICh4ZXJyb2spCi0JCQkqeGVycm9rID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRCQU5HOgotCQlydiA9ICFleGVjdXRlKHQtPnJpZ2h0LCBYRVJST0ssIHhlcnJvayk7Ci0JCWZsYWdzIHw9IFhFUlJPSzsKLQkJaWYgKHhlcnJvaykKLQkJCSp4ZXJyb2sgPSAxOwotCQlicmVhazsKLQotCWNhc2UgVERCUkFDS0VUOiB7Ci0JCVRlc3RfZW52IHRlOwotCi0JCXRlLmZsYWdzID0gVEVGX0RCUkFDS0VUOwotCQl0ZS5wb3Mud3AgPSB0LT5hcmdzOwotCQl0ZS5pc2EgPSBkYnRlc3RlX2lzYTsKLQkJdGUuZ2V0b3BuZCA9IGRidGVzdGVfZ2V0b3BuZDsKLQkJdGUuZXZhbCA9IHRlc3RfZXZhbDsKLQkJdGUuZXJyb3IgPSBkYnRlc3RlX2Vycm9yOwotCi0JCXJ2ID0gdGVzdF9wYXJzZSgmdGUpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFRGT1I6Ci0JY2FzZSBUU0VMRUNUOiB7Ci0JCXZvbGF0aWxlIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotCQlhcCA9ICh0LT52YXJzID09IE5VTEwpID8gZS0+bG9jLT5hcmd2ICsgMSA6Ci0JCSAgICAoY29uc3QgY2hhciAqKilldmFsKChjb25zdCBjaGFyICoqKXQtPnZhcnMsCi0JCSAgICBET0JMQU5LIHwgRE9HTE9CIHwgRE9USUxERSk7Ci0JCWUtPnR5cGUgPSBFX0xPT1A7Ci0JCXdoaWxlICgxKSB7Ci0JCQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOwotCQkJaWYgKCFpKQotCQkJCWJyZWFrOwotCQkJaWYgKChlLT5mbGFncyZFRl9CUktDT05UX1BBU1MpIHx8Ci0JCQkgICAgKGkgIT0gTEJSRUFLICYmIGkgIT0gTENPTlRJTikpIHsKLQkJCQlxdWl0ZW52KE5VTEwpOwotCQkJCXVud2luZChpKTsKLQkJCX0gZWxzZSBpZiAoaSA9PSBMQlJFQUspIHsKLQkJCQlydiA9IDA7Ci0JCQkJZ290byBCcmVhazsKLQkJCX0KLQkJfQotCQlydiA9IDA7IC8qIGluIGNhc2Ugb2YgYSBjb250aW51ZSAqLwotCQlpZiAodC0+dHlwZSA9PSBURk9SKSB7Ci0JCQl3aGlsZSAoKmFwICE9IE5VTEwpIHsKLQkJCQlzZXRzdHIoZ2xvYmFsKHQtPnN0ciksICphcCsrLCBLU0hfVU5XSU5EX0VSUk9SKTsKLQkJCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qIFRTRUxFQ1QgKi8KLQkJCWZvciAoOzspIHsKLQkJCQlpZiAoIShjcCA9IGRvX3NlbGVjdGFyZ3MoYXAsIGlzX2ZpcnN0KSkpIHsKLQkJCQkJcnYgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaXNfZmlyc3QgPSBmYWxzZTsKLQkJCQlzZXRzdHIoZ2xvYmFsKHQtPnN0ciksIGNwLCBLU0hfVU5XSU5EX0VSUk9SKTsKLQkJCQlleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVFdISUxFOgotCWNhc2UgVFVOVElMOgotCQllLT50eXBlID0gRV9MT09QOwotCQl3aGlsZSAoMSkgewotCQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQkJCWlmICghaSkKLQkJCQlicmVhazsKLQkJCWlmICgoZS0+ZmxhZ3MmRUZfQlJLQ09OVF9QQVNTKSB8fAotCQkJICAgIChpICE9IExCUkVBSyAmJiBpICE9IExDT05USU4pKSB7Ci0JCQkJcXVpdGVudihOVUxMKTsKLQkJCQl1bndpbmQoaSk7Ci0JCQl9IGVsc2UgaWYgKGkgPT0gTEJSRUFLKSB7Ci0JCQkJcnYgPSAwOwotCQkJCWdvdG8gQnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcnYgPSAwOyAvKiBpbiBjYXNlIG9mIGEgY29udGludWUgKi8KLQkJd2hpbGUgKChleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgTlVMTCkgPT0gMCkgPT0KLQkJICAgICh0LT50eXBlID09IFRXSElMRSkpCi0JCQlydiA9IGV4ZWN1dGUodC0+cmlnaHQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVElGOgotCWNhc2UgVEVMSUY6Ci0JCWlmICh0LT5yaWdodCA9PSBOVUxMKQotCQkJYnJlYWs7CS8qIHNob3VsZCBiZSBlcnJvciAqLwotCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgWEVSUk9LLCBOVUxMKSA9PSAwID8KLQkJICAgIGV4ZWN1dGUodC0+cmlnaHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spIDoKLQkJICAgIGV4ZWN1dGUodC0+cmlnaHQtPnJpZ2h0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRDQVNFOgotCQljcCA9IGV2YWxzdHIodC0+c3RyLCBET1RJTERFKTsKLQkJZm9yICh0ID0gdC0+bGVmdDsgdCAhPSBOVUxMICYmIHQtPnR5cGUgPT0gVFBBVDsgdCA9IHQtPnJpZ2h0KQotCQkgICAgZm9yIChhcCA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICphcDsgYXArKykKLQkJCWlmICgocyA9IGV2YWxzdHIoKmFwLCBET1RJTERFfERPUEFUKSkgJiYKLQkJCSAgICBnbWF0Y2h4KGNwLCBzLCBmYWxzZSkpCi0JCQkJZ290byBGb3VuZDsKLQkJYnJlYWs7Ci0gRm91bmQ6Ci0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRCUkFDRToKLQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVEZVTkNUOgotCQlydiA9IGRlZmluZSh0LT5zdHIsIHQpOwotCQlicmVhazsKLQotCWNhc2UgVFRJTUU6Ci0JCS8qIENsZWFyIFhFWEVDIHNvIG5lc3RlZCBleGVjdXRlKCkgY2FsbCBkb2Vzbid0IGV4aXQKLQkJICogKGFsbG93cyAibHMgLWwgfCB0aW1lIGdyZXAgZm9vIikuCi0JCSAqLwotCQlydiA9IHRpbWV4KHQsIGZsYWdzICYgflhFWEVDLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVEVYRUM6CQkvKiBhbiBldmFsJ2QgVENPTSAqLwotCQlzID0gdC0+YXJnc1swXTsKLQkJdXAgPSBtYWtlbnYoKTsKLQkJcmVzdG9yZXNpZ3MoKTsKLQkJY2xlYW51cF9wcm9jX2VudigpOwotCQl7Ci0JCQl1bmlvbiBta3NoX2NjcGhhY2sgY2FyZ3M7Ci0KLQkJCWNhcmdzLnJvID0gdC0+YXJnczsKLQkJCWV4ZWN2ZSh0LT5zdHIsIGNhcmdzLnJ3LCB1cCk7Ci0JCQlydiA9IGVycm5vOwotCQl9Ci0JCWlmIChydiA9PSBFTk9FWEVDKQotCQkJc2NyaXB0ZXhlYyh0LCAoY29uc3QgY2hhciAqKil1cCk7Ci0JCWVsc2UKLQkJCWVycm9yZigiJXM6ICVzIiwgcywgc3RyZXJyb3IocnYpKTsKLQl9Ci0gQnJlYWs6Ci0JZXhzdGF0ID0gcnY7Ci0KLQlxdWl0ZW52KE5VTEwpOwkJLyogcmVzdG9yZXMgSU8gKi8KLQlpZiAoKGZsYWdzJlhFWEVDKSkKLQkJdW53aW5kKExFWElUKTsJLyogZXhpdCBjaGlsZCAqLwotCWlmIChydiAhPSAwICYmICEoZmxhZ3MgJiBYRVJST0spICYmCi0JICAgICh4ZXJyb2sgPT0gTlVMTCB8fCAhKnhlcnJvaykpIHsKLQkJdHJhcHNpZyhTSUdFUlJfKTsKLQkJaWYgKEZsYWcoRkVSUkVYSVQpKQotCQkJdW53aW5kKExFUlJPUik7Ci0JfQotCXJldHVybiAocnYpOwotfQotCi0vKgotICogZXhlY3V0ZSBzaW1wbGUgY29tbWFuZAotICovCi0KLXN0YXRpYyBpbnQKLWNvbWV4ZWMoc3RydWN0IG9wICp0LCBzdHJ1Y3QgdGJsICp2b2xhdGlsZSB0cCwgY29uc3QgY2hhciAqKmFwLAotICAgIHZvbGF0aWxlIGludCBmbGFncywgdm9sYXRpbGUgaW50ICp4ZXJyb2spCi17Ci0JaW50IGk7Ci0Jdm9sYXRpbGUgaW50IHJ2ID0gMDsKLQljb25zdCBjaGFyICpjcDsKLQljb25zdCBjaGFyICoqbGFzdHA7Ci0Jc3RhdGljIHN0cnVjdCBvcCB0ZXhlYzsgLyogTXVzdCBiZSBzdGF0aWMgKFhYWCBidXQgd2h5PykgKi8KLQlpbnQgdHlwZV9mbGFnczsKLQlpbnQga2VlcGFzbl9vazsKLQlpbnQgZmNmbGFncyA9IEZDX0JJfEZDX0ZVTkN8RkNfUEFUSDsKLQlib29sIGJvdXJuZV9mdW5jdGlvbl9jYWxsID0gZmFsc2U7Ci0Jc3RydWN0IGJsb2NrICpsX2V4cGFuZCwgKmxfYXNzaWduOwotCi0JLyogc25hZyB0aGUgbGFzdCBhcmd1bWVudCBmb3IgJF8gWFhYIG5vdCB0aGUgc2FtZSBhcyBBVCZUIGtzaCwKLQkgKiB3aGljaCBvbmx5IHNlZW1zIHRvIHNldCAkXyBhZnRlciBhIG5ld2xpbmUgKGJ1dCBub3QgaW4KLQkgKiBmdW5jdGlvbnMvZG90IHNjcmlwdHMsIGJ1dCBpbiBpbnRlcmFjdGl2ZSBhbmQgc2NyaXB0KSAtCi0JICogcGVyaGFwcyBzYXZlIGxhc3QgYXJnIGhlcmUgYW5kIHNldCBpdCBpbiBzaGVsbCgpPy4KLQkgKi8KLQlpZiAoRmxhZyhGVEFMS0lORykgJiYgKihsYXN0cCA9IGFwKSkgewotCQl3aGlsZSAoKisrbGFzdHApCi0JCQk7Ci0JCS8qIHNldHN0cigpIGNhbid0IGZhaWwgaGVyZSAqLwotCQlzZXRzdHIodHlwZXNldCgiXyIsIExPQ0FMLCAwLCBJTlRFR0VSLCAwKSwgKi0tbGFzdHAsCi0JCSAgICBLU0hfUkVUVVJOX0VSUk9SKTsKLQl9Ci0KLQkvKiBEZWFsIHdpdGggdGhlIHNoZWxsIGJ1aWx0aW5zIGJ1aWx0aW4sIGV4ZWMgYW5kIGNvbW1hbmQgc2luY2UKLQkgKiB0aGV5IGNhbiBiZSBmb2xsb3dlZCBieSBvdGhlciBjb21tYW5kcy4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0JICogd2Uga25vdyBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgbG9jYWwgYmxvY2sgd2hpY2ggbXVzdCBiZSBkb25lCi0JICogYmVmb3JlIHdlIGNhbiBkbyBhIHBhdGggc2VhcmNoIChpbiBjYXNlIHRoZSBhc3NpZ25tZW50cyBjaGFuZ2UKLQkgKiBQQVRIKS4KLQkgKiBPZGQgY2FzZXM6Ci0JICoJRk9PPWJhciBleGVjID4vZGV2L251bGwJCUZPTyBpcyBrZXB0IGJ1dCBub3QgZXhwb3J0ZWQKLQkgKglGT089YmFyIGV4ZWMgZm9vYmFyCQlGT08gaXMgZXhwb3J0ZWQKLQkgKglGT089YmFyIGNvbW1hbmQgZXhlYyA+L2Rldi9udWxsCUZPTyBpcyBuZWl0aGVyIGtlcHQgbm9yIGV4cG9ydGVkCi0JICoJRk9PPWJhciBjb21tYW5kCQkJRk9PIGlzIG5laXRoZXIga2VwdCBub3IgZXhwb3J0ZWQKLQkgKglQQVRIPS4uLiBmb29iYXIJCQl1c2UgbmV3IFBBVEggaW4gZm9vYmFyIHNlYXJjaAotCSAqLwotCWtlZXBhc25fb2sgPSAxOwotCXdoaWxlICh0cCAmJiB0cC0+dHlwZSA9PSBDU0hFTEwpIHsKLQkJZmNmbGFncyA9IEZDX0JJfEZDX0ZVTkN8RkNfUEFUSDsvKiB1bmRvIGVmZmVjdHMgb2YgY29tbWFuZCAqLwotCQlpZiAodHAtPnZhbC5mID09IGNfYnVpbHRpbikgewotCQkJaWYgKChjcCA9ICorK2FwKSA9PSBOVUxMKSB7Ci0JCQkJdHAgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHAgPSBmaW5kY29tKGNwLCBGQ19CSSk7Ci0JCQlpZiAodHAgPT0gTlVMTCkKLQkJCQllcnJvcmYoImJ1aWx0aW46ICVzOiBub3QgYSBidWlsdGluIiwgY3ApOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodHAtPnZhbC5mID09IGNfZXhlYykgewotCQkJaWYgKGFwWzFdID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQlhcCsrOwotCQkJZmxhZ3MgfD0gWEVYRUM7Ci0JCX0gZWxzZSBpZiAodHAtPnZhbC5mID09IGNfY29tbWFuZCkgewotCQkJaW50IG9wdGMsIHNhd19wID0gMDsKLQotCQkJLyogVWdseSBkZWFsaW5nIHdpdGggb3B0aW9ucyBpbiB0d28gcGxhY2VzIChoZXJlIGFuZAotCQkJICogaW4gY19jb21tYW5kKCksIGJ1dCBzdWNoIGlzIGxpZmUpCi0JCQkgKi8KLQkJCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCAwKTsKLQkJCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoYXAsICZidWlsdGluX29wdCwgIjpwIikpID09ICdwJykKLQkJCQlzYXdfcCA9IDE7Ci0JCQlpZiAob3B0YyAhPSBFT0YpCi0JCQkJYnJlYWs7CS8qIGNvbW1hbmQgLXZWIG9yIHNvbWV0aGluZyAqLwotCQkJLyogZG9uJ3QgbG9vayBmb3IgZnVuY3Rpb25zICovCi0JCQlmY2ZsYWdzID0gRkNfQkl8RkNfUEFUSDsKLQkJCWlmIChzYXdfcCkgewotCQkJCWlmIChGbGFnKEZSRVNUUklDVEVEKSkgewotCQkJCQl3YXJuaW5nZih0cnVlLAotCQkJCQkgICAgImNvbW1hbmQgLXA6IHJlc3RyaWN0ZWQiKTsKLQkJCQkJcnYgPSAxOwotCQkJCQlnb3RvIExlYXZlOwotCQkJCX0KLQkJCQlmY2ZsYWdzIHw9IEZDX0RFRlBBVEg7Ci0JCQl9Ci0JCQlhcCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0JCQkvKiBQT1NJWCBzYXlzIHNwZWNpYWwgYnVpbHRpbnMgbG9zZSB0aGVpciBzdGF0dXMKLQkJCSAqIGlmIGFjY2Vzc2VkIHVzaW5nIGNvbW1hbmQuCi0JCQkgKi8KLQkJCWtlZXBhc25fb2sgPSAwOwotCQkJaWYgKCFhcFswXSkgewotCQkJCS8qIGVuc3VyZSBjb21tYW5kIHdpdGggbm8gYXJncyBleGl0cyB3aXRoIDAgKi8KLQkJCQlzdWJzdF9leHN0YXQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UKLQkJCWJyZWFrOwotCQl0cCA9IGZpbmRjb20oYXBbMF0sIGZjZmxhZ3MgJiAoRkNfQkl8RkNfRlVOQykpOwotCX0KLQlsX2V4cGFuZCA9IGUtPmxvYzsKLQlpZiAoa2VlcGFzbl9vayAmJiAoIWFwWzBdIHx8ICh0cCAmJiAodHAtPmZsYWcgJiBLRUVQQVNOKSkpKQotCQl0eXBlX2ZsYWdzID0gMDsKLQllbHNlIHsKLQkJLyogY3JlYXRlIG5ldyB2YXJpYWJsZS9mdW5jdGlvbiBibG9jayAqLwotCQluZXdibG9jaygpOwotCQkvKiBrc2ggZnVuY3Rpb25zIGRvbid0IGtlZXAgYXNzaWdubWVudHMsIFBPU0lYIGZ1bmN0aW9ucyBkby4gKi8KLQkJaWYgKGtlZXBhc25fb2sgJiYgdHAgJiYgdHAtPnR5cGUgPT0gQ0ZVTkMgJiYKLQkJICAgICEodHAtPmZsYWcgJiBGS1NIKSkgewotCQkJYm91cm5lX2Z1bmN0aW9uX2NhbGwgPSB0cnVlOwotCQkJdHlwZV9mbGFncyA9IEVYUE9SVDsKLQkJfSBlbHNlCi0JCQl0eXBlX2ZsYWdzID0gTE9DQUx8TE9DQUxfQ09QWXxFWFBPUlQ7Ci0JfQotCWxfYXNzaWduID0gZS0+bG9jOwotCWlmIChGbGFnKEZFWFBPUlQpKQotCQl0eXBlX2ZsYWdzIHw9IEVYUE9SVDsKLQlmb3IgKGkgPSAwOyB0LT52YXJzW2ldOyBpKyspIHsKLQkJLyogZG8gTk9UIGxvb2t1cCBpbiB0aGUgbmV3IHZhci9mbiBibG9jayBqdXN0IGNyZWF0ZWQgKi8KLQkJZS0+bG9jID0gbF9leHBhbmQ7Ci0JCWNwID0gZXZhbHN0cih0LT52YXJzW2ldLCBET0FTTlRJTERFKTsKLQkJZS0+bG9jID0gbF9hc3NpZ247Ci0JCS8qIGJ1dCBhc3NpZ24gaW4gdGhlcmUgYXMgdXN1YWwgKi8KLQotCQlpZiAoRmxhZyhGWFRSQUNFKSkgewotCQkJaWYgKGkgPT0gMCkKLQkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMiLAotCQkJCQlzdWJzdGl0dXRlKHN0cl92YWwoZ2xvYmFsKCJQUzQiKSksIDApKTsKLQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyVjIiwgY3AsCi0JCQkgICAgdC0+dmFyc1tpICsgMV0gPyAnICcgOiAnXG4nKTsKLQkJCWlmICghdC0+dmFyc1tpICsgMV0pCi0JCQkJc2hmX2ZsdXNoKHNobF9vdXQpOwotCQl9Ci0JCXR5cGVzZXQoY3AsIHR5cGVfZmxhZ3MsIDAsIDAsIDApOwotCQlpZiAoYm91cm5lX2Z1bmN0aW9uX2NhbGwgJiYgISh0eXBlX2ZsYWdzICYgRVhQT1JUKSkKLQkJCXR5cGVzZXQoY3AsIExPQ0FMfExPQ0FMX0NPUFl8RVhQT1JULCAwLCAwLCAwKTsKLQl9Ci0KLQlpZiAoKGNwID0gKmFwKSA9PSBOVUxMKSB7Ci0JCXJ2ID0gc3Vic3RfZXhzdGF0OwotCQlnb3RvIExlYXZlOwotCX0gZWxzZSBpZiAoIXRwKSB7Ci0JCWlmIChGbGFnKEZSRVNUUklDVEVEKSAmJiB2c3RyY2hyKGNwLCAnLycpKSB7Ci0JCQl3YXJuaW5nZih0cnVlLCAiJXM6IHJlc3RyaWN0ZWQiLCBjcCk7Ci0JCQlydiA9IDE7Ci0JCQlnb3RvIExlYXZlOwotCQl9Ci0JCXRwID0gZmluZGNvbShjcCwgZmNmbGFncyk7Ci0JfQotCi0Jc3dpdGNoICh0cC0+dHlwZSkgewotCWNhc2UgQ1NIRUxMOgkJCS8qIHNoZWxsIGJ1aWx0LWluICovCi0JCXJ2ID0gY2FsbF9idWlsdGluKHRwLCAoY29uc3QgY2hhciAqKilhcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRlVOQzogewkJCS8qIGZ1bmN0aW9uIGNhbGwgKi8KLQkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBvbGRfeGZsYWc7Ci0JCXZvbGF0aWxlIFRmbGFnIG9sZF9pbnVzZTsKLQkJY29uc3QgY2hhciAqdm9sYXRpbGUgb2xkX2tzaG5hbWU7Ci0KLQkJaWYgKCEodHAtPmZsYWcgJiBJU1NFVCkpIHsKLQkJCXN0cnVjdCB0YmwgKmZ0cDsKLQotCQkJaWYgKCF0cC0+dS5mcGF0aCkgewotCQkJCWlmICh0cC0+dTIuZXJybm9fKSB7Ci0JCQkJCXdhcm5pbmdmKHRydWUsCi0JCQkJCSAgICAiJXM6IGNhbid0IGZpbmQgZnVuY3Rpb24gIgotCQkJCQkgICAgImRlZmluaXRpb24gZmlsZSAtICVzIiwKLQkJCQkJICAgIGNwLCBzdHJlcnJvcih0cC0+dTIuZXJybm9fKSk7Ci0JCQkJCXJ2ID0gMTI2OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdhcm5pbmdmKHRydWUsCi0JCQkJCSAgICAiJXM6IGNhbid0IGZpbmQgZnVuY3Rpb24gIgotCQkJCQkgICAgImRlZmluaXRpb24gZmlsZSIsIGNwKTsKLQkJCQkJcnYgPSAxMjc7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGluY2x1ZGUodHAtPnUuZnBhdGgsIDAsIE5VTEwsIDApIDwgMCkgewotCQkJCXJ2ID0gZXJybm87Ci0JCQkJd2FybmluZ2YodHJ1ZSwKLQkJCQkgICAgIiVzOiBjYW4ndCBvcGVuIGZ1bmN0aW9uIGRlZmluaXRpb24gZmlsZSAlcyAtICVzIiwKLQkJCQkgICAgY3AsIHRwLT51LmZwYXRoLCBzdHJlcnJvcihydikpOwotCQkJCXJ2ID0gMTI3OwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCEoZnRwID0gZmluZGZ1bmMoY3AsIGhhc2goY3ApLCBmYWxzZSkpIHx8Ci0JCQkgICAgIShmdHAtPmZsYWcgJiBJU1NFVCkpIHsKLQkJCQl3YXJuaW5nZih0cnVlLAotCQkJCSAgICAiJXM6IGZ1bmN0aW9uIG5vdCBkZWZpbmVkIGJ5ICVzIiwKLQkJCQkgICAgY3AsIHRwLT51LmZwYXRoKTsKLQkJCQlydiA9IDEyNzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRwID0gZnRwOwotCQl9Ci0KLQkJLyoga3NoIGZ1bmN0aW9ucyBzZXQgJDAgdG8gZnVuY3Rpb24gbmFtZSwgUE9TSVggZnVuY3Rpb25zIGxlYXZlCi0JCSAqICQwIHVuY2hhbmdlZC4KLQkJICovCi0JCW9sZF9rc2huYW1lID0ga3NobmFtZTsKLQkJaWYgKHRwLT5mbGFnICYgRktTSCkKLQkJCWtzaG5hbWUgPSBhcFswXTsKLQkJZWxzZQotCQkJYXBbMF0gPSBrc2huYW1lOwotCQllLT5sb2MtPmFyZ3YgPSBhcDsKLQkJZm9yIChpID0gMDsgKmFwKysgIT0gTlVMTDsgaSsrKQotCQkJOwotCQllLT5sb2MtPmFyZ2MgPSBpIC0gMTsKLQkJLyoga3NoLXN0eWxlIGZ1bmN0aW9ucyBoYW5kbGUgZ2V0b3B0cyBzYW5lbHksCi0JCSAqIEJvdXJuZS9QT1NJWCBmdW5jdGlvbnMgYXJlIGluc2FuZS4uLgotCQkgKi8KLQkJaWYgKHRwLT5mbGFnICYgRktTSCkgewotCQkJZS0+bG9jLT5mbGFncyB8PSBCRl9ET0dFVE9QVFM7Ci0JCQllLT5sb2MtPmdldG9wdHNfc3RhdGUgPSB1c2VyX29wdDsKLQkJCWdldG9wdHNfcmVzZXQoMSk7Ci0JCX0KLQotCQlvbGRfeGZsYWcgPSBGbGFnKEZYVFJBQ0UpOwotCQlGbGFnKEZYVFJBQ0UpID0gdHAtPmZsYWcgJiBUUkFDRSA/IDEgOiAwOwotCi0JCW9sZF9pbnVzZSA9IHRwLT5mbGFnICYgRklOVVNFOwotCQl0cC0+ZmxhZyB8PSBGSU5VU0U7Ci0KLQkJZS0+dHlwZSA9IEVfRlVOQzsKLQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQkJaWYgKGkgPT0gMCkgewotCQkJLyogc2VlbXMgb2RkIHRvIHBhc3MgWEVSUk9LIGhlcmUsIGJ1dCBBVCZUIGtzaCBkb2VzICovCi0JCQlleHN0YXQgPSBleGVjdXRlKHRwLT52YWwudCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7Ci0JCQlpID0gTFJFVFVSTjsKLQkJfQotCQlrc2huYW1lID0gb2xkX2tzaG5hbWU7Ci0JCUZsYWcoRlhUUkFDRSkgPSBvbGRfeGZsYWc7Ci0JCXRwLT5mbGFnID0gKHRwLT5mbGFnICYgfkZJTlVTRSkgfCBvbGRfaW51c2U7Ci0JCS8qIFdlcmUgd2UgZGVsZXRlZCB3aGlsZSBleGVjdXRpbmc/IElmIHNvLCBmcmVlIHRoZSBleGVjdXRpb24KLQkJICogdHJlZS4gdG9kbzogVW5mb3J0dW5hdGVseSwgdGhlIHRhYmxlIGVudHJ5IGlzIG5ldmVyIHJlLXVzZWQKLQkJICogdW50aWwgdGhlIGxvb2t1cCB0YWJsZSBpcyBleHBhbmRlZC4KLQkJICovCi0JCWlmICgodHAtPmZsYWcgJiAoRkRFTEVURXxGSU5VU0UpKSA9PSBGREVMRVRFKSB7Ci0JCQlpZiAodHAtPmZsYWcgJiBBTExPQykgewotCQkJCXRwLT5mbGFnICY9IH5BTExPQzsKLQkJCQl0ZnJlZSh0cC0+dmFsLnQsIHRwLT5hcmVhcCk7Ci0JCQl9Ci0JCQl0cC0+ZmxhZyA9IDA7Ci0JCX0KLQkJc3dpdGNoIChpKSB7Ci0JCWNhc2UgTFJFVFVSTjoKLQkJY2FzZSBMRVJST1I6Ci0JCQlydiA9IGV4c3RhdDsKLQkJCWJyZWFrOwotCQljYXNlIExJTlRSOgotCQljYXNlIExFWElUOgotCQljYXNlIExMRUFWRToKLQkJY2FzZSBMU0hFTEw6Ci0JCQlxdWl0ZW52KE5VTEwpOwotCQkJdW53aW5kKGkpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQlkZWZhdWx0OgotCQkJcXVpdGVudihOVUxMKTsKLQkJCWludGVybmFsX2Vycm9yZigiQ0ZVTkMgJWQiLCBpKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIENFWEVDOgkJLyogZXhlY3V0YWJsZSBjb21tYW5kICovCi0JY2FzZSBDVEFMSUFTOgkJLyogdHJhY2tlZCBhbGlhcyAqLwotCQlpZiAoISh0cC0+ZmxhZyZJU1NFVCkpIHsKLQkJCS8qIGVycm5vXyB3aWxsIGJlIHNldCBpZiB0aGUgbmFtZWQgY29tbWFuZCB3YXMgZm91bmQKLQkJCSAqIGJ1dCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgKHBlcm1pc3Npb25zLCBubyBleGVjdXRlCi0JCQkgKiBiaXQsIGRpcmVjdG9yeSwgZXRjKS4gUHJpbnQgb3V0IGEgKGhvcGVmdWxseSkKLQkJCSAqIHVzZWZ1bCBlcnJvciBtZXNzYWdlIGFuZCBzZXQgdGhlIGV4aXQgc3RhdHVzIHRvIDEyNi4KLQkJCSAqLwotCQkJaWYgKHRwLT51Mi5lcnJub18pIHsKLQkJCQl3YXJuaW5nZih0cnVlLCAiJXM6IGNhbm5vdCBleGVjdXRlIC0gJXMiLCBjcCwKLQkJCQkgICAgc3RyZXJyb3IodHAtPnUyLmVycm5vXykpOwotCQkJCXJ2ID0gMTI2OwkvKiBQT1NJWCAqLwotCQkJfSBlbHNlIHsKLQkJCQl3YXJuaW5nZih0cnVlLCAiJXM6IG5vdCBmb3VuZCIsIGNwKTsKLQkJCQlydiA9IDEyNzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogc2V0ICRfIHRvIHByb2dyYW1tZSdzIGZ1bGwgcGF0aCAqLwotCQkvKiBzZXRzdHIoKSBjYW4ndCBmYWlsIGhlcmUgKi8KLQkJc2V0c3RyKHR5cGVzZXQoIl8iLCBMT0NBTHxFWFBPUlQsIDAsIElOVEVHRVIsIDApLAotCQkgICAgdHAtPnZhbC5zLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQotCQlpZiAoZmxhZ3MmWEVYRUMpIHsKLQkJCWpfZXhpdCgpOwotCQkJaWYgKCEoZmxhZ3MmWEJHTkQpCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQkJICAgIHx8IEZsYWcoRk1PTklUT1IpCi0jZW5kaWYKLQkJCSAgICApIHsKLQkJCQlzZXRleGVjc2lnKCZzaWd0cmFwc1tTSUdJTlRdLCBTU19SRVNUT1JFX09SSUcpOwotCQkJCXNldGV4ZWNzaWcoJnNpZ3RyYXBzW1NJR1FVSVRdLCBTU19SRVNUT1JFX09SSUcpOwotCQkJfQotCQl9Ci0KLQkJLyogdG8gZm9yayB3ZSBzZXQgdXAgYSBURVhFQyBub2RlIGFuZCBjYWxsIGV4ZWN1dGUgKi8KLQkJdGV4ZWMudHlwZSA9IFRFWEVDOwotCQl0ZXhlYy5sZWZ0ID0gdDsJLyogZm9yIHRwcmludCAqLwotCQl0ZXhlYy5zdHIgPSB0cC0+dmFsLnM7Ci0JCXRleGVjLmFyZ3MgPSBhcDsKLQkJcnYgPSBleGNoaWxkKCZ0ZXhlYywgZmxhZ3MsIHhlcnJvaywgLTEpOwotCQlicmVhazsKLQl9Ci0gTGVhdmU6Ci0JaWYgKGZsYWdzICYgWEVYRUMpIHsKLQkJZXhzdGF0ID0gcnY7Ci0JCXVud2luZChMTEVBVkUpOwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotc3RhdGljIHZvaWQKLXNjcmlwdGV4ZWMoc3RydWN0IG9wICp0cCwgY29uc3QgY2hhciAqKmFwKQotewotCWNvbnN0IGNoYXIgKnNoOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JdW5zaWduZWQgY2hhciAqY3A7Ci0JY2hhciBidWZbNjRdOwkJLyogNjQgPT0gTUFYSU5URVJQIGluIE1pckJTRCA8c3lzL3BhcmFtLmg+ICovCi0JaW50IGZkOwotI2VuZGlmCi0JdW5pb24gbWtzaF9jY3BoYWNrIGFyZ3MsIGNhcDsKLQotCXNoID0gc3RyX3ZhbChnbG9iYWwoIkVYRUNTSEVMTCIpKTsKLQlpZiAoc2ggJiYgKnNoKQotCQlzaCA9IHNlYXJjaChzaCwgcGF0aCwgWF9PSywgTlVMTCk7Ci0JaWYgKCFzaCB8fCAhKnNoKQotCQlzaCA9IE1LU0hfREVGQVVMVF9FWEVDU0hFTEw7Ci0KLQkqdHAtPmFyZ3MtLSA9IHRwLT5zdHI7Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCWlmICgoZmQgPSBvcGVuKHRwLT5zdHIsIE9fUkRPTkxZKSkgPj0gMCkgewotCQkvKiByZWFkIGZpcnN0IE1BWElOVEVSUCBvY3RldHMgZnJvbSBmaWxlICovCi0JCWlmIChyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA8PSAwKQotCQkJLyogcmVhZCBlcnJvciAtPiBubyBnb29kICovCi0JCQlidWZbMF0gPSAnXDAnOwotCQljbG9zZShmZCk7Ci0JCS8qIHNjYW4gZm9yIG5ld2xpbmUgKG9yIENSKSBvciBOVUwgX2JlZm9yZV8gZW5kIG9mIGJ1ZmZlciAqLwotCQljcCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOwotCQl3aGlsZSAoKGNoYXIgKiljcCA8IChidWYgKyBzaXplb2YoYnVmKSkpCi0JCQlpZiAoKmNwID09ICdcMCcgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICdccicpIHsKLQkJCQkqY3AgPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlCi0JCQkJKytjcDsKLQkJLyogaWYgdGhlIHNoZWJhbmcgbGluZSBpcyBsb25nZXIgdGhhbiBNQVhJTlRFUlAsIGJhaWwgb3V0ICovCi0JCWlmICgoY2hhciAqKWNwID49IChidWYgKyBzaXplb2YoYnVmKSkpCi0JCQlnb3RvIG5vc2hlYmFuZzsKLQkJLyogc2tpcCBVVEYtOCBCeXRlIE9yZGVyIE1hcmssIGlmIHByZXNlbnQgKi8KLQkJY3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKLQkJaWYgKChjcFswXSA9PSAweEVGKSAmJiAoY3BbMV0gPT0gMHhCQikgJiYgKGNwWzJdID09IDB4QkYpKQotCQkJY3AgKz0gMzsKLQkJLyogYmFpbCBvdXQgaWYgcmVhZCBlcnJvciAoYWJvdmUpIG9yIG5vIHNoZWJhbmcgKi8KLQkJaWYgKChjcFswXSAhPSAnIycpIHx8IChjcFsxXSAhPSAnIScpKQotCQkJZ290byBub3NoZWJhbmc7Ci0JCWNwICs9IDI7Ci0JCS8qIHNraXAgd2hpdGVzcGFjZSBiZWZvcmUgc2hlbGwgbmFtZSAqLwotCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKLQkJCSsrY3A7Ci0JCS8qIGp1c3Qgd2hpdGVzcGFjZSBvbiB0aGUgbGluZT8gKi8KLQkJaWYgKCpjcCA9PSAnXDAnKQotCQkJZ290byBub3NoZWJhbmc7Ci0JCS8qIG5vLCB3ZSBhY3R1YWxseSBmb3VuZCBhbiBpbnRlcnByZXRlciBuYW1lICovCi0JCXNoID0gKGNoYXIgKiljcDsKLQkJLyogbG9vayBmb3IgZW5kIG9mIHNoZWxsL2ludGVycHJldGVyIG5hbWUgKi8KLQkJd2hpbGUgKCpjcCAhPSAnICcgJiYgKmNwICE9ICdcdCcgJiYgKmNwICE9ICdcMCcpCi0JCQkrK2NwOwotCQkvKiBhbnkgYXJndW1lbnRzPyAqLwotCQlpZiAoKmNwKSB7Ci0JCQkqY3ArKyA9ICdcMCc7Ci0JCQkvKiBza2lwIHNwYWNlcyBiZWZvcmUgYXJndW1lbnRzICovCi0JCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKLQkJCQkrK2NwOwotCQkJLyogcGFzcyBpdCBhbGwgaW4gT05FIGFyZ3VtZW50IChoaXN0b3JpYyByZWFzb25zKSAqLwotCQkJaWYgKCpjcCkKLQkJCQkqdHAtPmFyZ3MtLSA9IChjaGFyICopY3A7Ci0JCX0KLSBub3NoZWJhbmc6Ci0JCWZkID0gYnVmWzBdIDw8IDggfCBidWZbMV07Ci0JCWlmICgoZmQgPT0gLyogT01BR0lDICovIDA0MDcpIHx8Ci0JCSAgICAoZmQgPT0gLyogTk1BR0lDICovIDA0MTApIHx8Ci0JCSAgICAoZmQgPT0gLyogWk1BR0lDICovIDA0MTMpIHx8Ci0JCSAgICAoZmQgPT0gLyogUU1BR0lDICovIDAzMTQpIHx8Ci0JCSAgICAoZmQgPT0gLyogRUNPRkZfSTM4NiAqLyAweDRDMDEpIHx8Ci0JCSAgICAoZmQgPT0gLyogRUNPRkZfTTY4SyAqLyAweDAxNTAgfHwgZmQgPT0gMHg1MDAxKSB8fAotCQkgICAgKGZkID09IC8qIEVDT0ZGX1NIICovICAgMHgwNTAwIHx8IGZkID09IDB4MDAwNSkgfHwKLQkJICAgIChmZCA9PSAweDdGNDUgJiYgYnVmWzJdID09ICdMJyAmJiBidWZbM10gPT0gJ0YnKSB8fAotCQkgICAgKGZkID09IC8qICJNWiIgKi8gMHg0RDVBKSB8fAotCQkgICAgKGZkID09IC8qIGd6aXAgKi8gMHgxRjhCKSkKLQkJCWVycm9yZigiJXM6IG5vdCBleGVjdXRhYmxlOiBtYWdpYyAlMDRYIiwgdHAtPnN0ciwgZmQpOwotCX0KLSNlbmRpZgotCWFyZ3Mucm8gPSB0cC0+YXJnczsKLQkqYXJncy5ybyA9IHNoOwotCi0JY2FwLnJvID0gYXA7Ci0JZXhlY3ZlKGFyZ3MucndbMF0sIGFyZ3MucncsIGNhcC5ydyk7Ci0KLQkvKiByZXBvcnQgYm90aCB0aGUgcHJvZ3JhbW1lIHRoYXQgd2FzIHJ1biBhbmQgdGhlIGJvZ3VzIGludGVycHJldGVyICovCi0JZXJyb3JmKCIlczogJXM6ICVzIiwgdHAtPnN0ciwgc2gsIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLWludAotc2hjb21leGVjKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3QgdGJsICp0cDsKLQotCXRwID0ga3RzZWFyY2goJmJ1aWx0aW5zLCAqd3AsIGhhc2goKndwKSk7Ci0JaWYgKHRwID09IE5VTEwpCi0JCWludGVybmFsX2Vycm9yZigic2hjb21leGVjOiAlcyIsICp3cCk7Ci0JcmV0dXJuIChjYWxsX2J1aWx0aW4odHAsIHdwKSk7Ci19Ci0KLS8qCi0gKiBTZWFyY2ggZnVuY3Rpb24gdGFibGVzIGZvciBhIGZ1bmN0aW9uLiBJZiBjcmVhdGUgc2V0LCBhIHRhYmxlIGVudHJ5Ci0gKiBpcyBjcmVhdGVkIGlmIG5vbmUgaXMgZm91bmQuCi0gKi8KLXN0cnVjdCB0YmwgKgotZmluZGZ1bmMoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgaCwgYm9vbCBjcmVhdGUpCi17Ci0Jc3RydWN0IGJsb2NrICpsOwotCXN0cnVjdCB0YmwgKnRwID0gTlVMTDsKLQotCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKLQkJdHAgPSBrdHNlYXJjaCgmbC0+ZnVucywgbmFtZSwgaCk7Ci0JCWlmICh0cCkKLQkJCWJyZWFrOwotCQlpZiAoIWwtPm5leHQgJiYgY3JlYXRlKSB7Ci0JCQl0cCA9IGt0ZW50ZXIoJmwtPmZ1bnMsIG5hbWUsIGgpOwotCQkJdHAtPmZsYWcgPSBERUZJTkVEOwotCQkJdHAtPnR5cGUgPSBDRlVOQzsKLQkJCXRwLT52YWwudCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKHRwKTsKLX0KLQotLyoKLSAqIGRlZmluZSBmdW5jdGlvbi4gUmV0dXJucyAxIGlmIGZ1bmN0aW9uIGlzIGJlaW5nIHVuZGVmaW5lZCAodCA9PSAwKSBhbmQKLSAqIGZ1bmN0aW9uIGRpZCBub3QgZXhpc3QsIHJldHVybnMgMCBvdGhlcndpc2UuCi0gKi8KLWludAotZGVmaW5lKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcCAqdCkKLXsKLQlzdHJ1Y3QgdGJsICp0cDsKLQlib29sIHdhc19zZXQgPSBmYWxzZTsKLQotCXdoaWxlICgxKSB7Ci0JCXRwID0gZmluZGZ1bmMobmFtZSwgaGFzaChuYW1lKSwgdHJ1ZSk7Ci0KLQkJaWYgKHRwLT5mbGFnICYgSVNTRVQpCi0JCQl3YXNfc2V0ID0gdHJ1ZTsKLQkJLyogSWYgdGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQsIHdlIHphcCB0aGlzCi0JCSAqIHRhYmxlIGVudHJ5IHNvIGZpbmRmdW5jKCkgd29uJ3Qgc2VlIGl0Ci0JCSAqLwotCQlpZiAodHAtPmZsYWcgJiBGSU5VU0UpIHsKLQkJCXRwLT5uYW1lWzBdID0gJ1wwJzsKLQkJCXRwLT5mbGFnICY9IH5ERUZJTkVEOyAvKiBlbnN1cmUgaXQgd29uJ3QgYmUgZm91bmQgKi8KLQkJCXRwLT5mbGFnIHw9IEZERUxFVEU7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRwLT5mbGFnICYgQUxMT0MpIHsKLQkJdHAtPmZsYWcgJj0gfihJU1NFVHxBTExPQyk7Ci0JCXRmcmVlKHRwLT52YWwudCwgdHAtPmFyZWFwKTsKLQl9Ci0KLQlpZiAodCA9PSBOVUxMKSB7CQkvKiB1bmRlZmluZSAqLwotCQlrdGRlbGV0ZSh0cCk7Ci0JCXJldHVybiAod2FzX3NldCA/IDAgOiAxKTsKLQl9Ci0KLQl0cC0+dmFsLnQgPSB0Y29weSh0LT5sZWZ0LCB0cC0+YXJlYXApOwotCXRwLT5mbGFnIHw9IChJU1NFVHxBTExPQyk7Ci0JaWYgKHQtPnUua3NoX2Z1bmMpCi0JCXRwLT5mbGFnIHw9IEZLU0g7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogYWRkIGJ1aWx0aW4KLSAqLwotdm9pZAotYnVpbHRpbihjb25zdCBjaGFyICpuYW1lLCBpbnQgKCpmdW5jKSAoY29uc3QgY2hhciAqKikpCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0JVGZsYWcgZmxhZzsKLQotCS8qIHNlZSBpZiBhbnkgZmxhZ3Mgc2hvdWxkIGJlIHNldCBmb3IgdGhpcyBidWlsdGluICovCi0JZm9yIChmbGFnID0gMDsgOyBuYW1lKyspIHsKLQkJaWYgKCpuYW1lID09ICc9JykJLyogY29tbWFuZCBkb2VzIHZhcmlhYmxlIGFzc2lnbm1lbnQgKi8KLQkJCWZsYWcgfD0gS0VFUEFTTjsKLQkJZWxzZSBpZiAoKm5hbWUgPT0gJyonKQkvKiBQT1NJWCBzcGVjaWFsIGJ1aWx0aW4gKi8KLQkJCWZsYWcgfD0gU1BFQ19CSTsKLQkJZWxzZSBpZiAoKm5hbWUgPT0gJysnKQkvKiBQT1NJWCByZWd1bGFyIGJ1aWx0aW4gKi8KLQkJCWZsYWcgfD0gUkVHX0JJOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQl0cCA9IGt0ZW50ZXIoJmJ1aWx0aW5zLCBuYW1lLCBoYXNoKG5hbWUpKTsKLQl0cC0+ZmxhZyA9IERFRklORUQgfCBmbGFnOwotCXRwLT50eXBlID0gQ1NIRUxMOwotCXRwLT52YWwuZiA9IGZ1bmM7Ci19Ci0KLS8qCi0gKiBmaW5kIGNvbW1hbmQKLSAqIGVpdGhlciBmdW5jdGlvbiwgaGFzaGVkIGNvbW1hbmQsIG9yIGJ1aWx0LWluIChpbiB0aGF0IG9yZGVyKQotICovCi1zdHJ1Y3QgdGJsICoKLWZpbmRjb20oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQotewotCXN0YXRpYyBzdHJ1Y3QgdGJsIHRlbXA7Ci0JdWludDMyX3QgaCA9IGhhc2gobmFtZSk7Ci0Jc3RydWN0IHRibCAqdHAgPSBOVUxMLCAqdGJpOwotCXVuc2lnbmVkIGNoYXIgaW5zZXJ0ID0gRmxhZyhGVFJBQ0tBTEwpOwkvKiBpbnNlcnQgaWYgbm90IGZvdW5kICovCi0JY2hhciAqZnBhdGg7CQkJLyogZm9yIGZ1bmN0aW9uIGF1dG9sb2FkaW5nICovCi0JdW5pb24gbWtzaF9jY2hhY2sgbnBhdGg7Ci0KLQlpZiAodnN0cmNocihuYW1lLCAnLycpKSB7Ci0JCWluc2VydCA9IDA7Ci0JCS8qIHByZXZlbnQgRlBBVEggc2VhcmNoIGJlbG93ICovCi0JCWZsYWdzICY9IH5GQ19GVU5DOwotCQlnb3RvIFNlYXJjaDsKLQl9Ci0JdGJpID0gKGZsYWdzICYgRkNfQkkpID8ga3RzZWFyY2goJmJ1aWx0aW5zLCBuYW1lLCBoKSA6IE5VTEw7Ci0JLyogUE9TSVggc2F5cyBzcGVjaWFsIGJ1aWx0aW5zIGZpcnN0LCB0aGVuIGZ1bmN0aW9ucywgdGhlbgotCSAqIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbnMsIHRoZW4gc2VhcmNoIHBhdGguLi4KLQkgKi8KLQlpZiAoKGZsYWdzICYgRkNfU1BFQ0JJKSAmJiB0YmkgJiYgKHRiaS0+ZmxhZyAmIFNQRUNfQkkpKQotCQl0cCA9IHRiaTsKLQlpZiAoIXRwICYmIChmbGFncyAmIEZDX0ZVTkMpKSB7Ci0JCXRwID0gZmluZGZ1bmMobmFtZSwgaCwgZmFsc2UpOwotCQlpZiAodHAgJiYgISh0cC0+ZmxhZyAmIElTU0VUKSkgewotCQkJaWYgKChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgPT0gbnVsbCkgewotCQkJCXRwLT51LmZwYXRoID0gTlVMTDsKLQkJCQl0cC0+dTIuZXJybm9fID0gMDsKLQkJCX0gZWxzZQotCQkJCXRwLT51LmZwYXRoID0gc2VhcmNoKG5hbWUsIGZwYXRoLCBSX09LLAotCQkJCSAgICAmdHAtPnUyLmVycm5vXyk7Ci0JCX0KLQl9Ci0JaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19SRUdCSSkgJiYgdGJpICYmICh0YmktPmZsYWcgJiBSRUdfQkkpKQotCQl0cCA9IHRiaTsKLQlpZiAoIXRwICYmIChmbGFncyAmIEZDX1VOUkVHQkkpICYmIHRiaSkKLQkJdHAgPSB0Ymk7Ci0JaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19QQVRIKSAmJiAhKGZsYWdzICYgRkNfREVGUEFUSCkpIHsKLQkJdHAgPSBrdHNlYXJjaCgmdGFsaWFzZXMsIG5hbWUsIGgpOwotCQlpZiAodHAgJiYgKHRwLT5mbGFnICYgSVNTRVQpICYmIGFjY2Vzcyh0cC0+dmFsLnMsIFhfT0spICE9IDApIHsKLQkJCWlmICh0cC0+ZmxhZyAmIEFMTE9DKSB7Ci0JCQkJdHAtPmZsYWcgJj0gfkFMTE9DOwotCQkJCWFmcmVlKHRwLT52YWwucywgQVBFUk0pOwotCQkJfQotCQkJdHAtPmZsYWcgJj0gfklTU0VUOwotCQl9Ci0JfQotCi0gU2VhcmNoOgotCWlmICgoIXRwIHx8ICh0cC0+dHlwZSA9PSBDVEFMSUFTICYmICEodHAtPmZsYWcmSVNTRVQpKSkgJiYKLQkgICAgKGZsYWdzICYgRkNfUEFUSCkpIHsKLQkJaWYgKCF0cCkgewotCQkJaWYgKGluc2VydCAmJiAhKGZsYWdzICYgRkNfREVGUEFUSCkpIHsKLQkJCQl0cCA9IGt0ZW50ZXIoJnRhbGlhc2VzLCBuYW1lLCBoKTsKLQkJCQl0cC0+dHlwZSA9IENUQUxJQVM7Ci0JCQl9IGVsc2UgewotCQkJCXRwID0gJnRlbXA7Ci0JCQkJdHAtPnR5cGUgPSBDRVhFQzsKLQkJCX0KLQkJCXRwLT5mbGFnID0gREVGSU5FRDsJLyogbWFrZSB+SVNTRVQgKi8KLQkJfQotCQlucGF0aC5ybyA9IHNlYXJjaChuYW1lLCBmbGFncyAmIEZDX0RFRlBBVEggPyBkZWZfcGF0aCA6IHBhdGgsCi0JCSAgICBYX09LLCAmdHAtPnUyLmVycm5vXyk7Ci0JCWlmIChucGF0aC5ybykgewotCQkJc3RyZHVweCh0cC0+dmFsLnMsIG5wYXRoLnJvLCBBUEVSTSk7Ci0JCQlpZiAobnBhdGgucm8gIT0gbmFtZSkKLQkJCQlhZnJlZShucGF0aC5ydywgQVRFTVApOwotCQkJdHAtPmZsYWcgfD0gSVNTRVR8QUxMT0M7Ci0JCX0gZWxzZSBpZiAoKGZsYWdzICYgRkNfRlVOQykgJiYKLQkJICAgIChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgIT0gbnVsbCAmJgotCQkgICAgKG5wYXRoLnJvID0gc2VhcmNoKG5hbWUsIGZwYXRoLCBSX09LLAotCQkgICAgJnRwLT51Mi5lcnJub18pKSAhPSBOVUxMKSB7Ci0JCQkvKiBBbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSBvZiBBVCZUIGtzaCBpcyB0aGF0IGl0Ci0JCQkgKiBzZWFyY2hlcyBGUEFUSCBpZiBhIGNvbW1hbmQgaXMgbm90IGZvdW5kLCBldmVuCi0JCQkgKiBpZiB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiBzZXQgdXAgYXMgYW4gYXV0b2xvYWRlZAotCQkJICogZnVuY3Rpb24gKGllLCBubyB0eXBlc2V0IC11ZikuCi0JCQkgKi8KLQkJCXRwID0gJnRlbXA7Ci0JCQl0cC0+dHlwZSA9IENGVU5DOwotCQkJdHAtPmZsYWcgPSBERUZJTkVEOyAvKiBtYWtlIH5JU1NFVCAqLwotCQkJdHAtPnUuZnBhdGggPSBucGF0aC5ybzsKLQkJfQotCX0KLQlyZXR1cm4gKHRwKTsKLX0KLQotLyoKLSAqIGZsdXNoIGV4ZWN1dGFibGUgY29tbWFuZHMgd2l0aCByZWxhdGl2ZSBwYXRocwotICovCi12b2lkCi1mbHVzaGNvbShpbnQgYWxsKQkvKiBqdXN0IHJlbGF0aXZlIG9yIGFsbCAqLwotewotCXN0cnVjdCB0YmwgKnRwOwotCXN0cnVjdCB0c3RhdGUgdHM7Ci0KLQlmb3IgKGt0d2FsaygmdHMsICZ0YWxpYXNlcyk7ICh0cCA9IGt0bmV4dCgmdHMpKSAhPSBOVUxMOyApCi0JCWlmICgodHAtPmZsYWcmSVNTRVQpICYmIChhbGwgfHwgdHAtPnZhbC5zWzBdICE9ICcvJykpIHsKLQkJCWlmICh0cC0+ZmxhZyZBTExPQykgewotCQkJCXRwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOwotCQkJCWFmcmVlKHRwLT52YWwucywgQVBFUk0pOwotCQkJfQotCQkJdHAtPmZsYWcgJj0gfklTU0VUOwotCQl9Ci19Ci0KLS8qIENoZWNrIGlmIHBhdGggaXMgc29tZXRoaW5nIHdlIHdhbnQgdG8gZmluZC4gUmV0dXJucyAtMSBmb3IgZmFpbHVyZS4gKi8KLWludAotc2VhcmNoX2FjY2Vzcyhjb25zdCBjaGFyICpscGF0aCwgaW50IG1vZGUsCi0gICAgaW50ICplcnJub3ApCS8qIHNldCBpZiBjYW5kaWRhdGUgZm91bmQsIGJ1dCBub3Qgc3VpdGFibGUgKi8KLXsKLQlpbnQgcmV0LCBlcnIgPSAwOwotCXN0cnVjdCBzdGF0IHN0YXRiOwotCi0JaWYgKHN0YXQobHBhdGgsICZzdGF0YikgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlyZXQgPSBhY2Nlc3MobHBhdGgsIG1vZGUpOwotCWlmIChyZXQgPCAwKQotCQllcnIgPSBlcnJubzsgLyogRmlsZSBleGlzdHMsIGJ1dCB3ZSBjYW4ndCBhY2Nlc3MgaXQgKi8KLQllbHNlIGlmIChtb2RlID09IFhfT0sgJiYgKCFTX0lTUkVHKHN0YXRiLnN0X21vZGUpIHx8Ci0JICAgICEoc3RhdGIuc3RfbW9kZSAmIChTX0lYVVNSfFNfSVhHUlB8U19JWE9USCkpKSkgewotCQkvKiBUaGlzICdjYXVzZSBhY2Nlc3MoKSBzYXlzIHJvb3QgY2FuIGV4ZWN1dGUgZXZlcnl0aGluZyAqLwotCQlyZXQgPSAtMTsKLQkJZXJyID0gU19JU0RJUihzdGF0Yi5zdF9tb2RlKSA/IEVJU0RJUiA6IEVBQ0NFUzsKLQl9Ci0JaWYgKGVyciAmJiBlcnJub3AgJiYgISplcnJub3ApCi0JCSplcnJub3AgPSBlcnI7Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKgotICogc2VhcmNoIGZvciBjb21tYW5kIHdpdGggUEFUSAotICovCi1jb25zdCBjaGFyICoKLXNlYXJjaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpscGF0aCwKLSAgICBpbnQgbW9kZSwJCS8qIFJfT0sgb3IgWF9PSyAqLwotICAgIGludCAqZXJybm9wKQkvKiBzZXQgaWYgY2FuZGlkYXRlIGZvdW5kLCBidXQgbm90IHN1aXRhYmxlICovCi17Ci0JY29uc3QgY2hhciAqc3AsICpwOwotCWNoYXIgKnhwOwotCVhTdHJpbmcgeHM7Ci0JaW50IG5hbWVsZW47Ci0KLQlpZiAoZXJybm9wKQotCQkqZXJybm9wID0gMDsKLQlpZiAodnN0cmNocihuYW1lLCAnLycpKSB7Ci0JCWlmIChzZWFyY2hfYWNjZXNzKG5hbWUsIG1vZGUsIGVycm5vcCkgPT0gMCkKLQkJCXJldHVybiAobmFtZSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JbmFtZWxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0JWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKLQotCXNwID0gbHBhdGg7Ci0Jd2hpbGUgKHNwICE9IE5VTEwpIHsKLQkJeHAgPSBYc3RyaW5nKHhzLCB4cCk7Ci0JCWlmICghKHAgPSBjc3RyY2hyKHNwLCAnOicpKSkKLQkJCXAgPSBzcCArIHN0cmxlbihzcCk7Ci0JCWlmIChwICE9IHNwKSB7Ci0JCQlYY2hlY2tOKHhzLCB4cCwgcCAtIHNwKTsKLQkJCW1lbWNweSh4cCwgc3AsIHAgLSBzcCk7Ci0JCQl4cCArPSBwIC0gc3A7Ci0JCQkqeHArKyA9ICcvJzsKLQkJfQotCQlzcCA9IHA7Ci0JCVhjaGVja04oeHMsIHhwLCBuYW1lbGVuKTsKLQkJbWVtY3B5KHhwLCBuYW1lLCBuYW1lbGVuKTsKLQkJaWYgKHNlYXJjaF9hY2Nlc3MoWHN0cmluZyh4cywgeHApLCBtb2RlLCBlcnJub3ApID09IDApCi0JCQlyZXR1cm4gKFhjbG9zZSh4cywgeHAgKyBuYW1lbGVuKSk7Ci0JCWlmICgqc3ArKyA9PSAnXDAnKQotCQkJc3AgPSBOVUxMOwotCX0KLQlYZnJlZSh4cywgeHApOwotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNhbGxfYnVpbHRpbihzdHJ1Y3QgdGJsICp0cCwgY29uc3QgY2hhciAqKndwKQotewotCWludCBydjsKLQotCWJ1aWx0aW5fYXJndjAgPSB3cFswXTsKLQlidWlsdGluX2ZsYWcgPSB0cC0+ZmxhZzsKLQlzaGZfcmVvcGVuKDEsIFNIRl9XUiwgc2hsX3N0ZG91dCk7Ci0Jc2hsX3N0ZG91dF9vayA9IDE7Ci0Ja3NoX2dldG9wdF9yZXNldCgmYnVpbHRpbl9vcHQsIEdGX0VSUk9SKTsKLQlydiA9ICgqdHAtPnZhbC5mKSh3cCk7Ci0Jc2hmX2ZsdXNoKHNobF9zdGRvdXQpOwotCXNobF9zdGRvdXRfb2sgPSAwOwotCWJ1aWx0aW5fZmxhZyA9IDA7Ci0JYnVpbHRpbl9hcmd2MCA9IE5VTEw7Ci0JcmV0dXJuIChydik7Ci19Ci0KLS8qCi0gKiBzZXQgdXAgcmVkaXJlY3Rpb24sIHNhdmluZyBvbGQgZmRzIGluIGUtPnNhdmVmZAotICovCi1zdGF0aWMgaW50Ci1pb3NldHVwKHN0cnVjdCBpb3dvcmQgKmlvcCwgc3RydWN0IHRibCAqdHApCi17Ci0JaW50IHUgPSAtMTsKLQljaGFyICpjcCA9IGlvcC0+bmFtZTsKLQlpbnQgaW90eXBlID0gaW9wLT5mbGFnICYgSU9UWVBFOwotCWludCBkb19vcGVuID0gMSwgZG9fY2xvc2UgPSAwLCBmbGFncyA9IDA7Ci0Jc3RydWN0IGlvd29yZCBpb3RtcDsKLQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQotCWlmIChpb3R5cGUgIT0gSU9IRVJFKQotCQljcCA9IGV2YWxvbmVzdHIoY3AsIERPVElMREV8KEZsYWcoRlRBTEtJTkdfSSkgPyBET0dMT0IgOiAwKSk7Ci0KLQkvKiBVc2VkIGZvciB0cmFjaW5nIGFuZCBlcnJvciBtZXNzYWdlcyB0byBwcmludCBleHBhbmRlZCBjcCAqLwotCWlvdG1wID0gKmlvcDsKLQlpb3RtcC5uYW1lID0gKGlvdHlwZSA9PSBJT0hFUkUpID8gTlVMTCA6IGNwOwotCWlvdG1wLmZsYWcgfD0gSU9OQU1FWFA7Ci0KLQlpZiAoRmxhZyhGWFRSQUNFKSkKLQkJc2hlbGxmKCIlcyVzXG4iLAotCQkgICAgc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSwKLQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApKTsKLQotCXN3aXRjaCAoaW90eXBlKSB7Ci0JY2FzZSBJT1JFQUQ6Ci0JCWZsYWdzID0gT19SRE9OTFk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT0NBVDoKLQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19DUkVBVDsKLQkJYnJlYWs7Ci0KLQljYXNlIElPV1JJVEU6Ci0JCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKLQkJLyogVGhlIHN0YXQoKSBpcyBoZXJlIHRvIGFsbG93IHJlZGlyZWN0aW9ucyB0bwotCQkgKiB0aGluZ3MgbGlrZSAvZGV2L251bGwgd2l0aG91dCBlcnJvci4KLQkJICovCi0JCWlmIChGbGFnKEZOT0NMT0JCRVIpICYmICEoaW9wLT5mbGFnICYgSU9DTE9CKSAmJgotCQkgICAgKHN0YXQoY3AsICZzdGF0YikgPCAwIHx8IFNfSVNSRUcoc3RhdGIuc3RfbW9kZSkpKQotCQkJZmxhZ3MgfD0gT19FWENMOwotCQlicmVhazsKLQotCWNhc2UgSU9SRFdSOgotCQlmbGFncyA9IE9fUkRXUiB8IE9fQ1JFQVQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT0hFUkU6Ci0JCWRvX29wZW4gPSAwOwotCQkvKiBoZXJlaW4oKSByZXR1cm5zIC0yIGlmIGVycm9yIGhhcyBiZWVuIHByaW50ZWQgKi8KLQkJdSA9IGhlcmVpbihpb3AtPmhlcmVkb2MsIGlvcC0+ZmxhZyAmIElPRVZBTCk7Ci0JCS8qIGNwIG1heSBoYXZlIHdyb25nIG5hbWUgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIElPRFVQOiB7Ci0JCWNvbnN0IGNoYXIgKmVtc2c7Ci0KLQkJZG9fb3BlbiA9IDA7Ci0JCWlmICgqY3AgPT0gJy0nICYmICFjcFsxXSkgewotCQkJdSA9IDEwMDk7CSAvKiBwcmV2ZW50IGVycm9yIHJldHVybiBiZWxvdyAqLwotCQkJZG9fY2xvc2UgPSAxOwotCQl9IGVsc2UgaWYgKCh1ID0gY2hlY2tfZmQoY3AsCi0JCSAgICBYX09LIHwgKChpb3AtPmZsYWcgJiBJT1JEVVApID8gUl9PSyA6IFdfT0spLAotCQkgICAgJmVtc2cpKSA8IDApIHsKLQkJCXdhcm5pbmdmKHRydWUsICIlczogJXMiLAotCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApLCBlbXNnKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCWlmICh1ID09IGlvcC0+dW5pdCkKLQkJCXJldHVybiAoMCk7CQkvKiAiZHVwIGZyb20iID09ICJkdXAgdG8iICovCi0JCWJyZWFrOwotCX0KLQl9Ci0KLQlpZiAoZG9fb3BlbikgewotCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgKGZsYWdzICYgT19DUkVBVCkpIHsKLQkJCXdhcm5pbmdmKHRydWUsICIlczogcmVzdHJpY3RlZCIsIGNwKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCXUgPSBvcGVuKGNwLCBmbGFncywgMDY2Nik7Ci0JfQotCWlmICh1IDwgMCkgewotCQkvKiBoZXJlaW4oKSBtYXkgYWxyZWFkeSBoYXZlIHByaW50ZWQgbWVzc2FnZSAqLwotCQlpZiAodSA9PSAtMSkgewotCQkJdSA9IGVycm5vOwotCQkJd2FybmluZ2YodHJ1ZSwgImNhbm5vdCAlcyAlczogJXMiLAotCQkJICAgIGlvdHlwZSA9PSBJT0RVUCA/ICJkdXAiIDoKLQkJCSAgICAoaW90eXBlID09IElPUkVBRCB8fCBpb3R5cGUgPT0gSU9IRVJFKSA/Ci0JCQkgICAgIm9wZW4iIDogImNyZWF0ZSIsIGNwLCBzdHJlcnJvcih1KSk7Ci0JCX0KLQkJcmV0dXJuICgtMSk7Ci0JfQotCS8qIERvIG5vdCBzYXZlIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVkaXJlY3RlZCAoaS5lLiAiY2F0ID54ID55IikuICovCi0JaWYgKGUtPnNhdmVmZFtpb3AtPnVuaXRdID09IDApIHsKLQkJLyogSWYgdGhlc2UgYXJlIHRoZSBzYW1lLCBpdCBtZWFucyB1bml0IHdhcyBwcmV2aW91c2x5IGNsb3NlZCAqLwotCQlpZiAodSA9PSBpb3AtPnVuaXQpCi0JCQllLT5zYXZlZmRbaW9wLT51bml0XSA9IC0xOwotCQllbHNlCi0JCQkvKiBjX2V4ZWMoKSBhc3N1bWVzIGUtPnNhdmVmZFtmZF0gc2V0IGZvciBhbnkKLQkJCSAqIHJlZGlyZWN0aW9ucy4gQXNrIHNhdmVmZCgpIG5vdCB0byBjbG9zZSBpb3AtPnVuaXQ7Ci0JCQkgKiB0aGlzIGFsbG93cyBlcnJvciBtZXNzYWdlcyB0byBiZSBzZWVuIGlmIGlvcC0+dW5pdAotCQkJICogaXMgMjsgYWxzbyBtZWFucyB3ZSBjYW4ndCBsb3NlIHRoZSBmZCAoZWcsIGJvdGgKLQkJCSAqIGR1cDIgYmVsb3cgYW5kIGR1cDIgaW4gcmVzdGZkKCkgZmFpbGluZykuCi0JCQkgKi8KLQkJCWUtPnNhdmVmZFtpb3AtPnVuaXRdID0gc2F2ZWZkKGlvcC0+dW5pdCk7Ci0JfQotCi0JaWYgKGRvX2Nsb3NlKQotCQljbG9zZShpb3AtPnVuaXQpOwotCWVsc2UgaWYgKHUgIT0gaW9wLT51bml0KSB7Ci0JCWlmIChrc2hfZHVwMih1LCBpb3AtPnVuaXQsIHRydWUpIDwgMCkgewotCQkJaW50IGV2OwotCi0JCQlldiA9IGVycm5vOwotCQkJd2FybmluZ2YodHJ1ZSwKLQkJCSAgICAiY291bGQgbm90IGZpbmlzaCAoZHVwKSByZWRpcmVjdGlvbiAlczogJXMiLAotCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApLAotCQkJICAgIHN0cmVycm9yKGV2KSk7Ci0JCQlpZiAoaW90eXBlICE9IElPRFVQKQotCQkJCWNsb3NlKHUpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJaWYgKGlvdHlwZSAhPSBJT0RVUCkKLQkJCWNsb3NlKHUpOwotCQkvKiBUb3VjaGluZyBhbnkgY28tcHJvY2VzcyBmZCBpbiBhbiBlbXB0eSBleGVjCi0JCSAqIGNhdXNlcyB0aGUgc2hlbGwgdG8gY2xvc2UgaXRzIGNvcGllcwotCQkgKi8KLQkJZWxzZSBpZiAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMICYmIHRwLT52YWwuZiA9PSBjX2V4ZWMpIHsKLQkJCWlmIChpb3AtPmZsYWcgJiBJT1JEVVApCS8qIHBvc3NpYmxlIGV4ZWMgPCZwICovCi0JCQkJY29wcm9jX3JlYWRfY2xvc2UodSk7Ci0JCQllbHNlCQkJLyogcG9zc2libGUgZXhlYyA+JnAgKi8KLQkJCQljb3Byb2Nfd3JpdGVfY2xvc2UodSk7Ci0JCX0KLQl9Ci0JaWYgKHUgPT0gMikgLyogQ2xlYXIgYW55IHdyaXRlIGVycm9ycyAqLwotCQlzaGZfcmVvcGVuKDIsIFNIRl9XUiwgc2hsX291dCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIG9wZW4gaGVyZSBkb2N1bWVudCB0ZW1wIGZpbGUuCi0gKiBpZiB1bnF1b3RlZCBoZXJlLCBleHBhbmQgaGVyZSB0ZW1wIGZpbGUgaW50byBzZWNvbmQgdGVtcCBmaWxlLgotICovCi1zdGF0aWMgaW50Ci1oZXJlaW4oY29uc3QgY2hhciAqY29udGVudCwgaW50IHN1YikKLXsKLQl2b2xhdGlsZSBpbnQgZmQgPSAtMTsKLQlzdHJ1Y3Qgc291cmNlICpzLCAqdm9sYXRpbGUgb3NvdXJjZTsKLQlzdHJ1Y3Qgc2hmICp2b2xhdGlsZSBzaGY7Ci0Jc3RydWN0IHRlbXAgKmg7Ci0JaW50IGk7Ci0KLQkvKiBrc2ggLWMgJ2NhdCA8PCBFT0YnIGNhbiBjYXVzZSB0aGlzLi4uICovCi0JaWYgKGNvbnRlbnQgPT0gTlVMTCkgewotCQl3YXJuaW5nZih0cnVlLCAiaGVyZSBkb2N1bWVudCBtaXNzaW5nIik7Ci0JCXJldHVybiAoLTIpOyAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8KLQl9Ci0KLQkvKiBDcmVhdGUgdGVtcCBmaWxlIHRvIGhvbGQgY29udGVudCAoZG9uZSBiZWZvcmUgbmV3ZW52IHNvIHRlbXAKLQkgKiBkb2Vzbid0IGdldCByZW1vdmVkIHRvbyBzb29uKS4KLQkgKi8KLQloID0gbWFrZXRlbXAoQVRFTVAsIFRUX0hFUkVET0NfRVhQLCAmZS0+dGVtcHMpOwotCWlmICghKHNoZiA9IGgtPnNoZikgfHwgKGZkID0gb3BlbihoLT5uYW1lLCBPX1JET05MWSwgMCkpIDwgMCkgewotCQlmZCA9IGVycm5vOwotCQl3YXJuaW5nZih0cnVlLCAiY2FuJ3QgJXMgdGVtcG9yYXJ5IGZpbGUgJXM6ICVzIiwKLQkJICAgICFzaGYgPyAiY3JlYXRlIiA6ICJvcGVuIiwKLQkJICAgIGgtPm5hbWUsIHN0cmVycm9yKGZkKSk7Ci0JCWlmIChzaGYpCi0JCQlzaGZfY2xvc2Uoc2hmKTsKLQkJcmV0dXJuICgtMiAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8pOwotCX0KLQotCW9zb3VyY2UgPSBzb3VyY2U7Ci0JbmV3ZW52KEVfRVJSSCk7Ci0JaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQlpZiAoaSkgewotCQlzb3VyY2UgPSBvc291cmNlOwotCQlxdWl0ZW52KHNoZik7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuICgtMik7IC8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLwotCX0KLQlpZiAoc3ViKSB7Ci0JCS8qIERvIHN1YnN0aXR1dGlvbnMgb24gdGhlIGNvbnRlbnQgb2YgaGVyZWRvYyAqLwotCQlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOwotCQlzLT5zdGFydCA9IHMtPnN0ciA9IGNvbnRlbnQ7Ci0JCXNvdXJjZSA9IHM7Ci0JCWlmICh5eWxleChPTkVXT1JEfEhFUkVET0MpICE9IExXT1JEKQotCQkJaW50ZXJuYWxfZXJyb3JmKCJoZXJlaW46IHl5bGV4Iik7Ci0JCXNvdXJjZSA9IG9zb3VyY2U7Ci0JCXNoZl9wdXRzKGV2YWxzdHIoeXlsdmFsLmNwLCAwKSwgc2hmKTsKLQl9IGVsc2UKLQkJc2hmX3B1dHMoY29udGVudCwgc2hmKTsKLQotCXF1aXRlbnYoTlVMTCk7Ci0KLQlpZiAoc2hmX2Nsb3NlKHNoZikgPT0gRU9GKSB7Ci0JCWkgPSBlcnJubzsKLQkJY2xvc2UoZmQpOwotCQlmZCA9IGVycm5vOwotCQl3YXJuaW5nZih0cnVlLCAiZXJyb3Igd3JpdGluZyAlczogJXMsICVzIiwgaC0+bmFtZSwKLQkJICAgIHN0cmVycm9yKGkpLCBzdHJlcnJvcihmZCkpOwotCQlyZXR1cm4gKC0yKTsJLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovCi0JfQotCi0JcmV0dXJuIChmZCk7Ci19Ci0KLS8qCi0gKglrc2ggc3BlY2lhbCAtIHRoZSBzZWxlY3QgY29tbWFuZCBwcm9jZXNzaW5nIHNlY3Rpb24KLSAqCXByaW50IHRoZSBhcmdzIGluIGNvbHVtbiBmb3JtIC0gYXNzdW1pbmcgdGhhdCB3ZSBjYW4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZG9fc2VsZWN0YXJncyhjb25zdCBjaGFyICoqYXAsIGJvb2wgcHJpbnRfbWVudSkKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqcmVhZF9hcmdzW10gPSB7Ci0JCSJyZWFkIiwgIi1yIiwgIlJFUExZIiwgTlVMTAotCX07Ci0JY2hhciAqczsKLQlpbnQgaSwgYXJnY3Q7Ci0KLQlmb3IgKGFyZ2N0ID0gMDsgYXBbYXJnY3RdOyBhcmdjdCsrKQotCQk7Ci0Jd2hpbGUgKDEpIHsKLQkJLyogTWVudSBpcyBwcmludGVkIGlmCi0JCSAqCS0gdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBhcm91bmQgdGhlIHNlbGVjdCBsb29wCi0JCSAqCS0gdGhlIHVzZXIgZW50ZXJzIGEgYmxhbmsgbGluZQotCQkgKgktIHRoZSBSRVBMWSBwYXJhbWV0ZXIgaXMgZW1wdHkKLQkJICovCi0JCWlmIChwcmludF9tZW51IHx8ICEqc3RyX3ZhbChnbG9iYWwoIlJFUExZIikpKQotCQkJcHJfbWVudShhcCk7Ci0JCXNoZWxsZigiJXMiLCBzdHJfdmFsKGdsb2JhbCgiUFMzIikpKTsKLQkJaWYgKGNhbGxfYnVpbHRpbihmaW5kY29tKCJyZWFkIiwgRkNfQkkpLCByZWFkX2FyZ3MpKQotCQkJcmV0dXJuIChOVUxMKTsKLQkJcyA9IHN0cl92YWwoZ2xvYmFsKCJSRVBMWSIpKTsKLQkJaWYgKCpzKSB7Ci0JCQlnZXRuKHMsICZpKTsKLQkJCXJldHVybiAoKGkgPj0gMSAmJiBpIDw9IGFyZ2N0KSA/IGFwW2kgLSAxXSA6IG51bGwpOwotCQl9Ci0JCXByaW50X21lbnUgPSAxOwotCX0KLX0KLQotc3RydWN0IHNlbGVjdF9tZW51X2luZm8gewotCWNvbnN0IGNoYXIgKiBjb25zdCAqYXJnczsKLQlpbnQgbnVtX3dpZHRoOwotfTsKLQotc3RhdGljIGNoYXIgKnNlbGVjdF9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKLQotLyogZm9ybWF0IGEgc2luZ2xlIHNlbGVjdCBtZW51IGl0ZW0gKi8KLXN0YXRpYyBjaGFyICoKLXNlbGVjdF9mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQotewotCWNvbnN0IHN0cnVjdCBzZWxlY3RfbWVudV9pbmZvICpzbWkgPQotCSAgICAoY29uc3Qgc3RydWN0IHNlbGVjdF9tZW51X2luZm8gKilhcmc7Ci0KLQlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlKmQpICVzIiwKLQkgICAgc21pLT5udW1fd2lkdGgsIGkgKyAxLCBzbWktPmFyZ3NbaV0pOwotCXJldHVybiAoYnVmKTsKLX0KLQotLyoKLSAqCXByaW50IGEgc2VsZWN0IHN0eWxlIG1lbnUKLSAqLwotaW50Ci1wcl9tZW51KGNvbnN0IGNoYXIgKiBjb25zdCAqYXApCi17Ci0Jc3RydWN0IHNlbGVjdF9tZW51X2luZm8gc21pOwotCWNvbnN0IGNoYXIgKiBjb25zdCAqcHA7Ci0JaW50IGFjb2xzID0gMCwgYW9jdHMgPSAwLCBpLCBuOwotCi0JLyoKLQkgKiB3aWR0aC9jb2x1bW4gY2FsY3VsYXRpb25zIHdlcmUgZG9uZSBvbmNlIGFuZCBzYXZlZCwgYnV0IHRoaXMKLQkgKiBtZWFucyBzZWxlY3QgY2FuJ3QgYmUgdXNlZCByZWN1cnNpdmVseSBzbyB3ZSByZS1jYWxjdWxhdGUKLQkgKiBlYWNoIHRpbWUgKGNvdWxkIHNhdmUgaW4gYSBzdHJ1Y3R1cmUgdGhhdCBpcyByZXR1cm5lZCwgYnV0Ci0JICogaXQncyBwcm9iYWJseSBub3Qgd29ydGggdGhlIGJvdGhlcikKLQkgKi8KLQotCS8qCi0JICogZ2V0IGRpbWVuc2lvbnMgb2YgdGhlIGxpc3QKLQkgKi8KLQlmb3IgKG4gPSAwLCBwcCA9IGFwOyAqcHA7IG4rKywgcHArKykgewotCQlpID0gc3RybGVuKCpwcCk7Ci0JCWlmIChpID4gYW9jdHMpCi0JCQlhb2N0cyA9IGk7Ci0JCWkgPSB1dGZfbWJzd2lkdGgoKnBwKTsKLQkJaWYgKGkgPiBhY29scykKLQkJCWFjb2xzID0gaTsKLQl9Ci0KLQkvKgotCSAqIHdlIHdpbGwgcHJpbnQgYW4gaW5kZXggb2YgdGhlIGZvcm0gIiVkKSAiIGluIGZyb250IG9mCi0JICogZWFjaCBlbnRyeSwgc28gZ2V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoaXMKLQkgKi8KLQlmb3IgKGkgPSBuLCBzbWkubnVtX3dpZHRoID0gMTsgaSA+PSAxMDsgaSAvPSAxMCkKLQkJc21pLm51bV93aWR0aCsrOwotCi0Jc21pLmFyZ3MgPSBhcDsKLQlwcmludF9jb2x1bW5zKHNobF9vdXQsIG4sIHNlbGVjdF9mbXRfZW50cnksICh2b2lkICopJnNtaSwKLQkgICAgc21pLm51bV93aWR0aCArIDIgKyBhb2N0cywgc21pLm51bV93aWR0aCArIDIgKyBhY29scywKLQkgICAgdHJ1ZSk7Ci0KLQlyZXR1cm4gKG4pOwotfQotCi0vKiBYWFg6IGhvcnJpYmxlIGtsdWRnZSB0byBmaXQgd2l0aGluIHRoZSBmcmFtZXdvcmsgKi8KLXN0YXRpYyBjaGFyICpwbGFpbl9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKLQotc3RhdGljIGNoYXIgKgotcGxhaW5fZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKLXsKLQlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsICgoY29uc3QgY2hhciAqIGNvbnN0ICopYXJnKVtpXSk7Ci0JcmV0dXJuIChidWYpOwotfQotCi1pbnQKLXByX2xpc3QoY2hhciAqIGNvbnN0ICphcCkKLXsKLQlpbnQgYWNvbHMgPSAwLCBhb2N0cyA9IDAsIGksIG47Ci0JY2hhciAqIGNvbnN0ICpwcDsKLQotCWZvciAobiA9IDAsIHBwID0gYXA7ICpwcDsgbisrLCBwcCsrKSB7Ci0JCWkgPSBzdHJsZW4oKnBwKTsKLQkJaWYgKGkgPiBhb2N0cykKLQkJCWFvY3RzID0gaTsKLQkJaSA9IHV0Zl9tYnN3aWR0aCgqcHApOwotCQlpZiAoaSA+IGFjb2xzKQotCQkJYWNvbHMgPSBpOwotCX0KLQotCXByaW50X2NvbHVtbnMoc2hsX291dCwgbiwgcGxhaW5fZm10X2VudHJ5LCAoY29uc3Qgdm9pZCAqKWFwLAotCSAgICBhb2N0cywgYWNvbHMsIGZhbHNlKTsKLQotCXJldHVybiAobik7Ci19Ci0KLS8qCi0gKglbWyAuLi4gXV0gZXZhbHVhdGlvbiByb3V0aW5lcwotICovCi0KLS8qCi0gKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKLSAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKLSAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KLSAqLwotc3RhdGljIFRlc3Rfb3AKLWRidGVzdGVfaXNhKFRlc3RfZW52ICp0ZSwgVGVzdF9tZXRhIG1ldGEpCi17Ci0JVGVzdF9vcCByZXQgPSBUT19OT05PUDsKLQlpbnQgdXF3b3JkOwotCWNvbnN0IGNoYXIgKnA7Ci0KLQlpZiAoISp0ZS0+cG9zLndwKQotCQlyZXR1cm4gKG1ldGEgPT0gVE1fRU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QKTsKLQotCS8qIHVucXVvdGVkIHdvcmQ/ICovCi0JZm9yIChwID0gKnRlLT5wb3Mud3A7ICpwID09IENIQVI7IHAgKz0gMikKLQkJOwotCXVxd29yZCA9ICpwID09IEVPUzsKLQotCWlmIChtZXRhID09IFRNX1VOT1AgfHwgbWV0YSA9PSBUTV9CSU5PUCkgewotCQlpZiAodXF3b3JkKSB7Ci0JCQljaGFyIGJ1Zls4XTsJLyogbG9uZ2VyIHRoYW4gdGhlIGxvbmdlc3Qgb3BlcmF0b3IgKi8KLQkJCWNoYXIgKnEgPSBidWY7Ci0JCQlmb3IgKHAgPSAqdGUtPnBvcy53cDsKLQkJCSAgICAqcCA9PSBDSEFSICYmIHEgPCAmYnVmW3NpemVvZihidWYpIC0gMV07IHAgKz0gMikKLQkJCQkqcSsrID0gcFsxXTsKLQkJCSpxID0gJ1wwJzsKLQkJCXJldCA9IHRlc3RfaXNvcChtZXRhLCBidWYpOwotCQl9Ci0JfSBlbHNlIGlmIChtZXRhID09IFRNX0VORCkKLQkJcmV0ID0gVE9fTk9OT1A7Ci0JZWxzZQotCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoKnRlLT5wb3Mud3AsCi0JCSAgICBkYnRlc3RfdG9rZW5zWyhpbnQpbWV0YV0pKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKLQotCS8qIEFjY2VwdCB0aGUgdG9rZW4/ICovCi0JaWYgKHJldCAhPSBUT19OT05PUCkKLQkJdGUtPnBvcy53cCsrOwotCi0JcmV0dXJuIChyZXQpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kYnRlc3RlX2dldG9wbmQoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBib29sIGRvX2V2YWwpCi17Ci0JY29uc3QgY2hhciAqcyA9ICp0ZS0+cG9zLndwOwotCi0JaWYgKCFzKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JdGUtPnBvcy53cCsrOwotCi0JaWYgKCFkb19ldmFsKQotCQlyZXR1cm4gKG51bGwpOwotCi0JaWYgKG9wID09IFRPX1NURVFMIHx8IG9wID09IFRPX1NUTkVRKQotCQlzID0gZXZhbHN0cihzLCBET1RJTERFIHwgRE9QQVQpOwotCWVsc2UKLQkJcyA9IGV2YWxzdHIocywgRE9USUxERSk7Ci0KLQlyZXR1cm4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotZGJ0ZXN0ZV9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOwotCWludGVybmFsX3dhcm5pbmdmKCJkYnRlc3RlX2Vycm9yOiAlcyAob2Zmc2V0ICVkKSIsIG1zZywgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V4cHIuYyBiL21rc2gvc3JjL2V4cHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1NzEwYy4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9leHByLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGV4cHIuYyx2IDEuMjEgMjAwOS8wNi8wMSAxOTowMDo1NyBkZXJhYWR0IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXhwci5jLHYgMS40NCAyMDEwLzA4LzE0IDIxOjM1OjEzIHRnIEV4cCAkIik7Ci0KLS8qIFRoZSBvcmRlciBvZiB0aGVzZSBlbnVtcyBpcyBjb25zdHJhaW5lZCBieSB0aGUgb3JkZXIgb2Ygb3BpbmZvW10gKi8KLWVudW0gdG9rZW4gewotCS8qIHNvbWUgKGxvbmcpIHVuYXJ5IG9wZXJhdG9ycyAqLwotCU9fUExVU1BMVVMgPSAwLCBPX01JTlVTTUlOVVMsCi0JLyogYmluYXJ5IG9wZXJhdG9ycyAqLwotCU9fRVEsIE9fTkUsCi0JLyogYXNzaWdubWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gcmFuZ2UgT19BU04gLi4gT19CT1JBU04gKi8KLQlPX0FTTiwgT19USU1FU0FTTiwgT19ESVZBU04sIE9fTU9EQVNOLCBPX1BMVVNBU04sIE9fTUlOVVNBU04sCi0JT19MU0hJRlRBU04sIE9fUlNISUZUQVNOLCBPX0JBTkRBU04sIE9fQlhPUkFTTiwgT19CT1JBU04sCi0JT19MU0hJRlQsIE9fUlNISUZULAotCU9fTEUsIE9fR0UsIE9fTFQsIE9fR1QsCi0JT19MQU5ELAotCU9fTE9SLAotCU9fVElNRVMsIE9fRElWLCBPX01PRCwKLQlPX1BMVVMsIE9fTUlOVVMsCi0JT19CQU5ELAotCU9fQlhPUiwKLQlPX0JPUiwKLQlPX1RFUk4sCi0JT19DT01NQSwKLQkvKiB0aGluZ3MgYWZ0ZXIgdGhpcyBhcmVuJ3QgdXNlZCBhcyBiaW5hcnkgb3BlcmF0b3JzICovCi0JLyogdW5hcnkgdGhhdCBhcmUgbm90IGFsc28gYmluYXJpZXMgKi8KLQlPX0JOT1QsIE9fTE5PVCwKLQkvKiBtaXNjICovCi0JT1BFTl9QQVJFTiwgQ0xPU0VfUEFSRU4sIENURVJOLAotCS8qIHRoaW5ncyB0aGF0IGRvbid0IGFwcGVhciBpbiB0aGUgb3BpbmZvW10gdGFibGUgKi8KLQlWQVIsIExJVCwgRU5ELCBCQUQKLX07Ci0jZGVmaW5lIElTX0JJTk9QKG9wKSAoKChpbnQpb3ApID49IChpbnQpT19FUSAmJiAoKGludClvcCkgPD0gKGludClPX0NPTU1BKQotI2RlZmluZSBJU19BU1NJR05PUChvcCkJKChpbnQpKG9wKSA+PSAoaW50KU9fQVNOICYmIChpbnQpKG9wKSA8PSAoaW50KU9fQk9SQVNOKQotCi0vKiBwcmVjaXNpb25zOyB1c2VkIHRvIGJlIGVudW0gcHJlYyBidXQgd2UgZG8gYXJpdGhtZXRpY3Mgb24gaXQgKi8KLSNkZWZpbmUgUF9QUklNQVJZCTAJLyogVkFSLCBMSVQsICgpLCB+ICEgLSArICovCi0jZGVmaW5lIFBfTVVMVAkJMQkvKiAqIC8gJSAqLwotI2RlZmluZSBQX0FERAkJMgkvKiArIC0gKi8KLSNkZWZpbmUgUF9TSElGVAkJMwkvKiA8PCA+PiAqLwotI2RlZmluZSBQX1JFTEFUSU9OCTQJLyogPCA8PSA+ID49ICovCi0jZGVmaW5lIFBfRVFVQUxJVFkJNQkvKiA9PSAhPSAqLwotI2RlZmluZSBQX0JBTkQJCTYJLyogJiAqLwotI2RlZmluZSBQX0JYT1IJCTcJLyogXiAqLwotI2RlZmluZSBQX0JPUgkJOAkvKiB8ICovCi0jZGVmaW5lIFBfTEFORAkJOQkvKiAmJiAqLwotI2RlZmluZSBQX0xPUgkJMTAJLyogfHwgKi8KLSNkZWZpbmUgUF9URVJOCQkxMQkvKiA/OiAqLwotI2RlZmluZSBQX0FTU0lHTgkxMgkvKiA9ICo9IC89ICU9ICs9IC09IDw8PSA+Pj0gJj0gXj0gfD0gKi8KLSNkZWZpbmUgUF9DT01NQQkJMTMJLyogLCAqLwotI2RlZmluZSBNQVhfUFJFQwlQX0NPTU1BCi0KLXN0cnVjdCBvcGluZm8gewotCWNoYXIJCW5hbWVbNF07Ci0JaW50CQlsZW47CS8qIG5hbWUgbGVuZ3RoICovCi0JaW50CQlwcmVjOwkvKiBwcmVjZWRlbmNlOiBsb3dlciBpcyBoaWdoZXIgKi8KLX07Ci0KLS8qIFRva2VucyBpbiB0aGlzIHRhYmxlIG11c3QgYmUgb3JkZXJlZCBzbyB0aGUgbG9uZ2VzdCBhcmUgZmlyc3QKLSAqIChlZywgKz0gYmVmb3JlICspLiBJZiB5b3UgY2hhbmdlIHNvbWV0aGluZywgY2hhbmdlIHRoZSBvcmRlcgotICogb2YgZW51bSB0b2tlbiB0b28uCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BpbmZvIG9waW5mb1tdID0gewotCXsgIisrIiwJIDIsIFBfUFJJTUFSWSB9LAkvKiBiZWZvcmUgKyAqLwotCXsgIi0tIiwJIDIsIFBfUFJJTUFSWSB9LAkvKiBiZWZvcmUgLSAqLwotCXsgIj09IiwJIDIsIFBfRVFVQUxJVFkgfSwJLyogYmVmb3JlID0gKi8KLQl7ICIhPSIsCSAyLCBQX0VRVUFMSVRZIH0sCS8qIGJlZm9yZSAhICovCi0JeyAiPSIsCSAxLCBQX0FTU0lHTiB9LAkJLyoga2VlcCBhc3NpZ25zIGluIGEgYmxvY2sgKi8KLQl7ICIqPSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIi89IiwJIDIsIFBfQVNTSUdOIH0sCi0JeyAiJT0iLAkgMiwgUF9BU1NJR04gfSwKLQl7ICIrPSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIi09IiwJIDIsIFBfQVNTSUdOIH0sCi0JeyAiPDw9IiwgMywgUF9BU1NJR04gfSwKLQl7ICI+Pj0iLCAzLCBQX0FTU0lHTiB9LAotCXsgIiY9IiwJIDIsIFBfQVNTSUdOIH0sCi0JeyAiXj0iLAkgMiwgUF9BU1NJR04gfSwKLQl7ICJ8PSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIjw8IiwJIDIsIFBfU0hJRlQgfSwKLQl7ICI+PiIsCSAyLCBQX1NISUZUIH0sCi0JeyAiPD0iLAkgMiwgUF9SRUxBVElPTiB9LAotCXsgIj49IiwJIDIsIFBfUkVMQVRJT04gfSwKLQl7ICI8IiwJIDEsIFBfUkVMQVRJT04gfSwKLQl7ICI+IiwJIDEsIFBfUkVMQVRJT04gfSwKLQl7ICImJiIsCSAyLCBQX0xBTkQgfSwKLQl7ICJ8fCIsCSAyLCBQX0xPUiB9LAotCXsgIioiLAkgMSwgUF9NVUxUIH0sCi0JeyAiLyIsCSAxLCBQX01VTFQgfSwKLQl7ICIlIiwJIDEsIFBfTVVMVCB9LAotCXsgIisiLAkgMSwgUF9BREQgfSwKLQl7ICItIiwJIDEsIFBfQUREIH0sCi0JeyAiJiIsCSAxLCBQX0JBTkQgfSwKLQl7ICJeIiwJIDEsIFBfQlhPUiB9LAotCXsgInwiLAkgMSwgUF9CT1IgfSwKLQl7ICI/IiwJIDEsIFBfVEVSTiB9LAotCXsgIiwiLAkgMSwgUF9DT01NQSB9LAotCXsgIn4iLAkgMSwgUF9QUklNQVJZIH0sCi0JeyAiISIsCSAxLCBQX1BSSU1BUlkgfSwKLQl7ICIoIiwJIDEsIFBfUFJJTUFSWSB9LAotCXsgIikiLAkgMSwgUF9QUklNQVJZIH0sCi0JeyAiOiIsCSAxLCBQX1BSSU1BUlkgfSwKLQl7ICIiLAkgMCwgUF9QUklNQVJZIH0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGV4cHJfc3RhdGUgRXhwcl9zdGF0ZTsKLXN0cnVjdCBleHByX3N0YXRlIHsKLQljb25zdCBjaGFyICpleHByZXNzaW9uOwkJLyogZXhwcmVzc2lvbiBiZWluZyBldmFsdWF0ZWQgKi8KLQljb25zdCBjaGFyICp0b2twOwkJLyogbGV4aWNhbCBwb3NpdGlvbiAqLwotCXN0cnVjdCB0YmwgKnZhbDsJCS8qIHZhbHVlIGZyb20gdG9rZW4oKSAqLwotCXN0cnVjdCB0YmwgKmV2YWxpbmc7CQkvKiB2YXJpYWJsZSB0aGF0IGlzIGJlaW5nIHJlY3Vyc2l2ZWx5Ci0JCQkJCSAqIGV4cGFuZGVkIChFWFBSSU5FVkFMIGZsYWcgc2V0KSAqLwotCWludCBub2Fzc2lnbjsJCQkvKiBkb24ndCBkbyBhc3NpZ25zIChmb3IgPzosJiYsfHwpICovCi0JZW51bSB0b2tlbiB0b2s7CQkJLyogdG9rZW4gZnJvbSB0b2tlbigpICovCi0JYm9vbCBhcml0aDsJCQkvKiBldmFsdWF0aW5nIGFuICQoKCkpIGV4cHJlc3Npb24/ICovCi0JYm9vbCBuYXR1cmFsOwkJCS8qIHVuc2lnbmVkIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gKi8KLX07Ci0KLSNkZWZpbmUgYml2dWkoeCwgb3AsIHkpCShlcy0+bmF0dXJhbCA/CQkJXAotCShta3NoX2FyaV90KSgoeCktPnZhbC51IG9wICh5KS0+dmFsLnUpIDoJXAotCShta3NoX2FyaV90KSgoeCktPnZhbC5pIG9wICh5KS0+dmFsLmkpCQlcCi0pCi0jZGVmaW5lIGNodnVpKHgsIG9wKQlkbyB7CQkJXAotCWlmIChlcy0+bmF0dXJhbCkJCQlcCi0JCSh4KS0+dmFsLnUgPSBvcCAoeCktPnZhbC51OwlcCi0JZWxzZQkJCQkJXAotCQkoeCktPnZhbC5pID0gb3AgKHgpLT52YWwuaTsJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZGVmaW5lIHN0dnVpKHgsIG4pCWRvIHsJCQlcCi0JaWYgKGVzLT5uYXR1cmFsKQkJCVwKLQkJKHgpLT52YWwudSA9IChuKTsJCVwKLQllbHNlCQkJCQlcCi0JCSh4KS0+dmFsLmkgPSAobik7CQlcCi19IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLQotZW51bSBlcnJvcl90eXBlIHsKLQlFVF9VTkVYUEVDVEVELCBFVF9CQURMSVQsIEVUX1JFQ1VSU0lWRSwKLQlFVF9MVkFMVUUsIEVUX1JET05MWSwgRVRfU1RSCi19OwotCi1zdGF0aWMgdm9pZCBldmFsZXJyKEV4cHJfc3RhdGUgKiwgZW51bSBlcnJvcl90eXBlLCBjb25zdCBjaGFyICopCi0gICAgTUtTSF9BX05PUkVUVVJOOwotc3RhdGljIHN0cnVjdCB0YmwgKmV2YWxleHByKEV4cHJfc3RhdGUgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGV4cHJ0b2tlbihFeHByX3N0YXRlICopOwotc3RhdGljIHN0cnVjdCB0YmwgKmRvX3BwbW0oRXhwcl9zdGF0ZSAqLCBlbnVtIHRva2VuLCBzdHJ1Y3QgdGJsICosIGJvb2wpOwotc3RhdGljIHZvaWQgYXNzaWduX2NoZWNrKEV4cHJfc3RhdGUgKiwgZW51bSB0b2tlbiwgc3RydWN0IHRibCAqKTsKLXN0YXRpYyBzdHJ1Y3QgdGJsICp0ZW1wdmFyKHZvaWQpOwotc3RhdGljIHN0cnVjdCB0YmwgKmludHZhcihFeHByX3N0YXRlICosIHN0cnVjdCB0YmwgKik7Ci0KLS8qCi0gKiBwYXJzZSBhbmQgZXZhbHVhdGUgZXhwcmVzc2lvbgotICovCi1pbnQKLWV2YWx1YXRlKGNvbnN0IGNoYXIgKmV4cHIsIG1rc2hfYXJpX3QgKnJ2YWwsIGludCBlcnJvcl9vaywgYm9vbCBhcml0aCkKLXsKLQlzdHJ1Y3QgdGJsIHY7Ci0JaW50IHJldDsKLQotCXYuZmxhZyA9IERFRklORUR8SU5URUdFUjsKLQl2LnR5cGUgPSAwOwotCXJldCA9IHZfZXZhbHVhdGUoJnYsIGV4cHIsIGVycm9yX29rLCBhcml0aCk7Ci0JKnJ2YWwgPSB2LnZhbC5pOwotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIHBhcnNlIGFuZCBldmFsdWF0ZSBleHByZXNzaW9uLCBzdG9yaW5nIHJlc3VsdCBpbiB2cC4KLSAqLwotaW50Ci12X2V2YWx1YXRlKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICpleHByLCB2b2xhdGlsZSBpbnQgZXJyb3Jfb2ssCi0gICAgYm9vbCBhcml0aCkKLXsKLQlzdHJ1Y3QgdGJsICp2OwotCUV4cHJfc3RhdGUgY3Vyc3RhdGU7Ci0JRXhwcl9zdGF0ZSAqIGNvbnN0IGVzID0gJmN1cnN0YXRlOwotCWludCBpOwotCi0JLyogc2F2ZSBzdGF0ZSB0byBhbGxvdyByZWN1cnNpdmUgY2FsbHMgKi8KLQljdXJzdGF0ZS5leHByZXNzaW9uID0gY3Vyc3RhdGUudG9rcCA9IGV4cHI7Ci0JY3Vyc3RhdGUubm9hc3NpZ24gPSAwOwotCWN1cnN0YXRlLmFyaXRoID0gYXJpdGg7Ci0JY3Vyc3RhdGUuZXZhbGluZyA9IE5VTEw7Ci0JY3Vyc3RhdGUubmF0dXJhbCA9IGZhbHNlOwotCi0JbmV3ZW52KEVfRVJSSCk7Ci0JaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQlpZiAoaSkgewotCQkvKiBDbGVhciBFWFBSSU5FVkFMIGluIG9mIGFueSB2YXJpYWJsZXMgd2Ugd2VyZSBwbGF5aW5nIHdpdGggKi8KLQkJaWYgKGN1cnN0YXRlLmV2YWxpbmcpCi0JCQljdXJzdGF0ZS5ldmFsaW5nLT5mbGFnICY9IH5FWFBSSU5FVkFMOwotCQlxdWl0ZW52KE5VTEwpOwotCQlpZiAoaSA9PSBMQUVYUFIpIHsKLQkJCWlmIChlcnJvcl9vayA9PSBLU0hfUkVUVVJOX0VSUk9SKQotCQkJCXJldHVybiAoMCk7Ci0JCQllcnJvcmZ6KCk7Ci0JCX0KLQkJdW53aW5kKGkpOwotCQkvKiBOT1RSRUFDSEVEICovCi0JfQotCi0JZXhwcnRva2VuKGVzKTsKLQlpZiAoZXMtPnRvayA9PSBFTkQpIHsKLQkJZXMtPnRvayA9IExJVDsKLQkJZXMtPnZhbCA9IHRlbXB2YXIoKTsKLQl9Ci0JdiA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIE1BWF9QUkVDKSk7Ci0KLQlpZiAoZXMtPnRvayAhPSBFTkQpCi0JCWV2YWxlcnIoZXMsIEVUX1VORVhQRUNURUQsIE5VTEwpOwotCi0JaWYgKGVzLT5hcml0aCAmJiBlcy0+bmF0dXJhbCkKLQkJdnAtPmZsYWcgfD0gSU5UX1U7Ci0JaWYgKHZwLT5mbGFnICYgSU5URUdFUikKLQkJc2V0aW50X3YodnAsIHYsIGVzLT5hcml0aCk7Ci0JZWxzZQotCQkvKiBjYW4gZmFpbCBpZiByZWFkb25seSAqLwotCQlzZXRzdHIodnAsIHN0cl92YWwodiksIGVycm9yX29rKTsKLQotCXF1aXRlbnYoTlVMTCk7Ci0KLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotZXZhbGVycihFeHByX3N0YXRlICplcywgZW51bSBlcnJvcl90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnN0cikKLXsKLQljaGFyIHRidWZbMl07Ci0JY29uc3QgY2hhciAqczsKLQotCWVzLT5hcml0aCA9IGZhbHNlOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgRVRfVU5FWFBFQ1RFRDoKLQkJc3dpdGNoIChlcy0+dG9rKSB7Ci0JCWNhc2UgVkFSOgotCQkJcyA9IGVzLT52YWwtPm5hbWU7Ci0JCQlicmVhazsKLQkJY2FzZSBMSVQ6Ci0JCQlzID0gc3RyX3ZhbChlcy0+dmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIEVORDoKLQkJCXMgPSAiZW5kIG9mIGV4cHJlc3Npb24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgQkFEOgotCQkJdGJ1ZlswXSA9ICplcy0+dG9rcDsKLQkJCXRidWZbMV0gPSAnXDAnOwotCQkJcyA9IHRidWY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXMgPSBvcGluZm9bKGludCllcy0+dG9rXS5uYW1lOwotCQl9Ci0JCXdhcm5pbmdmKHRydWUsICIlczogdW5leHBlY3RlZCAnJXMnIiwgZXMtPmV4cHJlc3Npb24sIHMpOwotCQlicmVhazsKLQotCWNhc2UgRVRfQkFETElUOgotCQl3YXJuaW5nZih0cnVlLCAiJXM6IGJhZCBudW1iZXIgJyVzJyIsIGVzLT5leHByZXNzaW9uLCBzdHIpOwotCQlicmVhazsKLQotCWNhc2UgRVRfUkVDVVJTSVZFOgotCQl3YXJuaW5nZih0cnVlLCAiJXM6IGV4cHJlc3Npb24gcmVjdXJzZXMgb24gcGFyYW1ldGVyICclcyciLAotCQkgICAgZXMtPmV4cHJlc3Npb24sIHN0cik7Ci0JCWJyZWFrOwotCi0JY2FzZSBFVF9MVkFMVUU6Ci0JCXdhcm5pbmdmKHRydWUsICIlczogJXMgcmVxdWlyZXMgbHZhbHVlIiwKLQkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOwotCQlicmVhazsKLQotCWNhc2UgRVRfUkRPTkxZOgotCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIGFwcGxpZWQgdG8gcmVhZCBvbmx5IHZhcmlhYmxlIiwKLQkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6IC8qIGtlZXAgZ2NjIGhhcHB5ICovCi0JY2FzZSBFVF9TVFI6Ci0JCXdhcm5pbmdmKHRydWUsICIlczogJXMiLCBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKLQkJYnJlYWs7Ci0JfQotCXVud2luZChMQUVYUFIpOwotfQotCi1zdGF0aWMgc3RydWN0IHRibCAqCi1ldmFsZXhwcihFeHByX3N0YXRlICplcywgaW50IHByZWMpCi17Ci0Jc3RydWN0IHRibCAqdmwsICp2ciA9IE5VTEwsICp2YXNuOwotCWVudW0gdG9rZW4gb3A7Ci0JbWtzaF9hcmlfdCByZXMgPSAwOwotCi0JaWYgKHByZWMgPT0gUF9QUklNQVJZKSB7Ci0JCW9wID0gZXMtPnRvazsKLQkJaWYgKG9wID09IE9fQk5PVCB8fCBvcCA9PSBPX0xOT1QgfHwgb3AgPT0gT19NSU5VUyB8fAotCQkgICAgb3AgPT0gT19QTFVTKSB7Ci0JCQlleHBydG9rZW4oZXMpOwotCQkJdmwgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBQX1BSSU1BUlkpKTsKLQkJCWlmIChvcCA9PSBPX0JOT1QpCi0JCQkJY2h2dWkodmwsIH4pOwotCQkJZWxzZSBpZiAob3AgPT0gT19MTk9UKQotCQkJCWNodnVpKHZsLCAhKTsKLQkJCWVsc2UgaWYgKG9wID09IE9fTUlOVVMpCi0JCQkJY2h2dWkodmwsIC0pOwotCQkJLyogb3AgPT0gT19QTFVTIGlzIGEgbm8tb3AgKi8KLQkJfSBlbHNlIGlmIChvcCA9PSBPUEVOX1BBUkVOKSB7Ci0JCQlleHBydG9rZW4oZXMpOwotCQkJdmwgPSBldmFsZXhwcihlcywgTUFYX1BSRUMpOwotCQkJaWYgKGVzLT50b2sgIT0gQ0xPU0VfUEFSRU4pCi0JCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyApIik7Ci0JCQlleHBydG9rZW4oZXMpOwotCQl9IGVsc2UgaWYgKG9wID09IE9fUExVU1BMVVMgfHwgb3AgPT0gT19NSU5VU01JTlVTKSB7Ci0JCQlleHBydG9rZW4oZXMpOwotCQkJdmwgPSBkb19wcG1tKGVzLCBvcCwgZXMtPnZhbCwgdHJ1ZSk7Ci0JCQlleHBydG9rZW4oZXMpOwotCQl9IGVsc2UgaWYgKG9wID09IFZBUiB8fCBvcCA9PSBMSVQpIHsKLQkJCXZsID0gZXMtPnZhbDsKLQkJCWV4cHJ0b2tlbihlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlldmFsZXJyKGVzLCBFVF9VTkVYUEVDVEVELCBOVUxMKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCQlpZiAoZXMtPnRvayA9PSBPX1BMVVNQTFVTIHx8IGVzLT50b2sgPT0gT19NSU5VU01JTlVTKSB7Ci0JCQl2bCA9IGRvX3BwbW0oZXMsIGVzLT50b2ssIHZsLCBmYWxzZSk7Ci0JCQlleHBydG9rZW4oZXMpOwotCQl9Ci0JCXJldHVybiAodmwpOwotCX0KLQl2bCA9IGV2YWxleHByKGVzLCBwcmVjIC0gMSk7Ci0JZm9yIChvcCA9IGVzLT50b2s7IElTX0JJTk9QKG9wKSAmJiBvcGluZm9bKGludClvcF0ucHJlYyA9PSBwcmVjOwotCSAgICBvcCA9IGVzLT50b2spIHsKLQkJZXhwcnRva2VuKGVzKTsKLQkJdmFzbiA9IHZsOwotCQlpZiAob3AgIT0gT19BU04pIC8qIHZsIG1heSBub3QgaGF2ZSBhIHZhbHVlIHlldCAqLwotCQkJdmwgPSBpbnR2YXIoZXMsIHZsKTsKLQkJaWYgKElTX0FTU0lHTk9QKG9wKSkgewotCQkJYXNzaWduX2NoZWNrKGVzLCBvcCwgdmFzbik7Ci0JCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIFBfQVNTSUdOKSk7Ci0JCX0gZWxzZSBpZiAob3AgIT0gT19URVJOICYmIG9wICE9IE9fTEFORCAmJiBvcCAhPSBPX0xPUikKLQkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgcHJlYyAtIDEpKTsKLQkJaWYgKChvcCA9PSBPX0RJViB8fCBvcCA9PSBPX01PRCB8fCBvcCA9PSBPX0RJVkFTTiB8fAotCQkgICAgb3AgPT0gT19NT0RBU04pICYmIHZyLT52YWwuaSA9PSAwKSB7Ci0JCQlpZiAoZXMtPm5vYXNzaWduKQotCQkJCXZyLT52YWwuaSA9IDE7Ci0JCQllbHNlCi0JCQkJZXZhbGVycihlcywgRVRfU1RSLCAiemVybyBkaXZpc29yIik7Ci0JCX0KLQkJc3dpdGNoICgoaW50KW9wKSB7Ci0JCWNhc2UgT19USU1FUzoKLQkJY2FzZSBPX1RJTUVTQVNOOgotCQkJcmVzID0gYml2dWkodmwsICosIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fRElWOgotCQljYXNlIE9fRElWQVNOOgotCQkJcmVzID0gYml2dWkodmwsIC8sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fTU9EOgotCQljYXNlIE9fTU9EQVNOOgotCQkJcmVzID0gYml2dWkodmwsICUsIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fUExVUzoKLQkJY2FzZSBPX1BMVVNBU046Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgKywgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19NSU5VUzoKLQkJY2FzZSBPX01JTlVTQVNOOgotCQkJcmVzID0gYml2dWkodmwsIC0sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fTFNISUZUOgotCQljYXNlIE9fTFNISUZUQVNOOgotCQkJcmVzID0gYml2dWkodmwsIDw8LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX1JTSElGVDoKLQkJY2FzZSBPX1JTSElGVEFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCA+PiwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19MVDoKLQkJCXJlcyA9IGJpdnVpKHZsLCA8LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0xFOgotCQkJcmVzID0gYml2dWkodmwsIDw9LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0dUOgotCQkJcmVzID0gYml2dWkodmwsID4sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fR0U6Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgPj0sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fRVE6Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgPT0sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fTkU6Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgIT0sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fQkFORDoKLQkJY2FzZSBPX0JBTkRBU046Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgJiwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19CWE9SOgotCQljYXNlIE9fQlhPUkFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCBeLCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0JPUjoKLQkJY2FzZSBPX0JPUkFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCB8LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0xBTkQ6Ci0JCQlpZiAoIXZsLT52YWwuaSkKLQkJCQllcy0+bm9hc3NpZ24rKzsKLQkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgcHJlYyAtIDEpKTsKLQkJCXJlcyA9IGJpdnVpKHZsLCAmJiwgdnIpOwotCQkJaWYgKCF2bC0+dmFsLmkpCi0JCQkJZXMtPm5vYXNzaWduLS07Ci0JCQlicmVhazsKLQkJY2FzZSBPX0xPUjoKLQkJCWlmICh2bC0+dmFsLmkpCi0JCQkJZXMtPm5vYXNzaWduKys7Ci0JCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgfHwsIHZyKTsKLQkJCWlmICh2bC0+dmFsLmkpCi0JCQkJZXMtPm5vYXNzaWduLS07Ci0JCQlicmVhazsKLQkJY2FzZSBPX1RFUk46Ci0JCQl7Ci0JCQkJYm9vbCBldiA9IHZsLT52YWwuaSAhPSAwOwotCi0JCQkJaWYgKCFldikKLQkJCQkJZXMtPm5vYXNzaWduKys7Ci0JCQkJdmwgPSBldmFsZXhwcihlcywgTUFYX1BSRUMpOwotCQkJCWlmICghZXYpCi0JCQkJCWVzLT5ub2Fzc2lnbi0tOwotCQkJCWlmIChlcy0+dG9rICE9IENURVJOKQotCQkJCQlldmFsZXJyKGVzLCBFVF9TVFIsICJtaXNzaW5nIDoiKTsKLQkJCQlleHBydG9rZW4oZXMpOwotCQkJCWlmIChldikKLQkJCQkJZXMtPm5vYXNzaWduKys7Ci0JCQkJdnIgPSBldmFsZXhwcihlcywgUF9URVJOKTsKLQkJCQlpZiAoZXYpCi0JCQkJCWVzLT5ub2Fzc2lnbi0tOwotCQkJCXZsID0gZXYgPyB2bCA6IHZyOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT19BU046Ci0JCQlyZXMgPSB2ci0+dmFsLmk7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0NPTU1BOgotCQkJcmVzID0gdnItPnZhbC5pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKElTX0FTU0lHTk9QKG9wKSkgewotCQkJc3R2dWkodnIsIHJlcyk7Ci0JCQlpZiAoIWVzLT5ub2Fzc2lnbikgewotCQkJCWlmICh2YXNuLT5mbGFnICYgSU5URUdFUikKLQkJCQkJc2V0aW50X3YodmFzbiwgdnIsIGVzLT5hcml0aCk7Ci0JCQkJZWxzZQotCQkJCQlzZXRpbnQodmFzbiwgcmVzKTsKLQkJCX0KLQkJCXZsID0gdnI7Ci0JCX0gZWxzZSBpZiAob3AgIT0gT19URVJOKQotCQkJc3R2dWkodmwsIHJlcyk7Ci0JfQotCXJldHVybiAodmwpOwotfQotCi1zdGF0aWMgdm9pZAotZXhwcnRva2VuKEV4cHJfc3RhdGUgKmVzKQotewotCWNvbnN0IGNoYXIgKmNwID0gZXMtPnRva3A7Ci0JaW50IGM7Ci0JY2hhciAqdHZhcjsKLQotCS8qIHNraXAgd2hpdGUgc3BhY2UgKi8KLSBza2lwX3NwYWNlczoKLQl3aGlsZSAoKGMgPSAqY3ApLCBrc2hfaXNzcGFjZShjKSkKLQkJKytjcDsKLQlpZiAoZXMtPnRva3AgPT0gZXMtPmV4cHJlc3Npb24gJiYgYyA9PSAnIycpIHsKLQkJLyogZXhwcmVzc2lvbiBiZWdpbnMgd2l0aCAjICovCi0JCWVzLT5uYXR1cmFsID0gdHJ1ZTsJLyogc3dpdGNoIHRvIHVuc2lnbmVkICovCi0JCSsrY3A7Ci0JCWdvdG8gc2tpcF9zcGFjZXM7Ci0JfQotCWVzLT50b2twID0gY3A7Ci0KLQlpZiAoYyA9PSAnXDAnKQotCQllcy0+dG9rID0gRU5EOwotCWVsc2UgaWYgKGtzaF9pc2FscGh4KGMpKSB7Ci0JCWZvciAoOyBrc2hfaXNhbG51eChjKTsgYyA9ICpjcCkKLQkJCWNwKys7Ci0JCWlmIChjID09ICdbJykgewotCQkJaW50IGxlbjsKLQotCQkJbGVuID0gYXJyYXlfcmVmX2xlbihjcCk7Ci0JCQlpZiAobGVuID09IDApCi0JCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyBdIik7Ci0JCQljcCArPSBsZW47Ci0JCX0gZWxzZSBpZiAoYyA9PSAnKCcgLyopKi8gKSB7Ci0JCQkvKiB0b2RvOiBhZGQgbWF0aCBmdW5jdGlvbnMgKGFsbCB0YWtlIHNpbmdsZSBhcmd1bWVudCk6Ci0JCQkgKiBhYnMgYWNvcyBhc2luIGF0YW4gY29zIGNvc2ggZXhwIGludCBsb2cgc2luIHNpbmggc3FydAotCQkJICogdGFuIHRhbmgKLQkJCSAqLwotCQkJOwotCQl9Ci0JCWlmIChlcy0+bm9hc3NpZ24pIHsKLQkJCWVzLT52YWwgPSB0ZW1wdmFyKCk7Ci0JCQllcy0+dmFsLT5mbGFnIHw9IEVYUFJMVkFMVUU7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgY3AgLSBlcy0+dG9rcCwgQVRFTVApOwotCQkJZXMtPnZhbCA9IGdsb2JhbCh0dmFyKTsKLQkJCWFmcmVlKHR2YXIsIEFURU1QKTsKLQkJfQotCQllcy0+dG9rID0gVkFSOwotCX0gZWxzZSBpZiAoYyA9PSAnMScgJiYgY3BbMV0gPT0gJyMnKSB7Ci0JCWNwICs9IDI7Ci0JCWNwICs9IHV0Zl9wdHJhZGooY3ApOwotCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgY3AgLSBlcy0+dG9rcCwgQVRFTVApOwotCQlnb3RvIHByb2Nlc3NfdHZhcjsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCX0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7Ci0JCSsrY3A7Ci0JCWNwICs9IHV0Zl9wdHJhZGooY3ApOwotCQlpZiAoKmNwKysgIT0gJ1wnJykKLQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwKLQkJCSAgICAibXVsdGktY2hhcmFjdGVyIGNoYXJhY3RlciBjb25zdGFudCIpOwotCQkvKiAneCcgLT4gMSN4ICh4ID0gb25lIG11bHRpYnl0ZSBjaGFyYWN0ZXIpICovCi0JCWMgPSBjcCAtIGVzLT50b2twOwotCQl0dmFyID0gYWxsb2MoYyArIC8qIE5VTCAqLyAxLCBBVEVNUCk7Ci0JCXR2YXJbMF0gPSAnMSc7Ci0JCXR2YXJbMV0gPSAnIyc7Ci0JCW1lbWNweSh0dmFyICsgMiwgZXMtPnRva3AgKyAxLCBjIC0gMik7Ci0JCXR2YXJbY10gPSAnXDAnOwotCQlnb3RvIHByb2Nlc3NfdHZhcjsKLSNlbmRpZgotCX0gZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpIHsKLQkJd2hpbGUgKGMgIT0gJ18nICYmIChrc2hfaXNhbG51eChjKSB8fCBjID09ICcjJykpCi0JCQljID0gKmNwKys7Ci0JCXN0cm5kdXB4KHR2YXIsIGVzLT50b2twLCAtLWNwIC0gZXMtPnRva3AsIEFURU1QKTsKLSBwcm9jZXNzX3R2YXI6Ci0JCWVzLT52YWwgPSB0ZW1wdmFyKCk7Ci0JCWVzLT52YWwtPmZsYWcgJj0gfklOVEVHRVI7Ci0JCWVzLT52YWwtPnR5cGUgPSAwOwotCQllcy0+dmFsLT52YWwucyA9IHR2YXI7Ci0JCWlmIChzZXRpbnRfdihlcy0+dmFsLCBlcy0+dmFsLCBlcy0+YXJpdGgpID09IE5VTEwpCi0JCQlldmFsZXJyKGVzLCBFVF9CQURMSVQsIHR2YXIpOwotCQlhZnJlZSh0dmFyLCBBVEVNUCk7Ci0JCWVzLT50b2sgPSBMSVQ7Ci0JfSBlbHNlIHsKLQkJaW50IGksIG4wOwotCi0JCWZvciAoaSA9IDA7IChuMCA9IG9waW5mb1tpXS5uYW1lWzBdKTsgaSsrKQotCQkJaWYgKGMgPT0gbjAgJiYgc3RybmNtcChjcCwgb3BpbmZvW2ldLm5hbWUsCi0JCQkgICAgKHNpemVfdClvcGluZm9baV0ubGVuKSA9PSAwKSB7Ci0JCQkJZXMtPnRvayA9IChlbnVtIHRva2VuKWk7Ci0JCQkJY3AgKz0gb3BpbmZvW2ldLmxlbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJaWYgKCFuMCkKLQkJCWVzLT50b2sgPSBCQUQ7Ci0JfQotCWVzLT50b2twID0gY3A7Ci19Ci0KLS8qIERvIGEgKysgb3IgLS0gb3BlcmF0aW9uICovCi1zdGF0aWMgc3RydWN0IHRibCAqCi1kb19wcG1tKEV4cHJfc3RhdGUgKmVzLCBlbnVtIHRva2VuIG9wLCBzdHJ1Y3QgdGJsICp2YXNuLCBib29sIGlzX3ByZWZpeCkKLXsKLQlzdHJ1Y3QgdGJsICp2bDsKLQlta3NoX2FyaV90IG92YWw7Ci0KLQlhc3NpZ25fY2hlY2soZXMsIG9wLCB2YXNuKTsKLQotCXZsID0gaW50dmFyKGVzLCB2YXNuKTsKLQlvdmFsID0gdmwtPnZhbC5pOwotCWlmIChvcCA9PSBPX1BMVVNQTFVTKSB7Ci0JCWlmIChlcy0+bmF0dXJhbCkKLQkJCSsrdmwtPnZhbC51OwotCQllbHNlCi0JCQkrK3ZsLT52YWwuaTsKLQl9IGVsc2UgewotCQlpZiAoZXMtPm5hdHVyYWwpCi0JCQktLXZsLT52YWwudTsKLQkJZWxzZQotCQkJLS12bC0+dmFsLmk7Ci0JfQotCWlmICh2YXNuLT5mbGFnICYgSU5URUdFUikKLQkJc2V0aW50X3YodmFzbiwgdmwsIGVzLT5hcml0aCk7Ci0JZWxzZQotCQlzZXRpbnQodmFzbiwgdmwtPnZhbC5pKTsKLQlpZiAoIWlzX3ByZWZpeCkJCS8qIHVuZG8gdGhlIGluYy9kZWMgKi8KLQkJdmwtPnZhbC5pID0gb3ZhbDsKLQotCXJldHVybiAodmwpOwotfQotCi1zdGF0aWMgdm9pZAotYXNzaWduX2NoZWNrKEV4cHJfc3RhdGUgKmVzLCBlbnVtIHRva2VuIG9wLCBzdHJ1Y3QgdGJsICp2YXNuKQotewotCWlmIChlcy0+dG9rID09IEVORCB8fAotCSAgICAodmFzbi0+bmFtZVswXSA9PSAnXDAnICYmICEodmFzbi0+ZmxhZyAmIEVYUFJMVkFMVUUpKSkKLQkJZXZhbGVycihlcywgRVRfTFZBTFVFLCBvcGluZm9bKGludClvcF0ubmFtZSk7Ci0JZWxzZSBpZiAodmFzbi0+ZmxhZyAmIFJET05MWSkKLQkJZXZhbGVycihlcywgRVRfUkRPTkxZLCBvcGluZm9bKGludClvcF0ubmFtZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGJsICoKLXRlbXB2YXIodm9pZCkKLXsKLQlzdHJ1Y3QgdGJsICp2cDsKLQotCXZwID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YmwpLCBBVEVNUCk7Ci0JdnAtPmZsYWcgPSBJU1NFVHxJTlRFR0VSOwotCXZwLT50eXBlID0gMDsKLQl2cC0+YXJlYXAgPSBBVEVNUDsKLQl2cC0+dWEuaHZhbCA9IDA7Ci0JdnAtPnZhbC5pID0gMDsKLQl2cC0+bmFtZVswXSA9ICdcMCc7Ci0JcmV0dXJuICh2cCk7Ci19Ci0KLS8qIGNhc3QgKHN0cmluZykgdmFyaWFibGUgdG8gdGVtcG9yYXJ5IGludGVnZXIgdmFyaWFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgdGJsICoKLWludHZhcihFeHByX3N0YXRlICplcywgc3RydWN0IHRibCAqdnApCi17Ci0Jc3RydWN0IHRibCAqdnE7Ci0KLQkvKiB0cnkgdG8gYXZvaWQgcmVwbGFjaW5nIGEgdGVtcCB2YXIgd2l0aCBhbm90aGVyIHRlbXAgdmFyICovCi0JaWYgKHZwLT5uYW1lWzBdID09ICdcMCcgJiYKLQkgICAgKHZwLT5mbGFnICYgKElTU0VUfElOVEVHRVJ8RVhQUkxWQUxVRSkpID09IChJU1NFVHxJTlRFR0VSKSkKLQkJcmV0dXJuICh2cCk7Ci0KLQl2cSA9IHRlbXB2YXIoKTsKLQlpZiAoc2V0aW50X3YodnEsIHZwLCBlcy0+YXJpdGgpID09IE5VTEwpIHsKLQkJaWYgKHZwLT5mbGFnICYgRVhQUklORVZBTCkKLQkJCWV2YWxlcnIoZXMsIEVUX1JFQ1VSU0lWRSwgdnAtPm5hbWUpOwotCQllcy0+ZXZhbGluZyA9IHZwOwotCQl2cC0+ZmxhZyB8PSBFWFBSSU5FVkFMOwotCQl2X2V2YWx1YXRlKHZxLCBzdHJfdmFsKHZwKSwgS1NIX1VOV0lORF9FUlJPUiwgZXMtPmFyaXRoKTsKLQkJdnAtPmZsYWcgJj0gfkVYUFJJTkVWQUw7Ci0JCWVzLT5ldmFsaW5nID0gTlVMTDsKLQl9Ci0JcmV0dXJuICh2cSk7Ci19Ci0KLQotLyoKLSAqIFVURi04IHN1cHBvcnQgY29kZTogaGlnaC1sZXZlbCBmdW5jdGlvbnMKLSAqLwotCi1pbnQKLXV0Zl93aWR0aGFkaihjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKipkc3QpCi17Ci0Jc2l6ZV90IGxlbjsKLQl1bnNpZ25lZCBpbnQgd2M7Ci0JaW50IHdpZHRoOwotCi0JaWYgKCFVVEZNT0RFIHx8IChsZW4gPSB1dGZfbWJ0b3djKCZ3Yywgc3JjKSkgPT0gKHNpemVfdCktMSB8fAotCSAgICB3YyA9PSAwKQotCQlsZW4gPSB3aWR0aCA9IDE7Ci0JZWxzZSBpZiAoKHdpZHRoID0gdXRmX3djd2lkdGgod2MpKSA8IDApCi0JCS8qIFhYWCB1c2UgMiBmb3IgeF96b3RjMyBoZXJlPyAqLwotCQl3aWR0aCA9IDE7Ci0KLQlpZiAoZHN0KQotCQkqZHN0ID0gc3JjICsgbGVuOwotCXJldHVybiAod2lkdGgpOwotfQotCi1pbnQKLXV0Zl9tYnN3aWR0aChjb25zdCBjaGFyICpzKQotewotCXNpemVfdCBsZW47Ci0JdW5zaWduZWQgaW50IHdjOwotCWludCB3aWR0aCA9IDAsIGN3OwotCi0JaWYgKCFVVEZNT0RFKQotCQlyZXR1cm4gKHN0cmxlbihzKSk7Ci0KLQl3aGlsZSAoKnMpCi0JCWlmICgoKGxlbiA9IHV0Zl9tYnRvd2MoJndjLCBzKSkgPT0gKHNpemVfdCktMSkgfHwKLQkJICAgICgoY3cgPSB1dGZfd2N3aWR0aCh3YykpID09IC0xKSkgewotCQkJcysrOwotCQkJd2lkdGggKz0gMTsKLQkJfSBlbHNlIHsKLQkJCXMgKz0gbGVuOwotCQkJd2lkdGggKz0gY3c7Ci0JCX0KLQlyZXR1cm4gKHdpZHRoKTsKLX0KLQotY29uc3QgY2hhciAqCi11dGZfc2tpcGNvbHMoY29uc3QgY2hhciAqcCwgaW50IGNvbHMpCi17Ci0JaW50IGMgPSAwOwotCi0Jd2hpbGUgKGMgPCBjb2xzKSB7Ci0JCWlmICghKnApCi0JCQlyZXR1cm4gKHAgKyBjb2xzIC0gYyk7Ci0JCWMgKz0gdXRmX3dpZHRoYWRqKHAsICZwKTsKLQl9Ci0JcmV0dXJuIChwKTsKLX0KLQotc2l6ZV90Ci11dGZfcHRyYWRqKGNvbnN0IGNoYXIgKnNyYykKLXsKLQlyZWdpc3RlciBzaXplX3QgbjsKLQotCWlmICghVVRGTU9ERSB8fAotCSAgICAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikoc3JjKSA8IDB4QzIgfHwKLQkgICAgKG4gPSB1dGZfbWJ0b3djKE5VTEwsIHNyYykpID09IChzaXplX3QpLTEpCi0JCW4gPSAxOwotCXJldHVybiAobik7Ci19Ci0KLS8qCi0gKiBVVEYtOCBzdXBwb3J0IGNvZGU6IGxvdy1sZXZlbCBmdW5jdGlvbnMKLSAqLwotCi0vKiBDRVNVLTggbXVsdGlieXRlIGFuZCB3aWRlIGNoYXJhY3RlciBjb252ZXJzaW9uIGNyYWZ0ZWQgZm9yIG1rc2ggKi8KLQotc2l6ZV90Ci11dGZfbWJ0b3djKHVuc2lnbmVkIGludCAqZHN0LCBjb25zdCBjaGFyICpzcmMpCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjOwotCXVuc2lnbmVkIGludCBjLCB3YzsKLQotCWlmICgod2MgPSAqcysrKSA8IDB4ODApIHsKLSBvdXQ6Ci0JCWlmIChkc3QgIT0gTlVMTCkKLQkJCSpkc3QgPSB3YzsKLQkJcmV0dXJuICh3YyA/ICgoY29uc3QgY2hhciAqKXMgLSBzcmMpIDogMCk7Ci0JfQotCWlmICh3YyA8IDB4QzIgfHwgd2MgPj0gMHhGMCkKLQkJLyogPCAweEMwOiBzcHVyaW91cyBzZWNvbmQgYnl0ZSAqLwotCQkvKiA8IDB4QzI6IG5vbi1taW5pbWFsaXN0aWMgbWFwcGluZyBlcnJvciBpbiAyLWJ5dGUgc2VxcyAqLwotCQkvKiA+IDB4RUY6IGJleW9uZCBCTVAgKi8KLQkJZ290byBpbHNlcTsKLQotCWlmICh3YyA8IDB4RTApIHsKLQkJd2MgPSAod2MgJiAweDFGKSA8PCA2OwotCQlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQotCQkJZ290byBpbHNlcTsKLQkJd2MgfD0gYyAmIDB4M0Y7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXdjID0gKHdjICYgMHgwRikgPDwgMTI7Ci0KLQlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQotCQlnb3RvIGlsc2VxOwotCXdjIHw9IChjICYgMHgzRikgPDwgNjsKLQotCWlmICgoKGMgPSAqcysrKSAmIDB4QzApICE9IDB4ODApCi0JCWdvdG8gaWxzZXE7Ci0Jd2MgfD0gYyAmIDB4M0Y7Ci0KLQkvKiBDaGVjayBmb3Igbm9uLW1pbmltYWxpc3RpYyBtYXBwaW5nIGVycm9yIGluIDMtYnl0ZSBzZXFzICovCi0JaWYgKHdjID49IDB4MDgwMCAmJiB3YyA8PSAweEZGRkQpCi0JCWdvdG8gb3V0OwotIGlsc2VxOgotCXJldHVybiAoKHNpemVfdCkoLTEpKTsKLX0KLQotc2l6ZV90Ci11dGZfd2N0b21iKGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IHdjKQotewotCXVuc2lnbmVkIGNoYXIgKmQ7Ci0KLQlpZiAod2MgPCAweDgwKSB7Ci0JCSpkc3QgPSB3YzsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlkID0gKHVuc2lnbmVkIGNoYXIgKilkc3Q7Ci0JaWYgKHdjIDwgMHgwODAwKQotCQkqZCsrID0gKHdjID4+IDYpIHwgMHhDMDsKLQllbHNlIHsKLQkJKmQrKyA9ICgod2MgPSB3YyA+IDB4RkZGRCA/IDB4RkZGRCA6IHdjKSA+PiAxMikgfCAweEUwOwotCQkqZCsrID0gKCh3YyA+PiA2KSAmIDB4M0YpIHwgMHg4MDsKLQl9Ci0JKmQrKyA9ICh3YyAmIDB4M0YpIHwgMHg4MDsKLQlyZXR1cm4gKChjaGFyICopZCAtIGRzdCk7Ci19Ci0KLQotI2lmbmRlZiBNS1NIX21pcmJzZF93Y3dpZHRoCi0vKiAtLS0gYmVnaW4gb2Ygd2N3aWR0aC5jIGV4Y2VycHQgLS0tICovCi0vKi0KLSAqIE1hcmt1cyBLdWhuIC0tIDIwMDctMDUtMjYgKFVuaWNvZGUgNS4wKQotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLSAqIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuIFRoZSBhdXRob3IKLSAqIGRpc2NsYWltcyBhbGwgd2FycmFudGllcyB3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLgotICovCi0KLV9fUkNTSUQoIiRtaXJvczogc3JjL2xpYi9saWJjL2kxOG4vd2N3aWR0aC5jLHYgMS44IDIwMDgvMDkvMjAgMTI6MDE6MTggdGcgRXhwICQiKTsKLQotaW50Ci11dGZfd2N3aWR0aCh1bnNpZ25lZCBpbnQgYykKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGNic2V0IHsKLQkJdW5zaWduZWQgc2hvcnQgZmlyc3Q7Ci0JCXVuc2lnbmVkIHNob3J0IGxhc3Q7Ci0JfSBjb21iW10gPSB7Ci0JCXsgMHgwMzAwLCAweDAzNkYgfSwgeyAweDA0ODMsIDB4MDQ4NiB9LCB7IDB4MDQ4OCwgMHgwNDg5IH0sCi0JCXsgMHgwNTkxLCAweDA1QkQgfSwgeyAweDA1QkYsIDB4MDVCRiB9LCB7IDB4MDVDMSwgMHgwNUMyIH0sCi0JCXsgMHgwNUM0LCAweDA1QzUgfSwgeyAweDA1QzcsIDB4MDVDNyB9LCB7IDB4MDYwMCwgMHgwNjAzIH0sCi0JCXsgMHgwNjEwLCAweDA2MTUgfSwgeyAweDA2NEIsIDB4MDY1RSB9LCB7IDB4MDY3MCwgMHgwNjcwIH0sCi0JCXsgMHgwNkQ2LCAweDA2RTQgfSwgeyAweDA2RTcsIDB4MDZFOCB9LCB7IDB4MDZFQSwgMHgwNkVEIH0sCi0JCXsgMHgwNzBGLCAweDA3MEYgfSwgeyAweDA3MTEsIDB4MDcxMSB9LCB7IDB4MDczMCwgMHgwNzRBIH0sCi0JCXsgMHgwN0E2LCAweDA3QjAgfSwgeyAweDA3RUIsIDB4MDdGMyB9LCB7IDB4MDkwMSwgMHgwOTAyIH0sCi0JCXsgMHgwOTNDLCAweDA5M0MgfSwgeyAweDA5NDEsIDB4MDk0OCB9LCB7IDB4MDk0RCwgMHgwOTREIH0sCi0JCXsgMHgwOTUxLCAweDA5NTQgfSwgeyAweDA5NjIsIDB4MDk2MyB9LCB7IDB4MDk4MSwgMHgwOTgxIH0sCi0JCXsgMHgwOUJDLCAweDA5QkMgfSwgeyAweDA5QzEsIDB4MDlDNCB9LCB7IDB4MDlDRCwgMHgwOUNEIH0sCi0JCXsgMHgwOUUyLCAweDA5RTMgfSwgeyAweDBBMDEsIDB4MEEwMiB9LCB7IDB4MEEzQywgMHgwQTNDIH0sCi0JCXsgMHgwQTQxLCAweDBBNDIgfSwgeyAweDBBNDcsIDB4MEE0OCB9LCB7IDB4MEE0QiwgMHgwQTREIH0sCi0JCXsgMHgwQTcwLCAweDBBNzEgfSwgeyAweDBBODEsIDB4MEE4MiB9LCB7IDB4MEFCQywgMHgwQUJDIH0sCi0JCXsgMHgwQUMxLCAweDBBQzUgfSwgeyAweDBBQzcsIDB4MEFDOCB9LCB7IDB4MEFDRCwgMHgwQUNEIH0sCi0JCXsgMHgwQUUyLCAweDBBRTMgfSwgeyAweDBCMDEsIDB4MEIwMSB9LCB7IDB4MEIzQywgMHgwQjNDIH0sCi0JCXsgMHgwQjNGLCAweDBCM0YgfSwgeyAweDBCNDEsIDB4MEI0MyB9LCB7IDB4MEI0RCwgMHgwQjREIH0sCi0JCXsgMHgwQjU2LCAweDBCNTYgfSwgeyAweDBCODIsIDB4MEI4MiB9LCB7IDB4MEJDMCwgMHgwQkMwIH0sCi0JCXsgMHgwQkNELCAweDBCQ0QgfSwgeyAweDBDM0UsIDB4MEM0MCB9LCB7IDB4MEM0NiwgMHgwQzQ4IH0sCi0JCXsgMHgwQzRBLCAweDBDNEQgfSwgeyAweDBDNTUsIDB4MEM1NiB9LCB7IDB4MENCQywgMHgwQ0JDIH0sCi0JCXsgMHgwQ0JGLCAweDBDQkYgfSwgeyAweDBDQzYsIDB4MENDNiB9LCB7IDB4MENDQywgMHgwQ0NEIH0sCi0JCXsgMHgwQ0UyLCAweDBDRTMgfSwgeyAweDBENDEsIDB4MEQ0MyB9LCB7IDB4MEQ0RCwgMHgwRDREIH0sCi0JCXsgMHgwRENBLCAweDBEQ0EgfSwgeyAweDBERDIsIDB4MERENCB9LCB7IDB4MERENiwgMHgwREQ2IH0sCi0JCXsgMHgwRTMxLCAweDBFMzEgfSwgeyAweDBFMzQsIDB4MEUzQSB9LCB7IDB4MEU0NywgMHgwRTRFIH0sCi0JCXsgMHgwRUIxLCAweDBFQjEgfSwgeyAweDBFQjQsIDB4MEVCOSB9LCB7IDB4MEVCQiwgMHgwRUJDIH0sCi0JCXsgMHgwRUM4LCAweDBFQ0QgfSwgeyAweDBGMTgsIDB4MEYxOSB9LCB7IDB4MEYzNSwgMHgwRjM1IH0sCi0JCXsgMHgwRjM3LCAweDBGMzcgfSwgeyAweDBGMzksIDB4MEYzOSB9LCB7IDB4MEY3MSwgMHgwRjdFIH0sCi0JCXsgMHgwRjgwLCAweDBGODQgfSwgeyAweDBGODYsIDB4MEY4NyB9LCB7IDB4MEY5MCwgMHgwRjk3IH0sCi0JCXsgMHgwRjk5LCAweDBGQkMgfSwgeyAweDBGQzYsIDB4MEZDNiB9LCB7IDB4MTAyRCwgMHgxMDMwIH0sCi0JCXsgMHgxMDMyLCAweDEwMzIgfSwgeyAweDEwMzYsIDB4MTAzNyB9LCB7IDB4MTAzOSwgMHgxMDM5IH0sCi0JCXsgMHgxMDU4LCAweDEwNTkgfSwgeyAweDExNjAsIDB4MTFGRiB9LCB7IDB4MTM1RiwgMHgxMzVGIH0sCi0JCXsgMHgxNzEyLCAweDE3MTQgfSwgeyAweDE3MzIsIDB4MTczNCB9LCB7IDB4MTc1MiwgMHgxNzUzIH0sCi0JCXsgMHgxNzcyLCAweDE3NzMgfSwgeyAweDE3QjQsIDB4MTdCNSB9LCB7IDB4MTdCNywgMHgxN0JEIH0sCi0JCXsgMHgxN0M2LCAweDE3QzYgfSwgeyAweDE3QzksIDB4MTdEMyB9LCB7IDB4MTdERCwgMHgxN0REIH0sCi0JCXsgMHgxODBCLCAweDE4MEQgfSwgeyAweDE4QTksIDB4MThBOSB9LCB7IDB4MTkyMCwgMHgxOTIyIH0sCi0JCXsgMHgxOTI3LCAweDE5MjggfSwgeyAweDE5MzIsIDB4MTkzMiB9LCB7IDB4MTkzOSwgMHgxOTNCIH0sCi0JCXsgMHgxQTE3LCAweDFBMTggfSwgeyAweDFCMDAsIDB4MUIwMyB9LCB7IDB4MUIzNCwgMHgxQjM0IH0sCi0JCXsgMHgxQjM2LCAweDFCM0EgfSwgeyAweDFCM0MsIDB4MUIzQyB9LCB7IDB4MUI0MiwgMHgxQjQyIH0sCi0JCXsgMHgxQjZCLCAweDFCNzMgfSwgeyAweDFEQzAsIDB4MURDQSB9LCB7IDB4MURGRSwgMHgxREZGIH0sCi0JCXsgMHgyMDBCLCAweDIwMEYgfSwgeyAweDIwMkEsIDB4MjAyRSB9LCB7IDB4MjA2MCwgMHgyMDYzIH0sCi0JCXsgMHgyMDZBLCAweDIwNkYgfSwgeyAweDIwRDAsIDB4MjBFRiB9LCB7IDB4MzAyQSwgMHgzMDJGIH0sCi0JCXsgMHgzMDk5LCAweDMwOUEgfSwgeyAweEE4MDYsIDB4QTgwNiB9LCB7IDB4QTgwQiwgMHhBODBCIH0sCi0JCXsgMHhBODI1LCAweEE4MjYgfSwgeyAweEZCMUUsIDB4RkIxRSB9LCB7IDB4RkUwMCwgMHhGRTBGIH0sCi0JCXsgMHhGRTIwLCAweEZFMjMgfSwgeyAweEZFRkYsIDB4RkVGRiB9LCB7IDB4RkZGOSwgMHhGRkZCIH0KLQl9OwotCXNpemVfdCBtaW4gPSAwLCBtaWQsIG1heCA9IE5FTEVNKGNvbWIpIC0gMTsKLQotCS8qIHRlc3QgZm9yIDgtYml0IGNvbnRyb2wgY2hhcmFjdGVycyAqLwotCWlmIChjIDwgMzIgfHwgKGMgPj0gMHg3ZiAmJiBjIDwgMHhhMCkpCi0JCXJldHVybiAoYyA/IC0xIDogMCk7Ci0KLQkvKiBiaW5hcnkgc2VhcmNoIGluIHRhYmxlIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMgKi8KLQlpZiAoYyA+PSBjb21iWzBdLmZpcnN0ICYmIGMgPD0gY29tYlttYXhdLmxhc3QpCi0JCXdoaWxlIChtYXggPj0gbWluKSB7Ci0JCQltaWQgPSAobWluICsgbWF4KSAvIDI7Ci0JCQlpZiAoYyA+IGNvbWJbbWlkXS5sYXN0KQotCQkJCW1pbiA9IG1pZCArIDE7Ci0JCQllbHNlIGlmIChjIDwgY29tYlttaWRdLmZpcnN0KQotCQkJCW1heCA9IG1pZCAtIDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgwKTsKLQkJfQotCi0JLyogaWYgd2UgYXJyaXZlIGhlcmUsIGMgaXMgbm90IGEgY29tYmluaW5nIG9yIEMwL0MxIGNvbnRyb2wgY2hhciAqLwotCXJldHVybiAoKGMgPj0gMHgxMTAwICYmICgKLQkgICAgYyA8PSAweDExNWYgfHwgLyogSGFuZ3VsIEphbW8gaW5pdC4gY29uc29uYW50cyAqLwotCSAgICBjID09IDB4MjMyOSB8fCBjID09IDB4MjMyYSB8fAotCSAgICAoYyA+PSAweDJlODAgJiYgYyA8PSAweGE0Y2YgJiYgYyAhPSAweDMwM2YpIHx8IC8qIENKSyAuLi4gWWkgKi8KLQkgICAgKGMgPj0gMHhhYzAwICYmIGMgPD0gMHhkN2EzKSB8fCAvKiBIYW5ndWwgU3lsbGFibGVzICovCi0JICAgIChjID49IDB4ZjkwMCAmJiBjIDw9IDB4ZmFmZikgfHwgLyogQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAqLwotCSAgICAoYyA+PSAweGZlMTAgJiYgYyA8PSAweGZlMTkpIHx8IC8qIFZlcnRpY2FsIGZvcm1zICovCi0JICAgIChjID49IDB4ZmUzMCAmJiBjIDw9IDB4ZmU2ZikgfHwgLyogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KLQkgICAgKGMgPj0gMHhmZjAwICYmIGMgPD0gMHhmZjYwKSB8fCAvKiBGdWxsd2lkdGggRm9ybXMgKi8KLQkgICAgKGMgPj0gMHhmZmUwICYmIGMgPD0gMHhmZmU2KSkpID8gMiA6IDEpOwotfQotLyogLS0tIGVuZCBvZiB3Y3dpZHRoLmMgZXhjZXJwdCAtLS0gKi8KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZnVuY3MuYyBiL21rc2gvc3JjL2Z1bmNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWMwM2EuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvZnVuY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MjkgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGNfa3NoLmMsdiAxLjMzIDIwMDkvMDIvMDcgMTQ6MDM6MjQga2lsaSBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IGNfc2guYyx2IDEuNDEgMjAxMC8wMy8yNyAwOToxMDowMSBqbWMgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBjX3Rlc3QuYyx2IDEuMTggMjAwOS8wMy8wMSAyMDoxMTowNiBvdHRvIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogY191bGltaXQuYyx2IDEuMTcgMjAwOC8wMy8yMSAxMjo1MToxOSBtaWxsZXJ0IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZnVuY3MuYyx2IDEuMTU3IDIwMTAvMDgvMjQgMTQ6NDI6MDEgdGcgRXhwICQiKTsKLQotI2lmIEhBVkVfS0lMTFBHCi0vKgotICogdXNlIGtpbGxwZyBpZiA8IC0xIHNpbmNlIC0xIGRvZXMgc3BlY2lhbCB0aGluZ3MKLSAqIGZvciBzb21lIG5vbi1raWxscGctZW5kb3dlZCBraWxscwotICovCi0jZGVmaW5lIG1rc2hfa2lsbChwLHMpCSgocCkgPCAtMSA/IGtpbGxwZygtKHApLCAocykpIDoga2lsbCgocCksIChzKSkpCi0jZWxzZQotLyogY3Jvc3MgZmluZ2VycyBhbmQgaG9wZSBraWxsIGlzIGtpbGxwZy1lbmRvd2VkICovCi0jZGVmaW5lIG1rc2hfa2lsbAlraWxsCi0jZW5kaWYKLQotLyogWFhYIGNvbmRpdGlvbnMgY29ycmVjdD8gKi8KLSNpZiAhZGVmaW5lZChSTElNX0lORklOSVRZKSAmJiAhZGVmaW5lZChNS1NIX05PX0xJTUlUUykKLSNkZWZpbmUgTUtTSF9OT19MSU1JVFMKLSNlbmRpZgotCi0jaWZkZWYgTUtTSF9OT19MSU1JVFMKLSNkZWZpbmUgY191bGltaXQgY19sYWJlbAotI2VuZGlmCi0KLWV4dGVybiB1aW50OF90IHNldF9yZWZmbGFnOwotCi0vKiBBIGxlYWRpbmcgPSBtZWFucyBhc3NpZ25tZW50cyBiZWZvcmUgY29tbWFuZCBhcmUga2VwdDsKLSAqIGEgbGVhZGluZyAqIG1lYW5zIGEgUE9TSVggc3BlY2lhbCBidWlsdGluOwotICogYSBsZWFkaW5nICsgbWVhbnMgYSBQT1NJWCByZWd1bGFyIGJ1aWx0aW4KLSAqICgqIGFuZCArIHNob3VsZCBub3QgYmUgY29tYmluZWQpLgotICovCi1jb25zdCBzdHJ1Y3QgYnVpbHRpbiBta3NoYnVpbHRpbnNbXSA9IHsKLQl7Iio9LiIsIGNfZG90fSwKLQl7Iio9OiIsIGNfbGFiZWx9LAotCXsiWyIsIGNfdGVzdH0sCi0JeyIqPWJyZWFrIiwgY19icmtjb250fSwKLQl7Ij1idWlsdGluIiwgY19idWlsdGlufSwKLQl7Iio9Y29udGludWUiLCBjX2Jya2NvbnR9LAotCXsiKj1ldmFsIiwgY19ldmFsfSwKLQl7Iio9ZXhlYyIsIGNfZXhlY30sCi0JeyIqPWV4aXQiLCBjX2V4aXRyZXR1cm59LAotCXsiK2ZhbHNlIiwgY19sYWJlbH0sCi0JeyIqPXJldHVybiIsIGNfZXhpdHJldHVybn0sCi0JeyIqPXNldCIsIGNfc2V0fSwKLQl7Iio9c2hpZnQiLCBjX3NoaWZ0fSwKLQl7Ij10aW1lcyIsIGNfdGltZXN9LAotCXsiKj10cmFwIiwgY190cmFwfSwKLQl7Iis9d2FpdCIsIGNfd2FpdH0sCi0JeyIrcmVhZCIsIGNfcmVhZH0sCi0JeyJ0ZXN0IiwgY190ZXN0fSwKLQl7Iit0cnVlIiwgY19sYWJlbH0sCi0JeyJ1bGltaXQiLCBjX3VsaW1pdH0sCi0JeyIrdW1hc2siLCBjX3VtYXNrfSwKLQl7Iio9dW5zZXQiLCBjX3Vuc2V0fSwKLQl7IithbGlhcyIsIGNfYWxpYXN9LAkvKiBubyA9OiBBVCZUIG1hbnVhbCB3cm9uZyAqLwotCXsiK2NkIiwgY19jZH0sCi0JeyJjaGRpciIsIGNfY2R9LAkvKiBkYXNoIGNvbXBhdGliaWxpdHkgaGFjayAqLwotCXsiK2NvbW1hbmQiLCBjX2NvbW1hbmR9LAotCXsiZWNobyIsIGNfcHJpbnR9LAotCXsiKj1leHBvcnQiLCBjX3R5cGVzZXR9LAotCXsiK2ZjIiwgY19mY30sCi0JeyIrZ2V0b3B0cyIsIGNfZ2V0b3B0c30sCi0JeyIram9icyIsIGNfam9ic30sCi0JeyIra2lsbCIsIGNfa2lsbH0sCi0JeyJsZXQiLCBjX2xldH0sCi0JeyJwcmludCIsIGNfcHJpbnR9LAotI2lmZGVmIE1LU0hfUFJJTlRGX0JVSUxUSU4KLQl7InByaW50ZiIsIGNfcHJpbnRmfSwKLSNlbmRpZgotCXsicHdkIiwgY19wd2R9LAotCXsiKj1yZWFkb25seSIsIGNfdHlwZXNldH0sCi0Je1RfX3R5cGVzZXQsIGNfdHlwZXNldH0sCi0JeyIrdW5hbGlhcyIsIGNfdW5hbGlhc30sCi0JeyJ3aGVuY2UiLCBjX3doZW5jZX0sCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCXsiK2JnIiwgY19mZ2JnfSwKLQl7IitmZyIsIGNfZmdiZ30sCi0jZW5kaWYKLQl7ImJpbmQiLCBjX2JpbmR9LAotI2lmIEhBVkVfTUtOT0QKLQl7Im1rbm9kIiwgY19ta25vZH0sCi0jZW5kaWYKLQl7InJlYWxwYXRoIiwgY19yZWFscGF0aH0sCi0JeyJyZW5hbWUiLCBjX3JlbmFtZX0sCi0Je05VTEwsIChpbnQgKCopKGNvbnN0IGNoYXIgKiopKU5VTEx9Ci19OwotCi1zdHJ1Y3Qga2lsbF9pbmZvIHsKLQlpbnQgbnVtX3dpZHRoOwotCWludCBuYW1lX3dpZHRoOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0X29wIHsKLQljaGFyIG9wX3RleHRbNF07Ci0JVGVzdF9vcCBvcF9udW07Ci19IHVfb3BzW10gPSB7Ci0JeyItYSIsCVRPX0ZJTEFYU1QgfSwKLQl7Ii1iIiwJVE9fRklMQkRFViB9LAotCXsiLWMiLAlUT19GSUxDREVWIH0sCi0JeyItZCIsCVRPX0ZJTElEIH0sCi0JeyItZSIsCVRPX0ZJTEVYU1QgfSwKLQl7Ii1mIiwJVE9fRklMUkVHIH0sCi0JeyItRyIsCVRPX0ZJTEdJRCB9LAotCXsiLWciLAlUT19GSUxTRVRHIH0sCi0JeyItaCIsCVRPX0ZJTFNZTSB9LAotCXsiLUgiLAlUT19GSUxDREYgfSwKLQl7Ii1rIiwJVE9fRklMU1RDSyB9LAotCXsiLUwiLAlUT19GSUxTWU0gfSwKLQl7Ii1uIiwJVE9fU1ROWkUgfSwKLQl7Ii1PIiwJVE9fRklMVUlEIH0sCi0JeyItbyIsCVRPX09QVElPTiB9LAotCXsiLXAiLAlUT19GSUxGSUZPIH0sCi0JeyItciIsCVRPX0ZJTFJEIH0sCi0JeyItcyIsCVRPX0ZJTEdaIH0sCi0JeyItUyIsCVRPX0ZJTFNPQ0sgfSwKLQl7Ii10IiwJVE9fRklMVFQgfSwKLQl7Ii11IiwJVE9fRklMU0VUVSB9LAotCXsiLXciLAlUT19GSUxXUiB9LAotCXsiLXgiLAlUT19GSUxFWCB9LAotCXsiLXoiLAlUT19TVFpFUiB9LAotCXsiIiwJVE9fTk9OT1AgfQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdF9vcCBiX29wc1tdID0gewotCXsiPSIsCVRPX1NURVFMIH0sCi0JeyI9PSIsCVRPX1NURVFMIH0sCi0JeyIhPSIsCVRPX1NUTkVRIH0sCi0JeyI8IiwJVE9fU1RMVCB9LAotCXsiPiIsCVRPX1NUR1QgfSwKLQl7Ii1lcSIsCVRPX0lOVEVRIH0sCi0JeyItbmUiLAlUT19JTlRORSB9LAotCXsiLWd0IiwJVE9fSU5UR1QgfSwKLQl7Ii1nZSIsCVRPX0lOVEdFIH0sCi0JeyItbHQiLAlUT19JTlRMVCB9LAotCXsiLWxlIiwJVE9fSU5UTEUgfSwKLQl7Ii1lZiIsCVRPX0ZJTEVRIH0sCi0JeyItbnQiLAlUT19GSUxOVCB9LAotCXsiLW90IiwJVE9fRklMT1QgfSwKLQl7IiIsCVRPX05PTk9QIH0KLX07Ci0KLXN0YXRpYyBpbnQgdGVzdF9lYWNjZXNzKGNvbnN0IGNoYXIgKiwgaW50KTsKLXN0YXRpYyBpbnQgdGVzdF9vZXhwcihUZXN0X2VudiAqLCBib29sKTsKLXN0YXRpYyBpbnQgdGVzdF9hZXhwcihUZXN0X2VudiAqLCBib29sKTsKLXN0YXRpYyBpbnQgdGVzdF9uZXhwcihUZXN0X2VudiAqLCBib29sKTsKLXN0YXRpYyBpbnQgdGVzdF9wcmltYXJ5KFRlc3RfZW52ICosIGJvb2wpOwotc3RhdGljIFRlc3Rfb3AgcHRlc3RfaXNhKFRlc3RfZW52ICosIFRlc3RfbWV0YSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqcHRlc3RfZ2V0b3BuZChUZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKLXN0YXRpYyB2b2lkIHB0ZXN0X2Vycm9yKFRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBjaGFyICpraWxsX2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOwotc3RhdGljIHZvaWQgcF90aW1lKHN0cnVjdCBzaGYgKiwgYm9vbCwgbG9uZywgaW50LCBpbnQsCi0gICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopCi0gICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDYsIDcpKSk7Ci1zdGF0aWMgY2hhciAqZG9fcmVhbHBhdGgoY29uc3QgY2hhciAqKTsKLQotc3RhdGljIGNoYXIgKgotZG9fcmVhbHBhdGgoY29uc3QgY2hhciAqdXBhdGgpCi17Ci0JY2hhciAqeHAsICppcCwgKnRwLCAqaXBhdGgsICpsZGVzdCA9IE5VTEw7Ci0JWFN0cmluZyB4czsKLQlwdHJkaWZmX3QgcG9zOwotCXNpemVfdCBsZW47Ci0JaW50IHN5bWxpbmtzID0gMzI7CS8qIG1heC4gcmVjdXJzaW9uIGRlcHRoICovCi0JaW50IGxsZW47Ci0Jc3RydWN0IHN0YXQgc2I7Ci0jaWZkZWYgTk9fUEFUSF9NQVgKLQlzaXplX3QgbGRlc3RsZW4gPSAwOwotI2RlZmluZSBwYXRobGVuIHNiLnN0X3NpemUKLSNkZWZpbmUgcGF0aGNuZCAobGRlc3RsZW4gPCAocGF0aGxlbiArIDEpKQotI2Vsc2UKLSNkZWZpbmUgcGF0aGxlbiBQQVRIX01BWAotI2RlZmluZSBwYXRoY25kICghbGRlc3QpCi0jZW5kaWYKLQotCWlmICh1cGF0aFswXSA9PSAnLycpIHsKLQkJLyogdXBhdGggaXMgYW4gYWJzb2x1dGUgcGF0aG5hbWUgKi8KLQkJc3RyZHVweChpcGF0aCwgdXBhdGgsIEFURU1QKTsKLQl9IGVsc2UgewotCQkvKiB1cGF0aCBpcyBhIHJlbGF0aXZlIHBhdGhuYW1lLCBwcmVwZW5kIGN3ZCAqLwotCQlpZiAoKHRwID0ga3NoX2dldF93ZChOVUxMKSkgPT0gTlVMTCB8fCB0cFswXSAhPSAnLycpCi0JCQlyZXR1cm4gKE5VTEwpOwotCQlpcGF0aCA9IHNoZl9zbXByaW50ZigiJXMvJXMiLCB0cCwgdXBhdGgpOwotCQlhZnJlZSh0cCwgQVRFTVApOwotCX0KLQotCVhpbml0KHhzLCB4cCwgc3RybGVuKGlwID0gaXBhdGgpICsgMSwgQVRFTVApOwotCi0Jd2hpbGUgKCppcCkgewotCQkvKiBza2lwIHNsYXNoZXMgaW4gaW5wdXQgKi8KLQkJd2hpbGUgKCppcCA9PSAnLycpCi0JCQkrK2lwOwotCQlpZiAoISppcCkKLQkJCWJyZWFrOwotCi0JCS8qIGdldCBuZXh0IHBhdGhuYW1lIGNvbXBvbmVudCBmcm9tIGlucHV0ICovCi0JCXRwID0gaXA7Ci0JCXdoaWxlICgqaXAgJiYgKmlwICE9ICcvJykKLQkJCSsraXA7Ci0JCWxlbiA9IGlwIC0gdHA7Ci0KLQkJLyogY2hlY2sgaW5wdXQgZm9yICIuIiBhbmQgIi4uIiAqLwotCQlpZiAodHBbMF0gPT0gJy4nKSB7Ci0JCQlpZiAobGVuID09IDEpCi0JCQkJLyoganVzdCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZSAqLwotCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAobGVuID09IDIgJiYgdHBbMV0gPT0gJy4nKSB7Ci0JCQkJLyogc3RyaXAgb2ZmIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50ICovCi0JCQkJd2hpbGUgKHhwID4gWHN0cmluZyh4cywgeHApKQotCQkJCQlpZiAoKi0teHAgPT0gJy8nKQotCQkJCQkJYnJlYWs7Ci0JCQkJLyogdGhlbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZSAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJLyogc3RvcmUgb3V0cHV0IHBvc2l0aW9uIGF3YXksIHRoZW4gYXBwZW5kIHNsYXNoIHRvIG91dHB1dCAqLwotCQlwb3MgPSBYc2F2ZXBvcyh4cywgeHApOwotCQkvKiAxIGZvciB0aGUgJy8nIGFuZCBsZW4gKyAxIGZvciB0cCBhbmQgdGhlIE5VTCBmcm9tIGJlbG93ICovCi0JCVhjaGVja04oeHMsIHhwLCAxICsgbGVuICsgMSk7Ci0JCVhwdXQoeHMsIHhwLCAnLycpOwotCi0JCS8qIGFwcGVuZCBuZXh0IHBhdGhuYW1lIGNvbXBvbmVudCB0byBvdXRwdXQgKi8KLQkJbWVtY3B5KHhwLCB0cCwgbGVuKTsKLQkJeHAgKz0gbGVuOwotCQkqeHAgPSAnXDAnOwotCi0JCS8qIGxzdGF0IHRoZSBjdXJyZW50IG91dHB1dCwgc2VlIGlmIGl0J3MgYSBzeW1saW5rICovCi0JCWlmIChsc3RhdChYc3RyaW5nKHhzLCB4cCksICZzYikpIHsKLQkJCS8qIGxzdGF0IGZhaWxlZCAqLwotCQkJaWYgKGVycm5vID09IEVOT0VOVCkgewotCQkJCS8qIGJlY2F1c2UgdGhlIHBhdGhuYW1lIGRvZXMgbm90IGV4aXN0ICovCi0JCQkJd2hpbGUgKCppcCA9PSAnLycpCi0JCQkJCS8qIHNraXAgYW55IHRyYWlsaW5nIHNsYXNoZXMgKi8KLQkJCQkJKytpcDsKLQkJCQkvKiBubyBtb3JlIGNvbXBvbmVudHMgbGVmdD8gKi8KLQkJCQlpZiAoISppcCkKLQkJCQkJLyogd2UgY2FuIHN0aWxsIHJldHVybiBzdWNjZXNzZnVsbHkgKi8KLQkJCQkJYnJlYWs7Ci0JCQkJLyogbW9yZSBjb21wb25lbnRzIGxlZnQ/IGZhbGwgdGhyb3VnaCAqLwotCQkJfQotCQkJLyogbm90IEVOT0VOVCBvciBub3QgYXQgdGhlIGVuZCBvZiBpcGF0aCAqLwotCQkJZ290byBub3Rmb3VuZDsKLQkJfQotCi0JCS8qIGNoZWNrIGlmIHdlIGVuY291bnRlcmVkIGEgc3ltbGluaz8gKi8KLQkJaWYgKFNfSVNMTksoc2Iuc3RfbW9kZSkpIHsKLQkJCS8qIHJlYWNoZWQgbWF4aW11bSByZWN1cnNpb24gZGVwdGg/ICovCi0JCQlpZiAoIXN5bWxpbmtzLS0pIHsKLQkJCQkvKiB5ZXAsIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgKi8KLQkJCQllcnJubyA9IEVMT09QOwotCQkJCWdvdG8gbm90Zm91bmQ7Ci0JCQl9Ci0KLQkJCS8qIGdldCBzeW1saW5rKDcpIHRhcmdldCAqLwotCQkJaWYgKHBhdGhjbmQpCi0JCQkJbGRlc3QgPSBhcmVzaXplKGxkZXN0LCBwYXRobGVuICsgMSwgQVRFTVApOwotCQkJbGxlbiA9IHJlYWRsaW5rKFhzdHJpbmcoeHMsIHhwKSwgbGRlc3QsIHBhdGhsZW4pOwotCQkJaWYgKGxsZW4gPCAwKQotCQkJCS8qIG9vcHMuLi4gKi8KLQkJCQlnb3RvIG5vdGZvdW5kOwotCQkJbGRlc3RbbGxlbl0gPSAnXDAnOwotCi0JCQkvKgotCQkJICogcmVzdGFydCBpZiBzeW1saW5rIHRhcmdldCBpcyBhbiBhYnNvbHV0ZSBwYXRoLAotCQkJICogb3RoZXJ3aXNlIGNvbnRpbnVlIHdpdGggY3VycmVudGx5IHJlc29sdmVkIHByZWZpeAotCQkJICovCi0JCQl4cCA9IChsZGVzdFswXSA9PSAnLycpID8gWHN0cmluZyh4cywgeHApIDoKLQkJCSAgICBYcmVzdHBvcyh4cywgeHAsIHBvcyk7Ci0JCQl0cCA9IHNoZl9zbXByaW50ZigiJXMlcyVzIiwgbGRlc3QsICppcCA/ICIvIiA6ICIiLCBpcCk7Ci0JCQlhZnJlZShpcGF0aCwgQVRFTVApOwotCQkJaXAgPSBpcGF0aCA9IHRwOwotCQl9Ci0JCS8qIG90aGVyd2lzZSAobm8gc3ltbGluaykgbWVyZWx5IGdvIG9uICovCi0JfQotCi0JLyoKLQkgKiBlaXRoZXIgZm91bmQgdGhlIHRhcmdldCBhbmQgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGl0LAotCSAqIG9yIGZvdW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGFuZCBtYXkgY3JlYXRlIGl0Ci0JICovCi0JaWYgKFhsZW5ndGgoeHMsIHhwKSA9PSAwKQotCQkvKgotCQkgKiBpZiB0aGUgcmVzb2x2ZWQgcGF0aG5hbWUgaXMgIiIsIG1ha2UgaXQgIi8iLAotCQkgKiBvdGhlcndpc2UgZG8gbm90IGFkZCBhIHRyYWlsaW5nIHNsYXNoCi0JCSAqLwotCQlYcHV0KHhzLCB4cCwgJy8nKTsKLQlYcHV0KHhzLCB4cCwgJ1wwJyk7Ci0KLQkvKgotCSAqIGlmIHNvdXJjZSBwYXRoIGhhZCBhIHRyYWlsaW5nIHNsYXNoLCBjaGVjayBpZiB0YXJnZXQgcGF0aAotCSAqIGlzIG5vdCBhIG5vbi1kaXJlY3RvcnkgZXhpc3RpbmcgZmlsZQotCSAqLwotCWlmIChpcCA+IGlwYXRoICYmIGlwWy0xXSA9PSAnLycpIHsKLQkJaWYgKHN0YXQoWHN0cmluZyh4cywgeHApLCAmc2IpKSB7Ci0JCQlpZiAoZXJybm8gIT0gRU5PRU5UKQotCQkJCWdvdG8gbm90Zm91bmQ7Ci0JCX0gZWxzZSBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKLQkJCWVycm5vID0gRU5PVERJUjsKLQkJCWdvdG8gbm90Zm91bmQ7Ci0JCX0KLQkJLyogdGFyZ2V0IG5vdyBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgYSBkaXJlY3RvcnkgKi8KLQl9Ci0KLQkvKiByZXR1cm4gdGFyZ2V0IHBhdGggKi8KLQlpZiAobGRlc3QgIT0gTlVMTCkKLQkJYWZyZWUobGRlc3QsIEFURU1QKTsKLQlhZnJlZShpcGF0aCwgQVRFTVApOwotCXJldHVybiAoWGNsb3NlKHhzLCB4cCkpOwotCi0gbm90Zm91bmQ6Ci0JbGxlbiA9IGVycm5vOwkvKiBzYXZlOyBmcmVlKDMpIG1pZ2h0IHRyYXNoIGl0ICovCi0JaWYgKGxkZXN0ICE9IE5VTEwpCi0JCWFmcmVlKGxkZXN0LCBBVEVNUCk7Ci0JYWZyZWUoaXBhdGgsIEFURU1QKTsKLQlYZnJlZSh4cywgeHApOwotCWVycm5vID0gbGxlbjsKLQlyZXR1cm4gKE5VTEwpOwotCi0jdW5kZWYgcGF0aGxlbgotI3VuZGVmIHBhdGhjbmQKLX0KLQotaW50Ci1jX2NkKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgb3B0YywgcnYsIHBoeXNfcGF0aDsKLQlib29sIHBoeXNpY2FsID0gRmxhZyhGUEhZU0lDQUwpID8gdHJ1ZSA6IGZhbHNlOwotCWludCBjZG5vZGU7CQkJLyogd2FzIGEgbm9kZSBmcm9tIGNkcGF0aCBhZGRlZCBpbj8gKi8KLQlib29sIHByaW50cGF0aCA9IGZhbHNlOwkJLyogcHJpbnQgd2hlcmUgd2UgY2QnZD8gKi8KLQlzdHJ1Y3QgdGJsICpwd2RfcywgKm9sZHB3ZF9zOwotCVhTdHJpbmcgeHM7Ci0JY2hhciAqZGlyLCAqYWxsb2NkID0gTlVMTCwgKnRyeXAsICpwd2QsICpjZHBhdGg7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJMUCIpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ0wnOgotCQkJcGh5c2ljYWwgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlICdQJzoKLQkJCXBoeXNpY2FsID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkpIHsKLQkJYmlfZXJyb3JmKCJyZXN0cmljdGVkIHNoZWxsIC0gY2FuJ3QgY2QiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlwd2RfcyA9IGdsb2JhbCgiUFdEIik7Ci0Jb2xkcHdkX3MgPSBnbG9iYWwoIk9MRFBXRCIpOwotCi0JaWYgKCF3cFswXSkgewotCQkvKiBObyBhcmd1bWVudHMgLSBnbyBob21lICovCi0JCWlmICgoZGlyID0gc3RyX3ZhbChnbG9iYWwoIkhPTUUiKSkpID09IG51bGwpIHsKLQkJCWJpX2Vycm9yZigibm8gaG9tZSBkaXJlY3RvcnkgKEhPTUUgbm90IHNldCkiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl9IGVsc2UgaWYgKCF3cFsxXSkgewotCQkvKiBPbmUgYXJndW1lbnQ6IC0gb3IgZGlyICovCi0JCXN0cmR1cHgoYWxsb2NkLCB3cFswXSwgQVRFTVApOwotCQlpZiAoa3NoX2lzZGFzaCgoZGlyID0gYWxsb2NkKSkpIHsKLQkJCWFmcmVlKGFsbG9jZCwgQVRFTVApOwotCQkJYWxsb2NkID0gTlVMTDsKLQkJCWRpciA9IHN0cl92YWwob2xkcHdkX3MpOwotCQkJaWYgKGRpciA9PSBudWxsKSB7Ci0JCQkJYmlfZXJyb3JmKCJubyBPTERQV0QiKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJcHJpbnRwYXRoID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSBpZiAoIXdwWzJdKSB7Ci0JCS8qIFR3byBhcmd1bWVudHMgLSBzdWJzdGl0dXRlIGFyZzEgaW4gUFdEIGZvciBhcmcyICovCi0JCWludCBpbGVuLCBvbGVuLCBubGVuLCBlbGVuOwotCQljaGFyICpjcDsKLQotCQlpZiAoIWN1cnJlbnRfd2RbMF0pIHsKLQkJCWJpX2Vycm9yZigiZG9uJ3Qga25vdyBjdXJyZW50IGRpcmVjdG9yeSIpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQkvKiBzdWJzdGl0dXRlIGFyZzEgZm9yIGFyZzIgaW4gY3VycmVudCBwYXRoLgotCQkgKiBpZiB0aGUgZmlyc3Qgc3Vic3RpdHV0aW9uIGZhaWxzIGJlY2F1c2UgdGhlIGNkIGZhaWxzCi0JCSAqIHdlIGNvdWxkIHRyeSB0byBmaW5kIGFub3RoZXIgc3Vic3RpdHV0aW9uLiBGb3Igbm93Ci0JCSAqIHdlIGRvbid0Ci0JCSAqLwotCQlpZiAoKGNwID0gc3Ryc3RyKGN1cnJlbnRfd2QsIHdwWzBdKSkgPT0gTlVMTCkgewotCQkJYmlfZXJyb3JmKCJiYWQgc3Vic3RpdHV0aW9uIik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCWlsZW4gPSBjcCAtIGN1cnJlbnRfd2Q7Ci0JCW9sZW4gPSBzdHJsZW4od3BbMF0pOwotCQlubGVuID0gc3RybGVuKHdwWzFdKTsKLQkJZWxlbiA9IHN0cmxlbihjdXJyZW50X3dkICsgaWxlbiArIG9sZW4pICsgMTsKLQkJZGlyID0gYWxsb2NkID0gYWxsb2MoaWxlbiArIG5sZW4gKyBlbGVuLCBBVEVNUCk7Ci0JCW1lbWNweShkaXIsIGN1cnJlbnRfd2QsIGlsZW4pOwotCQltZW1jcHkoZGlyICsgaWxlbiwgd3BbMV0sIG5sZW4pOwotCQltZW1jcHkoZGlyICsgaWxlbiArIG5sZW4sIGN1cnJlbnRfd2QgKyBpbGVuICsgb2xlbiwgZWxlbik7Ci0JCXByaW50cGF0aCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLSNpZmRlZiBOT19QQVRIX01BWAotCS8qIG9ubHkgYSBmaXJzdCBndWVzczsgbWFrZV9wYXRoIHdpbGwgZW5sYXJnZSB4cyBpZiBuZWNlc3NhcnkgKi8KLQlYaW5pdE4oeHMsIDEwMjQsIEFURU1QKTsKLSNlbHNlCi0JWGluaXROKHhzLCBQQVRIX01BWCwgQVRFTVApOwotI2VuZGlmCi0KLQljZHBhdGggPSBzdHJfdmFsKGdsb2JhbCgiQ0RQQVRIIikpOwotCWRvIHsKLQkJY2Rub2RlID0gbWFrZV9wYXRoKGN1cnJlbnRfd2QsIGRpciwgJmNkcGF0aCwgJnhzLCAmcGh5c19wYXRoKTsKLQkJaWYgKHBoeXNpY2FsKQotCQkJcnYgPSBjaGRpcih0cnlwID0gWHN0cmluZyh4cywgeHApICsgcGh5c19wYXRoKTsKLQkJZWxzZSB7Ci0JCQlzaW1wbGlmeV9wYXRoKFhzdHJpbmcoeHMsIHhwKSk7Ci0JCQlydiA9IGNoZGlyKHRyeXAgPSBYc3RyaW5nKHhzLCB4cCkpOwotCQl9Ci0JfSB3aGlsZSAocnYgPCAwICYmIGNkcGF0aCAhPSBOVUxMKTsKLQotCWlmIChydiA8IDApIHsKLQkJaWYgKGNkbm9kZSkKLQkJCWJpX2Vycm9yZigiJXM6IGJhZCBkaXJlY3RvcnkiLCBkaXIpOwotCQllbHNlCi0JCQliaV9lcnJvcmYoIiVzIC0gJXMiLCB0cnlwLCBzdHJlcnJvcihlcnJubykpOwotCQlhZnJlZShhbGxvY2QsIEFURU1QKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQkvKiBhbGxvY2QgKGFib3ZlKSA9PiBkaXIsIHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkICovCi0JYWZyZWUoYWxsb2NkLCBBVEVNUCk7Ci0JYWxsb2NkID0gTlVMTDsKLQotCS8qIENsZWFyIG91dCB0cmFja2VkIGFsaWFzZXMgd2l0aCByZWxhdGl2ZSBwYXRocyAqLwotCWZsdXNoY29tKDApOwotCi0JLyogU2V0IE9MRFBXRCAobm90ZTogdW5zZXR0aW5nIE9MRFBXRCBkb2VzIG5vdCBkaXNhYmxlIHRoaXMKLQkgKiBzZXR0aW5nIGluIEFUJlQga3NoKQotCSAqLwotCWlmIChjdXJyZW50X3dkWzBdKQotCQkvKiBJZ25vcmUgZmFpbHVyZSAoaGFwcGVucyBpZiByZWFkb25seSBvciBpbnRlZ2VyKSAqLwotCQlzZXRzdHIob2xkcHdkX3MsIGN1cnJlbnRfd2QsIEtTSF9SRVRVUk5fRVJST1IpOwotCi0JaWYgKFhzdHJpbmcoeHMsIHhwKVswXSAhPSAnLycpIHsKLQkJcHdkID0gTlVMTDsKLQl9IGVsc2UgaWYgKCFwaHlzaWNhbCB8fCAhKHB3ZCA9IGFsbG9jZCA9IGRvX3JlYWxwYXRoKFhzdHJpbmcoeHMsIHhwKSkpKQotCQlwd2QgPSBYc3RyaW5nKHhzLCB4cCk7Ci0KLQkvKiBTZXQgUFdEICovCi0JaWYgKHB3ZCkgewotCQljaGFyICpwdG1wID0gcHdkOwotCi0JCXNldF9jdXJyZW50X3dkKHB0bXApOwotCQkvKiBJZ25vcmUgZmFpbHVyZSAoaGFwcGVucyBpZiByZWFkb25seSBvciBpbnRlZ2VyKSAqLwotCQlzZXRzdHIocHdkX3MsIHB0bXAsIEtTSF9SRVRVUk5fRVJST1IpOwotCX0gZWxzZSB7Ci0JCXNldF9jdXJyZW50X3dkKG51bGwpOwotCQlwd2QgPSBYc3RyaW5nKHhzLCB4cCk7Ci0JCS8qIFhYWCB1bnNldCAkUFdEPyAqLwotCX0KLQlpZiAocHJpbnRwYXRoIHx8IGNkbm9kZSkKLQkJc2hwcmludGYoIiVzXG4iLCBwd2QpOwotCi0JYWZyZWUoYWxsb2NkLCBBVEVNUCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1jX3B3ZChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IG9wdGM7Ci0JYm9vbCBwaHlzaWNhbCA9IEZsYWcoRlBIWVNJQ0FMKSA/IHRydWUgOiBmYWxzZTsKLQljaGFyICpwLCAqYWxsb2NkID0gTlVMTDsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIkxQIikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnTCc6Ci0JCQlwaHlzaWNhbCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1AnOgotCQkJcGh5c2ljYWwgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCWlmICh3cFswXSkgewotCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlwID0gY3VycmVudF93ZFswXSA/IChwaHlzaWNhbCA/IGFsbG9jZCA9IGRvX3JlYWxwYXRoKGN1cnJlbnRfd2QpIDoKLQkgICAgY3VycmVudF93ZCkgOiBOVUxMOwotCWlmIChwICYmIGFjY2VzcyhwLCBSX09LKSA8IDApCi0JCXAgPSBOVUxMOwotCWlmICghcCAmJiAhKHAgPSBhbGxvY2QgPSBrc2hfZ2V0X3dkKE5VTEwpKSkgewotCQliaV9lcnJvcmYoImNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0Jc2hwcmludGYoIiVzXG4iLCBwKTsKLQlhZnJlZShhbGxvY2QsIEFURU1QKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc19wdHI7Ci1zdGF0aWMgaW50IHNfZ2V0KHZvaWQpOwotc3RhdGljIHZvaWQgc19wdXQoaW50KTsKLQotaW50Ci1jX3ByaW50KGNvbnN0IGNoYXIgKip3cCkKLXsKLSNkZWZpbmUgUE9fTkwJCUJJVCgwKQkvKiBwcmludCBuZXdsaW5lICovCi0jZGVmaW5lIFBPX0VYUEFORAlCSVQoMSkJLyogZXhwYW5kIGJhY2tzbGFzaCBzZXF1ZW5jZXMgKi8KLSNkZWZpbmUgUE9fUE1JTlVTTUlOVVMJQklUKDIpCS8qIHByaW50IGEgLS0gYXJndW1lbnQgKi8KLSNkZWZpbmUgUE9fSElTVAkJQklUKDMpCS8qIHByaW50IHRvIGhpc3RvcnkgaW5zdGVhZCBvZiBzdGRvdXQgKi8KLSNkZWZpbmUgUE9fQ09QUk9DCUJJVCg0KQkvKiBwcmludGluZyB0byBjb3Byb2Nlc3M6IGJsb2NrIFNJR1BJUEUgKi8KLQlpbnQgZmQgPSAxLCBjOwotCWludCBmbGFncyA9IFBPX0VYUEFORHxQT19OTDsKLQljb25zdCBjaGFyICpzLCAqZW1zZzsKLQlYU3RyaW5nIHhzOwotCWNoYXIgKnhwOwotCi0JaWYgKHdwWzBdWzBdID09ICdlJykgewotCQkvKiBlY2hvIGJ1aWx0aW4gKi8KLQkJd3ArKzsKLQkJaWYgKEZsYWcoRlBPU0lYKSB8fCBGbGFnKEZTSCkpIHsKLQkJCS8qIERlYmlhbiBQb2xpY3kgMTAuNCBjb21wbGlhbnQgImVjaG8iIGJ1aWx0aW4gKi8KLQkJCWlmICgqd3AgJiYgIXN0cmNtcCgqd3AsICItbiIpKSB7Ci0JCQkJLyogd2UgcmVjb2duaXNlICItbiIgb25seSBhcyB0aGUgZmlyc3QgYXJnICovCi0JCQkJZmxhZ3MgPSAwOwotCQkJCXdwKys7Ci0JCQl9IGVsc2UKLQkJCQkvKiBvdGhlcndpc2UsIHdlIHByaW50IGV2ZXJ5dGhpbmcgYXMtaXMgKi8KLQkJCQlmbGFncyA9IFBPX05MOwotCQl9IGVsc2UgewotCQkJaW50IG5mbGFncyA9IGZsYWdzOwotCi0JCQkvKioKLQkJCSAqIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHN5c1YgYW5kIEJTRCBlY2hvIGNvbW1hbmRzOgotCQkJICogZXNjYXBlIHNlcXVlbmNlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgLW4sCi0JCQkgKiAtZSBhbmQgLUUgYXJlIHJlY29nbmlzZWQgaWYgdGhleSBhcHBlYXIgaW4gYXJndS0KLQkJCSAqIG1lbnRzIHdpdGggbm8gaWxsZWdhbCBvcHRpb25zIChpZSwgZWNobyAtbnEgd2lsbAotCQkJICogcHJpbnQgLW5xKS4KLQkJCSAqIERpZmZlcmVudCBmcm9tIHN5c1YgZWNobyBzaW5jZSBvcHRpb25zIGFyZSByZWNvLQotCQkJICogZ25pc2VkLCBkaWZmZXJlbnQgZnJvbSBCU0QgZWNobyBzaW5jZSBlc2NhcGUgc2UtCi0JCQkgKiBxdWVuY2VzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JCQkgKi8KLQotCQkJd2hpbGUgKChzID0gKndwKSAmJiAqcyA9PSAnLScgJiYgc1sxXSkgewotCQkJCXdoaWxlICgqKytzKQotCQkJCQlpZiAoKnMgPT0gJ24nKQotCQkJCQkJbmZsYWdzICY9IH5QT19OTDsKLQkJCQkJZWxzZSBpZiAoKnMgPT0gJ2UnKQotCQkJCQkJbmZsYWdzIHw9IFBPX0VYUEFORDsKLQkJCQkJZWxzZSBpZiAoKnMgPT0gJ0UnKQotCQkJCQkJbmZsYWdzICY9IH5QT19FWFBBTkQ7Ci0JCQkJCWVsc2UKLQkJCQkJCS8qCi0JCQkJCQkgKiBiYWQgb3B0aW9uOiBkb24ndCB1c2UKLQkJCQkJCSAqIG5mbGFncywgcHJpbnQgYXJndW1lbnQKLQkJCQkJCSAqLwotCQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoKnMpCi0JCQkJCWJyZWFrOwotCQkJCXdwKys7Ci0JCQkJZmxhZ3MgPSBuZmxhZ3M7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgb3B0YzsKLQkJY29uc3QgY2hhciAqb3B0cyA9ICJSbnByc3UsIjsKLQotCQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkKLQkJCXN3aXRjaCAob3B0YykgewotCQkJY2FzZSAnUic6IC8qIGZha2UgQlNEIGVjaG8gY29tbWFuZCAqLwotCQkJCWZsYWdzIHw9IFBPX1BNSU5VU01JTlVTOwotCQkJCWZsYWdzICY9IH5QT19FWFBBTkQ7Ci0JCQkJb3B0cyA9ICJuZSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdlJzoKLQkJCQlmbGFncyB8PSBQT19FWFBBTkQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICduJzoKLQkJCQlmbGFncyAmPSB+UE9fTkw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJzoKLQkJCQlpZiAoKGZkID0gY29wcm9jX2dldGZkKFdfT0ssICZlbXNnKSkgPCAwKSB7Ci0JCQkJCWJpX2Vycm9yZigiLXA6ICVzIiwgZW1zZyk7Ci0JCQkJCXJldHVybiAoMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAncic6Ci0JCQkJZmxhZ3MgJj0gflBPX0VYUEFORDsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotCQkJCWZsYWdzIHw9IFBPX0hJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd1JzoKLQkJCQlpZiAoISoocyA9IGJ1aWx0aW5fb3B0Lm9wdGFyZykpCi0JCQkJCWZkID0gMDsKLQkJCQllbHNlIGlmICgoZmQgPSBjaGVja19mZChzLCBXX09LLCAmZW1zZykpIDwgMCkgewotCQkJCQliaV9lcnJvcmYoIi11OiAlczogJXMiLCBzLCBlbXNnKTsKLQkJCQkJcmV0dXJuICgxKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCi0JCWlmICghKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9NSU5VU01JTlVTKSkgewotCQkJLyogdHJlYXQgYSBsb25lIC0gbGlrZSAtLSAqLwotCQkJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0gJiYKLQkJCSAgICBrc2hfaXNkYXNoKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pKQotCQkJCWJ1aWx0aW5fb3B0Lm9wdGluZCsrOwotCQl9IGVsc2UgaWYgKGZsYWdzICYgUE9fUE1JTlVTTUlOVVMpCi0JCQlidWlsdGluX29wdC5vcHRpbmQtLTsKLQkJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCX0KLQotCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7Ci0KLQl3aGlsZSAoKndwICE9IE5VTEwpIHsKLQkJcyA9ICp3cDsKLQkJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQkJWGNoZWNrKHhzLCB4cCk7Ci0JCQlpZiAoKGZsYWdzICYgUE9fRVhQQU5EKSAmJiBjID09ICdcXCcpIHsKLQkJCQlzX3B0ciA9IHM7Ci0JCQkJYyA9IHVuYmtzbChmYWxzZSwgc19nZXQsIHNfcHV0KTsKLQkJCQlzID0gc19wdHI7Ci0JCQkJaWYgKGMgPT0gLTEpIHsKLQkJCQkJLyogcmVqZWN0ZWQgYnkgZ2VuZXJpYyBmdW5jdGlvbiAqLwotCQkJCQlzd2l0Y2ggKChjID0gKnMrKykpIHsKLQkJCQkJY2FzZSAnYyc6Ci0JCQkJCQlmbGFncyAmPSB+UE9fTkw7Ci0JCQkJCQkvKiBBVCZUIGJyYWluIGRhbWFnZSAqLwotCQkJCQkJY29udGludWU7Ci0JCQkJCWNhc2UgJ1wwJzoKLQkJCQkJCXMtLTsKLQkJCQkJCWMgPSAnXFwnOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlYcHV0KHhzLCB4cCwgJ1xcJyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpYyA+IDB4RkYpIHsKLQkJCQkJLyogZ2VuZXJpYyBmdW5jdGlvbiByZXR1cm5lZCBVbmljb2RlICovCi0JCQkJCWNoYXIgdHNbNF07Ci0KLQkJCQkJYyA9IHV0Zl93Y3RvbWIodHMsIGMgLSAweDEwMCk7Ci0JCQkJCXRzW2NdID0gMDsKLQkJCQkJZm9yIChjID0gMDsgdHNbY107ICsrYykKLQkJCQkJCVhwdXQoeHMsIHhwLCB0c1tjXSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCVhwdXQoeHMsIHhwLCBjKTsKLQkJfQotCQlpZiAoKisrd3AgIT0gTlVMTCkKLQkJCVhwdXQoeHMsIHhwLCAnICcpOwotCX0KLQlpZiAoZmxhZ3MgJiBQT19OTCkKLQkJWHB1dCh4cywgeHAsICdcbicpOwotCi0JaWYgKGZsYWdzICYgUE9fSElTVCkgewotCQlYcHV0KHhzLCB4cCwgJ1wwJyk7Ci0JCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIFhzdHJpbmcoeHMsIHhwKSwgdHJ1ZSwgZmFsc2UpOwotCQlYZnJlZSh4cywgeHApOwotCX0gZWxzZSB7Ci0JCWludCBsZW4gPSBYbGVuZ3RoKHhzLCB4cCk7Ci0JCWludCBvcGlwZSA9IDA7Ci0KLQkJLyogRW5zdXJlIHdlIGFyZW4ndCBraWxsZWQgYnkgYSBTSUdQSVBFIHdoaWxlIHdyaXRpbmcgdG8KLQkJICogYSBjb3Byb2Nlc3MuIEFUJlQga3NoIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzIChzZWVtcwotCQkgKiB0byBqdXN0IGNoZWNrIHRoYXQgdGhlIGNvLXByb2Nlc3MgaXMgYWxpdmUgd2hpY2ggaXMKLQkJICogbm90IGVub3VnaCkuCi0JCSAqLwotCQlpZiAoY29wcm9jLndyaXRlID49IDAgJiYgY29wcm9jLndyaXRlID09IGZkKSB7Ci0JCQlmbGFncyB8PSBQT19DT1BST0M7Ci0JCQlvcGlwZSA9IGJsb2NrX3BpcGUoKTsKLQkJfQotCQlmb3IgKHMgPSBYc3RyaW5nKHhzLCB4cCk7IGxlbiA+IDA7ICkgewotCQkJaWYgKChjID0gd3JpdGUoZmQsIHMsIGxlbikpIDwgMCkgewotCQkJCWlmIChmbGFncyAmIFBPX0NPUFJPQykKLQkJCQkJcmVzdG9yZV9waXBlKG9waXBlKTsKLQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKLQkJCQkJLyogYWxsb3cgdXNlciB0byBeQyBvdXQgKi8KLQkJCQkJaW50cmNoZWNrKCk7Ci0JCQkJCWlmIChmbGFncyAmIFBPX0NPUFJPQykKLQkJCQkJCW9waXBlID0gYmxvY2tfcGlwZSgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCXMgKz0gYzsKLQkJCWxlbiAtPSBjOwotCQl9Ci0JCWlmIChmbGFncyAmIFBPX0NPUFJPQykKLQkJCXJlc3RvcmVfcGlwZShvcGlwZSk7Ci0JfQotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotc19nZXQodm9pZCkKLXsKLQlyZXR1cm4gKCpzX3B0cisrKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHV0KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JLS1zX3B0cjsKLX0KLQotaW50Ci1jX3doZW5jZShjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0JY29uc3QgY2hhciAqaWQ7Ci0JYm9vbCBwZmxhZyA9IGZhbHNlLCB2ZmxhZyA9IGZhbHNlLCBWZmxhZyA9IGZhbHNlOwotCWludCBydiA9IDAsIG9wdGMsIGZjZmxhZ3M7Ci0JYm9vbCBpYW1fd2hlbmNlID0gd3BbMF1bMF0gPT0gJ3cnOwotCWNvbnN0IGNoYXIgKm9wdHMgPSBpYW1fd2hlbmNlID8gInB2IiA6ICJwdlYiOwotCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdwJzoKLQkJCXBmbGFnID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICd2JzoKLQkJCXZmbGFnID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICdWJzoKLQkJCVZmbGFnID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlmY2ZsYWdzID0gRkNfQkkgfCBGQ19QQVRIIHwgRkNfRlVOQzsKLQlpZiAoIWlhbV93aGVuY2UpIHsKLQkJLyogTm90ZSB0aGF0IC1wIG9uIGl0cyBvd24gaXMgZGVhbCB3aXRoIGluIGNvbWV4ZWMoKSAqLwotCQlpZiAocGZsYWcpCi0JCQlmY2ZsYWdzIHw9IEZDX0RFRlBBVEg7Ci0JCS8qIENvbnZlcnQgY29tbWFuZCBvcHRpb25zIHRvIHdoZW5jZSBvcHRpb25zIC0gbm90ZSB0aGF0Ci0JCSAqIGNvbW1hbmQgLXBWIHVzZXMgYSBkaWZmZXJlbnQgcGF0aCBzZWFyY2ggdGhhbiB3aGVuY2UgLXYKLQkJICogb3Igd2hlbmNlIC1wdi4gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUuCi0JCSAqLwotCQl2ZmxhZyA9IFZmbGFnOwotCX0KLQlpZiAocGZsYWcpCi0JCWZjZmxhZ3MgJj0gfihGQ19CSSB8IEZDX0ZVTkMpOwotCi0Jd2hpbGUgKCh2ZmxhZyB8fCBydiA9PSAwKSAmJiAoaWQgPSAqd3ArKykgIT0gTlVMTCkgewotCQl1aW50MzJfdCBoID0gMDsKLQotCQl0cCA9IE5VTEw7Ci0JCWlmICgoaWFtX3doZW5jZSB8fCB2ZmxhZykgJiYgIXBmbGFnKQotCQkJdHAgPSBrdHNlYXJjaCgma2V5d29yZHMsIGlkLCBoID0gaGFzaChpZCkpOwotCQlpZiAoIXRwICYmICFwZmxhZykgewotCQkJdHAgPSBrdHNlYXJjaCgmYWxpYXNlcywgaWQsIGggPyBoIDogaGFzaChpZCkpOwotCQkJaWYgKHRwICYmICEodHAtPmZsYWcgJiBJU1NFVCkpCi0JCQkJdHAgPSBOVUxMOwotCQl9Ci0JCWlmICghdHApCi0JCQl0cCA9IGZpbmRjb20oaWQsIGZjZmxhZ3MpOwotCQlpZiAodmZsYWcgfHwgKHRwLT50eXBlICE9IENBTElBUyAmJiB0cC0+dHlwZSAhPSBDRVhFQyAmJgotCQkgICAgdHAtPnR5cGUgIT0gQ1RBTElBUykpCi0JCQlzaGZfcHV0cyhpZCwgc2hsX3N0ZG91dCk7Ci0JCXN3aXRjaCAodHAtPnR5cGUpIHsKLQkJY2FzZSBDS0VZV0Q6Ci0JCQlpZiAodmZsYWcpCi0JCQkJc2hmX3B1dHMoIiBpcyBhIHJlc2VydmVkIHdvcmQiLCBzaGxfc3Rkb3V0KTsKLQkJCWJyZWFrOwotCQljYXNlIENBTElBUzoKLQkJCWlmICh2ZmxhZykKLQkJCQlzaHByaW50ZigiIGlzIGFuICVzYWxpYXMgZm9yICIsCi0JCQkJICAgICh0cC0+ZmxhZyAmIEVYUE9SVCkgPyAiZXhwb3J0ZWQgIiA6IG51bGwpOwotCQkJaWYgKCFpYW1fd2hlbmNlICYmICF2ZmxhZykKLQkJCQlzaHByaW50ZigiYWxpYXMgJXM9IiwgaWQpOwotCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHRwLT52YWwucyk7Ci0JCQlicmVhazsKLQkJY2FzZSBDRlVOQzoKLQkJCWlmICh2ZmxhZykgewotCQkJCXNoZl9wdXRzKCIgaXMgYSIsIHNobF9zdGRvdXQpOwotCQkJCWlmICh0cC0+ZmxhZyAmIEVYUE9SVCkKLQkJCQkJc2hmX3B1dHMoIm4gZXhwb3J0ZWQiLCBzaGxfc3Rkb3V0KTsKLQkJCQlpZiAodHAtPmZsYWcgJiBUUkFDRSkKLQkJCQkJc2hmX3B1dHMoIiB0cmFjZWQiLCBzaGxfc3Rkb3V0KTsKLQkJCQlpZiAoISh0cC0+ZmxhZyAmIElTU0VUKSkgewotCQkJCQlzaGZfcHV0cygiIHVuZGVmaW5lZCIsIHNobF9zdGRvdXQpOwotCQkJCQlpZiAodHAtPnUuZnBhdGgpCi0JCQkJCQlzaHByaW50ZigiIChhdXRvbG9hZCBmcm9tICVzKSIsCi0JCQkJCQkgICAgdHAtPnUuZnBhdGgpOwotCQkJCX0KLQkJCQlzaGZfcHV0cygiIGZ1bmN0aW9uIiwgc2hsX3N0ZG91dCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBDU0hFTEw6Ci0JCQlpZiAodmZsYWcpCi0JCQkJc2hwcmludGYoIiBpcyBhJXMgc2hlbGwgYnVpbHRpbiIsCi0JCQkJICAgICh0cC0+ZmxhZyAmIFNQRUNfQkkpID8gIiBzcGVjaWFsIiA6IG51bGwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1RBTElBUzoKLQkJY2FzZSBDRVhFQzoKLQkJCWlmICh0cC0+ZmxhZyAmIElTU0VUKSB7Ci0JCQkJaWYgKHZmbGFnKSB7Ci0JCQkJCXNoZl9wdXRzKCIgaXMgIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCWlmICh0cC0+dHlwZSA9PSBDVEFMSUFTKQotCQkJCQkJc2hwcmludGYoImEgdHJhY2tlZCAlc2FsaWFzIGZvciAiLAotCQkJCQkJICAgICh0cC0+ZmxhZyAmIEVYUE9SVCkgPwotCQkJCQkJICAgICJleHBvcnRlZCAiIDogbnVsbCk7Ci0JCQkJfQotCQkJCXNoZl9wdXRzKHRwLT52YWwucywgc2hsX3N0ZG91dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh2ZmxhZykKLQkJCQkJc2hmX3B1dHMoIiBub3QgZm91bmQiLCBzaGxfc3Rkb3V0KTsKLQkJCQlydiA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNocHJpbnRmKCIlcyBpcyAqR09LKiIsIGlkKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh2ZmxhZyB8fCAhcnYpCi0JCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQl9Ci0JcmV0dXJuIChydik7Ci19Ci0KLS8qIERlYWwgd2l0aCBjb21tYW5kIC12ViAtIGNvbW1hbmQgLXAgZGVhbHQgd2l0aCBpbiBjb21leGVjKCkgKi8KLWludAotY19jb21tYW5kKGNvbnN0IGNoYXIgKip3cCkKLXsKLQkvKiBMZXQgY193aGVuY2UgZG8gdGhlIHdvcmsuIE5vdGUgdGhhdCBjX2NvbW1hbmQoKSBtdXN0IGJlCi0JICogYSBkaXN0aW5jdCBmdW5jdGlvbiBmcm9tIGNfd2hlbmNlKCkgKHRlc3RlZCBpbiBjb21leGVjKCkpLgotCSAqLwotCXJldHVybiAoY193aGVuY2Uod3ApKTsKLX0KLQotLyogdHlwZXNldCwgZXhwb3J0LCBhbmQgcmVhZG9ubHkgKi8KLWludAotY190eXBlc2V0KGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3QgYmxvY2sgKmw7Ci0Jc3RydWN0IHRibCAqdnAsICoqcDsKLQlUZmxhZyBmc2V0ID0gMCwgZmNsciA9IDAsIGZsYWc7Ci0JaW50IHRoaW5nID0gMCwgZmllbGQsIGJhc2UsIG9wdGM7Ci0JY29uc3QgY2hhciAqb3B0czsKLQljb25zdCBjaGFyICpmaWVsZHN0ciwgKmJhc2VzdHI7Ci0JYm9vbCBsb2NhbHYgPSBmYWxzZSwgZnVuYyA9IGZhbHNlLCBwZmxhZyA9IGZhbHNlLCBpc3RzZXQgPSB0cnVlOwotCi0Jc3dpdGNoICgqKndwKSB7Ci0JY2FzZSAnZSc6CQkvKiBleHBvcnQgKi8KLQkJZnNldCB8PSBFWFBPUlQ7Ci0JCWlzdHNldCA9IGZhbHNlOwotCQlicmVhazsKLQljYXNlICdyJzoJCS8qIHJlYWRvbmx5ICovCi0JCWZzZXQgfD0gUkRPTkxZOwotCQlpc3RzZXQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSAncyc6CQkvKiBzZXQgKi8KLQkJLyogY2FsbGVkIHdpdGggJ3R5cGVzZXQgLScgKi8KLQkJYnJlYWs7Ci0JY2FzZSAndCc6CQkvKiB0eXBlc2V0ICovCi0JCWxvY2FsdiA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHNlZSBjb21tZW50IGJlbG93IHJlZ2FyZGluZyBwb3NzaWJsZSBvcGlvbnMgKi8KLQlvcHRzID0gaXN0c2V0ID8gIkwjUiNVWiNhZmkjbG5wcnR1eCIgOiAicCI7Ci0KLQlmaWVsZHN0ciA9IGJhc2VzdHIgPSBOVUxMOwotCWJ1aWx0aW5fb3B0LmZsYWdzIHw9IEdGX1BMVVNPUFQ7Ci0JLyogQVQmVCBrc2ggc2VlbXMgdG8gaGF2ZSAwLTkgYXMgb3B0aW9ucyB3aGljaCBhcmUgbXVsdGlwbGllZAotCSAqIHRvIGdldCBhIG51bWJlciB0aGF0IGlzIHVzZWQgd2l0aCAtTCwgLVIsIC1aIG9yIC1pIChlZywgLTFSMgotCSAqIHNldHMgcmlnaHQganVzdGlmeSBpbiBhIGZpZWxkIG9mIDEyKS4gVGhpcyBhbGxvd3Mgb3B0aW9ucwotCSAqIHRvIGJlIGdyb3VwZWQgaW4gYW4gb3JkZXIgKGVnLCAtTHUxMiksIGJ1dCBkaXNhbGxvd3MgLWk4IC1MMyBhbmQKLQkgKiBkb2VzIG5vdCBhbGxvdyB0aGUgbnVtYmVyIHRvIGJlIHNwZWNpZmllZCBhcyBhIHNlcGFyYXRlIGFyZ3VtZW50Ci0JICogSGVyZSwgdGhlIG51bWJlciBtdXN0IGZvbGxvdyB0aGUgUkxaaSBvcHRpb24sIGJ1dCBpcyBvcHRpb25hbAotCSAqIChzZWUgdGhlICMga2x1ZGdlIGluIGtzaF9nZXRvcHQoKSkuCi0JICovCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpIHsKLQkJZmxhZyA9IDA7Ci0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdMJzoKLQkJCWZsYWcgPSBMSlVTVDsKLQkJCWZpZWxkc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1InOgotCQkJZmxhZyA9IFJKVVNUOwotCQkJZmllbGRzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnVSc6Ci0JCQkvKiBBVCZUIGtzaCB1c2VzIHUsIGJ1dCB0aGlzIGNvbmZsaWN0cyB3aXRoCi0JCQkgKiB1cHBlci9sb3dlciBjYXNlLiBJZiB0aGlzIG9wdGlvbiBpcyBjaGFuZ2VkLAotCQkJICogbmVlZCB0byBjaGFuZ2UgdGhlIC1VIGJlbG93IGFzIHdlbGwKLQkJCSAqLwotCQkJZmxhZyA9IElOVF9VOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1onOgotCQkJZmxhZyA9IFpFUk9GSUw7Ci0JCQlmaWVsZHN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdhJzoKLQkJCS8qCi0JCQkgKiB0aGlzIGlzIHN1cHBvc2VkIHRvIHNldCAoLWEpIG9yIHVuc2V0ICgrYSkgdGhlCi0JCQkgKiBpbmRleGVkIGFycmF5IGF0dHJpYnV0ZTsgaXQgZG9lcyBub3RoaW5nIG9uIGFuCi0JCQkgKiBleGlzdGluZyByZWd1bGFyIHN0cmluZyBvciBpbmRleGVkIGFycmF5IHRob3VnaAotCQkJICovCi0JCQlicmVhazsKLQkJY2FzZSAnZic6Ci0JCQlmdW5jID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICdpJzoKLQkJCWZsYWcgPSBJTlRFR0VSOwotCQkJYmFzZXN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdsJzoKLQkJCWZsYWcgPSBMQ0FTRVY7Ci0JCQlicmVhazsKLQkJY2FzZSAnbic6Ci0JCQlzZXRfcmVmZmxhZyA9IChidWlsdGluX29wdC5pbmZvICYgR0lfUExVUykgPyAyIDogMTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCS8qIGV4cG9ydCwgcmVhZG9ubHk6IFBPU0lYIC1wIGZsYWcgKi8KLQkJCS8qIHR5cGVzZXQ6IHNob3cgdmFsdWVzIGFzIHdlbGwgKi8KLQkJCXBmbGFnID0gdHJ1ZTsKLQkJCWlmIChpc3RzZXQpCi0JCQkJY29udGludWU7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCQlmbGFnID0gUkRPTkxZOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3QnOgotCQkJZmxhZyA9IFRSQUNFOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3UnOgotCQkJZmxhZyA9IFVDQVNFVl9BTDsJLyogdXBwZXIgY2FzZSAvIGF1dG9sb2FkICovCi0JCQlicmVhazsKLQkJY2FzZSAneCc6Ci0JCQlmbGFnID0gRVhQT1JUOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlpZiAoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMpIHsKLQkJCWZjbHIgfD0gZmxhZzsKLQkJCWZzZXQgJj0gfmZsYWc7Ci0JCQl0aGluZyA9ICcrJzsKLQkJfSBlbHNlIHsKLQkJCWZzZXQgfD0gZmxhZzsKLQkJCWZjbHIgJj0gfmZsYWc7Ci0JCQl0aGluZyA9ICctJzsKLQkJfQotCX0KLQotCWZpZWxkID0gMDsKLQlpZiAoZmllbGRzdHIgJiYgIWJpX2dldG4oZmllbGRzdHIsICZmaWVsZCkpCi0JCXJldHVybiAoMSk7Ci0JYmFzZSA9IDA7Ci0JaWYgKGJhc2VzdHIgJiYgIWJpX2dldG4oYmFzZXN0ciwgJmJhc2UpKQotCQlyZXR1cm4gKDEpOwotCi0JaWYgKCEoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0gJiYKLQkgICAgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMF0gPT0gJy0nIHx8Ci0JICAgIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMF0gPT0gJysnKSAmJgotCSAgICB3cFtidWlsdGluX29wdC5vcHRpbmRdWzFdID09ICdcMCcpIHsKLQkJdGhpbmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdOwotCQlidWlsdGluX29wdC5vcHRpbmQrKzsKLQl9Ci0KLQlpZiAoZnVuYyAmJiAoKChmc2V0fGZjbHIpICYgfihUUkFDRXxVQ0FTRVZfQUx8RVhQT1JUKSkgfHwgc2V0X3JlZmZsYWcpKSB7Ci0JCWJpX2Vycm9yZigib25seSAtdCwgLXUgYW5kIC14IG9wdGlvbnMgbWF5IGJlIHVzZWQgd2l0aCAtZiIpOwotCQlzZXRfcmVmZmxhZyA9IDA7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7Ci0JCS8qIFRha2UgY2FyZSBvZiBleGNsdXNpb25zLgotCQkgKiBBdCB0aGlzIHBvaW50LCBmbGFncyBpbiBmc2V0IGFyZSBjbGVhcmVkIGluIGZjbHIgYW5kIHZpY2UKLQkJICogdmVyc2EuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHByZXNlcnZlZC4KLQkJICovCi0JCWlmIChmc2V0ICYgTENBU0VWKQkvKiBMQ0FTRVYgaGFzIHByaW9yaXR5IG92ZXIgVUNBU0VWX0FMICovCi0JCQlmc2V0ICY9IH5VQ0FTRVZfQUw7Ci0JCWlmIChmc2V0ICYgTEpVU1QpCS8qIExKVVNUIGhhcyBwcmlvcml0eSBvdmVyIFJKVVNUICovCi0JCQlmc2V0ICY9IH5SSlVTVDsKLQkJaWYgKChmc2V0ICYgKFpFUk9GSUx8TEpVU1QpKSA9PSBaRVJPRklMKSB7IC8qIC1aIGltcGxpZXMgLVpSICovCi0JCQlmc2V0IHw9IFJKVVNUOwotCQkJZmNsciAmPSB+UkpVU1Q7Ci0JCX0KLQkJLyogU2V0dGluZyB0aGVzZSBhdHRyaWJ1dGVzIGNsZWFycyB0aGUgb3RoZXJzLCB1bmxlc3MgdGhleQotCQkgKiBhcmUgYWxzbyBzZXQgaW4gdGhpcyBjb21tYW5kCi0JCSAqLwotCQlpZiAoKGZzZXQgJiAoTEpVU1QgfCBSSlVTVCB8IFpFUk9GSUwgfCBVQ0FTRVZfQUwgfCBMQ0FTRVYgfAotCQkgICAgSU5URUdFUiB8IElOVF9VIHwgSU5UX0wpKSB8fCBzZXRfcmVmZmxhZykKLQkJCWZjbHIgfD0gfmZzZXQgJiAoTEpVU1QgfCBSSlVTVCB8IFpFUk9GSUwgfCBVQ0FTRVZfQUwgfAotCQkJICAgIExDQVNFViB8IElOVEVHRVIgfCBJTlRfVSB8IElOVF9MKTsKLQl9Ci0KLQkvKiBzZXQgdmFyaWFibGVzIGFuZCBhdHRyaWJ1dGVzICovCi0JaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pIHsKLQkJaW50IGksIHJ2ID0gMDsKLQkJc3RydWN0IHRibCAqZjsKLQotCQlpZiAobG9jYWx2ICYmICFmdW5jKQotCQkJZnNldCB8PSBMT0NBTDsKLQkJZm9yIChpID0gYnVpbHRpbl9vcHQub3B0aW5kOyB3cFtpXTsgaSsrKSB7Ci0JCQlpZiAoZnVuYykgewotCQkJCWYgPSBmaW5kZnVuYyh3cFtpXSwgaGFzaCh3cFtpXSksCi0JCQkJICAgIChmc2V0JlVDQVNFVl9BTCkgPyB0cnVlIDogZmFsc2UpOwotCQkJCWlmICghZikgewotCQkJCQkvKiBBVCZUIGtzaCBkb2VzICsrcnY6IGJvZ3VzICovCi0JCQkJCXJ2ID0gMTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChmc2V0IHwgZmNscikgewotCQkJCQlmLT5mbGFnIHw9IGZzZXQ7Ci0JCQkJCWYtPmZsYWcgJj0gfmZjbHI7Ci0JCQkJfSBlbHNlCi0JCQkJCWZwdHJlZWYoc2hsX3N0ZG91dCwgMCwKLQkJCQkJICAgIGYtPmZsYWcgJiBGS1NIID8KLQkJCQkJICAgICJmdW5jdGlvbiAlcyAlVFxuIiA6Ci0JCQkJCSAgICAiJXMoKSAlVFxuIiwgd3BbaV0sIGYtPnZhbC50KTsKLQkJCX0gZWxzZSBpZiAoIXR5cGVzZXQod3BbaV0sIGZzZXQsIGZjbHIsIGZpZWxkLCBiYXNlKSkgewotCQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpZGVudGlmaWVyIiwgd3BbaV0pOwotCQkJCXNldF9yZWZmbGFnID0gMDsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQl9Ci0JCXNldF9yZWZmbGFnID0gMDsKLQkJcmV0dXJuIChydik7Ci0JfQotCi0JLyogbGlzdCB2YXJpYWJsZXMgYW5kIGF0dHJpYnV0ZXMgKi8KLQlmbGFnID0gZnNldCB8IGZjbHI7IC8qIG5vIGRpZmZlcmVuY2UgYXQgdGhpcyBwb2ludC4uICovCi0JaWYgKGZ1bmMpIHsKLQkJZm9yIChsID0gZS0+bG9jOyBsOyBsID0gbC0+bmV4dCkgewotCQkJZm9yIChwID0ga3Rzb3J0KCZsLT5mdW5zKTsgKHZwID0gKnArKyk7ICkgewotCQkJCWlmIChmbGFnICYmICh2cC0+ZmxhZyAmIGZsYWcpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh0aGluZyA9PSAnLScpCi0JCQkJCWZwdHJlZWYoc2hsX3N0ZG91dCwgMCwgdnAtPmZsYWcgJiBGS1NIID8KLQkJCQkJICAgICJmdW5jdGlvbiAlcyAlVFxuIiA6ICIlcygpICVUXG4iLAotCQkJCQkgICAgdnAtPm5hbWUsIHZwLT52YWwudCk7Ci0JCQkJZWxzZQotCQkJCQlzaHByaW50ZigiJXNcbiIsIHZwLT5uYW1lKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKLQkJCWZvciAocCA9IGt0c29ydCgmbC0+dmFycyk7ICh2cCA9ICpwKyspOyApIHsKLQkJCQlzdHJ1Y3QgdGJsICp0dnA7Ci0JCQkJYm9vbCBhbnlfc2V0ID0gZmFsc2U7Ci0JCQkJLyoKLQkJCQkgKiBTZWUgaWYgdGhlIHBhcmFtZXRlciBpcyBzZXQgKGZvciBhcnJheXMsIGlmIGFueQotCQkJCSAqIGVsZW1lbnQgaXMgc2V0KS4KLQkJCQkgKi8KLQkJCQlmb3IgKHR2cCA9IHZwOyB0dnA7IHR2cCA9IHR2cC0+dS5hcnJheSkKLQkJCQkJaWYgKHR2cC0+ZmxhZyAmIElTU0VUKSB7Ci0JCQkJCQlhbnlfc2V0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIENoZWNrIGF0dHJpYnV0ZXMgLSBub3RlIHRoYXQgYWxsIGFycmF5IGVsZW1lbnRzCi0JCQkJICogaGF2ZSAoc2hvdWxkIGhhdmU/KSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBzbyBjaGVja2luZwotCQkJCSAqIHRoZSBmaXJzdCBpcyBzdWZmaWNpZW50LgotCQkJCSAqCi0JCQkJICogUmVwb3J0IGFuIHVuc2V0IHBhcmFtIG9ubHkgaWYgdGhlIHVzZXIgaGFzCi0JCQkJICogZXhwbGljaXRseSBnaXZlbiBpdCBzb21lIGF0dHJpYnV0ZSAobGlrZSBleHBvcnQpOwotCQkJCSAqIG90aGVyd2lzZSwgYWZ0ZXIgImVjaG8gJEZPTyIsIHdlIHdvdWxkIHJlcG9ydCBGT08uLi4KLQkJCQkgKi8KLQkJCQlpZiAoIWFueV9zZXQgJiYgISh2cC0+ZmxhZyAmIFVTRVJBVFRSSUIpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZmxhZyAmJiAodnAtPmZsYWcgJiBmbGFnKSA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpIHsKLQkJCQkJLyogSWdub3JlIGFycmF5IGVsZW1lbnRzIHRoYXQgYXJlbid0Ci0JCQkJCSAqIHNldCB1bmxlc3MgdGhlcmUgYXJlIG5vIHNldCBlbGVtZW50cywKLQkJCQkJICogaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgaXMgcmVwb3J0ZWQgb24gKi8KLQkJCQkJaWYgKCh2cC0+ZmxhZyZBUlJBWSkgJiYgYW55X3NldCAmJgotCQkJCQkgICAgISh2cC0+ZmxhZyAmIElTU0VUKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkvKiBubyBhcmd1bWVudHMgKi8KLQkJCQkJaWYgKHRoaW5nID09IDAgJiYgZmxhZyA9PSAwKSB7Ci0JCQkJCQkvKiBBVCZUIGtzaCBwcmludHMgdGhpbmdzCi0JCQkJCQkgKiBsaWtlIGV4cG9ydCwgaW50ZWdlciwKLQkJCQkJCSAqIGxlZnRhZGosIHplcm9maWxsLCBldGMuLAotCQkJCQkJICogYnV0IFBPU0lYIHNheXMgbXVzdAotCQkJCQkJICogYmUgc3VpdGFibGUgZm9yIHJlLWVudHJ5Li4uCi0JCQkJCQkgKi8KLQkJCQkJCXNoZl9wdXRzKCJ0eXBlc2V0ICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCgodnAtPmZsYWcmKEFSUkFZfEFTU09DKSk9PUFTU09DKSkKLQkJCQkJCQlzaGZfcHV0cygiLW4gIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJklOVEVHRVIpKQotCQkJCQkJCXNoZl9wdXRzKCItaSAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmRVhQT1JUKSkKLQkJCQkJCQlzaGZfcHV0cygiLXggIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJlJET05MWSkpCi0JCQkJCQkJc2hmX3B1dHMoIi1yICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZUUkFDRSkpCi0JCQkJCQkJc2hmX3B1dHMoIi10ICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZMSlVTVCkpCi0JCQkJCQkJc2hwcmludGYoIi1MJWQgIiwgdnAtPnUyLmZpZWxkKTsKLQkJCQkJCWlmICgodnAtPmZsYWcmUkpVU1QpKQotCQkJCQkJCXNocHJpbnRmKCItUiVkICIsIHZwLT51Mi5maWVsZCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJlpFUk9GSUwpKQotCQkJCQkJCXNoZl9wdXRzKCItWiAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmTENBU0VWKSkKLQkJCQkJCQlzaGZfcHV0cygiLWwgIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJlVDQVNFVl9BTCkpCi0JCQkJCQkJc2hmX3B1dHMoIi11ICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZJTlRfVSkpCi0JCQkJCQkJc2hmX3B1dHMoIi1VICIsIHNobF9zdGRvdXQpOwotCQkJCQkJc2hmX3B1dHModnAtPm5hbWUsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKHBmbGFnKSB7Ci0JCQkJCQkJY2hhciAqcyA9IHN0cl92YWwodnApOwotCi0JCQkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCQkvKiBBVCZUIGtzaCBjYW4ndCBoYXZlCi0JCQkJCQkJICoganVzdGlmaWVkIGludGVnZXJzLi4gKi8KLQkJCQkJCQlpZiAoKHZwLT5mbGFnICYKLQkJCQkJCQkgICAgKElOVEVHRVJ8TEpVU1R8UkpVU1QpKSA9PQotCQkJCQkJCSAgICBJTlRFR0VSKQotCQkJCQkJCQlzaGZfcHV0cyhzLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXByaW50X3ZhbHVlX3F1b3RlZChzKTsKLQkJCQkJCX0KLQkJCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKHZwLT5mbGFnICYgQVJSQVkpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocGZsYWcpCi0JCQkJCQkJc2hmX3B1dHMoaXN0c2V0ID8KLQkJCQkJCQkgICAgInR5cGVzZXQgIiA6Ci0JCQkJCQkJICAgIChmbGFnICYgRVhQT1JUKSA/Ci0JCQkJCQkJICAgICJleHBvcnQgIiA6Ci0JCQkJCQkJICAgICJyZWFkb25seSAiLAotCQkJCQkJCSAgICBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmQVJSQVkpICYmIGFueV9zZXQpCi0JCQkJCQkJc2hwcmludGYoIiVzWyVsdV0iLAotCQkJCQkJCSAgICB2cC0+bmFtZSwKLQkJCQkJCQkgICAgYXJyYXlpbmRleCh2cCkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXNoZl9wdXRzKHZwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICh0aGluZyA9PSAnLScgJiYgKHZwLT5mbGFnJklTU0VUKSkgewotCQkJCQkJCWNoYXIgKnMgPSBzdHJfdmFsKHZwKTsKLQotCQkJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7Ci0JCQkJCQkJLyogQVQmVCBrc2ggY2FuJ3QgaGF2ZQotCQkJCQkJCSAqIGp1c3RpZmllZCBpbnRlZ2Vycy4uICovCi0JCQkJCQkJaWYgKCh2cC0+ZmxhZyAmCi0JCQkJCQkJICAgIChJTlRFR0VSfExKVVNUfFJKVVNUKSkgPT0KLQkJCQkJCQkgICAgSU5URUdFUikKLQkJCQkJCQkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwcmludF92YWx1ZV9xdW90ZWQocyk7Ci0JCQkJCQl9Ci0JCQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQkJCQkJfQotCQkJCQkvKiBPbmx5IHJlcG9ydCBmaXJzdCAnZWxlbWVudCcgb2YgYW4gYXJyYXkgd2l0aAotCQkJCQkgKiBubyBzZXQgZWxlbWVudHMuCi0JCQkJCSAqLwotCQkJCQlpZiAoIWFueV9zZXQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1jX2FsaWFzKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3QgdGFibGUgKnQgPSAmYWxpYXNlczsKLQlpbnQgcnYgPSAwLCBwcmVmaXggPSAwOwotCWJvb2wgcmZsYWcgPSBmYWxzZSwgdGZsYWcsIFVmbGFnID0gZmFsc2UsIHBmbGFnID0gZmFsc2U7Ci0JVGZsYWcgeGZsYWcgPSAwOwotCWludCBvcHRjOwotCi0JYnVpbHRpbl9vcHQuZmxhZ3MgfD0gR0ZfUExVU09QVDsKLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJkcHJ0VXgiKSkgIT0gLTEpIHsKLQkJcHJlZml4ID0gYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMgPyAnKycgOiAnLSc7Ci0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdkJzoKLSNpZmRlZiBNS1NIX05PUFdOQU0KLQkJCXQgPSBOVUxMOwkvKiBmaXggImFsaWFzIC1kdCIgKi8KLSNlbHNlCi0JCQl0ID0gJmhvbWVkaXJzOwotI2VuZGlmCi0JCQlicmVhazsKLQkJY2FzZSAncCc6Ci0JCQlwZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCQlyZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQl0ID0gJnRhbGlhc2VzOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1UnOgotCQkJLyoKLQkJCSAqIGtsdWRnZSBmb3IgdHJhY2tlZCBhbGlhcyBpbml0aWFsaXphdGlvbgotCQkJICogKGRvbid0IGRvIGEgcGF0aCBzZWFyY2gsIGp1c3QgbWFrZSBhbiBlbnRyeSkKLQkJCSAqLwotCQkJVWZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkJeGZsYWcgPSBFWFBPUlQ7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfQotI2lmZGVmIE1LU0hfTk9QV05BTQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0jZW5kaWYKLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlpZiAoIShidWlsdGluX29wdC5pbmZvICYgR0lfTUlOVVNNSU5VUykgJiYgKndwICYmCi0JICAgICh3cFswXVswXSA9PSAnLScgfHwgd3BbMF1bMF0gPT0gJysnKSAmJiB3cFswXVsxXSA9PSAnXDAnKSB7Ci0JCXByZWZpeCA9IHdwWzBdWzBdOwotCQl3cCsrOwotCX0KLQotCXRmbGFnID0gdCA9PSAmdGFsaWFzZXM7Ci0KLQkvKiAiaGFzaCAtciIgbWVhbnMgcmVzZXQgYWxsIHRoZSB0cmFja2VkIGFsaWFzZXMuLiAqLwotCWlmIChyZmxhZykgewotCQlzdGF0aWMgY29uc3QgY2hhciAqYXJnc1tdID0gewotCQkJInVuYWxpYXMiLCAiLXRhIiwgTlVMTAotCQl9OwotCi0JCWlmICghdGZsYWcgfHwgKndwKSB7Ci0JCQlzaGZfcHV0cygiYWxpYXM6IC1yIGZsYWcgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC10IgotCQkJICAgICIgYW5kIHdpdGhvdXQgYXJndW1lbnRzXG4iLCBzaGxfc3Rkb3V0KTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJa3NoX2dldG9wdF9yZXNldCgmYnVpbHRpbl9vcHQsIEdGX0VSUk9SKTsKLQkJcmV0dXJuIChjX3VuYWxpYXMoYXJncykpOwotCX0KLQotCWlmICgqd3AgPT0gTlVMTCkgewotCQlzdHJ1Y3QgdGJsICphcCwgKipwOwotCi0JCWZvciAocCA9IGt0c29ydCh0KTsgKGFwID0gKnArKykgIT0gTlVMTDsgKQotCQkJaWYgKChhcC0+ZmxhZyAmIChJU1NFVHx4ZmxhZykpID09IChJU1NFVHx4ZmxhZykpIHsKLQkJCQlpZiAocGZsYWcpCi0JCQkJCXNoZl9wdXRzKCJhbGlhcyAiLCBzaGxfc3Rkb3V0KTsKLQkJCQlzaGZfcHV0cyhhcC0+bmFtZSwgc2hsX3N0ZG91dCk7Ci0JCQkJaWYgKHByZWZpeCAhPSAnKycpIHsKLQkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKLQkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKGFwLT52YWwucyk7Ci0JCQkJfQotCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOwotCQkJfQotCX0KLQotCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgewotCQljb25zdCBjaGFyICphbGlhcyA9ICp3cCwgKnZhbCwgKm5ld3ZhbDsKLQkJY2hhciAqeGFsaWFzID0gTlVMTDsKLQkJc3RydWN0IHRibCAqYXA7Ci0JCXVpbnQzMl90IGg7Ci0KLQkJaWYgKCh2YWwgPSBjc3RyY2hyKGFsaWFzLCAnPScpKSkgewotCQkJc3RybmR1cHgoeGFsaWFzLCBhbGlhcywgdmFsKysgLSBhbGlhcywgQVRFTVApOwotCQkJYWxpYXMgPSB4YWxpYXM7Ci0JCX0KLQkJaCA9IGhhc2goYWxpYXMpOwotCQlpZiAodmFsID09IE5VTEwgJiYgIXRmbGFnICYmICF4ZmxhZykgewotCQkJYXAgPSBrdHNlYXJjaCh0LCBhbGlhcywgaCk7Ci0JCQlpZiAoYXAgIT0gTlVMTCAmJiAoYXAtPmZsYWcmSVNTRVQpKSB7Ci0JCQkJaWYgKHBmbGFnKQotCQkJCQlzaGZfcHV0cygiYWxpYXMgIiwgc2hsX3N0ZG91dCk7Ci0JCQkJc2hmX3B1dHMoYXAtPm5hbWUsIHNobF9zdGRvdXQpOwotCQkJCWlmIChwcmVmaXggIT0gJysnKSB7Ci0JCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7Ci0JCQkJCXByaW50X3ZhbHVlX3F1b3RlZChhcC0+dmFsLnMpOwotCQkJCX0KLQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hwcmludGYoIiVzIGFsaWFzIG5vdCBmb3VuZFxuIiwgYWxpYXMpOwotCQkJCXJ2ID0gMTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWFwID0ga3RlbnRlcih0LCBhbGlhcywgaCk7Ci0JCWFwLT50eXBlID0gdGZsYWcgPyBDVEFMSUFTIDogQ0FMSUFTOwotCQkvKiBBcmUgd2Ugc2V0dGluZyB0aGUgdmFsdWUgb3IganVzdCBzb21lIGZsYWdzPyAqLwotCQlpZiAoKHZhbCAmJiAhdGZsYWcpIHx8ICghdmFsICYmIHRmbGFnICYmICFVZmxhZykpIHsKLQkJCWlmIChhcC0+ZmxhZyZBTExPQykgewotCQkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOwotCQkJCWFmcmVlKGFwLT52YWwucywgQVBFUk0pOwotCQkJfQotCQkJLyogaWdub3JlIHZhbHVlcyBmb3IgLXQgKEFUJlQga3NoIGRvZXMgdGhpcykgKi8KLQkJCW5ld3ZhbCA9IHRmbGFnID8gc2VhcmNoKGFsaWFzLCBwYXRoLCBYX09LLCBOVUxMKSA6IHZhbDsKLQkJCWlmIChuZXd2YWwpIHsKLQkJCQlzdHJkdXB4KGFwLT52YWwucywgbmV3dmFsLCBBUEVSTSk7Ci0JCQkJYXAtPmZsYWcgfD0gQUxMT0N8SVNTRVQ7Ci0JCQl9IGVsc2UKLQkJCQlhcC0+ZmxhZyAmPSB+SVNTRVQ7Ci0JCX0KLQkJYXAtPmZsYWcgfD0gREVGSU5FRDsKLQkJaWYgKHByZWZpeCA9PSAnKycpCi0JCQlhcC0+ZmxhZyAmPSB+eGZsYWc7Ci0JCWVsc2UKLQkJCWFwLT5mbGFnIHw9IHhmbGFnOwotCQlhZnJlZSh4YWxpYXMsIEFURU1QKTsKLQl9Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotaW50Ci1jX3VuYWxpYXMoY29uc3QgY2hhciAqKndwKQotewotCXN0cnVjdCB0YWJsZSAqdCA9ICZhbGlhc2VzOwotCXN0cnVjdCB0YmwgKmFwOwotCWludCBvcHRjLCBydiA9IDA7Ci0JYm9vbCBhbGwgPSBmYWxzZTsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImFkdCIpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ2EnOgotCQkJYWxsID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICdkJzoKLSNpZmRlZiBNS1NIX05PUFdOQU0KLQkJCXQgPSBOVUxMOwkvKiBmaXggInVuYWxpYXMgLWR0IiAqLwotI2Vsc2UKLQkJCXQgPSAmaG9tZWRpcnM7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCXQgPSAmdGFsaWFzZXM7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0jaWZkZWYgTUtTSF9OT1BXTkFNCi0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLSNlbmRpZgotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgewotCQlhcCA9IGt0c2VhcmNoKHQsICp3cCwgaGFzaCgqd3ApKTsKLQkJaWYgKGFwID09IE5VTEwpIHsKLQkJCXJ2ID0gMTsJLyogUE9TSVggKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChhcC0+ZmxhZyZBTExPQykgewotCQkJYXAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7Ci0JCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKLQkJfQotCQlhcC0+ZmxhZyAmPSB+KERFRklORUR8SVNTRVR8RVhQT1JUKTsKLQl9Ci0KLQlpZiAoYWxsKSB7Ci0JCXN0cnVjdCB0c3RhdGUgdHM7Ci0KLQkJZm9yIChrdHdhbGsoJnRzLCB0KTsgKGFwID0ga3RuZXh0KCZ0cykpOyApIHsKLQkJCWlmIChhcC0+ZmxhZyZBTExPQykgewotCQkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOwotCQkJCWFmcmVlKGFwLT52YWwucywgQVBFUk0pOwotCQkJfQotCQkJYXAtPmZsYWcgJj0gfihERUZJTkVEfElTU0VUfEVYUE9SVCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotaW50Ci1jX2xldChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IHJ2ID0gMTsKLQlta3NoX2FyaV90IHZhbDsKLQotCWlmICh3cFsxXSA9PSBOVUxMKSAvKiBBVCZUIGtzaCBkb2VzIHRoaXMgKi8KLQkJYmlfZXJyb3JmKCJubyBhcmd1bWVudHMiKTsKLQllbHNlCi0JCWZvciAod3ArKzsgKndwOyB3cCsrKQotCQkJaWYgKCFldmFsdWF0ZSgqd3AsICZ2YWwsIEtTSF9SRVRVUk5fRVJST1IsIHRydWUpKSB7Ci0JCQkJcnYgPSAyOwkvKiBkaXN0aW5ndWlzaCBlcnJvciBmcm9tIHplcm8gcmVzdWx0ICovCi0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UKLQkJCQlydiA9IHZhbCA9PSAwOwotCXJldHVybiAocnYpOwotfQotCi1pbnQKLWNfam9icyhjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IG9wdGMsIGZsYWcgPSAwLCBuZmxhZyA9IDAsIHJ2ID0gMDsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImxwbnoiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdsJzoKLQkJCWZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJZmxhZyA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSAnbic6Ci0JCQluZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAneic6CS8qIGRlYnVnZ2luZzogcHJpbnQgem9tYmllcyAqLwotCQkJbmZsYWcgPSAtMTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0JaWYgKCEqd3ApIHsKLQkJaWYgKGpfam9icyhOVUxMLCBmbGFnLCBuZmxhZykpCi0JCQlydiA9IDE7Ci0JfSBlbHNlIHsKLQkJZm9yICg7ICp3cDsgd3ArKykKLQkJCWlmIChqX2pvYnMoKndwLCBmbGFnLCBuZmxhZykpCi0JCQkJcnYgPSAxOwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLWludAotY19mZ2JnKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlib29sIGJnID0gc3RyY21wKCp3cCwgImJnIikgPT0gMDsKLQlpbnQgcnYgPSAwOwotCi0JaWYgKCFGbGFnKEZNT05JVE9SKSkgewotCQliaV9lcnJvcmYoImpvYiBjb250cm9sIG5vdCBlbmFibGVkIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKLQkJcmV0dXJuICgxKTsKLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0JaWYgKCp3cCkKLQkJZm9yICg7ICp3cDsgd3ArKykKLQkJCXJ2ID0gal9yZXN1bWUoKndwLCBiZyk7Ci0JZWxzZQotCQlydiA9IGpfcmVzdW1lKCIlJSIsIGJnKTsKLQlyZXR1cm4gKGJnID8gMCA6IHJ2KTsKLX0KLSNlbmRpZgotCi0vKiBmb3JtYXQgYSBzaW5nbGUga2lsbCBpdGVtICovCi1zdGF0aWMgY2hhciAqCi1raWxsX2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCi17Ci0JY29uc3Qgc3RydWN0IGtpbGxfaW5mbyAqa2kgPSAoY29uc3Qgc3RydWN0IGtpbGxfaW5mbyAqKWFyZzsKLQotCWkrKzsKLQlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlKmQgJSpzICVzIiwKLQkgICAga2ktPm51bV93aWR0aCwgaSwKLQkgICAga2ktPm5hbWVfd2lkdGgsIHNpZ3RyYXBzW2ldLm5hbWUsCi0JICAgIHNpZ3RyYXBzW2ldLm1lc3MpOwotCXJldHVybiAoYnVmKTsKLX0KLQotaW50Ci1jX2tpbGwoY29uc3QgY2hhciAqKndwKQotewotCVRyYXAgKnQgPSBOVUxMOwotCWNvbnN0IGNoYXIgKnA7Ci0JYm9vbCBsZmxhZyA9IGZhbHNlOwotCWludCBpLCBuLCBydiwgc2lnOwotCi0JLyogYXNzdW1lIG9sZCBzdHlsZSBvcHRpb25zIGlmIC1kaWdpdHMgb3IgLVVQUEVSQ0FTRSAqLwotCWlmICgocCA9IHdwWzFdKSAmJiAqcCA9PSAnLScgJiYgKGtzaF9pc2RpZ2l0KHBbMV0pIHx8Ci0JICAgIGtzaF9pc3VwcGVyKHBbMV0pKSkgewotCQlpZiAoISh0ID0gZ2V0dHJhcChwICsgMSwgdHJ1ZSkpKSB7Ci0JCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJyVzJyIsIHAgKyAxKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJaSA9ICh3cFsyXSAmJiBzdHJjbXAod3BbMl0sICItLSIpID09IDApID8gMyA6IDI7Ci0JfSBlbHNlIHsKLQkJaW50IG9wdGM7Ci0KLQkJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAibHM6IikpICE9IC0xKQotCQkJc3dpdGNoIChvcHRjKSB7Ci0JCQljYXNlICdsJzoKLQkJCQlsZmxhZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlpZiAoISh0ID0gZ2V0dHJhcChidWlsdGluX29wdC5vcHRhcmcsIHRydWUpKSkgewotCQkJCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJyVzJyIsCi0JCQkJCSAgICBidWlsdGluX29wdC5vcHRhcmcpOwotCQkJCQlyZXR1cm4gKDEpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJz8nOgotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCWkgPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0JfQotCWlmICgobGZsYWcgJiYgdCkgfHwgKCF3cFtpXSAmJiAhbGZsYWcpKSB7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJc2hmX3B1dHMoInVzYWdlOlx0a2lsbCBbLXMgc2lnbmFtZSB8IC1zaWdudW0gfCAtc2lnbmFtZV0iCi0JCSAgICAiIHsgam9iIHwgcGlkIHwgcGdycCB9IC4uLlxuIgotCQkgICAgIlx0a2lsbCAtbCBbZXhpdF9zdGF0dXMgLi4uXVxuIiwgc2hsX291dCk7Ci0jZW5kaWYKLQkJYmlfZXJyb3JmeigpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChsZmxhZykgewotCQlpZiAod3BbaV0pIHsKLQkJCWZvciAoOyB3cFtpXTsgaSsrKSB7Ci0JCQkJaWYgKCFiaV9nZXRuKHdwW2ldLCAmbikpCi0JCQkJCXJldHVybiAoMSk7Ci0JCQkJaWYgKG4gPiAxMjggJiYgbiA8IDEyOCArIE5TSUcpCi0JCQkJCW4gLT0gMTI4OwotCQkJCWlmIChuID4gMCAmJiBuIDwgTlNJRykKLQkJCQkJc2hwcmludGYoIiVzXG4iLCBzaWd0cmFwc1tuXS5uYW1lKTsKLQkJCQllbHNlCi0JCQkJCXNocHJpbnRmKCIlZFxuIiwgbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdywgaiwgbWVzc19jb2xzLCBtZXNzX29jdHM7Ci0JCQlzdHJ1Y3Qga2lsbF9pbmZvIGtpOwotCi0JCQlmb3IgKGogPSBOU0lHLCBraS5udW1fd2lkdGggPSAxOyBqID49IDEwOyBqIC89IDEwKQotCQkJCWtpLm51bV93aWR0aCsrOwotCQkJa2kubmFtZV93aWR0aCA9IG1lc3NfY29scyA9IG1lc3Nfb2N0cyA9IDA7Ci0JCQlmb3IgKGogPSAwOyBqIDwgTlNJRzsgaisrKSB7Ci0JCQkJdyA9IHN0cmxlbihzaWd0cmFwc1tqXS5uYW1lKTsKLQkJCQlpZiAodyA+IGtpLm5hbWVfd2lkdGgpCi0JCQkJCWtpLm5hbWVfd2lkdGggPSB3OwotCQkJCXcgPSBzdHJsZW4oc2lndHJhcHNbal0ubWVzcyk7Ci0JCQkJaWYgKHcgPiBtZXNzX29jdHMpCi0JCQkJCW1lc3Nfb2N0cyA9IHc7Ci0JCQkJdyA9IHV0Zl9tYnN3aWR0aChzaWd0cmFwc1tqXS5tZXNzKTsKLQkJCQlpZiAodyA+IG1lc3NfY29scykKLQkJCQkJbWVzc19jb2xzID0gdzsKLQkJCX0KLQotCQkJcHJpbnRfY29sdW1ucyhzaGxfc3Rkb3V0LCBOU0lHIC0gMSwKLQkJCSAgICBraWxsX2ZtdF9lbnRyeSwgKHZvaWQgKikma2ksCi0JCQkgICAga2kubnVtX3dpZHRoICsgMSArIGtpLm5hbWVfd2lkdGggKyAxICsgbWVzc19vY3RzLAotCQkJICAgIGtpLm51bV93aWR0aCArIDEgKyBraS5uYW1lX3dpZHRoICsgMSArIG1lc3NfY29scywKLQkJCSAgICB0cnVlKTsKLQkJfQotCQlyZXR1cm4gKDApOwotCX0KLQlydiA9IDA7Ci0Jc2lnID0gdCA/IHQtPnNpZ25hbCA6IFNJR1RFUk07Ci0JZm9yICg7IChwID0gd3BbaV0pOyBpKyspIHsKLQkJaWYgKCpwID09ICclJykgewotCQkJaWYgKGpfa2lsbChwLCBzaWcpKQotCQkJCXJ2ID0gMTsKLQkJfSBlbHNlIGlmICghZ2V0bihwLCAmbikpIHsKLQkJCWJpX2Vycm9yZigiJXM6IGFyZ3VtZW50cyBtdXN0IGJlIGpvYnMgb3IgcHJvY2VzcyBJRHMiLAotCQkJICAgIHApOwotCQkJcnYgPSAxOwotCQl9IGVsc2UgewotCQkJaWYgKG1rc2hfa2lsbChuLCBzaWcpIDwgMCkgewotCQkJCWJpX2Vycm9yZigiJXM6ICVzIiwgcCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlydiA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChydik7Ci19Ci0KLXZvaWQKLWdldG9wdHNfcmVzZXQoaW50IHZhbCkKLXsKLQlpZiAodmFsID49IDEpIHsKLQkJa3NoX2dldG9wdF9yZXNldCgmdXNlcl9vcHQsIEdGX05PTkFNRSB8IEdGX1BMVVNPUFQpOwotCQl1c2VyX29wdC5vcHRpbmQgPSB1c2VyX29wdC51b3B0aW5kID0gdmFsOwotCX0KLX0KLQotaW50Ci1jX2dldG9wdHMoY29uc3QgY2hhciAqKndwKQotewotCWludCBhcmdjLCBvcHRjLCBydjsKLQljb25zdCBjaGFyICpvcHRzLCAqdmFyOwotCWNoYXIgYnVmWzNdOwotCXN0cnVjdCB0YmwgKnZxLCAqdm9wdGFyZzsKLQotCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKLQkJcmV0dXJuICgxKTsKLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlvcHRzID0gKndwKys7Ci0JaWYgKCFvcHRzKSB7Ci0JCWJpX2Vycm9yZigibWlzc2luZyBvcHRpb25zIGFyZ3VtZW50Iik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JdmFyID0gKndwKys7Ci0JaWYgKCF2YXIpIHsKLQkJYmlfZXJyb3JmKCJtaXNzaW5nIG5hbWUgYXJndW1lbnQiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JaWYgKCEqdmFyIHx8ICpza2lwX3Zhcm5hbWUodmFyLCB0cnVlKSkgewotCQliaV9lcnJvcmYoIiVzOiBpcyBub3QgYW4gaWRlbnRpZmllciIsIHZhcik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JaWYgKGUtPmxvYy0+bmV4dCA9PSBOVUxMKSB7Ci0JCWludGVybmFsX3dhcm5pbmdmKCJjX2dldG9wdHM6IG5vIGFyZ3YiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JLyogV2hpY2ggYXJndW1lbnRzIGFyZSB3ZSBwYXJzaW5nLi4uICovCi0JaWYgKCp3cCA9PSBOVUxMKQotCQl3cCA9IGUtPmxvYy0+bmV4dC0+YXJndjsKLQllbHNlCi0JCSotLXdwID0gZS0+bG9jLT5uZXh0LT5hcmd2WzBdOwotCi0JLyogQ2hlY2sgdGhhdCBvdXIgc2F2ZWQgc3RhdGUgd29uJ3QgY2F1c2UgYSBjb3JlIGR1bXAuLi4gKi8KLQlmb3IgKGFyZ2MgPSAwOyB3cFthcmdjXTsgYXJnYysrKQotCQk7Ci0JaWYgKHVzZXJfb3B0Lm9wdGluZCA+IGFyZ2MgfHwKLQkgICAgKHVzZXJfb3B0LnAgIT0gMCAmJgotCSAgICB1c2VyX29wdC5wID4gc3RybGVuKHdwW3VzZXJfb3B0Lm9wdGluZCAtIDFdKSkpIHsKLQkJYmlfZXJyb3JmKCJhcmd1bWVudHMgY2hhbmdlZCBzaW5jZSBsYXN0IGNhbGwiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQl1c2VyX29wdC5vcHRhcmcgPSBOVUxMOwotCW9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmdXNlcl9vcHQsIG9wdHMpOwotCi0JaWYgKG9wdGMgPj0gMCAmJiBvcHRjICE9ICc/JyAmJiAodXNlcl9vcHQuaW5mbyAmIEdJX1BMVVMpKSB7Ci0JCWJ1ZlswXSA9ICcrJzsKLQkJYnVmWzFdID0gb3B0YzsKLQkJYnVmWzJdID0gJ1wwJzsKLQl9IGVsc2UgewotCQkvKiBQT1NJWCBzYXlzIHZhciBpcyBzZXQgdG8gPyBhdCBlbmQtb2Ytb3B0aW9ucywgQVQmVCBrc2gKLQkJICogc2V0cyBpdCB0byBudWxsIC0gd2UgZ28gd2l0aCBQT1NJWC4uLgotCQkgKi8KLQkJYnVmWzBdID0gb3B0YyA8IDAgPyAnPycgOiBvcHRjOwotCQlidWZbMV0gPSAnXDAnOwotCX0KLQotCS8qIEFUJlQga3NoOTMgaW4gZmFjdCBkb2VzIGNoYW5nZSBPUFRJTkQgZm9yIHVua25vd24gb3B0aW9ucyB0b28gKi8KLQl1c2VyX29wdC51b3B0aW5kID0gdXNlcl9vcHQub3B0aW5kOwotCi0Jdm9wdGFyZyA9IGdsb2JhbCgiT1BUQVJHIik7Ci0Jdm9wdGFyZy0+ZmxhZyAmPSB+UkRPTkxZOwkvKiBBVCZUIGtzaCBjbGVhcnMgcm8gYW5kIGludCAqLwotCS8qIFBhcmFub2lhOiBlbnN1cmUgbm8gYml6YXJyZSByZXN1bHRzLiAqLwotCWlmICh2b3B0YXJnLT5mbGFnICYgSU5URUdFUikKLQkgICAgdHlwZXNldCgiT1BUQVJHIiwgMCwgSU5URUdFUiwgMCwgMCk7Ci0JaWYgKHVzZXJfb3B0Lm9wdGFyZyA9PSBOVUxMKQotCQl1bnNldCh2b3B0YXJnLCAxKTsKLQllbHNlCi0JCS8qIFRoaXMgY2FuJ3QgZmFpbCAoaGF2ZSBjbGVhcmVkIHJlYWRvbmx5L2ludGVnZXIpICovCi0JCXNldHN0cih2b3B0YXJnLCB1c2VyX29wdC5vcHRhcmcsIEtTSF9SRVRVUk5fRVJST1IpOwotCi0JcnYgPSAwOwotCi0JdnEgPSBnbG9iYWwodmFyKTsKLQkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgcHJpbnRlZCAoaW50ZWdlciwgcmVhZG9ubHkpICovCi0JaWYgKCFzZXRzdHIodnEsIGJ1ZiwgS1NIX1JFVFVSTl9FUlJPUikpCi0JCXJ2ID0gMTsKLQlpZiAoRmxhZyhGRVhQT1JUKSkKLQkJdHlwZXNldCh2YXIsIEVYUE9SVCwgMCwgMCwgMCk7Ci0KLQlyZXR1cm4gKG9wdGMgPCAwID8gMSA6IHJ2KTsKLX0KLQotaW50Ci1jX2JpbmQoY29uc3QgY2hhciAqKndwKQotewotCWludCBvcHRjLCBydiA9IDA7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQlib29sIG1hY3JvID0gZmFsc2U7Ci0jZW5kaWYKLQlib29sIGxpc3QgPSBmYWxzZTsKLQljb25zdCBjaGFyICpjcDsKLQljaGFyICp1cDsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwKLSNpZm5kZWYgTUtTSF9TTUFMTAotCSAgICAibG0iCi0jZWxzZQotCSAgICAibCIKLSNlbmRpZgotCSAgICApKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ2wnOgotCQkJbGlzdCA9IHRydWU7Ci0JCQlicmVhazsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQljYXNlICdtJzoKLQkJCW1hY3JvID0gdHJ1ZTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCWlmICgqd3AgPT0gTlVMTCkJLyogbGlzdCBhbGwgKi8KLQkJcnYgPSB4X2JpbmQoTlVMTCwgTlVMTCwKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQkgICAgZmFsc2UsCi0jZW5kaWYKLQkJICAgIGxpc3QpOwotCi0JZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7Ci0JCWlmICgoY3AgPSBjc3RyY2hyKCp3cCwgJz0nKSkgPT0gTlVMTCkKLQkJCXVwID0gTlVMTDsKLQkJZWxzZSB7Ci0JCQlzdHJkdXB4KHVwLCAqd3AsIEFURU1QKTsKLQkJCXVwW2NwKysgLSAqd3BdID0gJ1wwJzsKLQkJfQotCQlpZiAoeF9iaW5kKHVwID8gdXAgOiAqd3AsIGNwLAotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCSAgICBtYWNybywKLSNlbmRpZgotCQkgICAgZmFsc2UpKQotCQkJcnYgPSAxOwotCQlhZnJlZSh1cCwgQVRFTVApOwotCX0KLQotCXJldHVybiAocnYpOwotfQotCi0vKiA6LCBmYWxzZSBhbmQgdHJ1ZSAoYW5kIHVsaW1pdCBpZiBNS1NIX05PX0xJTUlUUykgKi8KLWludAotY19sYWJlbChjb25zdCBjaGFyICoqd3ApCi17Ci0JcmV0dXJuICh3cFswXVswXSA9PSAnZicgPyAxIDogMCk7Ci19Ci0KLWludAotY19zaGlmdChjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOwotCWludCBuOwotCW1rc2hfYXJpX3QgdmFsOwotCWNvbnN0IGNoYXIgKmFyZzsKLQotCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKLQkJcmV0dXJuICgxKTsKLQlhcmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOwotCi0JaWYgKGFyZykgewotCQlldmFsdWF0ZShhcmcsICZ2YWwsIEtTSF9VTldJTkRfRVJST1IsIGZhbHNlKTsKLQkJbiA9IHZhbDsKLQl9IGVsc2UKLQkJbiA9IDE7Ci0JaWYgKG4gPCAwKSB7Ci0JCWJpX2Vycm9yZigiJXM6IGJhZCBudW1iZXIiLCBhcmcpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAobC0+YXJnYyA8IG4pIHsKLQkJYmlfZXJyb3JmKCJub3RoaW5nIHRvIHNoaWZ0Iik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWwtPmFyZ3Zbbl0gPSBsLT5hcmd2WzBdOwotCWwtPmFyZ3YgKz0gbjsKLQlsLT5hcmdjIC09IG47Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1jX3VtYXNrKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgaSwgb3B0YzsKLQljb25zdCBjaGFyICpjcDsKLQlib29sIHN5bWJvbGljID0gZmFsc2U7Ci0JbW9kZV90IG9sZF91bWFzazsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIlMiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdTJzoKLQkJCXN5bWJvbGljID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQljcCA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07Ci0JaWYgKGNwID09IE5VTEwpIHsKLQkJb2xkX3VtYXNrID0gdW1hc2soKG1vZGVfdCkwKTsKLQkJdW1hc2sob2xkX3VtYXNrKTsKLQkJaWYgKHN5bWJvbGljKSB7Ci0JCQljaGFyIGJ1ZlsxOF0sICpwOwotCQkJaW50IGo7Ci0KLQkJCW9sZF91bWFzayA9IH5vbGRfdW1hc2s7Ci0JCQlwID0gYnVmOwotCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCSpwKysgPSAidWdvIltpXTsKLQkJCQkqcCsrID0gJz0nOwotCQkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0JCQkJCWlmIChvbGRfdW1hc2sgJiAoMSA8PCAoOCAtICgzKmkgKyBqKSkpKQotCQkJCQkJKnArKyA9ICJyd3giW2pdOwotCQkJCSpwKysgPSAnLCc7Ci0JCQl9Ci0JCQlwWy0xXSA9ICdcMCc7Ci0JCQlzaHByaW50ZigiJXNcbiIsIGJ1Zik7Ci0JCX0gZWxzZQotCQkJc2hwcmludGYoIiUjMy4zb1xuIiwgKHVuc2lnbmVkIGludClvbGRfdW1hc2spOwotCX0gZWxzZSB7Ci0JCW1vZGVfdCBuZXdfdW1hc2s7Ci0KLQkJaWYgKGtzaF9pc2RpZ2l0KCpjcCkpIHsKLQkJCWZvciAobmV3X3VtYXNrID0gMDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzcnOyBjcCsrKQotCQkJCW5ld191bWFzayA9IG5ld191bWFzayAqIDggKyAoKmNwIC0gJzAnKTsKLQkJCWlmICgqY3ApIHsKLQkJCQliaV9lcnJvcmYoImJhZCBudW1iZXIiKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogc3ltYm9saWMgZm9ybWF0ICovCi0JCQlpbnQgcG9zaXRpb25zLCBuZXdfdmFsOwotCQkJY2hhciBvcDsKLQotCQkJb2xkX3VtYXNrID0gdW1hc2soKG1vZGVfdCkwKTsKLQkJCXVtYXNrKG9sZF91bWFzayk7IC8qIGluIGNhc2Ugb2YgZXJyb3IgKi8KLQkJCW9sZF91bWFzayA9IH5vbGRfdW1hc2s7Ci0JCQluZXdfdW1hc2sgPSBvbGRfdW1hc2s7Ci0JCQlwb3NpdGlvbnMgPSAwOwotCQkJd2hpbGUgKCpjcCkgewotCQkJCXdoaWxlICgqY3AgJiYgdnN0cmNocigiYXVnbyIsICpjcCkpCi0JCQkJCXN3aXRjaCAoKmNwKyspIHsKLQkJCQkJY2FzZSAnYSc6Ci0JCQkJCQlwb3NpdGlvbnMgfD0gMDExMTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICd1JzoKLQkJCQkJCXBvc2l0aW9ucyB8PSAwMTAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ2cnOgotCQkJCQkJcG9zaXRpb25zIHw9IDAwMTA7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnbyc6Ci0JCQkJCQlwb3NpdGlvbnMgfD0gMDAwMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJaWYgKCFwb3NpdGlvbnMpCi0JCQkJCXBvc2l0aW9ucyA9IDAxMTE7IC8qIGRlZmF1bHQgaXMgYSAqLwotCQkJCWlmICghdnN0cmNocigiPSstIiwgb3AgPSAqY3ApKQotCQkJCQlicmVhazsKLQkJCQljcCsrOwotCQkJCW5ld192YWwgPSAwOwotCQkJCXdoaWxlICgqY3AgJiYgdnN0cmNocigicnd4dWdvWHMiLCAqY3ApKQotCQkJCQlzd2l0Y2ggKCpjcCsrKSB7Ci0JCQkJCWNhc2UgJ3InOiBuZXdfdmFsIHw9IDA0OyBicmVhazsKLQkJCQkJY2FzZSAndyc6IG5ld192YWwgfD0gMDI7IGJyZWFrOwotCQkJCQljYXNlICd4JzogbmV3X3ZhbCB8PSAwMTsgYnJlYWs7Ci0JCQkJCWNhc2UgJ3UnOgotCQkJCQkJbmV3X3ZhbCB8PSBvbGRfdW1hc2sgPj4gNjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdnJzoKLQkJCQkJCW5ld192YWwgfD0gb2xkX3VtYXNrID4+IDM7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnbyc6Ci0JCQkJCQluZXdfdmFsIHw9IG9sZF91bWFzayA+PiAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ1gnOgotCQkJCQkJaWYgKG9sZF91bWFzayAmIDAxMTEpCi0JCQkJCQkJbmV3X3ZhbCB8PSAwMTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdzJzoKLQkJCQkJCS8qIGlnbm9yZWQgKi8KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJbmV3X3ZhbCA9IChuZXdfdmFsICYgMDcpICogcG9zaXRpb25zOwotCQkJCXN3aXRjaCAob3ApIHsKLQkJCQljYXNlICctJzoKLQkJCQkJbmV3X3VtYXNrICY9IH5uZXdfdmFsOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc9JzoKLQkJCQkJbmV3X3VtYXNrID0gbmV3X3ZhbCB8Ci0JCQkJCSAgICAobmV3X3VtYXNrICYgfihwb3NpdGlvbnMgKiAwNykpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcrJzoKLQkJCQkJbmV3X3VtYXNrIHw9IG5ld192YWw7Ci0JCQkJfQotCQkJCWlmICgqY3AgPT0gJywnKSB7Ci0JCQkJCXBvc2l0aW9ucyA9IDA7Ci0JCQkJCWNwKys7Ci0JCQkJfSBlbHNlIGlmICghdnN0cmNocigiPSstIiwgKmNwKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKmNwKSB7Ci0JCQkJYmlfZXJyb3JmKCJiYWQgbWFzayIpOwotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCQluZXdfdW1hc2sgPSB+bmV3X3VtYXNrOwotCQl9Ci0JCXVtYXNrKG5ld191bWFzayk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotY19kb3QoY29uc3QgY2hhciAqKndwKQotewotCWNvbnN0IGNoYXIgKmZpbGUsICpjcCwgKiphcmd2OwotCWludCBhcmdjLCBpLCBlcnJjb2RlOwotCi0JaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQotCQlyZXR1cm4gKDEpOwotCi0JaWYgKChjcCA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pID09IE5VTEwpIHsKLQkJYmlfZXJyb3JmKCJtaXNzaW5nIGFyZ3VtZW50Iik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmICgoZmlsZSA9IHNlYXJjaChjcCwgcGF0aCwgUl9PSywgJmVycmNvZGUpKSA9PSBOVUxMKSB7Ci0JCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsCi0JCSAgICBlcnJjb2RlID8gc3RyZXJyb3IoZXJyY29kZSkgOiAibm90IGZvdW5kIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JLyogU2V0IHBvc2l0aW9uYWwgcGFyYW1ldGVycz8gKi8KLQlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kICsgMV0pIHsKLQkJYXJndiA9IHdwICsgYnVpbHRpbl9vcHQub3B0aW5kOwotCQlhcmd2WzBdID0gZS0+bG9jLT5hcmd2WzBdOyAvKiBwcmVzZXJ2ZSAkMCAqLwotCQlmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2MgKyAxXTsgYXJnYysrKQotCQkJOwotCX0gZWxzZSB7Ci0JCWFyZ2MgPSAwOwotCQlhcmd2ID0gTlVMTDsKLQl9Ci0JaWYgKChpID0gaW5jbHVkZShmaWxlLCBhcmdjLCBhcmd2LCAwKSkgPCAwKSB7Ci0JCS8qIHNob3VsZCBub3QgaGFwcGVuICovCi0JCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCXJldHVybiAoaSk7Ci19Ci0KLWludAotY193YWl0KGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgcnYgPSAwLCBzaWc7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCWlmICgqd3AgPT0gTlVMTCkgewotCQl3aGlsZSAod2FpdGZvcihOVUxMLCAmc2lnKSA+PSAwKQotCQkJOwotCQlydiA9IHNpZzsKLQl9IGVsc2UgewotCQlmb3IgKDsgKndwOyB3cCsrKQotCQkJcnYgPSB3YWl0Zm9yKCp3cCwgJnNpZyk7Ci0JCWlmIChydiA8IDApCi0JCQlydiA9IHNpZyA/IHNpZyA6IDEyNzsgLyogbWFnaWMgZXhpdCBjb2RlOiBiYWQgam9iLWlkICovCi0JfQotCXJldHVybiAocnYpOwotfQotCi1pbnQKLWNfcmVhZChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IGMgPSAwLCBlY29kZSA9IDAsIGZkID0gMCwgb3B0YzsKLQlib29sIGV4cGFuZGUgPSB0cnVlLCBoaXN0b3J5ciA9IGZhbHNlLCBleHBhbmRpbmc7Ci0JY29uc3QgY2hhciAqY3AsICplbXNnOwotCXN0cnVjdCBzaGYgKnNoZjsKLQlYU3RyaW5nIGNzLCB4cyA9IHsgTlVMTCwgTlVMTCwgMCwgTlVMTH07Ci0Jc3RydWN0IHRibCAqdnA7Ci0JY2hhciAqY2NwLCAqeHAgPSBOVUxMLCAqd3BhbGxvYyA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgUkVQTFlbXSA9ICJSRVBMWSI7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJwcnN1LCIpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ3AnOgotCQkJaWYgKChmZCA9IGNvcHJvY19nZXRmZChSX09LLCAmZW1zZykpIDwgMCkgewotCQkJCWJpX2Vycm9yZigiLXA6ICVzIiwgZW1zZyk7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCWV4cGFuZGUgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJCWhpc3RvcnlyID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICd1JzoKLQkJCWlmICghKihjcCA9IGJ1aWx0aW5fb3B0Lm9wdGFyZykpCi0JCQkJZmQgPSAwOwotCQkJZWxzZSBpZiAoKGZkID0gY2hlY2tfZmQoY3AsIFJfT0ssICZlbXNnKSkgPCAwKSB7Ci0JCQkJYmlfZXJyb3JmKCItdTogJXM6ICVzIiwgY3AsIGVtc2cpOwotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JaWYgKCp3cCA9PSBOVUxMKQotCQkqLS13cCA9IFJFUExZOwotCi0JLyogU2luY2Ugd2UgY2FuJ3QgbmVjZXNzYXJpbHkgc2VlayBiYWNrd2FyZHMgb24gbm9uLXJlZ3VsYXIgZmlsZXMsCi0JICogZG9uJ3QgYnVmZmVyIHRoZW0gc28gd2UgY2FuJ3QgcmVhZCB0b28gbXVjaC4KLQkgKi8KLQlzaGYgPSBzaGZfcmVvcGVuKGZkLCBTSEZfUkQgfCBTSEZfSU5URVJSVVBUIHwgY2FuX3NlZWsoZmQpLCBzaGxfc3BhcmUpOwotCi0JaWYgKChjcCA9IGNzdHJjaHIoKndwLCAnPycpKSAhPSBOVUxMKSB7Ci0JCXN0cmR1cHgod3BhbGxvYywgKndwLCBBVEVNUCk7Ci0JCXdwYWxsb2NbY3AgLSAqd3BdID0gJ1wwJzsKLQkJKndwID0gd3BhbGxvYzsKLQkJaWYgKGlzYXR0eShmZCkpIHsKLQkJCS8qIEFUJlQga3NoIHNheXMgaXQgcHJpbnRzIHByb21wdCBvbiBmZCBpZiBpdCdzIG9wZW4KLQkJCSAqIGZvciB3cml0aW5nIGFuZCBpcyBhIHR0eSwgYnV0IGl0IGRvZXNuJ3QgZG8gaXQKLQkJCSAqIChpdCBhbHNvIGRvZXNuJ3QgY2hlY2sgdGhlIGludGVyYWN0aXZlIGZsYWcsCi0JCQkgKiBhcyBpcyBpbmRpY2F0ZWQgaW4gdGhlIEtvcm5zaGVsbCBib29rKS4KLQkJCSAqLwotCQkJc2hlbGxmKCIlcyIsIGNwKzEpOwotCQl9Ci0JfQotCi0JLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgY28tcHJvY2VzcyBmb3IgdGhlIGZpcnN0IHRpbWUsCi0JICogbWFrZSBzdXJlIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBwaXBlIGlzIGNsb3NlZCBmaXJzdC4gVGhpcyBhbGxvd3MKLQkgKiB0aGUgZGV0ZWN0aW9uIG9mIGVvZi4KLQkgKgotCSAqIFRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBBVCZUIGtzaC4uLiB0aGUgZmQgaXMga2VwdCBzbyBhbm90aGVyCi0JICogY29wcm9jIGNhbiBiZSBzdGFydGVkIHdpdGggc2FtZSBvdXRwdXQsIGhvd2V2ZXIsIHRoaXMgbWVhbnMgZW9mCi0JICogY2FuJ3QgYmUgZGV0ZWN0ZWQuLi4gVGhpcyBpcyB3aHkgaXQgaXMgY2xvc2VkIGhlcmUuCi0JICogSWYgdGhpcyBjYWxsIGlzIHJlbW92ZWQsIHJlbW92ZSB0aGUgZW9mIGNoZWNrIGJlbG93LCB0b28uCi0JICogY29wcm9jX3JlYWR3X2Nsb3NlKGZkKTsKLQkgKi8KLQotCWlmIChoaXN0b3J5cikKLQkJWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKLQlleHBhbmRpbmcgPSBmYWxzZTsKLQlYaW5pdChjcywgY2NwLCAxMjgsIEFURU1QKTsKLQlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKLQkJZm9yIChjY3AgPSBYc3RyaW5nKGNzLCBjY3ApOyA7ICkgewotCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09IEVPRikKLQkJCQlicmVhazsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJYyA9IHNoZl9nZXRjKHNoZik7Ci0JCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGMgPT0gRU9GICYmIHNoZl9lcnJvcihzaGYpICYmCi0JCQkJICAgIHNoZl9lcnJubyhzaGYpID09IEVJTlRSKSB7Ci0JCQkJCS8qIFdhcyB0aGUgb2ZmZW5kaW5nIHNpZ25hbCBvbmUgdGhhdAotCQkJCQkgKiB3b3VsZCBub3JtYWxseSBraWxsIGEgcHJvY2Vzcz8KLQkJCQkJICogSWYgc28sIHByZXRlbmQgdGhlIHJlYWQgd2FzIGtpbGxlZC4KLQkJCQkJICovCi0JCQkJCWVjb2RlID0gZmF0YWxfdHJhcF9jaGVjaygpOwotCi0JCQkJCS8qIG5vbiBmYXRhbCAoZWcsIENITEQpLCBjYXJyeSBvbiAqLwotCQkJCQlpZiAoIWVjb2RlKSB7Ci0JCQkJCQlzaGZfY2xlYXJlcnIoc2hmKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGhpc3RvcnlyKSB7Ci0JCQkJWGNoZWNrKHhzLCB4cCk7Ci0JCQkJWHB1dCh4cywgeHAsIGMpOwotCQkJfQotCQkJWGNoZWNrKGNzLCBjY3ApOwotCQkJaWYgKGV4cGFuZGluZykgewotCQkJCWV4cGFuZGluZyA9IGZhbHNlOwotCQkJCWlmIChjID09ICdcbicpIHsKLQkJCQkJYyA9IDA7Ci0JCQkJCWlmIChGbGFnKEZUQUxLSU5HX0kpICYmIGlzYXR0eShmZCkpIHsKLQkJCQkJCS8qIHNldCBwcm9tcHQgaW4gY2FzZSB0aGlzIGlzCi0JCQkJCQkgKiBjYWxsZWQgZnJvbSAucHJvZmlsZSBvciAkRU5WCi0JCQkJCQkgKi8KLQkJCQkJCXNldF9wcm9tcHQoUFMyLCBOVUxMKTsKLQkJCQkJCXBwcm9tcHQocHJvbXB0LCAwKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYyAhPSBFT0YpCi0JCQkJCVhwdXQoY3MsIGNjcCwgYyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZXhwYW5kZSAmJiBjID09ICdcXCcpIHsKLQkJCQlleHBhbmRpbmcgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09IEVPRikKLQkJCQlicmVhazsKLQkJCWlmIChjdHlwZShjLCBDX0lGUykpIHsKLQkJCQlpZiAoWGxlbmd0aChjcywgY2NwKSA9PSAwICYmIGN0eXBlKGMsIENfSUZTV1MpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAod3BbMV0pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJWHB1dChjcywgY2NwLCBjKTsKLQkJfQotCQkvKiBzdHJpcCB0cmFpbGluZyBJRlMgd2hpdGUgc3BhY2UgZnJvbSBsYXN0IHZhcmlhYmxlICovCi0JCWlmICghd3BbMV0pCi0JCQl3aGlsZSAoWGxlbmd0aChjcywgY2NwKSAmJiBjdHlwZShjY3BbLTFdLCBDX0lGUykgJiYKLQkJCSAgICBjdHlwZShjY3BbLTFdLCBDX0lGU1dTKSkKLQkJCQljY3AtLTsKLQkJWHB1dChjcywgY2NwLCAnXDAnKTsKLQkJdnAgPSBnbG9iYWwoKndwKTsKLQkJLyogTXVzdCBiZSBkb25lIGJlZm9yZSBzZXR0aW5nIGV4cG9ydC4gKi8KLQkJaWYgKHZwLT5mbGFnICYgUkRPTkxZKSB7Ci0JCQlzaGZfZmx1c2goc2hmKTsKLQkJCWJpX2Vycm9yZigiJXMgaXMgcmVhZCBvbmx5IiwgKndwKTsKLQkJCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJaWYgKEZsYWcoRkVYUE9SVCkpCi0JCQl0eXBlc2V0KCp3cCwgRVhQT1JULCAwLCAwLCAwKTsKLQkJaWYgKCFzZXRzdHIodnAsIFhzdHJpbmcoY3MsIGNjcCksIEtTSF9SRVRVUk5fRVJST1IpKSB7Ci0JCQlzaGZfZmx1c2goc2hmKTsKLQkJCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl9Ci0KLQlzaGZfZmx1c2goc2hmKTsKLQlpZiAoaGlzdG9yeXIpIHsKLQkJWHB1dCh4cywgeHAsICdcMCcpOwotCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCBYc3RyaW5nKHhzLCB4cCksIHRydWUsIGZhbHNlKTsKLQkJWGZyZWUoeHMsIHhwKTsKLQl9Ci0JLyogaWYgdGhpcyBpcyB0aGUgY28tcHJvY2VzcyBmZCwgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgotCSAqIChjYW4gZ2V0IGVvZiBpZiBhbmQgb25seSBpZiBhbGwgcHJvY2Vzc2VzIGFyZSBoYXZlIGRpZWQsIGllLAotCSAqIGNvcHJvYy5uam9icyBpcyAwIGFuZCB0aGUgcGlwZSBpcyBjbG9zZWQpLgotCSAqLwotCWlmIChjID09IEVPRiAmJiAhZWNvZGUpCi0JCWNvcHJvY19yZWFkX2Nsb3NlKGZkKTsKLQotCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKLQlyZXR1cm4gKGVjb2RlID8gZWNvZGUgOiBjID09IEVPRik7Ci19Ci0KLWludAotY19ldmFsKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3Qgc291cmNlICpzLCAqc2F2ZXMgPSBzb3VyY2U7Ci0JdW5zaWduZWQgY2hhciBzYXZlZjsKLQlpbnQgcnY7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0JcyA9IHB1c2hzKFNXT1JEUywgQVRFTVApOwotCXMtPnUuc3RydiA9IHdwICsgYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JLyotCi0JICogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbW1hbmQgaXMKLQkgKiBlbXB0eSBkdWUgdG8gZmFpbGVkIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBmb3IgZXhhbXBsZSBieQotCSAqCWV2YWwgIiQoZmFsc2UpIgotCSAqIFRoaXMgaGFzIGhpc3RvcmljYWxseSByZXR1cm5lZCAxIGJ5IEFUJlQga3NoODguIEluIHRoaXMKLQkgKiBjYXNlLCBzaGVsbCgpIHdpbGwgbm90IHNldCBvciBjaGFuZ2UgZXhzdGF0IGJlY2F1c2UgdGhlCi0JICogY29tcGlsZWQgdHJlZSBpcyBlbXB0eSwgc28gaXQgd2lsbCB1c2UgdGhlIHZhbHVlIHdlIHBhc3MKLQkgKiBmcm9tIHN1YnN0X2V4c3RhdCwgd2hpY2ggaXMgY2xlYXJlZCBpbiBleGVjdXRlKCksIHNvIGl0Ci0JICogc2hvdWxkIGhhdmUgYmVlbiAwIGlmIHRoZXJlIHdlcmUgbm8gc3Vic3RpdHV0aW9ucy4KLQkgKgotCSAqIFBPU0lYIGhvd2V2ZXIgc2F5cyB3ZSBkb24ndCBkbyB0aGlzLCBldmVuIHRob3VnaCBpdCBpcwotCSAqIHRyYWRpdGlvbmFsbHkgZG9uZS4gQVQmVCBrc2g5MyBhZ3JlZXMgd2l0aCBQT1NJWCwgc28gd2UKLQkgKiBkby4gVGhlIGZvbGxvd2luZyBpcyBhbiBleGNlcnB0IGZyb20gU1VTdjQgWzEwMDMuMi0yMDA4XToKLQkgKgotCSAqIDIuOS4xOiBTaW1wbGUgQ29tbWFuZHMKLQkgKgkuLi4gSWYgdGhlcmUgaXMgYSBjb21tYW5kIG5hbWUsIGV4ZWN1dGlvbiBzaGFsbAotCSAqCWNvbnRpbnVlIGFzIGRlc2NyaWJlZCBpbiAyLjkuMS4xIFtDb21tYW5kIFNlYXJjaAotCSAqCWFuZCBFeGVjdXRpb25dLiBJZiB0aGVyZSBpcyBubyBjb21tYW5kIG5hbWUsIGJ1dAotCSAqCXRoZSBjb21tYW5kIGNvbnRhaW5lZCBhIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCB0aGUKLQkgKgljb21tYW5kIHNoYWxsIGNvbXBsZXRlIHdpdGggdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQotCSAqCWxhc3QgY29tbWFuZCBzdWJzdGl0dXRpb24gcGVyZm9ybWVkLgotCSAqIDIuOS4xLjE6IENvbW1hbmQgU2VhcmNoIGFuZCBFeGVjdXRpb24KLQkgKgkoMSkgYS4gSWYgdGhlIGNvbW1hbmQgbmFtZSBtYXRjaGVzIHRoZSBuYW1lIG9mIGEKLQkgKglzcGVjaWFsIGJ1aWx0LWluIHV0aWxpdHksIHRoYXQgc3BlY2lhbCBidWlsdC1pbgotCSAqCXV0aWxpdHkgc2hhbGwgYmUgaW52b2tlZC4KLQkgKiAyLjE0LjU6IGV2YWwKLQkgKglJZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzLCBvciBvbmx5IG51bGwgYXJndW1lbnRzLAotCSAqCWV2YWwgc2hhbGwgcmV0dXJuIGEgemVybyBleGl0IHN0YXR1czsgLi4uCi0JICovCi0JLyogZXhzdGF0ID0gc3Vic3RfZXhzdGF0OyAqLwkvKiBBVCZUIGtzaDg4ICovCi0JZXhzdGF0ID0gMDsJCQkvKiBTVVN2NCAqLwotCi0Jc2F2ZWYgPSBGbGFnKEZFUlJFWElUKTsKLQlGbGFnKEZFUlJFWElUKSA9IDA7Ci0JcnYgPSBzaGVsbChzLCBmYWxzZSk7Ci0JRmxhZyhGRVJSRVhJVCkgPSBzYXZlZjsKLQlzb3VyY2UgPSBzYXZlczsKLQlhZnJlZShzLCBBVEVNUCk7Ci0JcmV0dXJuIChydik7Ci19Ci0KLWludAotY190cmFwKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgaTsKLQljb25zdCBjaGFyICpzOwotCVRyYXAgKnA7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JaWYgKCp3cCA9PSBOVUxMKSB7Ci0JCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQotCQkJaWYgKHAtPnRyYXAgIT0gTlVMTCkgewotCQkJCXNoZl9wdXRzKCJ0cmFwIC0tICIsIHNobF9zdGRvdXQpOwotCQkJCXByaW50X3ZhbHVlX3F1b3RlZChwLT50cmFwKTsKLQkJCQlzaHByaW50ZigiICVzXG4iLCBwLT5uYW1lKTsKLQkJCX0KLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQkvKgotCSAqIFVzZSBjYXNlIHNlbnNpdGl2ZSBsb29rdXAgZm9yIGZpcnN0IGFyZyBzbyB0aGUKLQkgKiBjb21tYW5kICdleGl0JyBpc24ndCBjb25mdXNlZCB3aXRoIHRoZSBwc2V1ZG8tc2lnbmFsCi0JICogJ0VYSVQnLgotCSAqLwotCXMgPSAoZ2V0dHJhcCgqd3AsIGZhbHNlKSA9PSBOVUxMKSA/ICp3cCsrIDogTlVMTDsgLyogZ2V0IGNvbW1hbmQgKi8KLQlpZiAocyAhPSBOVUxMICYmIHNbMF0gPT0gJy0nICYmIHNbMV0gPT0gJ1wwJykKLQkJcyA9IE5VTEw7Ci0KLQkvKiBzZXQvY2xlYXIgdHJhcHMgKi8KLQl3aGlsZSAoKndwICE9IE5VTEwpIHsKLQkJcCA9IGdldHRyYXAoKndwKyssIHRydWUpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJXMiLCB3cFstMV0pOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlzZXR0cmFwKHAsIHMpOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLWNfZXhpdHJldHVybihjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IG4sIGhvdyA9IExFWElUOwotCWNvbnN0IGNoYXIgKmFyZzsKLQotCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKLQkJcmV0dXJuICgxKTsKLQlhcmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOwotCi0JaWYgKGFyZykgewotCQlpZiAoIWdldG4oYXJnLCAmbikpIHsKLQkJCWV4c3RhdCA9IDE7Ci0JCQl3YXJuaW5nZih0cnVlLCAiJXM6IGJhZCBudW1iZXIiLCBhcmcpOwotCQl9IGVsc2UKLQkJCWV4c3RhdCA9IG47Ci0JfQotCWlmICh3cFswXVswXSA9PSAncicpIHsgLyogcmV0dXJuICovCi0JCXN0cnVjdCBlbnYgKmVwOwotCi0JCS8qIG5lZWQgdG8gdGVsbCBpZiB0aGlzIGlzIGV4aXQgb3IgcmV0dXJuIHNvIHRyYXAgZXhpdCB3aWxsCi0JCSAqIHdvcmsgcmlnaHQgKFBPU0lYKQotCQkgKi8KLQkJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQotCQkJaWYgKFNUT1BfUkVUVVJOKGVwLT50eXBlKSkgewotCQkJCWhvdyA9IExSRVRVUk47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCi0JaWYgKGhvdyA9PSBMRVhJVCAmJiAhcmVhbGx5X2V4aXQgJiYgal9zdG9wcGVkX3J1bm5pbmcoKSkgewotCQlyZWFsbHlfZXhpdCA9IDE7Ci0JCWhvdyA9IExTSEVMTDsKLQl9Ci0KLQlxdWl0ZW52KE5VTEwpOwkvKiBnZXQgcmlkIG9mIGFueSBpL28gcmVkaXJlY3Rpb25zICovCi0JdW53aW5kKGhvdyk7Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi1pbnQKLWNfYnJrY29udChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IG4sIHF1aXQ7Ci0Jc3RydWN0IGVudiAqZXAsICpsYXN0X2VwID0gTlVMTDsKLQljb25zdCBjaGFyICphcmc7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0JYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKLQotCWlmICghYXJnKQotCQluID0gMTsKLQllbHNlIGlmICghYmlfZ2V0bihhcmcsICZuKSkKLQkJcmV0dXJuICgxKTsKLQlxdWl0ID0gbjsKLQlpZiAocXVpdCA8PSAwKSB7Ci0JCS8qIEFUJlQga3NoIGRvZXMgdGhpcyBmb3Igbm9uLWludGVyYWN0aXZlIHNoZWxscyBvbmx5IC0gd2VpcmQgKi8KLQkJYmlfZXJyb3JmKCIlczogYmFkIHZhbHVlIiwgYXJnKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQkvKiBTdG9wIGF0IEVfTk9ORSwgRV9QQVJTRSwgRV9GVU5DLCBvciBFX0lOQ0wgKi8KLQlmb3IgKGVwID0gZTsgZXAgJiYgIVNUT1BfQlJLQ09OVChlcC0+dHlwZSk7IGVwID0gZXAtPm9lbnYpCi0JCWlmIChlcC0+dHlwZSA9PSBFX0xPT1ApIHsKLQkJCWlmICgtLXF1aXQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWVwLT5mbGFncyB8PSBFRl9CUktDT05UX1BBU1M7Ci0JCQlsYXN0X2VwID0gZXA7Ci0JCX0KLQotCWlmIChxdWl0KSB7Ci0JCS8qIEFUJlQga3NoIGRvZXNuJ3QgcHJpbnQgYSBtZXNzYWdlIC0ganVzdCBkb2VzIHdoYXQgaXQKLQkJICogY2FuLiBXZSBwcmludCBhIG1lc3NhZ2UgJ2NhdXNlIGl0IGhlbHBzIGluIGRlYnVnZ2luZwotCQkgKiBzY3JpcHRzLCBidXQgZG9uJ3QgZ2VuZXJhdGUgYW4gZXJyb3IgKGllLCBrZWVwIGdvaW5nKS4KLQkJICovCi0JCWlmIChuID09IHF1aXQpIHsKLQkJCXdhcm5pbmdmKHRydWUsICIlczogY2Fubm90ICVzIiwgd3BbMF0sIHdwWzBdKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJLyogUE9TSVggc2F5cyBpZiBuIGlzIHRvbyBiaWcsIHRoZSBsYXN0IGVuY2xvc2luZyBsb29wCi0JCSAqIHNoYWxsIGJlIHVzZWQuIERvZXNuJ3Qgc2F5IHRvIHByaW50IGFuIGVycm9yIGJ1dCB3ZQotCQkgKiBkbyBhbnl3YXkgJ2NhdXNlIHRoZSB1c2VyIG1lc3NlZCB1cC4KLQkJICovCi0JCWlmIChsYXN0X2VwKQotCQkJbGFzdF9lcC0+ZmxhZ3MgJj0gfkVGX0JSS0NPTlRfUEFTUzsKLQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBjYW4gb25seSAlcyAlZCBsZXZlbChzKSIsCi0JCSAgICB3cFswXSwgd3BbMF0sIG4gLSBxdWl0KTsKLQl9Ci0KLQl1bndpbmQoKndwWzBdID09ICdiJyA/IExCUkVBSyA6IExDT05USU4pOwotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotaW50Ci1jX3NldChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IGFyZ2k7Ci0JYm9vbCBzZXRhcmdzOwotCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKLQljb25zdCBjaGFyICoqb3dwOwotCi0JaWYgKHdwWzFdID09IE5VTEwpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsgInNldCIsICItIiwgTlVMTCB9OwotCQlyZXR1cm4gKGNfdHlwZXNldChhcmdzKSk7Ci0JfQotCi0JYXJnaSA9IHBhcnNlX2FyZ3Mod3AsIE9GX1NFVCwgJnNldGFyZ3MpOwotCWlmIChhcmdpIDwgMCkKLQkJcmV0dXJuICgxKTsKLQkvKiBzZXQgJCMgYW5kICQqICovCi0JaWYgKHNldGFyZ3MpIHsKLQkJd3AgKz0gYXJnaSAtIDE7Ci0JCW93cCA9IHdwOwotCQl3cFswXSA9IGwtPmFyZ3ZbMF07IC8qIHNhdmUgJDAgKi8KLQkJd2hpbGUgKCorK3dwICE9IE5VTEwpCi0JCQlzdHJkdXB4KCp3cCwgKndwLCAmbC0+YXJlYSk7Ci0JCWwtPmFyZ2MgPSB3cCAtIG93cCAtIDE7Ci0JCWwtPmFyZ3YgPSBhbGxvYygobC0+YXJnYyArIDIpICogc2l6ZW9mKGNoYXIgKiksICZsLT5hcmVhKTsKLQkJZm9yICh3cCA9IGwtPmFyZ3Y7ICgqd3ArKyA9ICpvd3ArKykgIT0gTlVMTDsgKQotCQkJOwotCX0KLQkvKi0KLQkgKiBQT1NJWCBzYXlzIHNldCBleGl0IHN0YXR1cyBpcyAwLCBidXQgb2xkIHNjcmlwdHMgdGhhdCB1c2UKLQkgKiBnZXRvcHQoMSkgdXNlIHRoZSBjb25zdHJ1Y3QKLQkgKglzZXQgLS0gJChnZXRvcHQgYWI6YyAiJEAiKQotCSAqIHdoaWNoIGFzc3VtZXMgdGhlIGV4aXQgdmFsdWUgc2V0IHdpbGwgYmUgdGhhdCBvZiB0aGUgJCgpCi0JICogKHN1YnN0X2V4c3RhdCBpcyBjbGVhcmVkIGluIGV4ZWN1dGUoKSBzbyB0aGF0IGl0IHdpbGwgYmUgMAotCSAqIGlmIHRoZXJlIGFyZSBubyBjb21tYW5kIHN1YnN0aXR1dGlvbnMpLgotCSAqIFN3aXRjaGVkIGtzaCAoIXBvc2l4ICFzaCkgdG8gUE9TSVggaW4gbWtzaCBSMzliLgotCSAqLwotCXJldHVybiAoRmxhZyhGU0gpID8gc3Vic3RfZXhzdGF0IDogMCk7Ci19Ci0KLWludAotY191bnNldChjb25zdCBjaGFyICoqd3ApCi17Ci0JY29uc3QgY2hhciAqaWQ7Ci0JaW50IG9wdGM7Ci0JYm9vbCB1bnNldF92YXIgPSB0cnVlOwotCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiZnYiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdmJzoKLQkJCXVuc2V0X3ZhciA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkJdW5zZXRfdmFyID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0JZm9yICg7IChpZCA9ICp3cCkgIT0gTlVMTDsgd3ArKykKLQkJaWYgKHVuc2V0X3ZhcikgewkvKiB1bnNldCB2YXJpYWJsZSAqLwotCQkJc3RydWN0IHRibCAqdnA7Ci0JCQljaGFyICpjcCA9IE5VTEw7Ci0JCQlzaXplX3QgbjsKLQotCQkJbiA9IHN0cmxlbihpZCk7Ci0JCQlpZiAobiA+IDMgJiYgaWRbbi0zXSA9PSAnWycgJiYgaWRbbi0yXSA9PSAnKicgJiYKLQkJCSAgICBpZFtuLTFdID09ICddJykgewotCQkJCXN0cm5kdXB4KGNwLCBpZCwgbiAtIDMsIEFURU1QKTsKLQkJCQlpZCA9IGNwOwotCQkJCW9wdGMgPSAzOwotCQkJfSBlbHNlCi0JCQkJb3B0YyA9IHZzdHJjaHIoaWQsICdbJykgPyAwIDogMTsKLQotCQkJdnAgPSBnbG9iYWwoaWQpOwotCQkJYWZyZWUoY3AsIEFURU1QKTsKLQotCQkJaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKSB7Ci0JCQkJYmlfZXJyb3JmKCIlcyBpcyByZWFkIG9ubHkiLCB2cC0+bmFtZSk7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCXVuc2V0KHZwLCBvcHRjKTsKLQkJfSBlbHNlCQkJLyogdW5zZXQgZnVuY3Rpb24gKi8KLQkJCWRlZmluZShpZCwgTlVMTCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXBfdGltZShzdHJ1Y3Qgc2hmICpzaGYsIGJvb2wgcG9zaXgsIGxvbmcgdHZfc2VjLCBpbnQgdHZfdXNlYywgaW50IHdpZHRoLAotICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4KQotewotCXR2X3VzZWMgLz0gMTAwMDA7Ci0JaWYgKHBvc2l4KQotCQlzaGZfZnByaW50ZihzaGYsICIlcyUqbGQuJTAyZCVzIiwgcHJlZml4LCB3aWR0aCwKLQkJICAgIHR2X3NlYywgdHZfdXNlYywgc3VmZml4KTsKLQllbHNlCi0JCXNoZl9mcHJpbnRmKHNoZiwgIiVzJSpsZG0lZC4lMDJkcyVzIiwgcHJlZml4LCB3aWR0aCwKLQkJICAgIHR2X3NlYyAvIDYwLCAoaW50KSh0dl9zZWMgJSA2MCksIHR2X3VzZWMsIHN1ZmZpeCk7Ci19Ci0KLWludAotY190aW1lcyhjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKLXsKLQlzdHJ1Y3QgcnVzYWdlIHVzYWdlOwotCi0JZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpOwotCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfdXRpbWUudHZfc2VjLAotCSAgICB1c2FnZS5ydV91dGltZS50dl91c2VjLCAwLCBudWxsLCAiICIpOwotCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfc3RpbWUudHZfc2VjLAotCSAgICB1c2FnZS5ydV9zdGltZS50dl91c2VjLCAwLCBudWxsLCAiXG4iKTsKLQotCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZ1c2FnZSk7Ci0JcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV91dGltZS50dl9zZWMsCi0JICAgIHVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMsIDAsIG51bGwsICIgIik7Ci0JcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV9zdGltZS50dl9zZWMsCi0JICAgIHVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMsIDAsIG51bGwsICJcbiIpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIHRpbWUgcGlwZWxpbmUgKHJlYWxseSBhIHN0YXRlbWVudCwgbm90IGEgYnVpbHQtaW4gY29tbWFuZCkKLSAqLwotaW50Ci10aW1leChzdHJ1Y3Qgb3AgKnQsIGludCBmLCB2b2xhdGlsZSBpbnQgKnhlcnJvaykKLXsKLSNkZWZpbmUgVEZfTk9BUkdTCUJJVCgwKQotI2RlZmluZSBURl9OT1JFQUwJQklUKDEpCQkvKiBkb24ndCByZXBvcnQgcmVhbCB0aW1lICovCi0jZGVmaW5lIFRGX1BPU0lYCUJJVCgyKQkJLyogcmVwb3J0IGluIFBPU0lYIGZvcm1hdCAqLwotCWludCBydiA9IDAsIHRmID0gMDsKLQlzdHJ1Y3QgcnVzYWdlIHJ1MCwgcnUxLCBjcnUwLCBjcnUxOwotCXN0cnVjdCB0aW1ldmFsIHVzcnRpbWUsIHN5c3RpbWUsIHR2MCwgdHYxOwotCi0JZ2V0dGltZW9mZGF5KCZ0djAsIE5VTEwpOwotCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1MCk7Ci0JZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmNydTApOwotCWlmICh0LT5sZWZ0KSB7Ci0JCS8qCi0JCSAqIFR3byB3YXlzIG9mIGdldHRpbmcgY3B1IHVzYWdlIG9mIGEgY29tbWFuZDoganVzdCB1c2UgdDAKLQkJICogYW5kIHQxICh3aGljaCB3aWxsIGdldCBjcHUgdXNhZ2UgZnJvbSBvdGhlciBqb2JzIHRoYXQKLQkJICogZmluaXNoIHdoaWxlIHdlIGFyZSBleGVjdXRpbmcgdC0+bGVmdCksIG9yIGdldCB0aGUKLQkJICogY3B1IHVzYWdlIG9mIHQtPmxlZnQuIEFUJlQga3NoIGRvZXMgdGhlIGZvcm1lciwgd2hpbGUKLQkJICogcGRrc2ggdHJpZXMgdG8gZG8gdGhlIGxhdGVyICh0aGUgal91c3J0aW1lIGhhY2sgZG9lc24ndAotCQkgKiByZWFsbHkgd29yayBhcyBpdCBvbmx5IGNvdW50cyB0aGUgbGFzdCBqb2IpLgotCQkgKi8KLQkJdGltZXJjbGVhcigmal91c3J0aW1lKTsKLQkJdGltZXJjbGVhcigmal9zeXN0aW1lKTsKLQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGYgfCBYVElNRSwgeGVycm9rKTsKLQkJaWYgKHQtPmxlZnQtPnR5cGUgPT0gVENPTSkKLQkJCXRmIHw9IHQtPmxlZnQtPnN0clswXTsKLQkJZ2V0dGltZW9mZGF5KCZ0djEsIE5VTEwpOwotCQlnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydTEpOwotCQlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmY3J1MSk7Ci0JfSBlbHNlCi0JCXRmID0gVEZfTk9BUkdTOwotCi0JaWYgKHRmICYgVEZfTk9BUkdTKSB7IC8qIGtzaDkzIC0gcmVwb3J0IHNoZWxsIHRpbWVzIChzaGVsbCtraWRzKSAqLwotCQl0ZiB8PSBURl9OT1JFQUw7Ci0JCXRpbWVyYWRkKCZydTAucnVfdXRpbWUsICZjcnUwLnJ1X3V0aW1lLCAmdXNydGltZSk7Ci0JCXRpbWVyYWRkKCZydTAucnVfc3RpbWUsICZjcnUwLnJ1X3N0aW1lLCAmc3lzdGltZSk7Ci0JfSBlbHNlIHsKLQkJdGltZXJzdWIoJnJ1MS5ydV91dGltZSwgJnJ1MC5ydV91dGltZSwgJnVzcnRpbWUpOwotCQl0aW1lcmFkZCgmdXNydGltZSwgJmpfdXNydGltZSwgJnVzcnRpbWUpOwotCQl0aW1lcnN1YigmcnUxLnJ1X3N0aW1lLCAmcnUwLnJ1X3N0aW1lLCAmc3lzdGltZSk7Ci0JCXRpbWVyYWRkKCZzeXN0aW1lLCAmal9zeXN0aW1lLCAmc3lzdGltZSk7Ci0JfQotCi0JaWYgKCEodGYgJiBURl9OT1JFQUwpKSB7Ci0JCXRpbWVyc3ViKCZ0djEsICZ0djAsICZ0djEpOwotCQlpZiAodGYgJiBURl9QT1NJWCkKLQkJCXBfdGltZShzaGxfb3V0LCB0cnVlLCB0djEudHZfc2VjLCB0djEudHZfdXNlYywKLQkJCSAgICA1LCAicmVhbCAiLCAiXG4iKTsKLQkJZWxzZQotCQkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCB0djEudHZfc2VjLCB0djEudHZfdXNlYywKLQkJCSAgICA1LCBudWxsLCAiIHJlYWwgIik7Ci0JfQotCWlmICh0ZiAmIFRGX1BPU0lYKQotCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgdXNydGltZS50dl9zZWMsIHVzcnRpbWUudHZfdXNlYywKLQkJICAgIDUsICJ1c2VyICIsICJcbiIpOwotCWVsc2UKLQkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCB1c3J0aW1lLnR2X3NlYywgdXNydGltZS50dl91c2VjLAotCQkgICAgNSwgbnVsbCwgIiB1c2VyICIpOwotCWlmICh0ZiAmIFRGX1BPU0lYKQotCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgc3lzdGltZS50dl9zZWMsIHN5c3RpbWUudHZfdXNlYywKLQkJICAgIDUsICJzeXMgICIsICJcbiIpOwotCWVsc2UKLQkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCBzeXN0aW1lLnR2X3NlYywgc3lzdGltZS50dl91c2VjLAotCQkgICAgNSwgbnVsbCwgIiBzeXN0ZW1cbiIpOwotCXNoZl9mbHVzaChzaGxfb3V0KTsKLQotCXJldHVybiAocnYpOwotfQotCi12b2lkCi10aW1leF9ob29rKHN0cnVjdCBvcCAqdCwgY2hhciAqKnZvbGF0aWxlICphcHApCi17Ci0JY2hhciAqKndwID0gKmFwcDsKLQlpbnQgb3B0YywgaSwgajsKLQlHZXRvcHQgb3B0OwotCi0Ja3NoX2dldG9wdF9yZXNldCgmb3B0LCAwKTsKLQlvcHQub3B0aW5kID0gMDsJLyogc3RhcnQgYXQgdGhlIHN0YXJ0ICovCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCgoY29uc3QgY2hhciAqKil3cCwgJm9wdCwgIjpwIikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAncCc6Ci0JCQl0LT5zdHJbMF0gfD0gVEZfUE9TSVg7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQllcnJvcmYoInRpbWU6IC0lcyB1bmtub3duIG9wdGlvbiIsIG9wdC5vcHRhcmcpOwotCQljYXNlICc6JzoKLQkJCWVycm9yZigidGltZTogLSVzIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCSAgICBvcHQub3B0YXJnKTsKLQkJfQotCS8qIENvcHkgY29tbWFuZCB3b3JkcyBkb3duIG92ZXIgb3B0aW9ucy4gKi8KLQlpZiAob3B0Lm9wdGluZCAhPSAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHQub3B0aW5kOyBpKyspCi0JCQlhZnJlZSh3cFtpXSwgQVRFTVApOwotCQlmb3IgKGkgPSAwLCBqID0gb3B0Lm9wdGluZDsgKHdwW2ldID0gd3Bbal0pOyBpKyssIGorKykKLQkJCTsKLQl9Ci0JaWYgKCF3cFswXSkKLQkJdC0+c3RyWzBdIHw9IFRGX05PQVJHUzsKLQkqYXBwID0gd3A7Ci19Ci0KLS8qIGV4ZWMgd2l0aCBubyBhcmdzIC0gYXJncyBjYXNlIGlzIHRha2VuIGNhcmUgb2YgaW4gY29tZXhlYygpICovCi1pbnQKLWNfZXhlYyhjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgaTsKLQotCS8qIG1ha2Ugc3VyZSByZWRpcmVjdHMgc3RheSBpbiBwbGFjZSAqLwotCWlmIChlLT5zYXZlZmQgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVGSUxFOyBpKyspIHsKLQkJCWlmIChlLT5zYXZlZmRbaV0gPiAwKQotCQkJCWNsb3NlKGUtPnNhdmVmZFtpXSk7Ci0JCQkvKgotCQkJICoga2VlcCBhbGwgZmlsZSBkZXNjcmlwdG9ycyA+IDIgcHJpdmF0ZSBmb3Iga3NoLAotCQkJICogYnV0IG5vdCBmb3IgUE9TSVggb3IgbGVnYWN5L2tsdWRnZSBzaAotCQkJICovCi0JCQlpZiAoIUZsYWcoRlBPU0lYKSAmJiAhRmxhZyhGU0gpICYmIGkgPiAyICYmCi0JCQkgICAgZS0+c2F2ZWZkW2ldKQotCQkJCWZjbnRsKGksIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotCQl9Ci0JCWUtPnNhdmVmZCA9IE5VTEw7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLSNpZiBIQVZFX01LTk9ECi1pbnQKLWNfbWtub2QoY29uc3QgY2hhciAqKndwKQotewotCWludCBhcmdjLCBvcHRjLCBydiA9IDA7Ci0JYm9vbCBpc21rZmlmbyA9IGZhbHNlOwotCWNvbnN0IGNoYXIgKiphcmd2OwotCXZvaWQgKnNldCA9IE5VTEw7Ci0JbW9kZV90IG1vZGUgPSAwLCBvbGRtb2RlID0gMDsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIm06IikpICE9IC0xKSB7Ci0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdtJzoKLQkJCXNldCA9IHNldG1vZGUoYnVpbHRpbl9vcHQub3B0YXJnKTsKLQkJCWlmIChzZXQgPT0gTlVMTCkgewotCQkJCWJpX2Vycm9yZigiaW52YWxpZCBmaWxlIG1vZGUiKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJbW9kZSA9IGdldG1vZGUoc2V0LCAobW9kZV90KShERUZGSUxFTU9ERSkpOwotCQkJZnJlZShzZXQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlnb3RvIGNfbWtub2RfdXNhZ2U7Ci0JCX0KLQl9Ci0JYXJndiA9ICZ3cFtidWlsdGluX29wdC5vcHRpbmRdOwotCWlmIChhcmd2WzBdID09IE5VTEwpCi0JCWdvdG8gY19ta25vZF91c2FnZTsKLQlmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdOyBhcmdjKyspCi0JCTsKLQlpZiAoYXJnYyA9PSAyICYmIGFyZ3ZbMV1bMF0gPT0gJ3AnKQotCQlpc21rZmlmbyA9IHRydWU7Ci0JZWxzZSBpZiAoYXJnYyAhPSA0IHx8IChhcmd2WzFdWzBdICE9ICdiJyAmJiBhcmd2WzFdWzBdICE9ICdjJykpCi0JCWdvdG8gY19ta25vZF91c2FnZTsKLQotCWlmIChzZXQgIT0gTlVMTCkKLQkJb2xkbW9kZSA9IHVtYXNrKChtb2RlX3QpMCk7Ci0JZWxzZQotCQltb2RlID0gREVGRklMRU1PREU7Ci0KLQltb2RlIHw9IChhcmd2WzFdWzBdID09ICdiJykgPyBTX0lGQkxLIDoKLQkgICAgKGFyZ3ZbMV1bMF0gPT0gJ2MnKSA/IFNfSUZDSFIgOiAwOwotCi0JaWYgKCFpc21rZmlmbykgewotCQl1bnNpZ25lZCBsb25nIG1ham51bSwgbWlubnVtOwotCQlkZXZfdCBkdjsKLQkJY2hhciAqYzsKLQotCQltYWpudW0gPSBzdHJ0b3VsKGFyZ3ZbMl0sICZjLCAwKTsKLQkJaWYgKChjID09IGFyZ3ZbMl0pIHx8ICgqYyAhPSAnXDAnKSkgewotCQkJYmlfZXJyb3JmKCJub24tbnVtZXJpYyBkZXZpY2UgbWFqb3IgJyVzJyIsIGFyZ3ZbMl0pOwotCQkJZ290byBjX21rbm9kX2VycjsKLQkJfQotCQltaW5udW0gPSBzdHJ0b3VsKGFyZ3ZbM10sICZjLCAwKTsKLQkJaWYgKChjID09IGFyZ3ZbM10pIHx8ICgqYyAhPSAnXDAnKSkgewotCQkJYmlfZXJyb3JmKCJub24tbnVtZXJpYyBkZXZpY2UgbWlub3IgJyVzJyIsIGFyZ3ZbM10pOwotCQkJZ290byBjX21rbm9kX2VycjsKLQkJfQotCQlkdiA9IG1ha2VkZXYobWFqbnVtLCBtaW5udW0pOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpKG1ham9yKGR2KSkgIT0gbWFqbnVtKSB7Ci0JCQliaV9lcnJvcmYoImRldmljZSBtYWpvciB0b28gbGFyZ2U6ICVsdSIsIG1ham51bSk7Ci0JCQlnb3RvIGNfbWtub2RfZXJyOwotCQl9Ci0JCWlmICgodW5zaWduZWQgbG9uZykobWlub3IoZHYpKSAhPSBtaW5udW0pIHsKLQkJCWJpX2Vycm9yZigiZGV2aWNlIG1pbm9yIHRvbyBsYXJnZTogJWx1IiwgbWlubnVtKTsKLQkJCWdvdG8gY19ta25vZF9lcnI7Ci0JCX0KLQkJaWYgKG1rbm9kKGFyZ3ZbMF0sIG1vZGUsIGR2KSkKLQkJCWdvdG8gY19ta25vZF9mYWlsZWQ7Ci0JfSBlbHNlIGlmIChta2ZpZm8oYXJndlswXSwgbW9kZSkpIHsKLSBjX21rbm9kX2ZhaWxlZDoKLQkJYmlfZXJyb3JmKCIlczogJXMiLCAqd3AsIHN0cmVycm9yKGVycm5vKSk7Ci0gY19ta25vZF9lcnI6Ci0JCXJ2ID0gMTsKLQl9Ci0KLQlpZiAoc2V0KQotCQl1bWFzayhvbGRtb2RlKTsKLQlyZXR1cm4gKHJ2KTsKLSBjX21rbm9kX3VzYWdlOgotCWJpX2Vycm9yZigidXNhZ2U6IG1rbm9kIFstbSBtb2RlXSBuYW1lIGJ8YyBtYWpvciBtaW5vciIpOwotCWJpX2Vycm9yZigidXNhZ2U6IG1rbm9kIFstbSBtb2RlXSBuYW1lIHAiKTsKLQlyZXR1cm4gKDEpOwotfQotI2VuZGlmCi0KLS8qIGR1bW15IGZ1bmN0aW9uLCBzcGVjaWFsIGNhc2UgaW4gY29tZXhlYygpICovCi1pbnQKLWNfYnVpbHRpbihjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKDApOwotfQotCi0vKiB0ZXN0KDEpIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBncmFtbWFyOgotCW9leHByCTo6PSBhZXhwciB8IGFleHByICItbyIgb2V4cHIgOwotCWFleHByCTo6PSBuZXhwciB8IG5leHByICItYSIgYWV4cHIgOwotCW5leHByCTo6PSBwcmltYXJ5IHwgIiEiIG5leHByIDsKLQlwcmltYXJ5CTo6PSB1bmFyeS1vcGVyYXRvciBvcGVyYW5kCi0JCXwgb3BlcmFuZCBiaW5hcnktb3BlcmF0b3Igb3BlcmFuZAotCQl8IG9wZXJhbmQKLQkJfCAiKCIgb2V4cHIgIikiCi0JCTsKLQotCXVuYXJ5LW9wZXJhdG9yIDo6PSAiLWEifCItciJ8Ii13InwiLXgifCItZSJ8Ii1mInwiLWQifCItYyJ8Ii1iInwiLXAifAotCQkJICAgIi11InwiLWcifCItayJ8Ii1zInwiLXQifCIteiJ8Ii1uInwiLW8ifCItTyJ8Ii1HInwKLQkJCSAgICItTCJ8Ii1oInwiLVMifCItSCI7Ci0KLQliaW5hcnktb3BlcmF0b3IgOjo9ICI9InwiPT0ifCIhPSJ8Ii1lcSJ8Ii1uZSJ8Ii1nZSJ8Ii1ndCJ8Ii1sZSJ8Ii1sdCJ8Ci0JCQkgICAgIi1udCJ8Ii1vdCJ8Ii1lZiJ8Ci0JCQkgICAgIjwifCI+IgkjIHJ1bGVzIHVzZWQgZm9yIFtbIC4uIF1dIGV4cHJlc3Npb25zCi0JCQkgICAgOwotCW9wZXJhbmQgOjo9IDxhbnkgdGhpbmc+Ci0qLwotCi0jZGVmaW5lIFRfRVJSX0VYSVQJMgkvKiBQT1NJWCBzYXlzID4gMSBmb3IgZXJyb3JzICovCi0KLWludAotY190ZXN0KGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgYXJnYywgcmVzOwotCVRlc3RfZW52IHRlOwotCi0JdGUuZmxhZ3MgPSAwOwotCXRlLmlzYSA9IHB0ZXN0X2lzYTsKLQl0ZS5nZXRvcG5kID0gcHRlc3RfZ2V0b3BuZDsKLQl0ZS5ldmFsID0gdGVzdF9ldmFsOwotCXRlLmVycm9yID0gcHRlc3RfZXJyb3I7Ci0KLQlmb3IgKGFyZ2MgPSAwOyB3cFthcmdjXTsgYXJnYysrKQotCQk7Ci0KLQlpZiAoc3RyY21wKHdwWzBdLCAiWyIpID09IDApIHsKLQkJaWYgKHN0cmNtcCh3cFstLWFyZ2NdLCAiXSIpICE9IDApIHsKLQkJCWJpX2Vycm9yZigibWlzc2luZyBdIik7Ci0JCQlyZXR1cm4gKFRfRVJSX0VYSVQpOwotCQl9Ci0JfQotCi0JdGUucG9zLndwID0gd3AgKyAxOwotCXRlLndwX2VuZCA9IHdwICsgYXJnYzsKLQotCS8qCi0JICogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2VzIGZyb20gUE9TSVguMiwgc2VjdGlvbiA0LjYyLjQuCi0JICogSW1wbGVtZW50YXRpb24gb2YgYWxsIHRoZSBydWxlcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UKLQkgKiBvdXIgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciB0aGUgb21pdHRlZCBzdGVwcy4KLQkgKi8KLQlpZiAoYXJnYyA8PSA1KSB7Ci0JCWNvbnN0IGNoYXIgKipvd3AgPSB3cDsKLQkJaW50IGludmVydCA9IDA7Ci0JCVRlc3Rfb3Agb3A7Ci0JCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7Ci0KLQkJd2hpbGUgKC0tYXJnYyA+PSAwKSB7Ci0JCQlpZiAoKCp0ZS5pc2EpKCZ0ZSwgVE1fRU5EKSkKLQkJCQlyZXR1cm4gKCEwKTsKLQkJCWlmIChhcmdjID09IDMpIHsKLQkJCQlvcG5kMSA9ICgqdGUuZ2V0b3BuZCkoJnRlLCBUT19OT05PUCwgMSk7Ci0JCQkJaWYgKChvcCA9ICgqdGUuaXNhKSgmdGUsIFRNX0JJTk9QKSkpIHsKLQkJCQkJb3BuZDIgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgb3AsIDEpOwotCQkJCQlyZXMgPSAoKnRlLmV2YWwpKCZ0ZSwgb3AsIG9wbmQxLAotCQkJCQkgICAgb3BuZDIsIDEpOwotCQkJCQlpZiAodGUuZmxhZ3MgJiBURUZfRVJST1IpCi0JCQkJCQlyZXR1cm4gKFRfRVJSX0VYSVQpOwotCQkJCQlpZiAoaW52ZXJ0ICYgMSkKLQkJCQkJCXJlcyA9ICFyZXM7Ci0JCQkJCXJldHVybiAoIXJlcyk7Ci0JCQkJfQotCQkJCS8qIGJhY2sgdXAgdG8gb3BuZDEgKi8KLQkJCQl0ZS5wb3Mud3AtLTsKLQkJCX0KLQkJCWlmIChhcmdjID09IDEpIHsKLQkJCQlvcG5kMSA9ICgqdGUuZ2V0b3BuZCkoJnRlLCBUT19OT05PUCwgMSk7Ci0JCQkJaWYgKHN0cmNtcChvcG5kMSwgIi10IikgPT0gMCkKLQkJCQkgICAgYnJlYWs7Ci0JCQkJcmVzID0gKCp0ZS5ldmFsKSgmdGUsIFRPX1NUTlpFLCBvcG5kMSwKLQkJCQkgICAgTlVMTCwgMSk7Ci0JCQkJaWYgKGludmVydCAmIDEpCi0JCQkJCXJlcyA9ICFyZXM7Ci0JCQkJcmV0dXJuICghcmVzKTsKLQkJCX0KLQkJCWlmICgoKnRlLmlzYSkoJnRlLCBUTV9OT1QpKSB7Ci0JCQkJaW52ZXJ0Kys7Ci0JCQl9IGVsc2UKLQkJCQlicmVhazsKLQkJfQotCQl0ZS5wb3Mud3AgPSBvd3AgKyAxOwotCX0KLQotCXJldHVybiAodGVzdF9wYXJzZSgmdGUpKTsKLX0KLQotLyoKLSAqIEdlbmVyaWMgdGVzdCByb3V0aW5lcy4KLSAqLwotCi1UZXN0X29wCi10ZXN0X2lzb3AoVGVzdF9tZXRhIG1ldGEsIGNvbnN0IGNoYXIgKnMpCi17Ci0JY2hhciBzYzE7Ci0JY29uc3Qgc3RydWN0IHRfb3AgKnRibDsKLQotCXRibCA9IG1ldGEgPT0gVE1fVU5PUCA/IHVfb3BzIDogYl9vcHM7Ci0JaWYgKCpzKSB7Ci0JCXNjMSA9IHNbMV07Ci0JCWZvciAoOyB0YmwtPm9wX3RleHRbMF07IHRibCsrKQotCQkJaWYgKHNjMSA9PSB0YmwtPm9wX3RleHRbMV0gJiYgIXN0cmNtcChzLCB0YmwtPm9wX3RleHQpKQotCQkJCXJldHVybiAodGJsLT5vcF9udW0pOwotCX0KLQlyZXR1cm4gKFRPX05PTk9QKTsKLX0KLQotaW50Ci10ZXN0X2V2YWwoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBjb25zdCBjaGFyICpvcG5kMSwgY29uc3QgY2hhciAqb3BuZDIsCi0gICAgYm9vbCBkb19ldmFsKQotewotCWludCBpLCBzOwotCXNpemVfdCBrOwotCXN0cnVjdCBzdGF0IGIxLCBiMjsKLQlta3NoX2FyaV90IHYxLCB2MjsKLQotCWlmICghZG9fZXZhbCkKLQkJcmV0dXJuICgwKTsKLQotCXN3aXRjaCAoKGludClvcCkgewotCS8qCi0JICogVW5hcnkgT3BlcmF0b3JzCi0JICovCi0JY2FzZSBUT19TVE5aRTogLyogLW4gKi8KLQkJcmV0dXJuICgqb3BuZDEgIT0gJ1wwJyk7Ci0JY2FzZSBUT19TVFpFUjogLyogLXogKi8KLQkJcmV0dXJuICgqb3BuZDEgPT0gJ1wwJyk7Ci0JY2FzZSBUT19PUFRJT046IC8qIC1vICovCi0JCWlmICgoaSA9ICpvcG5kMSkgPT0gJyEnIHx8IGkgPT0gJz8nKQotCQkJb3BuZDErKzsKLQkJaWYgKChrID0gb3B0aW9uKG9wbmQxKSkgPT0gKHNpemVfdCktMSkKLQkJCXJldHVybiAoMCk7Ci0JCXJldHVybiAoaSA9PSAnPycgPyAxIDogaSA9PSAnIScgPyAhRmxhZyhrKSA6IEZsYWcoaykpOwotCWNhc2UgVE9fRklMUkQ6IC8qIC1yICovCi0JCXJldHVybiAodGVzdF9lYWNjZXNzKG9wbmQxLCBSX09LKSA9PSAwKTsKLQljYXNlIFRPX0ZJTFdSOiAvKiAtdyAqLwotCQlyZXR1cm4gKHRlc3RfZWFjY2VzcyhvcG5kMSwgV19PSykgPT0gMCk7Ci0JY2FzZSBUT19GSUxFWDogLyogLXggKi8KLQkJcmV0dXJuICh0ZXN0X2VhY2Nlc3Mob3BuZDEsIFhfT0spID09IDApOwotCWNhc2UgVE9fRklMQVhTVDogLyogLWEgKi8KLQljYXNlIFRPX0ZJTEVYU1Q6IC8qIC1lICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwKTsKLQljYXNlIFRPX0ZJTFJFRzogLyogLXIgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU1JFRyhiMS5zdF9tb2RlKSk7Ci0JY2FzZSBUT19GSUxJRDogLyogLWQgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0RJUihiMS5zdF9tb2RlKSk7Ci0JY2FzZSBUT19GSUxDREVWOiAvKiAtYyAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTQ0hSKGIxLnN0X21vZGUpKTsKLQljYXNlIFRPX0ZJTEJERVY6IC8qIC1iICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNCTEsoYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMRklGTzogLyogLXAgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0ZJRk8oYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMU1lNOiAvKiAtaCAtTCAqLwotCQlyZXR1cm4gKGxzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0xOSyhiMS5zdF9tb2RlKSk7Ci0JY2FzZSBUT19GSUxTT0NLOiAvKiAtUyAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTU09DSyhiMS5zdF9tb2RlKSk7Ci0JY2FzZSBUT19GSUxDREY6LyogLUggSFAgY29udGV4dCBkZXBlbmRlbnQgZmlsZXMgKGRpcmVjdG9yaWVzKSAqLwotCQlyZXR1cm4gKDApOwotCWNhc2UgVE9fRklMU0VUVTogLyogLXUgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKLQkJICAgIChiMS5zdF9tb2RlICYgU19JU1VJRCkgPT0gU19JU1VJRCk7Ci0JY2FzZSBUT19GSUxTRVRHOiAvKiAtZyAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgotCQkgICAgKGIxLnN0X21vZGUgJiBTX0lTR0lEKSA9PSBTX0lTR0lEKTsKLQljYXNlIFRPX0ZJTFNUQ0s6IC8qIC1rICovCi0jaWZkZWYgU19JU1ZUWAotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgotCQkgICAgKGIxLnN0X21vZGUgJiBTX0lTVlRYKSA9PSBTX0lTVlRYKTsKLSNlbHNlCi0JCXJldHVybiAoMCk7Ci0jZW5kaWYKLQljYXNlIFRPX0ZJTEdaOiAvKiAtcyAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBiMS5zdF9zaXplID4gMEwpOwotCWNhc2UgVE9fRklMVFQ6IC8qIC10ICovCi0JCWlmIChvcG5kMSAmJiAhYmlfZ2V0bihvcG5kMSwgJmkpKSB7Ci0JCQl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOwotCQkJaSA9IDA7Ci0JCX0gZWxzZQotCQkJaSA9IGlzYXR0eShvcG5kMSA/IGkgOiAwKTsKLQkJcmV0dXJuIChpKTsKLQljYXNlIFRPX0ZJTFVJRDogLyogLU8gKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3RfdWlkID09IGtzaGV1aWQpOwotCWNhc2UgVE9fRklMR0lEOiAvKiAtRyAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBiMS5zdF9naWQgPT0gZ2V0ZWdpZCgpKTsKLQkvKgotCSAqIEJpbmFyeSBPcGVyYXRvcnMKLQkgKi8KLQljYXNlIFRPX1NURVFMOiAvKiA9ICovCi0JCWlmICh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpCi0JCQlyZXR1cm4gKGdtYXRjaHgob3BuZDEsIG9wbmQyLCBmYWxzZSkpOwotCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpID09IDApOwotCWNhc2UgVE9fU1RORVE6IC8qICE9ICovCi0JCWlmICh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpCi0JCQlyZXR1cm4gKCFnbWF0Y2h4KG9wbmQxLCBvcG5kMiwgZmFsc2UpKTsKLQkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSAhPSAwKTsKLQljYXNlIFRPX1NUTFQ6IC8qIDwgKi8KLQkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA8IDApOwotCWNhc2UgVE9fU1RHVDogLyogPiAqLwotCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpID4gMCk7Ci0JY2FzZSBUT19JTlRFUTogLyogLWVxICovCi0JY2FzZSBUT19JTlRORTogLyogLW5lICovCi0JY2FzZSBUT19JTlRHRTogLyogLWdlICovCi0JY2FzZSBUT19JTlRHVDogLyogLWd0ICovCi0JY2FzZSBUT19JTlRMRTogLyogLWxlICovCi0JY2FzZSBUT19JTlRMVDogLyogLWx0ICovCi0JCWlmICghZXZhbHVhdGUob3BuZDEsICZ2MSwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpIHx8Ci0JCSAgICAhZXZhbHVhdGUob3BuZDIsICZ2MiwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpKSB7Ci0JCQkvKiBlcnJvciBhbHJlYWR5IHByaW50ZWQuLiAqLwotCQkJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJc3dpdGNoICgoaW50KW9wKSB7Ci0JCWNhc2UgVE9fSU5URVE6Ci0JCQlyZXR1cm4gKHYxID09IHYyKTsKLQkJY2FzZSBUT19JTlRORToKLQkJCXJldHVybiAodjEgIT0gdjIpOwotCQljYXNlIFRPX0lOVEdFOgotCQkJcmV0dXJuICh2MSA+PSB2Mik7Ci0JCWNhc2UgVE9fSU5UR1Q6Ci0JCQlyZXR1cm4gKHYxID4gdjIpOwotCQljYXNlIFRPX0lOVExFOgotCQkJcmV0dXJuICh2MSA8PSB2Mik7Ci0JCWNhc2UgVE9fSU5UTFQ6Ci0JCQlyZXR1cm4gKHYxIDwgdjIpOwotCQl9Ci0JY2FzZSBUT19GSUxOVDogLyogLW50ICovCi0JCS8qIGtzaDg4L2tzaDkzIHN1Y2NlZWQgaWYgZmlsZTIgY2FuJ3QgYmUgc3RhdGVkCi0JCSAqIChzdWJ0bHkgZGlmZmVyZW50IGZyb20gJ2RvZXMgbm90IGV4aXN0JykuCi0JCSAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgotCQkgICAgKCgocyA9IHN0YXQob3BuZDIsICZiMikpID09IDAgJiYKLQkJICAgIGIxLnN0X210aW1lID4gYjIuc3RfbXRpbWUpIHx8IHMgPCAwKSk7Ci0JY2FzZSBUT19GSUxPVDogLyogLW90ICovCi0JCS8qIGtzaDg4L2tzaDkzIHN1Y2NlZWQgaWYgZmlsZTEgY2FuJ3QgYmUgc3RhdGVkCi0JCSAqIChzdWJ0bHkgZGlmZmVyZW50IGZyb20gJ2RvZXMgbm90IGV4aXN0JykuCi0JCSAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDIsICZiMikgPT0gMCAmJgotCQkgICAgKCgocyA9IHN0YXQob3BuZDEsICZiMSkpID09IDAgJiYKLQkJICAgIGIxLnN0X210aW1lIDwgYjIuc3RfbXRpbWUpIHx8IHMgPCAwKSk7Ci0JY2FzZSBUT19GSUxFUTogLyogLWVmICovCi0JCXJldHVybiAoc3RhdCAob3BuZDEsICZiMSkgPT0gMCAmJiBzdGF0IChvcG5kMiwgJmIyKSA9PSAwICYmCi0JCSAgICBiMS5zdF9kZXYgPT0gYjIuc3RfZGV2ICYmIGIxLnN0X2lubyA9PSBiMi5zdF9pbm8pOwotCX0KLQkoKnRlLT5lcnJvcikodGUsIDAsICJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBvcCIpOwotCXJldHVybiAoMSk7Ci19Ci0KLS8qIE9uIG1vc3QvYWxsIHVuaXhlbiwgYWNjZXNzKCkgc2F5cyBldmVyeXRoaW5nIGlzIGV4ZWN1dGFibGUgZm9yIHJvb3QuLi4gKi8KLXN0YXRpYyBpbnQKLXRlc3RfZWFjY2Vzcyhjb25zdCBjaGFyICpwYXRobCwgaW50IG1vZGUpCi17Ci0JaW50IHJ2OwotCi0JaWYgKChydiA9IGFjY2VzcyhwYXRobCwgbW9kZSkpID09IDAgJiYga3NoZXVpZCA9PSAwICYmIChtb2RlICYgWF9PSykpIHsKLQkJc3RydWN0IHN0YXQgc3RhdGI7Ci0KLQkJaWYgKHN0YXQocGF0aGwsICZzdGF0YikgPCAwKQotCQkJcnYgPSAtMTsKLQkJZWxzZSBpZiAoU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkKLQkJCXJ2ID0gMDsKLQkJZWxzZQotCQkJcnYgPSAoc3RhdGIuc3RfbW9kZSAmIChTX0lYVVNSfFNfSVhHUlB8U19JWE9USCkpID8KLQkJCSAgICAwIDogLTE7Ci0JfQotCXJldHVybiAocnYpOwotfQotCi1pbnQKLXRlc3RfcGFyc2UoVGVzdF9lbnYgKnRlKQotewotCWludCBydjsKLQotCXJ2ID0gdGVzdF9vZXhwcih0ZSwgMSk7Ci0KLQlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICEoKnRlLT5pc2EpKHRlLCBUTV9FTkQpKQotCQkoKnRlLT5lcnJvcikodGUsIDAsICJ1bmV4cGVjdGVkIG9wZXJhdG9yL29wZXJhbmQiKTsKLQotCXJldHVybiAoKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgPyBUX0VSUl9FWElUIDogIXJ2KTsKLX0KLQotc3RhdGljIGludAotdGVzdF9vZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKLXsKLQlpbnQgcnY7Ci0KLQlpZiAoKHJ2ID0gdGVzdF9hZXhwcih0ZSwgZG9fZXZhbCkpKQotCQlkb19ldmFsID0gZmFsc2U7Ci0JaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9PUikpCi0JCXJldHVybiAodGVzdF9vZXhwcih0ZSwgZG9fZXZhbCkgfHwgcnYpOwotCXJldHVybiAocnYpOwotfQotCi1zdGF0aWMgaW50Ci10ZXN0X2FleHByKFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQotewotCWludCBydjsKLQotCWlmICghKHJ2ID0gdGVzdF9uZXhwcih0ZSwgZG9fZXZhbCkpKQotCQlkb19ldmFsID0gZmFsc2U7Ci0JaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9BTkQpKQotCQlyZXR1cm4gKHRlc3RfYWV4cHIodGUsIGRvX2V2YWwpICYmIHJ2KTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotc3RhdGljIGludAotdGVzdF9uZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKLXsKLQlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICgqdGUtPmlzYSkodGUsIFRNX05PVCkpCi0JCXJldHVybiAoIXRlc3RfbmV4cHIodGUsIGRvX2V2YWwpKTsKLQlyZXR1cm4gKHRlc3RfcHJpbWFyeSh0ZSwgZG9fZXZhbCkpOwotfQotCi1zdGF0aWMgaW50Ci10ZXN0X3ByaW1hcnkoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCi17Ci0JY29uc3QgY2hhciAqb3BuZDEsICpvcG5kMjsKLQlpbnQgcnY7Ci0JVGVzdF9vcCBvcDsKLQotCWlmICh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpCi0JCXJldHVybiAoMCk7Ci0JaWYgKCgqdGUtPmlzYSkodGUsIFRNX09QQVJFTikpIHsKLQkJcnYgPSB0ZXN0X29leHByKHRlLCBkb19ldmFsKTsKLQkJaWYgKHRlLT5mbGFncyAmIFRFRl9FUlJPUikKLQkJCXJldHVybiAoMCk7Ci0JCWlmICghKCp0ZS0+aXNhKSh0ZSwgVE1fQ1BBUkVOKSkgewotCQkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAibWlzc2luZyBjbG9zaW5nIHBhcmVuIik7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCXJldHVybiAocnYpOwotCX0KLQkvKgotCSAqIEJpbmFyeSBzaG91bGQgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgdW5hcnkgaW4gdGhpcyBjYXNlCi0JICogc28gdGhhdCBzb21ldGhpbmcgbGlrZSB0ZXN0IFwoIC1mID0gLWYgXCkgaXMgYWNjZXB0ZWQKLQkgKi8KLQlpZiAoKHRlLT5mbGFncyAmIFRFRl9EQlJBQ0tFVCkgfHwgKCZ0ZS0+cG9zLndwWzFdIDwgdGUtPndwX2VuZCAmJgotCSAgICAhdGVzdF9pc29wKFRNX0JJTk9QLCB0ZS0+cG9zLndwWzFdKSkpIHsKLQkJaWYgKChvcCA9ICgqdGUtPmlzYSkodGUsIFRNX1VOT1ApKSkgewotCQkJLyogdW5hcnkgZXhwcmVzc2lvbiAqLwotCQkJb3BuZDEgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgb3AsIGRvX2V2YWwpOwotCQkJaWYgKCFvcG5kMSkgewotCQkJCSgqdGUtPmVycm9yKSh0ZSwgLTEsICJtaXNzaW5nIGFyZ3VtZW50Iik7Ci0JCQkJcmV0dXJuICgwKTsKLQkJCX0KLQotCQkJcmV0dXJuICgoKnRlLT5ldmFsKSh0ZSwgb3AsIG9wbmQxLCBOVUxMLCBkb19ldmFsKSk7Ci0JCX0KLQl9Ci0Jb3BuZDEgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgVE9fTk9OT1AsIGRvX2V2YWwpOwotCWlmICghb3BuZDEpIHsKLQkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAiZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoKG9wID0gKCp0ZS0+aXNhKSh0ZSwgVE1fQklOT1ApKSkgewotCQkvKiBiaW5hcnkgZXhwcmVzc2lvbiAqLwotCQlvcG5kMiA9ICgqdGUtPmdldG9wbmQpKHRlLCBvcCwgZG9fZXZhbCk7Ci0JCWlmICghb3BuZDIpIHsKLQkJCSgqdGUtPmVycm9yKSh0ZSwgLTEsICJtaXNzaW5nIHNlY29uZCBhcmd1bWVudCIpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCi0JCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIG9wLCBvcG5kMSwgb3BuZDIsIGRvX2V2YWwpKTsKLQl9Ci0JcmV0dXJuICgoKnRlLT5ldmFsKSh0ZSwgVE9fU1ROWkUsIG9wbmQxLCBOVUxMLCBkb19ldmFsKSk7Ci19Ci0KLS8qCi0gKiBQbGFpbiB0ZXN0ICh0ZXN0IGFuZCBbIC4uIF0pIHNwZWNpZmljIHJvdXRpbmVzLgotICovCi0KLS8qCi0gKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKLSAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKLSAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KLSAqLwotc3RhdGljIFRlc3Rfb3AKLXB0ZXN0X2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQotewotCS8qIE9yZGVyIGltcG9ydGFudCAtIGluZGV4ZWQgYnkgVGVzdF9tZXRhIHZhbHVlcyAqLwotCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0b2tlbnNbXSA9IHsKLQkJIi1vIiwgIi1hIiwgIiEiLCAiKCIsICIpIgotCX07Ci0JVGVzdF9vcCBydjsKLQotCWlmICh0ZS0+cG9zLndwID49IHRlLT53cF9lbmQpCi0JCXJldHVybiAobWV0YSA9PSBUTV9FTkQgPyBUT19OT05OVUxMIDogVE9fTk9OT1ApOwotCi0JaWYgKG1ldGEgPT0gVE1fVU5PUCB8fCBtZXRhID09IFRNX0JJTk9QKQotCQlydiA9IHRlc3RfaXNvcChtZXRhLCAqdGUtPnBvcy53cCk7Ci0JZWxzZSBpZiAobWV0YSA9PSBUTV9FTkQpCi0JCXJ2ID0gVE9fTk9OT1A7Ci0JZWxzZQotCQlydiA9ICFzdHJjbXAoKnRlLT5wb3Mud3AsIHRva2Vuc1soaW50KW1ldGFdKSA/Ci0JCSAgICBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0KLQkvKiBBY2NlcHQgdGhlIHRva2VuPyAqLwotCWlmIChydiAhPSBUT19OT05PUCkKLQkJdGUtPnBvcy53cCsrOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXB0ZXN0X2dldG9wbmQoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKLXsKLQlpZiAodGUtPnBvcy53cCA+PSB0ZS0+d3BfZW5kKQotCQlyZXR1cm4gKG9wID09IFRPX0ZJTFRUID8gIjEiIDogTlVMTCk7Ci0JcmV0dXJuICgqdGUtPnBvcy53cCsrKTsKLX0KLQotc3RhdGljIHZvaWQKLXB0ZXN0X2Vycm9yKFRlc3RfZW52ICp0ZSwgaW50IG9mcywgY29uc3QgY2hhciAqbXNnKQotewotCWNvbnN0IGNoYXIgKm9wOwotCi0JdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKLQlpZiAoKG9wID0gdGUtPnBvcy53cCArIG9mcyA+PSB0ZS0+d3BfZW5kID8gTlVMTCA6IHRlLT5wb3Mud3Bbb2ZzXSkpCi0JCWJpX2Vycm9yZigiJXM6ICVzIiwgb3AsIG1zZyk7Ci0JZWxzZQotCQliaV9lcnJvcmYoIiVzIiwgbXNnKTsKLX0KLQotI2lmbmRlZiBNS1NIX05PX0xJTUlUUwotI2RlZmluZSBTT0ZUCTB4MQotI2RlZmluZSBIQVJECTB4MgotCi1zdHJ1Y3QgbGltaXRzIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCByZXNvdXJjZTsJCS8qIHJlc291cmNlIHRvIGdldC9zZXQgKi8KLQlpbnQgZmFjdG9yOwkJLyogbXVsdGlwbHkgYnkgdG8gZ2V0IHJsaW1fe2N1cixtYXh9IHZhbHVlcyAqLwotCWNoYXIgb3B0aW9uOwotfTsKLQotc3RhdGljIHZvaWQgcHJpbnRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKiwgaW50KTsKLXN0YXRpYyBpbnQgc2V0X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLQotLyogTWFnaWMgdG8gZGl2aW5lIHRoZSAnbScgYW5kICd2JyBsaW1pdHMgKi8KLQotI2lmZGVmIFJMSU1JVF9BUwotI2lmICFkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCAoUkxJTUlUX1ZNRU0gPT0gUkxJTUlUX0FTKSB8fCBcCi0gICAgIWRlZmluZWQoUkxJTUlUX1JTUykgfHwgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9SU1MpCi0jZGVmaW5lIFVMSU1JVF9WX0lTX0FTCi0jZWxpZiBkZWZpbmVkKFJMSU1JVF9WTUVNKQotI2lmICFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChSTElNSVRfUlNTID09IFJMSU1JVF9BUykKLSNkZWZpbmUgVUxJTUlUX1ZfSVNfQVMKLSNlbHNlCi0jZGVmaW5lIFVMSU1JVF9WX0lTX1ZNRU0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFJMSU1JVF9SU1MKLSNpZmRlZiBVTElNSVRfVl9JU19WTUVNCi0jZGVmaW5lIFVMSU1JVF9NX0lTX1JTUwotI2VsaWYgZGVmaW5lZChSTElNSVRfVk1FTSkgJiYgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9SU1MpCi0jZGVmaW5lIFVMSU1JVF9NX0lTX1ZNRU0KLSNlbHNlCi0jZGVmaW5lIFVMSU1JVF9NX0lTX1JTUwotI2VuZGlmCi0jaWYgZGVmaW5lZChVTElNSVRfTV9JU19SU1MpICYmIGRlZmluZWQoUkxJTUlUX0FTKSAmJiAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpCi0jdW5kZWYgVUxJTUlUX01fSVNfUlNTCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUkxJTUlUX0FTKSAmJiAhZGVmaW5lZChVTElNSVRfTV9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9WTUVNKQotI2RlZmluZSBVTElNSVRfVl9JU19WTUVNCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFVMSU1JVF9WX0lTX1ZNRU0pICYmIGRlZmluZWQoUkxJTUlUX1ZNRU0pICYmIFwKLSAgICAoIWRlZmluZWQoUkxJTUlUX1JTUykgfHwgKGRlZmluZWQoUkxJTUlUX0FTKSAmJiAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpKSkKLSNkZWZpbmUgVUxJTUlUX01fSVNfVk1FTQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1ZNRU0pICYmIGRlZmluZWQoUkxJTUlUX0FTKSAmJiBcCi0gICAgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9BUykKLSN1bmRlZiBVTElNSVRfTV9JU19WTUVNCi0jZW5kaWYKLQotCi1pbnQKLWNfdWxpbWl0KGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGxpbWl0cyBsaW1pdHNbXSA9IHsKLQkJLyogZG8gbm90IHVzZSBvcHRpb25zIC1ILCAtUyBvciAtYSBvciBjaGFuZ2UgdGhlIG9yZGVyICovCi0jaWZkZWYgUkxJTUlUX0NQVQotCQl7ICJ0aW1lKGNwdS1zZWNvbmRzKSIsIFJMSU1JVF9DUFUsIDEsICd0JyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX0ZTSVpFCi0JCXsgImZpbGUoYmxvY2tzKSIsIFJMSU1JVF9GU0laRSwgNTEyLCAnZicgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9DT1JFCi0JCXsgImNvcmVkdW1wKGJsb2NrcykiLCBSTElNSVRfQ09SRSwgNTEyLCAnYycgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9EQVRBCi0JCXsgImRhdGEoS2lCKSIsIFJMSU1JVF9EQVRBLCAxMDI0LCAnZCcgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9TVEFDSwotCQl7ICJzdGFjayhLaUIpIiwgUkxJTUlUX1NUQUNLLCAxMDI0LCAncycgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9NRU1MT0NLCi0JCXsgImxvY2tlZG1lbShLaUIpIiwgUkxJTUlUX01FTUxPQ0ssIDEwMjQsICdsJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05PRklMRQotCQl7ICJub2ZpbGVzKGRlc2NyaXB0b3JzKSIsIFJMSU1JVF9OT0ZJTEUsIDEsICduJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05QUk9DCi0JCXsgInByb2Nlc3NlcyIsIFJMSU1JVF9OUFJPQywgMSwgJ3AnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfU1dBUAotCQl7ICJzd2FwKEtpQikiLCBSTElNSVRfU1dBUCwgMTAyNCwgJ3cnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTE9DS1MKLQkJeyAiZmxvY2tzIiwgUkxJTUlUX0xPQ0tTLCAtMSwgJ0wnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfVElNRQotCQl7ICJodW1hbnRpbWUoc2Vjb25kcykiLCBSTElNSVRfVElNRSwgMSwgJ1QnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTk9WTU9OCi0JCXsgInZub2RlbW9uaXRvcnMiLCBSTElNSVRfTk9WTU9OLCAxLCAnVicgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9TSUdQRU5ESU5HCi0JCXsgInNpZ3BlbmRpbmciLCBSTElNSVRfU0lHUEVORElORywgMSwgJ2knIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTVNHUVVFVUUKLQkJeyAibXNncXVldWUoYnl0ZXMpIiwgUkxJTUlUX01TR1FVRVVFLCAxLCAncScgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9BSU9fTUVNCi0JCXsgIkFJT2xvY2tlZG1lbShLaUIpIiwgUkxJTUlUX0FJT19NRU0sIDEwMjQsICdNJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX0FJT19PUFMKLQkJeyAiQUlPb3BlcmF0aW9ucyIsIFJMSU1JVF9BSU9fT1BTLCAxLCAnTycgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9UQ0FDSEUKLQkJeyAiY2FjaGVkdGhyZWFkcyIsIFJMSU1JVF9UQ0FDSEUsIDEsICdDJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX1NCU0laRQotCQl7ICJzb2NrYnVmc2l6KEtpQikiLCBSTElNSVRfU0JTSVpFLCAxMDI0LCAnQicgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9QVEhSRUFECi0JCXsgInRocmVhZHNwZXJwcm9jZXNzIiwgUkxJTUlUX1BUSFJFQUQsIDEsICdQJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05JQ0UKLQkJeyAibWF4bmljZSIsIFJMSU1JVF9OSUNFLCAxLCAnZScgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9SVFBSSU8KLQkJeyAibWF4cnRwcmlvIiwgUkxJTUlUX1JUUFJJTywgMSwgJ3InIH0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1JTUykKLQkJeyAicmVzaWRlbnQtc2V0KEtpQikiLCBSTElNSVRfUlNTLCAxMDI0LCAnbScgfSwKLSNlbGlmIGRlZmluZWQoVUxJTUlUX01fSVNfVk1FTSkKLQkJeyAibWVtb3J5KEtpQikiLCBSTElNSVRfVk1FTSwgMTAyNCwgJ20nIH0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFVMSU1JVF9WX0lTX1ZNRU0pCi0JCXsgInZpcnR1YWwtbWVtb3J5KEtpQikiLCBSTElNSVRfVk1FTSwgMTAyNCwgJ3YnIH0sCi0jZWxpZiBkZWZpbmVkKFVMSU1JVF9WX0lTX0FTKQotCQl7ICJhZGRyZXNzLXNwYWNlKEtpQikiLCBSTElNSVRfQVMsIDEwMjQsICd2JyB9LAotI2VuZGlmCi0JCXsgTlVMTCwgMCwgMCwgMCB9Ci0JfTsKLQlzdGF0aWMgY2hhciBvcHRzWzMgKyBORUxFTShsaW1pdHMpXTsKLQlpbnQgaG93ID0gU09GVCB8IEhBUkQsIG9wdGMsIHdoYXQgPSAnZic7Ci0JYm9vbCBhbGwgPSBmYWxzZTsKLQljb25zdCBzdHJ1Y3QgbGltaXRzICpsOwotCi0JaWYgKCFvcHRzWzBdKSB7Ci0JCS8qIGJ1aWxkIG9wdGlvbnMgc3RyaW5nIG9uIGZpcnN0IGNhbGwgLSB5dWNrICovCi0JCWNoYXIgKnAgPSBvcHRzOwotCi0JCSpwKysgPSAnSCc7ICpwKysgPSAnUyc7ICpwKysgPSAnYSc7Ci0JCWZvciAobCA9IGxpbWl0czsgbC0+bmFtZTsgbCsrKQotCQkJKnArKyA9IGwtPm9wdGlvbjsKLQkJKnAgPSAnXDAnOwotCX0KLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnSCc6Ci0JCQlob3cgPSBIQVJEOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1MnOgotCQkJaG93ID0gU09GVDsKLQkJCWJyZWFrOwotCQljYXNlICdhJzoKLQkJCWFsbCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQliaV9lcnJvcmYoInVzYWdlOiB1bGltaXQgWy1hY2RmSExsbW5wU3NUdHZ3XSBbdmFsdWVdIik7Ci0JCQlyZXR1cm4gKDEpOwotCQlkZWZhdWx0OgotCQkJd2hhdCA9IG9wdGM7Ci0JCX0KLQotCWZvciAobCA9IGxpbWl0czsgbC0+bmFtZSAmJiBsLT5vcHRpb24gIT0gd2hhdDsgbCsrKQotCQk7Ci0JaWYgKCFsLT5uYW1lKSB7Ci0JCWludGVybmFsX3dhcm5pbmdmKCJ1bGltaXQ6ICVjIiwgd2hhdCk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pIHsKLQkJaWYgKGFsbCB8fCB3cFtidWlsdGluX29wdC5vcHRpbmQgKyAxXSkgewotCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJcmV0dXJuIChzZXRfdWxpbWl0KGwsIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0sIGhvdykpOwotCX0KLQlpZiAoIWFsbCkKLQkJcHJpbnRfdWxpbWl0KGwsIGhvdyk7Ci0JZWxzZSBmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWU7IGwrKykgewotCQlzaHByaW50ZigiJS0yMHMgIiwgbC0+bmFtZSk7Ci0JCXByaW50X3VsaW1pdChsLCBob3cpOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1zZXRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKmwsIGNvbnN0IGNoYXIgKnYsIGludCBob3cpCi17Ci0JcmxpbV90IHZhbCA9IChybGltX3QpMDsKLQlzdHJ1Y3QgcmxpbWl0IGxpbWl0OwotCi0JaWYgKHN0cmNtcCh2LCAidW5saW1pdGVkIikgPT0gMCkKLQkJdmFsID0gKHJsaW1fdClSTElNX0lORklOSVRZOwotCWVsc2UgewotCQlta3NoX2FyaV90IHJ2YWw7Ci0KLQkJaWYgKCFldmFsdWF0ZSh2LCAmcnZhbCwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpKQotCQkJcmV0dXJuICgxKTsKLQkJLyoKLQkJICogQXZvaWQgcHJvYmxlbXMgY2F1c2VkIGJ5IHR5cG9zIHRoYXQgZXZhbHVhdGUgbWlzc2VzIGR1ZQotCQkgKiB0byBldmFsdWF0aW5nIHVuc2V0IHBhcmFtZXRlcnMgdG8gMC4uLgotCQkgKiBJZiB0aGlzIGNhdXNlcyBwcm9ibGVtcywgd2lsbCBoYXZlIHRvIGFkZCBwYXJhbWV0ZXIgdG8KLQkJICogZXZhbHVhdGUoKSB0byBjb250cm9sIGlmIHVuc2V0IHBhcmFtcyBhcmUgMCBvciBhbiBlcnJvci4KLQkJICovCi0JCWlmICghcnZhbCAmJiAha3NoX2lzZGlnaXQodlswXSkpIHsKLQkJCWJpX2Vycm9yZigiaW52YWxpZCAlcyBsaW1pdDogJXMiLCBsLT5uYW1lLCB2KTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJdmFsID0gKHJsaW1fdCkoKHJsaW1fdClydmFsICogbC0+ZmFjdG9yKTsKLQl9Ci0KLQlpZiAoZ2V0cmxpbWl0KGwtPnJlc291cmNlLCAmbGltaXQpIDwgMCkgewotCQkvKiBzb21lIGNhbm5vdCBiZSByZWFkLCBlLmcuIExpbnV4IFJMSU1JVF9MT0NLUyAqLwotCQlsaW1pdC5ybGltX2N1ciA9IFJMSU1fSU5GSU5JVFk7Ci0JCWxpbWl0LnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKLQl9Ci0JaWYgKGhvdyAmIFNPRlQpCi0JCWxpbWl0LnJsaW1fY3VyID0gdmFsOwotCWlmIChob3cgJiBIQVJEKQotCQlsaW1pdC5ybGltX21heCA9IHZhbDsKLQlpZiAoIXNldHJsaW1pdChsLT5yZXNvdXJjZSwgJmxpbWl0KSkKLQkJcmV0dXJuICgwKTsKLQlpZiAoZXJybm8gPT0gRVBFUk0pCi0JCWJpX2Vycm9yZigiJXMgZXhjZWVkcyBhbGxvd2FibGUgJXMgbGltaXQiLCB2LCBsLT5uYW1lKTsKLQllbHNlCi0JCWJpX2Vycm9yZigiYmFkICVzIGxpbWl0OiAlcyIsIGwtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICpsLCBpbnQgaG93KQotewotCXJsaW1fdCB2YWwgPSAocmxpbV90KTA7Ci0Jc3RydWN0IHJsaW1pdCBsaW1pdDsKLQotCWlmIChnZXRybGltaXQobC0+cmVzb3VyY2UsICZsaW1pdCkpIHsKLQkJc2hmX3B1dHMoInVua25vd25cbiIsIHNobF9zdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCWlmIChob3cgJiBTT0ZUKQotCQl2YWwgPSBsaW1pdC5ybGltX2N1cjsKLQllbHNlIGlmIChob3cgJiBIQVJEKQotCQl2YWwgPSBsaW1pdC5ybGltX21heDsKLQlpZiAodmFsID09IChybGltX3QpUkxJTV9JTkZJTklUWSkKLQkJc2hmX3B1dHMoInVubGltaXRlZFxuIiwgc2hsX3N0ZG91dCk7Ci0JZWxzZQotCQlzaHByaW50ZigiJWxkXG4iLCAobG9uZykodmFsIC8gbC0+ZmFjdG9yKSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1jX3JlbmFtZShjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IHJ2ID0gMTsKLQotCWlmICh3cCA9PSBOVUxMCQkvKiBhcmd2ICovIHx8Ci0JICAgIHdwWzBdID09IE5VTEwJLyogbmFtZSBvZiBidWlsdGluICovIHx8Ci0JICAgIHdwWzFdID09IE5VTEwJLyogZmlyc3QgYXJndW1lbnQgKi8gfHwKLQkgICAgd3BbMl0gPT0gTlVMTAkvKiBzZWNvbmQgYXJndW1lbnQgKi8gfHwKLQkgICAgd3BbM10gIT0gTlVMTAkvKiBubyBmdXJ0aGVyIGFyZ3MgcGxlYXNlICovKQotCQliaV9lcnJvcmYoVF9zeW5lcnIpOwotCWVsc2UgaWYgKChydiA9IHJlbmFtZSh3cFsxXSwgd3BbMl0pKSAhPSAwKSB7Ci0JCXJ2ID0gZXJybm87Ci0JCWJpX2Vycm9yZigiZmFpbGVkOiAlcyIsIHN0cmVycm9yKHJ2KSk7Ci0JfQotCi0JcmV0dXJuIChydik7Ci19Ci0KLWludAotY19yZWFscGF0aChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IHJ2ID0gMTsKLQljaGFyICpidWY7Ci0KLQlpZiAod3AgIT0gTlVMTCAmJiB3cFswXSAhPSBOVUxMICYmIHdwWzFdICE9IE5VTEwpIHsKLQkJaWYgKHN0cmNtcCh3cFsxXSwgIi0tIikpIHsKLQkJCWlmICh3cFsyXSA9PSBOVUxMKSB7Ci0JCQkJd3AgKz0gMTsKLQkJCQlydiA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod3BbMl0gIT0gTlVMTCAmJiB3cFszXSA9PSBOVUxMKSB7Ci0JCQkJd3AgKz0gMjsKLQkJCQlydiA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocnYpCi0JCWJpX2Vycm9yZihUX3N5bmVycik7Ci0JZWxzZSBpZiAoKGJ1ZiA9IGRvX3JlYWxwYXRoKCp3cCkpID09IE5VTEwpIHsKLQkJcnYgPSBlcnJubzsKLQkJYmlfZXJyb3JmKCIlczogJXMiLCAqd3AsIHN0cmVycm9yKHJ2KSk7Ci0JCWlmICgodW5zaWduZWQgaW50KXJ2ID4gMjU1KQotCQkJcnYgPSAyNTU7Ci0JfSBlbHNlIHsKLQkJc2hwcmludGYoIiVzXG4iLCBidWYpOwotCQlhZnJlZShidWYsIEFURU1QKTsKLQl9Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2hpc3RyYXAuYyBiL21rc2gvc3JjL2hpc3RyYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjNGMzOC4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9oaXN0cmFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDgzICswLDAgQEAKLS8qCSRPcGVuQlNEOiBoaXN0b3J5LmMsdiAxLjM5IDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogdHJhcC5jLHYgMS4yMyAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2hpc3RyYXAuYyx2IDEuOTggMjAxMC8wNy8yNCAxNzowODoyOSB0ZyBFeHAgJCIpOwotCi0vKi0KLSAqIE1pck9TOiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1hcHBpbmcgdHlwZSwgYW5kIG5lZWQgbm90IGJlIHNwZWNpZmllZC4KLSAqIElSSVggZG9lc24ndCBoYXZlIHRoaXMgY29uc3RhbnQuCi0gKi8KLSNpZm5kZWYgTUFQX0ZJTEUKLSNkZWZpbmUgTUFQX0ZJTEUJMAotI2VuZGlmCi0KLVRyYXAgc2lndHJhcHNbTlNJRyArIDFdOwotc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gU2lnYWN0X2lnbjsKLQotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi1zdGF0aWMgaW50IGhpc3RfY291bnRfbGluZXModW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBoaXN0X3Nocmluayh1bnNpZ25lZCBjaGFyICosIGludCk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaGlzdF9za2lwX2JhY2sodW5zaWduZWQgY2hhciAqLGludCAqLGludCk7Ci1zdGF0aWMgdm9pZCBoaXN0bG9hZChTb3VyY2UgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgaGlzdGluc2VydChTb3VyY2UgKiwgaW50LCBjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgd3JpdGVoaXN0ZmlsZShpbnQsIGNoYXIgKik7Ci1zdGF0aWMgaW50IHNwcmlua2xlKGludCk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBoaXN0X2V4ZWN1dGUoY2hhciAqKTsKLXN0YXRpYyBpbnQgaGlzdF9yZXBsYWNlKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKLXN0YXRpYyBjaGFyICoqaGlzdF9nZXQoY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKLXN0YXRpYyBjaGFyICoqaGlzdF9nZXRfb2xkZXN0KHZvaWQpOwotc3RhdGljIHZvaWQgaGlzdGJhY2t1cCh2b2lkKTsKLQotc3RhdGljIGNoYXIgKipjdXJyZW50OwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBoaXN0b3J5W10gKi8KLXN0YXRpYyBpbnQgaHN0YXJ0ZWQ7CQkvKiBzZXQgYWZ0ZXIgaGlzdF9pbml0KCkgY2FsbGVkICovCi1zdGF0aWMgU291cmNlICpoaXN0X3NvdXJjZTsKLQotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi1zdGF0aWMgY2hhciAqaG5hbWU7CQkvKiBjdXJyZW50IG5hbWUgb2YgaGlzdG9yeSBmaWxlICovCi1zdGF0aWMgaW50IGhpc3RmZDsKLXN0YXRpYyBpbnQgaHNpemU7Ci0jZW5kaWYKLQotaW50Ci1jX2ZjKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3Qgc2hmICpzaGY7Ci0Jc3RydWN0IHRlbXAgKnRmOwotCWNvbnN0IGNoYXIgKnA7Ci0JY2hhciAqZWRpdG9yID0gTlVMTDsKLQlib29sIGdmbGFnID0gZmFsc2UsIGxmbGFnID0gZmFsc2UsIG5mbGFnID0gZmFsc2UsIHJmbGFnID0gZmFsc2UsCi0JICAgIHNmbGFnID0gZmFsc2U7Ci0JaW50IG9wdGM7Ci0JY29uc3QgY2hhciAqZmlyc3QgPSBOVUxMLCAqbGFzdCA9IE5VTEw7Ci0JY2hhciAqKmhmaXJzdCwgKipobGFzdCwgKipocDsKLQotCWlmICghRmxhZyhGVEFMS0lOR19JKSkgewotCQliaV9lcnJvcmYoImhpc3RvcnkgZnVuY3Rpb25zIG5vdCBhdmFpbGFibGUiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsCi0JICAgICJlOmdsbnJzMCwxLDIsMyw0LDUsNiw3LDgsOSwiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdlJzoKLQkJCXAgPSBidWlsdGluX29wdC5vcHRhcmc7Ci0JCQlpZiAoa3NoX2lzZGFzaChwKSkKLQkJCQlzZmxhZyA9IHRydWU7Ci0JCQllbHNlIHsKLQkJCQlzaXplX3QgbGVuID0gc3RybGVuKHApOwotCQkJCWVkaXRvciA9IGFsbG9jKGxlbiArIDQsIEFURU1QKTsKLQkJCQltZW1jcHkoZWRpdG9yLCBwLCBsZW4pOwotCQkJCW1lbWNweShlZGl0b3IgKyBsZW4sICIgJF8iLCA0KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdnJzogLyogbm9uLUFUJlQga3NoICovCi0JCQlnZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnbCc6Ci0JCQlsZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnbic6Ci0JCQluZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCQlyZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6CS8qIFBPU0lYIHZlcnNpb24gb2YgLWUgLSAqLwotCQkJc2ZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCS8qIGtsdWRnZSBjaXR5IC0gYWNjZXB0IC1udW0gYXMgLS0gLW51bSAoa2luZCBvZikgKi8KLQkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JCQlwID0gc2hmX3NtcHJpbnRmKCItJWMlcyIsCi0JCQkJCW9wdGMsIGJ1aWx0aW5fb3B0Lm9wdGFyZyk7Ci0JCQlpZiAoIWZpcnN0KQotCQkJCWZpcnN0ID0gcDsKLQkJCWVsc2UgaWYgKCFsYXN0KQotCQkJCWxhc3QgPSBwOwotCQkJZWxzZSB7Ci0JCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCS8qIFN1YnN0aXR1dGUgYW5kIGV4ZWN1dGUgY29tbWFuZCAqLwotCWlmIChzZmxhZykgewotCQljaGFyICpwYXQgPSBOVUxMLCAqcmVwID0gTlVMTDsKLQotCQlpZiAoZWRpdG9yIHx8IGxmbGFnIHx8IG5mbGFnIHx8IHJmbGFnKSB7Ci0JCQliaV9lcnJvcmYoImNhbid0IHVzZSAtZSwgLWwsIC1uLCAtciB3aXRoIC1zICgtZSAtKSIpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCi0JCS8qIENoZWNrIGZvciBwYXR0ZXJuIHJlcGxhY2VtZW50IGFyZ3VtZW50ICovCi0JCWlmICgqd3AgJiYgKip3cCAmJiAocCA9IGNzdHJjaHIoKndwICsgMSwgJz0nKSkpIHsKLQkJCXN0cmR1cHgocGF0LCAqd3AsIEFURU1QKTsKLQkJCXJlcCA9IHBhdCArIChwIC0gKndwKTsKLQkJCSpyZXArKyA9ICdcMCc7Ci0JCQl3cCsrOwotCQl9Ci0JCS8qIENoZWNrIGZvciBzZWFyY2ggcHJlZml4ICovCi0JCWlmICghZmlyc3QgJiYgKGZpcnN0ID0gKndwKSkKLQkJCXdwKys7Ci0JCWlmIChsYXN0IHx8ICp3cCkgewotCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQotCQlocCA9IGZpcnN0ID8gaGlzdF9nZXQoZmlyc3QsIGZhbHNlLCBmYWxzZSkgOgotCQkgICAgaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKTsKLQkJaWYgKCFocCkKLQkJCXJldHVybiAoMSk7Ci0JCXJldHVybiAoaGlzdF9yZXBsYWNlKGhwLCBwYXQsIHJlcCwgZ2ZsYWcpKTsKLQl9Ci0KLQlpZiAoZWRpdG9yICYmIChsZmxhZyB8fCBuZmxhZykpIHsKLQkJYmlfZXJyb3JmKCJjYW4ndCB1c2UgLWwsIC1uIHdpdGggLWUiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlpZiAoIWZpcnN0ICYmIChmaXJzdCA9ICp3cCkpCi0JCXdwKys7Ci0JaWYgKCFsYXN0ICYmIChsYXN0ID0gKndwKSkKLQkJd3ArKzsKLQlpZiAoKndwKSB7Ci0JCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmICghZmlyc3QpIHsKLQkJaGZpcnN0ID0gbGZsYWcgPyBoaXN0X2dldCgiLTE2IiwgdHJ1ZSwgdHJ1ZSkgOgotCQkgICAgaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKTsKLQkJaWYgKCFoZmlyc3QpCi0JCQlyZXR1cm4gKDEpOwotCQkvKiBjYW4ndCBmYWlsIGlmIGhmaXJzdCBkaWRuJ3QgZmFpbCAqLwotCQlobGFzdCA9IGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7Ci0JfSBlbHNlIHsKLQkJLyogUE9TSVggc2F5cyBub3QgYW4gZXJyb3IgaWYgZmlyc3QvbGFzdCBvdXQgb2YgYm91bmRzCi0JCSAqIHdoZW4gcmFuZ2UgaXMgc3BlY2lmaWVkOyBBVCZUIGtzaCBhbmQgcGRrc2ggYWxsb3cgb3V0IG9mCi0JCSAqIGJvdW5kcyBmb3IgLWwgYXMgd2VsbC4KLQkJICovCi0JCWhmaXJzdCA9IGhpc3RfZ2V0KGZpcnN0LCAobGZsYWcgfHwgbGFzdCkgPyB0cnVlIDogZmFsc2UsIGxmbGFnKTsKLQkJaWYgKCFoZmlyc3QpCi0JCQlyZXR1cm4gKDEpOwotCQlobGFzdCA9IGxhc3QgPyBoaXN0X2dldChsYXN0LCB0cnVlLCBsZmxhZykgOgotCQkgICAgKGxmbGFnID8gaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKSA6IGhmaXJzdCk7Ci0JCWlmICghaGxhc3QpCi0JCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAoaGZpcnN0ID4gaGxhc3QpIHsKLQkJY2hhciAqKnRlbXA7Ci0KLQkJdGVtcCA9IGhmaXJzdDsgaGZpcnN0ID0gaGxhc3Q7IGhsYXN0ID0gdGVtcDsKLQkJcmZsYWcgPSAhcmZsYWc7IC8qIFBPU0lYICovCi0JfQotCi0JLyogTGlzdCBoaXN0b3J5ICovCi0JaWYgKGxmbGFnKSB7Ci0JCWNoYXIgKnMsICp0OwotCi0JCWZvciAoaHAgPSByZmxhZyA/IGhsYXN0IDogaGZpcnN0OwotCQkgICAgaHAgPj0gaGZpcnN0ICYmIGhwIDw9IGhsYXN0OyBocCArPSByZmxhZyA/IC0xIDogMSkgewotCQkJaWYgKCFuZmxhZykKLQkJCQlzaGZfZnByaW50ZihzaGxfc3Rkb3V0LCAiJWQiLAotCQkJCSAgICBoaXN0X3NvdXJjZS0+bGluZSAtIChpbnQpKGhpc3RwdHIgLSBocCkpOwotCQkJc2hmX3B1dGMoJ1x0Jywgc2hsX3N0ZG91dCk7Ci0JCQkvKiBwcmludCBtdWx0aS1saW5lIGNvbW1hbmRzIGNvcnJlY3RseSAqLwotCQkJcyA9ICpocDsKLQkJCXdoaWxlICgodCA9IHN0cmNocihzLCAnXG4nKSkpIHsKLQkJCQkqdCA9ICdcMCc7Ci0JCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVzXG5cdCIsIHMpOwotCQkJCSp0KysgPSAnXG4nOwotCQkJCXMgPSB0OwotCQkJfQotCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVzXG4iLCBzKTsKLQkJfQotCQlzaGZfZmx1c2goc2hsX3N0ZG91dCk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCi0JLyogUnVuIGVkaXRvciBvbiBzZWxlY3RlZCBsaW5lcywgdGhlbiBydW4gcmVzdWx0aW5nIGNvbW1hbmRzICovCi0KLQl0ZiA9IG1ha2V0ZW1wKEFURU1QLCBUVF9ISVNUX0VESVQsICZlLT50ZW1wcyk7Ci0JaWYgKCEoc2hmID0gdGYtPnNoZikpIHsKLQkJYmlfZXJyb3JmKCJjYW5ub3QgY3JlYXRlIHRlbXAgZmlsZSAlcyAtICVzIiwKLQkJICAgIHRmLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlmb3IgKGhwID0gcmZsYWcgPyBobGFzdCA6IGhmaXJzdDsKLQkgICAgaHAgPj0gaGZpcnN0ICYmIGhwIDw9IGhsYXN0OyBocCArPSByZmxhZyA/IC0xIDogMSkKLQkJc2hmX2ZwcmludGYoc2hmLCAiJXNcbiIsICpocCk7Ci0JaWYgKHNoZl9jbG9zZShzaGYpID09IEVPRikgewotCQliaV9lcnJvcmYoImVycm9yIHdyaXRpbmcgdGVtcG9yYXJ5IGZpbGUgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JLyogSWdub3JlIHNldHN0ciBlcnJvcnMgaGVyZSAoYXJiaXRyYXJ5KSAqLwotCXNldHN0cihsb2NhbCgiXyIsIGZhbHNlKSwgdGYtPm5hbWUsIEtTSF9SRVRVUk5fRVJST1IpOwotCi0JLyogWFhYOiBzb3VyY2Ugc2hvdWxkIG5vdCBnZXQgdHJhc2hlZCBieSB0aGlzLi4gKi8KLQl7Ci0JCVNvdXJjZSAqc29sZCA9IHNvdXJjZTsKLQkJaW50IHJldDsKLQotCQlyZXQgPSBjb21tYW5kKGVkaXRvciA/IGVkaXRvciA6ICIke0ZDRURJVDotL2Jpbi9lZH0gJF8iLCAwKTsKLQkJc291cmNlID0gc29sZDsKLQkJaWYgKHJldCkKLQkJCXJldHVybiAocmV0KTsKLQl9Ci0KLQl7Ci0JCXN0cnVjdCBzdGF0IHN0YXRiOwotCQlYU3RyaW5nIHhzOwotCQljaGFyICp4cDsKLQkJaW50IG47Ci0KLQkJaWYgKCEoc2hmID0gc2hmX29wZW4odGYtPm5hbWUsIE9fUkRPTkxZLCAwLCAwKSkpIHsKLQkJCWJpX2Vycm9yZigiY2Fubm90IG9wZW4gdGVtcCBmaWxlICVzIiwgdGYtPm5hbWUpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCi0JCW4gPSBzdGF0KHRmLT5uYW1lLCAmc3RhdGIpIDwgMCA/IDEyOCA6IHN0YXRiLnN0X3NpemUgKyAxOwotCQlYaW5pdCh4cywgeHAsIG4sIGhpc3Rfc291cmNlLT5hcmVhcCk7Ci0JCXdoaWxlICgobiA9IHNoZl9yZWFkKHhwLCBYbmxlZnQoeHMsIHhwKSwgc2hmKSkgPiAwKSB7Ci0JCQl4cCArPSBuOwotCQkJaWYgKFhubGVmdCh4cywgeHApIDw9IDApCi0JCQkJWGNoZWNrTih4cywgeHAsIFhsZW5ndGgoeHMsIHhwKSk7Ci0JCX0KLQkJaWYgKG4gPCAwKSB7Ci0JCQliaV9lcnJvcmYoImVycm9yIHJlYWRpbmcgdGVtcCBmaWxlICVzIC0gJXMiLAotCQkJICAgIHRmLT5uYW1lLCBzdHJlcnJvcihzaGZfZXJybm8oc2hmKSkpOwotCQkJc2hmX2Nsb3NlKHNoZik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCXNoZl9jbG9zZShzaGYpOwotCQkqeHAgPSAnXDAnOwotCQlzdHJpcF9udWxzKFhzdHJpbmcoeHMsIHhwKSwgWGxlbmd0aCh4cywgeHApKTsKLQkJcmV0dXJuIChoaXN0X2V4ZWN1dGUoWHN0cmluZyh4cywgeHApKSk7Ci0JfQotfQotCi0vKiBTYXZlIGNtZCBpbiBoaXN0b3J5LCBleGVjdXRlIGNtZCAoY21kIGdldHMgdHJhc2hlZCkgKi8KLXN0YXRpYyBpbnQKLWhpc3RfZXhlY3V0ZShjaGFyICpjbWQpCi17Ci0JU291cmNlICpzb2xkOwotCWludCByZXQ7Ci0JY2hhciAqcCwgKnE7Ci0KLQloaXN0YmFja3VwKCk7Ci0KLQlmb3IgKHAgPSBjbWQ7IHA7IHAgPSBxKSB7Ci0JCWlmICgocSA9IHN0cmNocihwLCAnXG4nKSkpIHsKLQkJCSpxKysgPSAnXDAnOyAvKiBraWxsIHRoZSBuZXdsaW5lICovCi0JCQlpZiAoISpxKSAvKiBpZ25vcmUgdHJhaWxpbmcgbmV3bGluZSAqLwotCQkJCXEgPSBOVUxMOwotCQl9Ci0JCWhpc3RzYXZlKCZoaXN0X3NvdXJjZS0+bGluZSwgcCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJc2hlbGxmKCIlc1xuIiwgcCk7IC8qIFBPU0lYIGRvZXNuJ3Qgc2F5IHRoaXMgaXMgZG9uZS4uLiAqLwotCQlpZiAocSkJCS8qIHJlc3RvcmUgXG4gKHRyYWlsaW5nIFxuIG5vdCByZXN0b3JlZCkgKi8KLQkJCXFbLTFdID0gJ1xuJzsKLQl9Ci0KLQkvKgotCSAqIENvbW1hbmRzIGFyZSBleGVjdXRlZCBoZXJlIGluc3RlYWQgb2YgcHVzaGluZyB0aGVtIG9udG8gdGhlCi0JICogaW5wdXQgJ2NhdXNlIFBPU0lYIHNheXMgdGhlIHJlZGlyZWN0aW9uIGFuZCB2YXJpYWJsZSBhc3NpZ25tZW50cwotCSAqIGluCi0JICoJWD15IGZjIC1lIC0gNDIgMj4gL2Rldi9udWxsCi0JICogYXJlIHRvIGVmZmVjdCB0aGUgcmVwZWF0ZWQgY29tbWFuZHMgZW52aXJvbm1lbnQuCi0JICovCi0JLyogWFhYOiBzb3VyY2Ugc2hvdWxkIG5vdCBnZXQgdHJhc2hlZCBieSB0aGlzLi4gKi8KLQlzb2xkID0gc291cmNlOwotCXJldCA9IGNvbW1hbmQoY21kLCAwKTsKLQlzb3VyY2UgPSBzb2xkOwotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGludAotaGlzdF9yZXBsYWNlKGNoYXIgKipocCwgY29uc3QgY2hhciAqcGF0LCBjb25zdCBjaGFyICpyZXAsIGJvb2wgZ2xvYnIpCi17Ci0JY2hhciAqbGluZTsKLQotCWlmICghcGF0KQotCQlzdHJkdXB4KGxpbmUsICpocCwgQVRFTVApOwotCWVsc2UgewotCQljaGFyICpzLCAqczE7Ci0JCWludCBwYXRfbGVuID0gc3RybGVuKHBhdCk7Ci0JCWludCByZXBfbGVuID0gc3RybGVuKHJlcCk7Ci0JCWludCBsZW47Ci0JCVhTdHJpbmcgeHM7Ci0JCWNoYXIgKnhwOwotCQlib29sIGFueV9zdWJzdCA9IGZhbHNlOwotCi0JCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7Ci0JCWZvciAocyA9ICpocDsgKHMxID0gc3Ryc3RyKHMsIHBhdCkpICYmICghYW55X3N1YnN0IHx8IGdsb2JyKTsKLQkJICAgIHMgPSBzMSArIHBhdF9sZW4pIHsKLQkJCWFueV9zdWJzdCA9IHRydWU7Ci0JCQlsZW4gPSBzMSAtIHM7Ci0JCQlYY2hlY2tOKHhzLCB4cCwgbGVuICsgcmVwX2xlbik7Ci0JCQltZW1jcHkoeHAsIHMsIGxlbik7CQkvKiBmaXJzdCBwYXJ0ICovCi0JCQl4cCArPSBsZW47Ci0JCQltZW1jcHkoeHAsIHJlcCwgcmVwX2xlbik7CS8qIHJlcGxhY2VtZW50ICovCi0JCQl4cCArPSByZXBfbGVuOwotCQl9Ci0JCWlmICghYW55X3N1YnN0KSB7Ci0JCQliaV9lcnJvcmYoInN1YnN0aXR1dGlvbiBmYWlsZWQiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJbGVuID0gc3RybGVuKHMpICsgMTsKLQkJWGNoZWNrTih4cywgeHAsIGxlbik7Ci0JCW1lbWNweSh4cCwgcywgbGVuKTsKLQkJeHAgKz0gbGVuOwotCQlsaW5lID0gWGNsb3NlKHhzLCB4cCk7Ci0JfQotCXJldHVybiAoaGlzdF9leGVjdXRlKGxpbmUpKTsKLX0KLQotLyoKLSAqIGdldCBwb2ludGVyIHRvIGhpc3RvcnkgZ2l2ZW4gcGF0dGVybgotICogcGF0dGVybiBpcyBhIG51bWJlciBvciBzdHJpbmcKLSAqLwotc3RhdGljIGNoYXIgKioKLWhpc3RfZ2V0KGNvbnN0IGNoYXIgKnN0ciwgYm9vbCBhcHByb3gsIGJvb2wgYWxsb3dfY3VyKQotewotCWNoYXIgKipocCA9IE5VTEw7Ci0JaW50IG47Ci0KLQlpZiAoZ2V0bihzdHIsICZuKSkgewotCQlocCA9IGhpc3RwdHIgKyAobiA8IDAgPyBuIDogKG4gLSBoaXN0X3NvdXJjZS0+bGluZSkpOwotCQlpZiAoKHB0cmRpZmZfdClocCA8IChwdHJkaWZmX3QpaGlzdG9yeSkgewotCQkJaWYgKGFwcHJveCkKLQkJCQlocCA9IGhpc3RfZ2V0X29sZGVzdCgpOwotCQkJZWxzZSB7Ci0JCQkJYmlfZXJyb3JmKCIlczogbm90IGluIGhpc3RvcnkiLCBzdHIpOwotCQkJCWhwID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIGlmICgocHRyZGlmZl90KWhwID4gKHB0cmRpZmZfdCloaXN0cHRyKSB7Ci0JCQlpZiAoYXBwcm94KQotCQkJCWhwID0gaGlzdF9nZXRfbmV3ZXN0KGFsbG93X2N1cik7Ci0JCQllbHNlIHsKLQkJCQliaV9lcnJvcmYoIiVzOiBub3QgaW4gaGlzdG9yeSIsIHN0cik7Ci0JCQkJaHAgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgaWYgKCFhbGxvd19jdXIgJiYgaHAgPT0gaGlzdHB0cikgewotCQkJYmlfZXJyb3JmKCIlczogaW52YWxpZCByYW5nZSIsIHN0cik7Ci0JCQlocCA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgYW5jaG9yZWQgPSAqc3RyID09ICc/JyA/ICgrK3N0ciwgMCkgOiAxOwotCi0JCS8qIHRoZSAtMSBpcyB0byBhdm9pZCB0aGUgY3VycmVudCBmYyBjb21tYW5kICovCi0JCWlmICgobiA9IGZpbmRoaXN0KGhpc3RwdHIgLSBoaXN0b3J5IC0gMSwgMCwgc3RyLCBhbmNob3JlZCkpIDwgMCkKLQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpbiBoaXN0b3J5Iiwgc3RyKTsKLQkJZWxzZQotCQkJaHAgPSAmaGlzdG9yeVtuXTsKLQl9Ci0JcmV0dXJuIChocCk7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ld2VzdCBjb21tYW5kIGluIHRoZSBoaXN0b3J5ICovCi1jaGFyICoqCi1oaXN0X2dldF9uZXdlc3QoYm9vbCBhbGxvd19jdXIpCi17Ci0JaWYgKGhpc3RwdHIgPCBoaXN0b3J5IHx8ICghYWxsb3dfY3VyICYmIGhpc3RwdHIgPT0gaGlzdG9yeSkpIHsKLQkJYmlfZXJyb3JmKCJubyBoaXN0b3J5ICh5ZXQpIik7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCXJldHVybiAoYWxsb3dfY3VyID8gaGlzdHB0ciA6IGhpc3RwdHIgLSAxKTsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgb2xkZXN0IGNvbW1hbmQgaW4gdGhlIGhpc3RvcnkgKi8KLXN0YXRpYyBjaGFyICoqCi1oaXN0X2dldF9vbGRlc3Qodm9pZCkKLXsKLQlpZiAoaGlzdHB0ciA8PSBoaXN0b3J5KSB7Ci0JCWJpX2Vycm9yZigibm8gaGlzdG9yeSAoeWV0KSIpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlyZXR1cm4gKGhpc3RvcnkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQmFjayB1cCBvdmVyIGxhc3QgaGlzdHNhdmUgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotaGlzdGJhY2t1cCh2b2lkKQotewotCXN0YXRpYyBpbnQgbGFzdF9saW5lID0gLTE7Ci0KLQlpZiAoaGlzdHB0ciA+PSBoaXN0b3J5ICYmIGxhc3RfbGluZSAhPSBoaXN0X3NvdXJjZS0+bGluZSkgewotCQloaXN0X3NvdXJjZS0+bGluZS0tOwotCQlhZnJlZSgqaGlzdHB0ciwgQVBFUk0pOwotCQloaXN0cHRyLS07Ci0JCWxhc3RfbGluZSA9IGhpc3Rfc291cmNlLT5saW5lOwotCX0KLX0KLQotLyoKLSAqIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqLwotY2hhciAqKgotaGlzdHBvcyh2b2lkKQotewotCXJldHVybiAoY3VycmVudCk7Ci19Ci0KLWludAotaGlzdG51bShpbnQgbikKLXsKLQlpbnQgbGFzdCA9IGhpc3RwdHIgLSBoaXN0b3J5OwotCi0JaWYgKG4gPCAwIHx8IG4gPj0gbGFzdCkgewotCQljdXJyZW50ID0gaGlzdHB0cjsKLQkJcmV0dXJuIChsYXN0KTsKLQl9IGVsc2UgewotCQljdXJyZW50ID0gJmhpc3Rvcnlbbl07Ci0JCXJldHVybiAobik7Ci0JfQotfQotCi0vKgotICogVGhpcyB3aWxsIGJlY29tZSB1bm5lY2Vzc2FyeSBpZiBoaXN0X2dldCBpcyBtb2RpZmllZCB0byBhbGxvdwotICogc2VhcmNoaW5nIGZyb20gcG9zaXRpb25zIG90aGVyIHRoYW4gdGhlIGVuZCwgYW5kIGluIGVpdGhlcgotICogZGlyZWN0aW9uLgotICovCi1pbnQKLWZpbmRoaXN0KGludCBzdGFydCwgaW50IGZ3ZCwgY29uc3QgY2hhciAqc3RyLCBpbnQgYW5jaG9yZWQpCi17Ci0JY2hhcgkqKmhwOwotCWludAltYXhoaXN0ID0gaGlzdHB0ciAtIGhpc3Rvcnk7Ci0JaW50CWluY3IgPSBmd2QgPyAxIDogLTE7Ci0JaW50CWxlbiA9IHN0cmxlbihzdHIpOwotCi0JaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSBtYXhoaXN0KQotCQlzdGFydCA9IG1heGhpc3Q7Ci0KLQlocCA9ICZoaXN0b3J5W3N0YXJ0XTsKLQlmb3IgKDsgaHAgPj0gaGlzdG9yeSAmJiBocCA8PSBoaXN0cHRyOyBocCArPSBpbmNyKQotCQlpZiAoKGFuY2hvcmVkICYmIHN0cm5jbXAoKmhwLCBzdHIsIGxlbikgPT0gMCkgfHwKLQkJICAgICghYW5jaG9yZWQgJiYgc3Ryc3RyKCpocCwgc3RyKSkpCi0JCQlyZXR1cm4gKGhwIC0gaGlzdG9yeSk7Ci0KLQlyZXR1cm4gKC0xKTsKLX0KLQotaW50Ci1maW5kaGlzdHJlbChjb25zdCBjaGFyICpzdHIpCi17Ci0JaW50CW1heGhpc3QgPSBoaXN0cHRyIC0gaGlzdG9yeTsKLQlpbnQJc3RhcnQgPSBtYXhoaXN0IC0gMTsKLQlpbnQJcmVjOwotCi0JZ2V0bihzdHIsICZyZWMpOwotCWlmIChyZWMgPT0gMCkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKHJlYyA+IDApIHsKLQkJaWYgKHJlYyA+IG1heGhpc3QpCi0JCQlyZXR1cm4gKC0xKTsKLQkJcmV0dXJuIChyZWMgLSAxKTsKLQl9Ci0JaWYgKHJlYyA+IG1heGhpc3QpCi0JCXJldHVybiAoLTEpOwotCXJldHVybiAoc3RhcnQgKyByZWMgKyAxKTsKLX0KLQotLyoKLSAqCXNldCBoaXN0b3J5Ci0gKgl0aGlzIG1lYW5zIHJlYWxsb2NhdGluZyB0aGUgZGF0YXNwYWNlCi0gKi8KLXZvaWQKLXNldGhpc3RzaXplKGludCBuKQotewotCWlmIChuID4gMCAmJiBuICE9IGhpc3RzaXplKSB7Ci0JCWludCBjdXJzaXplID0gaGlzdHB0ciAtIGhpc3Rvcnk7Ci0KLQkJLyogc2F2ZSBtb3N0IHJlY2VudCBoaXN0b3J5ICovCi0JCWlmIChuIDwgY3Vyc2l6ZSkgewotCQkJbWVtbW92ZShoaXN0b3J5LCBoaXN0cHRyIC0gbiwgbiAqIHNpemVvZihjaGFyICopKTsKLQkJCWN1cnNpemUgPSBuOwotCQl9Ci0KLQkJaGlzdG9yeSA9IGFyZXNpemUoaGlzdG9yeSwgbiAqIHNpemVvZihjaGFyICopLCBBUEVSTSk7Ci0KLQkJaGlzdHNpemUgPSBuOwotCQloaXN0cHRyID0gaGlzdG9yeSArIGN1cnNpemU7Ci0JfQotfQotCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLS8qCi0gKglzZXQgaGlzdG9yeSBmaWxlCi0gKglUaGlzIGNhbiBtZWFuIHJlbG9hZGluZy9yZXNldHRpbmcvc3RhcnRpbmcgaGlzdG9yeSBmaWxlCi0gKgltYWludGVuYW5jZQotICovCi12b2lkCi1zZXRoaXN0ZmlsZShjb25zdCBjaGFyICpuYW1lKQotewotCS8qIGlmIG5vdCBzdGFydGVkIHRoZW4gbm90aGluZyB0byBkbyAqLwotCWlmIChoc3RhcnRlZCA9PSAwKQotCQlyZXR1cm47Ci0KLQkvKiBpZiB0aGUgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSB3ZSBoYXZlICovCi0JaWYgKGhuYW1lICYmIHN0cmNtcChobmFtZSwgbmFtZSkgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBpdHMgYSBuZXcgbmFtZSAtIHBvc3NpYmx5Ci0JICovCi0JaWYgKGhpc3RmZCkgewotCQkvKiB5ZXMgdGhlIGZpbGUgaXMgb3BlbiAqLwotCQkodm9pZCljbG9zZShoaXN0ZmQpOwotCQloaXN0ZmQgPSAwOwotCQloc2l6ZSA9IDA7Ci0JCWFmcmVlKGhuYW1lLCBBUEVSTSk7Ci0JCWhuYW1lID0gTlVMTDsKLQkJLyogbGV0J3MgcmVzZXQgdGhlIGhpc3RvcnkgKi8KLQkJaGlzdHB0ciA9IGhpc3RvcnkgLSAxOwotCQloaXN0X3NvdXJjZS0+bGluZSA9IDA7Ci0JfQotCi0JaGlzdF9pbml0KGhpc3Rfc291cmNlKTsKLX0KLSNlbmRpZgotCi0vKgotICoJaW5pdGlhbGlzZSB0aGUgaGlzdG9yeSB2ZWN0b3IKLSAqLwotdm9pZAotaW5pdF9oaXN0dmVjKHZvaWQpCi17Ci0JaWYgKGhpc3RvcnkgPT0gKGNoYXIgKiopTlVMTCkgewotCQloaXN0c2l6ZSA9IEhJU1RPUllTSVpFOwotCQloaXN0b3J5ID0gYWxsb2MoaGlzdHNpemUgKiBzaXplb2YoY2hhciAqKSwgQVBFUk0pOwotCQloaXN0cHRyID0gaGlzdG9yeSAtIDE7Ci0JfQotfQotCi0KLS8qCi0gKglSb3V0aW5lcyBhZGRlZCBieSBQZXRlciBDb2xsaW5zb24gQlNESShFdXJvcGUpL0hpbGxzaWRlIFN5c3RlbXMgdG8KLSAqCWEpIHBlcm1pdCBISVNUU0laRSB0byBjb250cm9sIG51bWJlciBvZiBsaW5lcyBvZiBoaXN0b3J5IHN0b3JlZAotICoJYikgbWFpbnRhaW4gYSBwaHlzaWNhbCBoaXN0b3J5IGZpbGUKLSAqCi0gKglJdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcyBhIGxvdCBvZiBnaGFzdGx5IGhhY2tlcnkgaGVyZQotICovCi0KLSNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotLyogZG8gbm90IHNhdmUgY29tbWFuZCBpbiBoaXN0b3J5IGJ1dCBwb3NzaWJseSBzeW5jICovCi1ib29sCi1oaXN0c3luYyh2b2lkKQotewotCWJvb2wgY2hhbmdlZCA9IGZhbHNlOwotCi0JaWYgKGhpc3RmZCkgewotCQlpbnQgbG5vID0gaGlzdF9zb3VyY2UtPmxpbmU7Ci0KLQkJaGlzdF9zb3VyY2UtPmxpbmUrKzsKLQkJd3JpdGVoaXN0ZmlsZSgwLCBOVUxMKTsKLQkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKLQotCQlpZiAobG5vICE9IGhpc3Rfc291cmNlLT5saW5lKQotCQkJY2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcmV0dXJuIChjaGFuZ2VkKTsKLX0KLSNlbmRpZgotCi0vKgotICogc2F2ZSBjb21tYW5kIGluIGhpc3RvcnkKLSAqLwotdm9pZAotaGlzdHNhdmUoaW50ICpsbnAsIGNvbnN0IGNoYXIgKmNtZCwgYm9vbCBkb3dyaXRlIE1LU0hfQV9VTlVTRUQsIGJvb2wgaWdub3JlZHVwcykKLXsKLQljaGFyICoqaHA7Ci0JY2hhciAqYywgKmNwOwotCi0Jc3RyZHVweChjLCBjbWQsIEFQRVJNKTsKLQlpZiAoKGNwID0gc3RyY2hyKGMsICdcbicpKSAhPSBOVUxMKQotCQkqY3AgPSAnXDAnOwotCi0JaWYgKGlnbm9yZWR1cHMgJiYgIXN0cmNtcChjLCAqaGlzdHB0cikKLSNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCSAgICAmJiAhaGlzdHN5bmMoKQotI2VuZGlmCi0JICAgICkgewotCQlhZnJlZShjLCBBUEVSTSk7Ci0JCXJldHVybjsKLQl9Ci0JKysqbG5wOwotCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQlpZiAoaGlzdGZkICYmIGRvd3JpdGUpCi0JCXdyaXRlaGlzdGZpbGUoKmxucCwgYyk7Ci0jZW5kaWYKLQotCWhwID0gaGlzdHB0cjsKLQotCWlmICgrK2hwID49IGhpc3RvcnkgKyBoaXN0c2l6ZSkgeyAvKiByZW1vdmUgb2xkZXN0IGNvbW1hbmQgKi8KLQkJYWZyZWUoKmhpc3RvcnksIEFQRVJNKTsKLQkJZm9yIChocCA9IGhpc3Rvcnk7IGhwIDwgaGlzdG9yeSArIGhpc3RzaXplIC0gMTsgaHArKykKLQkJCWhwWzBdID0gaHBbMV07Ci0JfQotCSpocCA9IGM7Ci0JaGlzdHB0ciA9IGhwOwotfQotCi0vKgotICoJV3JpdGUgaGlzdG9yeSBkYXRhIHRvIGEgZmlsZSBub21pbmF0ZWQgYnkgSElTVEZJTEUKLSAqCWlmIEhJU1RGSUxFIGlzIHVuc2V0IHRoZW4gaGlzdG9yeSBzdGlsbCBoYXBwZW5zLCBidXQKLSAqCXRoZSBkYXRhIGlzIG5vdCB3cml0dGVuIHRvIGEgZmlsZQotICoJQWxsIGNvcGllcyBvZiBrc2ggbG9va2luZyBhdCB0aGUgZmlsZSB3aWxsIG1haW50YWluIHRoZQotICoJc2FtZSBoaXN0b3J5LiBUaGlzIGlzIGtzaCBiZWhhdmlvdXIuCi0gKgotICoJVGhpcyBzdHVmZiB1c2VzIG1tYXAoKQotICoJaWYgeW91ciBzeXN0ZW0gYWluJ3QgZ290IGl0IC0gdGhlbiB5b3UnbGwgaGF2ZSB0byB1bmRlZiBISVNUT1JZRklMRQotICovCi0KLS8qCi0gKglPcGVuIGEgaGlzdG9yeSBmaWxlCi0gKglGb3JtYXQgaXM6Ci0gKglCeXRlcyAxLCAyOgotICoJCUhNQUdJQyAtIGp1c3QgdG8gY2hlY2sgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCi0gKgkJdGhlIGNvcnJlY3Qgb2JqZWN0Ci0gKglUaGVuIGZvbGxvd3MgYSBudW1iZXIgb2Ygc3RvcmVkIGNvbW1hbmRzCi0gKglFYWNoIGNvbW1hbmQgaXMKLSAqCTxjb21tYW5kIGJ5dGU+PGNvbW1hbmQgbnVtYmVyKDQgYnl0ZXMpPjxieXRlcz48bnVsbD4KLSAqLwotI2RlZmluZSBITUFHSUMxCQkweGFiCi0jZGVmaW5lIEhNQUdJQzIJCTB4Y2QKLSNkZWZpbmUgQ09NTUFORAkJMHhmZgotCi12b2lkCi1oaXN0X2luaXQoU291cmNlICpzKQotewotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi0JdW5zaWduZWQgY2hhciAqYmFzZTsKLQlpbnQgbGluZXMsIGZkLCBydiA9IDA7Ci0jZW5kaWYKLQotCWlmIChGbGFnKEZUQUxLSU5HKSA9PSAwKQotCQlyZXR1cm47Ci0KLQloc3RhcnRlZCA9IDE7Ci0KLQloaXN0X3NvdXJjZSA9IHM7Ci0KLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCWlmICgoaG5hbWUgPSBzdHJfdmFsKGdsb2JhbCgiSElTVEZJTEUiKSkpID09IE5VTEwpCi0JCXJldHVybjsKLQlzdHJkdXB4KGhuYW1lLCBobmFtZSwgQVBFUk0pOwotCi0gcmV0cnk6Ci0JLyogd2UgaGF2ZSBhIGZpbGUgYW5kIGFyZSBpbnRlcmFjdGl2ZSAqLwotCWlmICgoZmQgPSBvcGVuKGhuYW1lLCBPX1JEV1J8T19DUkVBVHxPX0FQUEVORCwgMDYwMCkpIDwgMCkKLQkJcmV0dXJuOwotCi0JaGlzdGZkID0gc2F2ZWZkKGZkKTsKLQlpZiAoaGlzdGZkICE9IGZkKQotCQljbG9zZShmZCk7Ci0KLQkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfRVgpOwotCi0JaHNpemUgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7Ci0KLQlpZiAoaHNpemUgPT0gMCkgewotCQkvKiBhZGQgbWFnaWMgKi8KLQkJaWYgKHNwcmlua2xlKGhpc3RmZCkpIHsKLQkJCWhpc3RfZmluaXNoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgaWYgKGhzaXplID4gMCkgewotCQkvKgotCQkgKiB3ZSBoYXZlIHNvbWUgZGF0YQotCQkgKi8KLQkJYmFzZSA9ICh2b2lkICopbW1hcChOVUxMLCBoc2l6ZSwgUFJPVF9SRUFELAotCQkgICAgTUFQX0ZJTEUgfCBNQVBfUFJJVkFURSwgaGlzdGZkLCAob2ZmX3QpMCk7Ci0JCS8qCi0JCSAqIGNoZWNrIG9uIGl0cyB2YWxpZGl0eQotCQkgKi8KLQkJaWYgKGJhc2UgPT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEIHx8Ci0JCSAgICAqYmFzZSAhPSBITUFHSUMxIHx8IGJhc2VbMV0gIT0gSE1BR0lDMikgewotCQkJaWYgKGJhc2UgIT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEKQotCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBoc2l6ZSk7Ci0JCQloaXN0X2ZpbmlzaCgpOwotCQkJaWYgKHVubGluayhobmFtZSkgLyogZmFpbHMgKi8pCi0JCQkJZ290byBoaW5pdGVycjsKLQkJCWdvdG8gcmV0cnk7Ci0JCX0KLQkJaWYgKGhzaXplID4gMikgewotCQkJbGluZXMgPSBoaXN0X2NvdW50X2xpbmVzKGJhc2UrMiwgaHNpemUtMik7Ci0JCQlpZiAobGluZXMgPiBoaXN0c2l6ZSkgewotCQkJCS8qIHdlIG5lZWQgdG8gbWFrZSB0aGUgZmlsZSBzbWFsbGVyICovCi0JCQkJaWYgKGhpc3Rfc2hyaW5rKGJhc2UsIGhzaXplKSkKLQkJCQkJcnYgPSB1bmxpbmsoaG5hbWUpOwotCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBoc2l6ZSk7Ci0JCQkJaGlzdF9maW5pc2goKTsKLQkJCQlpZiAocnYpIHsKLSBoaW5pdGVycjoKLQkJCQkJYmlfZXJyb3JmKCJjYW5ub3QgdW5saW5rIEhJU1RGSUxFICVzIgotCQkJCQkgICAgIiAtICVzIiwgaG5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJCWhzaXplID0gMDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlnb3RvIHJldHJ5OwotCQkJfQotCQl9Ci0JCWhpc3Rsb2FkKGhpc3Rfc291cmNlLCBiYXNlKzIsIGhzaXplLTIpOwotCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOwotCX0KLQkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOwotCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOwotI2VuZGlmCi19Ci0KLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotdHlwZWRlZiBlbnVtIHN0YXRlIHsKLQlzaGRyLAkJLyogZXhwZWN0aW5nIGEgaGVhZGVyICovCi0Jc2xpbmUsCQkvKiBsb29raW5nIGZvciBhIG51bGwgYnl0ZSB0byBlbmQgdGhlIGxpbmUgKi8KLQlzbjEsCQkvKiBieXRlcyAxIHRvIDQgb2YgYSBsaW5lIG5vICovCi0Jc24yLCBzbjMsIHNuNAotfSBTdGF0ZTsKLQotc3RhdGljIGludAotaGlzdF9jb3VudF9saW5lcyh1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgYnl0ZXMpCi17Ci0JU3RhdGUgc3RhdGUgPSBzaGRyOwotCWludCBsaW5lcyA9IDA7Ci0KLQl3aGlsZSAoYnl0ZXMtLSkgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2Ugc2hkcjoKLQkJCWlmICgqYmFzZSA9PSBDT01NQU5EKQotCQkJCXN0YXRlID0gc24xOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc24xOgotCQkJc3RhdGUgPSBzbjI7IGJyZWFrOwotCQljYXNlIHNuMjoKLQkJCXN0YXRlID0gc24zOyBicmVhazsKLQkJY2FzZSBzbjM6Ci0JCQlzdGF0ZSA9IHNuNDsgYnJlYWs7Ci0JCWNhc2Ugc240OgotCQkJc3RhdGUgPSBzbGluZTsgYnJlYWs7Ci0JCWNhc2Ugc2xpbmU6Ci0JCQlpZiAoKmJhc2UgPT0gJ1wwJykgewotCQkJCWxpbmVzKys7Ci0JCQkJc3RhdGUgPSBzaGRyOwotCQkJfQotCQl9Ci0JCWJhc2UrKzsKLQl9Ci0JcmV0dXJuIChsaW5lcyk7Ci19Ci0KLS8qCi0gKglTaHJpbmsgdGhlIGhpc3RvcnkgZmlsZSB0byBoaXN0c2l6ZSBsaW5lcwotICovCi1zdGF0aWMgaW50Ci1oaXN0X3Nocmluayh1bnNpZ25lZCBjaGFyICpvbGRiYXNlLCBpbnQgb2xkYnl0ZXMpCi17Ci0JaW50IGZkLCBydiA9IDA7Ci0JY2hhciAqbmZpbGUgPSBOVUxMOwotCXN0cnVjdAlzdGF0IHN0YXRiOwotCXVuc2lnbmVkIGNoYXIgKm5iYXNlID0gb2xkYmFzZTsKLQlpbnQgbmJ5dGVzID0gb2xkYnl0ZXM7Ci0KLQluYmFzZSA9IGhpc3Rfc2tpcF9iYWNrKG5iYXNlLCAmbmJ5dGVzLCBoaXN0c2l6ZSk7Ci0JaWYgKG5iYXNlID09IE5VTEwpCi0JCXJldHVybiAoMSk7Ci0JaWYgKG5iYXNlID09IG9sZGJhc2UpCi0JCXJldHVybiAoMCk7Ci0KLQkvKgotCSAqCWNyZWF0ZSB0ZW1wIGZpbGUKLQkgKi8KLQluZmlsZSA9IHNoZl9zbXByaW50ZigiJXMuJWQiLCBobmFtZSwgKGludClwcm9jcGlkKTsKLQlpZiAoKGZkID0gb3BlbihuZmlsZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDYwMCkpIDwgMCkKLQkJZ290byBlcnJvdXQ7Ci0JaWYgKGZzdGF0KGhpc3RmZCwgJnN0YXRiKSA+PSAwICYmCi0JICAgIGNob3duKG5maWxlLCBzdGF0Yi5zdF91aWQsIHN0YXRiLnN0X2dpZCkpCi0JCWdvdG8gZXJyb3V0OwotCi0JaWYgKHNwcmlua2xlKGZkKSB8fCB3cml0ZShmZCwgbmJhc2UsIG5ieXRlcykgIT0gbmJ5dGVzKQotCQlnb3RvIGVycm91dDsKLQljbG9zZShmZCk7Ci0JZmQgPSAtMTsKLQotCS8qCi0JICoJcmVuYW1lCi0JICovCi0JaWYgKHJlbmFtZShuZmlsZSwgaG5hbWUpIDwgMCkgewotIGVycm91dDoKLQkJaWYgKGZkID49IDApIHsKLQkJCWNsb3NlKGZkKTsKLQkJCWlmIChuZmlsZSkKLQkJCQl1bmxpbmsobmZpbGUpOwotCQl9Ci0JCXJ2ID0gMTsKLQl9Ci0JYWZyZWUobmZpbGUsIEFURU1QKTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyoKLSAqCWZpbmQgYSBwb2ludGVyIHRvIHRoZSBkYXRhICdubycgYmFjayBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUKLSAqCXJldHVybiB0aGUgcG9pbnRlciBhbmQgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0Ci0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWhpc3Rfc2tpcF9iYWNrKHVuc2lnbmVkIGNoYXIgKmJhc2UsIGludCAqYnl0ZXMsIGludCBubykKLXsKLQlpbnQgbGluZXMgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmVwOwotCi0JZm9yIChlcCA9IGJhc2UgKyAqYnl0ZXM7IC0tZXAgPiBiYXNlOyApIHsKLQkJLyoKLQkJICogdGhpcyBkb2Vzbid0IHJlYWxseSB3b3JrOiB0aGUgNCBieXRlIGxpbmUgbnVtYmVyIHRoYXQKLQkJICogaXMgZW5jb2RlZCBhZnRlciB0aGUgQ09NTUFORCBieXRlIGNhbiBpdHNlbGYgY29udGFpbgotCQkgKiB0aGUgQ09NTUFORCBieXRlLi4uLgotCQkgKi8KLQkJZm9yICg7IGVwID4gYmFzZSAmJiAqZXAgIT0gQ09NTUFORDsgZXAtLSkKLQkJCTsKLQkJaWYgKGVwID09IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKCsrbGluZXMgPT0gbm8pIHsKLQkJCSpieXRlcyA9ICpieXRlcyAtICgoY2hhciAqKWVwIC0gKGNoYXIgKiliYXNlKTsKLQkJCXJldHVybiAoZXApOwotCQl9Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qCi0gKglsb2FkIHRoZSBoaXN0b3J5IHN0cnVjdHVyZSBmcm9tIHRoZSBzdG9yZWQgZGF0YQotICovCi1zdGF0aWMgdm9pZAotaGlzdGxvYWQoU291cmNlICpzLCB1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgYnl0ZXMpCi17Ci0JU3RhdGUgc3RhdGU7Ci0JaW50IGxubyA9IDA7Ci0JdW5zaWduZWQgY2hhciAqbGluZSA9IE5VTEw7Ci0KLQlmb3IgKHN0YXRlID0gc2hkcjsgYnl0ZXMtLSA+IDA7IGJhc2UrKykgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2Ugc2hkcjoKLQkJCWlmICgqYmFzZSA9PSBDT01NQU5EKQotCQkJCXN0YXRlID0gc24xOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc24xOgotCQkJbG5vID0gKCgoKmJhc2UpJjB4ZmYpPDwyNCk7Ci0JCQlzdGF0ZSA9IHNuMjsKLQkJCWJyZWFrOwotCQljYXNlIHNuMjoKLQkJCWxubyB8PSAoKCgqYmFzZSkmMHhmZik8PDE2KTsKLQkJCXN0YXRlID0gc24zOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc24zOgotCQkJbG5vIHw9ICgoKCpiYXNlKSYweGZmKTw8OCk7Ci0JCQlzdGF0ZSA9IHNuNDsKLQkJCWJyZWFrOwotCQljYXNlIHNuNDoKLQkJCWxubyB8PSAoKmJhc2UpJjB4ZmY7Ci0JCQlsaW5lID0gYmFzZSsxOwotCQkJc3RhdGUgPSBzbGluZTsKLQkJCWJyZWFrOwotCQljYXNlIHNsaW5lOgotCQkJaWYgKCpiYXNlID09ICdcMCcpIHsKLQkJCQkvKiB3b3JyeSBhYm91dCBsaW5lIG51bWJlcnMgKi8KLQkJCQlpZiAoaGlzdHB0ciA+PSBoaXN0b3J5ICYmIGxuby0xICE9IHMtPmxpbmUpIHsKLQkJCQkJLyogYSByZXBsYWNlbWVudCA/ICovCi0JCQkJCWhpc3RpbnNlcnQocywgbG5vLCAoY2hhciAqKWxpbmUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXMtPmxpbmUgPSBsbm8tLTsKLQkJCQkJaGlzdHNhdmUoJmxubywgKGNoYXIgKilsaW5lLCBmYWxzZSwKLQkJCQkJICAgIGZhbHNlKTsKLQkJCQl9Ci0JCQkJc3RhdGUgPSBzaGRyOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICoJSW5zZXJ0IGEgbGluZSBpbnRvIHRoZSBoaXN0b3J5IGF0IGEgc3BlY2lmaWVkIG51bWJlcgotICovCi1zdGF0aWMgdm9pZAotaGlzdGluc2VydChTb3VyY2UgKnMsIGludCBsbm8sIGNvbnN0IGNoYXIgKmxpbmUpCi17Ci0JY2hhciAqKmhwOwotCi0JaWYgKGxubyA+PSBzLT5saW5lIC0gKGhpc3RwdHIgLSBoaXN0b3J5KSAmJiBsbm8gPD0gcy0+bGluZSkgewotCQlocCA9ICZoaXN0cHRyW2xubyAtIHMtPmxpbmVdOwotCQlpZiAoKmhwKQotCQkJYWZyZWUoKmhwLCBBUEVSTSk7Ci0JCXN0cmR1cHgoKmhwLCBsaW5lLCBBUEVSTSk7Ci0JfQotfQotCi0vKgotICoJd3JpdGUgYSBjb21tYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgZmlsZQotICoJVGhpcyAqTUFZKiBzZWVtIGVhc3kgYnV0IGl0J3MgYWxzbyBuZWNlc3NhcnkgdG8gY2hlY2sKLSAqCXRoYXQgdGhlIGhpc3RvcnkgZmlsZSBoYXMgbm90IGNoYW5nZWQgaW4gc2l6ZS4KLSAqCUlmIGl0IGhhcyAtIHRoZW4gc29tZSBvdGhlciBzaGVsbCBoYXMgd3JpdHRlbiB0byBpdAotICoJYW5kIHdlIHNob3VsZCByZWFkIHRob3NlIGNvbW1hbmRzIHRvIHVwZGF0ZSBvdXIgaGlzdG9yeQotICovCi1zdGF0aWMgdm9pZAotd3JpdGVoaXN0ZmlsZShpbnQgbG5vLCBjaGFyICpjbWQpCi17Ci0JaW50CXNpemVub3c7Ci0JdW5zaWduZWQgY2hhcgkqYmFzZTsKLQl1bnNpZ25lZCBjaGFyCSpuZXdzOwotCWludAlieXRlczsKLQl1bnNpZ25lZCBjaGFyCWhkcls1XTsKLQotCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19FWCk7Ci0Jc2l6ZW5vdyA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKLQlpZiAoc2l6ZW5vdyAhPSBoc2l6ZSkgewotCQkvKgotCQkgKglUaGluZ3MgaGF2ZSBjaGFuZ2VkCi0JCSAqLwotCQlpZiAoc2l6ZW5vdyA+IGhzaXplKSB7Ci0JCQkvKiBzb21lb25lIGhhcyBhZGRlZCBzb21lIGxpbmVzICovCi0JCQlieXRlcyA9IHNpemVub3cgLSBoc2l6ZTsKLQkJCWJhc2UgPSAodm9pZCAqKW1tYXAoTlVMTCwgc2l6ZW5vdywgUFJPVF9SRUFELAotCQkJICAgIE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUsIGhpc3RmZCwgKG9mZl90KTApOwotCQkJaWYgKGJhc2UgPT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEKQotCQkJCWdvdG8gYmFkOwotCQkJbmV3cyA9IGJhc2UgKyBoc2l6ZTsKLQkJCWlmICgqbmV3cyAhPSBDT01NQU5EKSB7Ci0JCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIHNpemVub3cpOwotCQkJCWdvdG8gYmFkOwotCQkJfQotCQkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKLQkJCWhpc3Rsb2FkKGhpc3Rfc291cmNlLCBuZXdzLCBieXRlcyk7Ci0JCQloaXN0X3NvdXJjZS0+bGluZSsrOwotCQkJbG5vID0gaGlzdF9zb3VyY2UtPmxpbmU7Ci0JCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgc2l6ZW5vdyk7Ci0JCQloc2l6ZSA9IHNpemVub3c7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBpdCBoYXMgc2hydW5rICovCi0JCQkvKiBidXQgdG8gd2hhdD8gKi8KLQkJCS8qIHdlJ2xsIGdpdmUgdXAgZm9yIG5vdyAqLwotCQkJZ290byBiYWQ7Ci0JCX0KLQl9Ci0JaWYgKGNtZCkgewotCQkvKgotCQkgKgl3ZSBjYW4gd3JpdGUgb3VyIGJpdCBub3cKLQkJICovCi0JCWhkclswXSA9IENPTU1BTkQ7Ci0JCWhkclsxXSA9IChsbm8+PjI0KSYweGZmOwotCQloZHJbMl0gPSAobG5vPj4xNikmMHhmZjsKLQkJaGRyWzNdID0gKGxubz4+OCkmMHhmZjsKLQkJaGRyWzRdID0gbG5vJjB4ZmY7Ci0JCWJ5dGVzID0gc3RybGVuKGNtZCkgKyAxOwotCQlpZiAoKHdyaXRlKGhpc3RmZCwgaGRyLCA1KSAhPSA1KSB8fAotCQkgICAgKHdyaXRlKGhpc3RmZCwgY21kLCBieXRlcykgIT0gYnl0ZXMpKQotCQkJZ290byBiYWQ7Ci0JCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOwotCX0KLQkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOwotCXJldHVybjsKLSBiYWQ6Ci0JaGlzdF9maW5pc2goKTsKLX0KLQotdm9pZAotaGlzdF9maW5pc2godm9pZCkKLXsKLQkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOwotCSh2b2lkKWNsb3NlKGhpc3RmZCk7Ci0JaGlzdGZkID0gMDsKLX0KLQotLyoKLSAqCWFkZCBtYWdpYyB0byB0aGUgaGlzdG9yeSBmaWxlCi0gKi8KLXN0YXRpYyBpbnQKLXNwcmlua2xlKGludCBmZCkKLXsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYWdbXSA9IHsgSE1BR0lDMSwgSE1BR0lDMiB9OwotCi0JcmV0dXJuICh3cml0ZShmZCwgbWFnLCAyKSAhPSAyKTsKLX0KLSNlbmRpZgotCi0jaWYgIUhBVkVfU1lTX1NJR05BTUUKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWtzaF9zaWdwYWlyIHsKLQljb25zdCBjaGFyICpjb25zdCBuYW1lOwotCWludCBucjsKLX0gbWtzaF9zaWdwYWlyc1tdID0gewotI2luY2x1ZGUgInNpZ25hbWVzLmluYyIKLQl7IE5VTEwsIDAgfQotfTsKLSNlbmRpZgotCi12b2lkCi1pbml0dHJhcHModm9pZCkKLXsKLQlpbnQgaTsKLQljb25zdCBjaGFyICpjczsKLQotCS8qIFBvcHVsYXRlIHNpZ3RyYXBzIGJhc2VkIG9uIHN5c19zaWduYW1lIGFuZCBzeXNfc2lnbGlzdC4gKi8KLQlmb3IgKGkgPSAwOyBpIDw9IE5TSUc7IGkrKykgewotCQlzaWd0cmFwc1tpXS5zaWduYWwgPSBpOwotCQlpZiAoaSA9PSBTSUdFUlJfKSB7Ci0JCQlzaWd0cmFwc1tpXS5uYW1lID0gIkVSUiI7Ci0JCQlzaWd0cmFwc1tpXS5tZXNzID0gIkVycm9yIGhhbmRsZXIiOwotCQl9IGVsc2UgewotI2lmIEhBVkVfU1lTX1NJR05BTUUKLQkJCWNzID0gc3lzX3NpZ25hbWVbaV07Ci0jZWxzZQotCQkJY29uc3Qgc3RydWN0IG1rc2hfc2lncGFpciAqcGFpciA9IG1rc2hfc2lncGFpcnM7Ci0JCQl3aGlsZSAoKHBhaXItPm5yICE9IGkpICYmIChwYWlyLT5uYW1lICE9IE5VTEwpKQotCQkJCSsrcGFpcjsKLQkJCWNzID0gcGFpci0+bmFtZTsKLSNlbmRpZgotCQkJaWYgKChjcyA9PSBOVUxMKSB8fAotCQkJICAgIChjc1swXSA9PSAnXDAnKSkKLQkJCQlzaWd0cmFwc1tpXS5uYW1lID0gc2hmX3NtcHJpbnRmKCIlZCIsIGkpOwotCQkJZWxzZSB7Ci0JCQkJY2hhciAqczsKLQotCQkJCWlmICghc3RybmNhc2VjbXAoY3MsICJTSUciLCAzKSkKLQkJCQkJY3MgKz0gMzsKLQkJCQlzdHJkdXB4KHMsIGNzLCBBUEVSTSk7Ci0JCQkJc2lndHJhcHNbaV0ubmFtZSA9IHM7Ci0JCQkJd2hpbGUgKCgqcyA9IGtzaF90b3VwcGVyKCpzKSkpCi0JCQkJCSsrczsKLQkJCX0KLSNpZiBIQVZFX1NZU19TSUdMSVNUCi0JCQlzaWd0cmFwc1tpXS5tZXNzID0gc3lzX3NpZ2xpc3RbaV07Ci0jZWxpZiBIQVZFX1NUUlNJR05BTAotCQkJc2lndHJhcHNbaV0ubWVzcyA9IHN0cnNpZ25hbChpKTsKLSNlbHNlCi0JCQlzaWd0cmFwc1tpXS5tZXNzID0gTlVMTDsKLSNlbmRpZgotCQkJaWYgKChzaWd0cmFwc1tpXS5tZXNzID09IE5VTEwpIHx8Ci0JCQkgICAgKHNpZ3RyYXBzW2ldLm1lc3NbMF0gPT0gJ1wwJykpCi0JCQkJc2lndHJhcHNbaV0ubWVzcyA9IHNoZl9zbXByaW50ZigiU2lnbmFsICVkIiwgaSk7Ci0JCX0KLQl9Ci0Jc2lndHJhcHNbU0lHRVhJVF9dLm5hbWUgPSAiRVhJVCI7CS8qIG91ciBuYW1lIGZvciBzaWduYWwgMCAqLwotCi0JKHZvaWQpc2lnZW1wdHlzZXQoJlNpZ2FjdF9pZ24uc2FfbWFzayk7Ci0JU2lnYWN0X2lnbi5zYV9mbGFncyA9IDA7IC8qIGludGVycnVwdGlibGUgKi8KLQlTaWdhY3RfaWduLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotCi0Jc2lndHJhcHNbU0lHSU5UXS5mbGFncyB8PSBURl9ERkxfSU5UUiB8IFRGX1RUWV9JTlRSOwotCXNpZ3RyYXBzW1NJR1FVSVRdLmZsYWdzIHw9IFRGX0RGTF9JTlRSIHwgVEZfVFRZX0lOVFI7Ci0Jc2lndHJhcHNbU0lHVEVSTV0uZmxhZ3MgfD0gVEZfREZMX0lOVFI7Lyogbm90IGZhdGFsIGZvciBpbnRlcmFjdGl2ZSAqLwotCXNpZ3RyYXBzW1NJR0hVUF0uZmxhZ3MgfD0gVEZfRkFUQUw7Ci0Jc2lndHJhcHNbU0lHQ0hMRF0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKLQotCS8qIHRoZXNlIGFyZSBhbHdheXMgY2F1Z2h0IHNvIHdlIGNhbiBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IGZpbGVzLiAqLwotCXNldHNpZygmc2lndHJhcHNbU0lHSU5UXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1FVSVRdLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOwotCXNldHNpZygmc2lndHJhcHNbU0lHVEVSTV0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7Ci0Jc2V0c2lnKCZzaWd0cmFwc1tTSUdIVVBdLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOwotfQotCi1zdGF0aWMgdm9pZCBhbGFybV9jYXRjaGVyKGludCBzaWcpOwotCi12b2lkCi1hbGFybV9pbml0KHZvaWQpCi17Ci0Jc2lndHJhcHNbU0lHQUxSTV0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR0FMUk1dLCBhbGFybV9jYXRjaGVyLAotCQlTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0V8U1NfU0hUUkFQKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1hbGFybV9jYXRjaGVyKGludCBzaWcgTUtTSF9BX1VOVVNFRCkKLXsKLQkvKiB0aGlzIHJ1bnMgaW5zaWRlIGludGVycnVwdCBjb250ZXh0LCB3aXRoIGVycm5vIHNhdmVkICovCi0KLQlpZiAoa3NoX3Rtb3V0X3N0YXRlID09IFRNT1VUX1JFQURJTkcpIHsKLQkJaW50IGxlZnQgPSBhbGFybSgwKTsKLQotCQlpZiAobGVmdCA9PSAwKSB7Ci0JCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9MRUFWSU5HOwotCQkJaW50cnNpZyA9IDE7Ci0JCX0gZWxzZQotCQkJYWxhcm0obGVmdCk7Ci0JfQotfQotCi1UcmFwICoKLWdldHRyYXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGlnbmNhc2UpCi17Ci0JaW50IG4gPSBOU0lHICsgMTsKLQlUcmFwICpwOwotCWNvbnN0IGNoYXIgKm4yOwotCWludCAoKmNtcGZ1bmMpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSA9IHN0cmNtcDsKLQotCWlmIChrc2hfaXNkaWdpdCgqbmFtZSkpIHsKLQkJaWYgKGdldG4obmFtZSwgJm4pICYmIDAgPD0gbiAmJiBuIDwgTlNJRykKLQkJCXJldHVybiAoJnNpZ3RyYXBzW25dKTsKLQkJZWxzZQotCQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQluMiA9IHN0cm5jYXNlY21wKG5hbWUsICJTSUciLCAzKSA/IE5VTEwgOiBuYW1lICsgMzsKLQlpZiAoaWduY2FzZSkKLQkJY21wZnVuYyA9IHN0cmNhc2VjbXA7Ci0JZm9yIChwID0gc2lndHJhcHM7IC0tbiA+PSAwOyBwKyspCi0JCWlmICghY21wZnVuYyhwLT5uYW1lLCBuYW1lKSB8fCAobjIgJiYgIWNtcGZ1bmMocC0+bmFtZSwgbjIpKSkKLQkJCXJldHVybiAocCk7Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoKLSAqIHRyYXAgc2lnbmFsIGhhbmRsZXIKLSAqLwotdm9pZAotdHJhcHNpZyhpbnQgaSkKLXsKLQlUcmFwICpwID0gJnNpZ3RyYXBzW2ldOwotCWludCBlcnJub18gPSBlcnJubzsKLQotCXRyYXAgPSBwLT5zZXQgPSAxOwotCWlmIChwLT5mbGFncyAmIFRGX0RGTF9JTlRSKQotCQlpbnRyc2lnID0gMTsKLQlpZiAoKHAtPmZsYWdzICYgVEZfRkFUQUwpICYmICFwLT50cmFwKSB7Ci0JCWZhdGFsX3RyYXAgPSAxOwotCQlpbnRyc2lnID0gMTsKLQl9Ci0JaWYgKHAtPnNodHJhcCkKLQkJKCpwLT5zaHRyYXApKGkpOwotCWVycm5vID0gZXJybm9fOwotfQotCi0vKgotICogY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBeQyBvdXQgb2Ygc29tZXRoaW5nIC0gd29uJ3QKLSAqIHdvcmsgaWYgdXNlciBoYXMgdHJhcHBlZCBTSUdJTlQuCi0gKi8KLXZvaWQKLWludHJjaGVjayh2b2lkKQotewotCWlmIChpbnRyc2lnKQotCQlydW50cmFwcyhURl9ERkxfSU5UUnxURl9GQVRBTCk7Ci19Ci0KLS8qCi0gKiBjYWxsZWQgYWZ0ZXIgRUlOVFIgdG8gY2hlY2sgaWYgYSBzaWduYWwgd2l0aCBub3JtYWxseSBjYXVzZXMgcHJvY2VzcwotICogdGVybWluYXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQuCi0gKi8KLWludAotZmF0YWxfdHJhcF9jaGVjayh2b2lkKQotewotCWludCBpOwotCVRyYXAgKnA7Ci0KLQkvKiB0b2RvOiBzaG91bGQgY2hlY2sgaWYgc2lnbmFsIGlzIGZhdGFsLCBub3QgdGhlIFRGX0RGTF9JTlRSIGZsYWcgKi8KLQlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKLQkJaWYgKHAtPnNldCAmJiAocC0+ZmxhZ3MgJiAoVEZfREZMX0lOVFJ8VEZfRkFUQUwpKSkKLQkJCS8qIHJldHVybiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGV4aXQgY29kZSAqLwotCQkJcmV0dXJuICgxMjggKyBwLT5zaWduYWwpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIG9mIGFueSBwZW5kaW5nIHRyYXBzOiBpZSwgYSBzaWduYWwgd2hpY2ggaGFzCi0gKiBvY2N1cnJlZCBmb3Igd2hpY2ggYSB0cmFwIGhhcyBiZWVuIHNldCBvciBmb3Igd2hpY2ggdGhlIFRGX0RGTF9JTlRSIGZsYWcKLSAqIGlzIHNldC4KLSAqLwotaW50Ci10cmFwX3BlbmRpbmcodm9pZCkKLXsKLQlpbnQgaTsKLQlUcmFwICpwOwotCi0JZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCi0JCWlmIChwLT5zZXQgJiYgKChwLT50cmFwICYmIHAtPnRyYXBbMF0pIHx8Ci0JCSAgICAoKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkgJiYgIXAtPnRyYXApKSkKLQkJCXJldHVybiAocC0+c2lnbmFsKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogcnVuIGFueSBwZW5kaW5nIHRyYXBzLiBJZiBpbnRyIGlzIHNldCwgb25seSBydW4gdHJhcHMgdGhhdAotICogY2FuIGludGVycnVwdCBjb21tYW5kcy4KLSAqLwotdm9pZAotcnVudHJhcHMoaW50IGZsYWcpCi17Ci0JaW50IGk7Ci0JVHJhcCAqcDsKLQotCWlmIChrc2hfdG1vdXRfc3RhdGUgPT0gVE1PVVRfTEVBVklORykgewotCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9FWEVDVVRJTkc7Ci0JCXdhcm5pbmdmKGZhbHNlLCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGlucHV0Iik7Ci0JCXVud2luZChMRVhJVCk7Ci0JfSBlbHNlCi0JCS8qCi0JCSAqIFhYWDogdGhpcyBtZWFucyB0aGUgYWxhcm0gd2lsbCBoYXZlIG5vIGVmZmVjdCBpZiBhIHRyYXAKLQkJICogaXMgY2F1Z2h0IGFmdGVyIHRoZSBhbGFybSgpIHdhcyBzdGFydGVkLi4ubm90IGdvb2QuCi0JCSAqLwotCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9FWEVDVVRJTkc7Ci0JaWYgKCFmbGFnKQotCQl0cmFwID0gMDsKLQlpZiAoZmxhZyAmIFRGX0RGTF9JTlRSKQotCQlpbnRyc2lnID0gMDsKLQlpZiAoZmxhZyAmIFRGX0ZBVEFMKQotCQlmYXRhbF90cmFwID0gMDsKLQlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKLQkJaWYgKHAtPnNldCAmJiAoIWZsYWcgfHwKLQkJICAgICgocC0+ZmxhZ3MgJiBmbGFnKSAmJiBwLT50cmFwID09IE5VTEwpKSkKLQkJCXJ1bnRyYXAocCk7Ci19Ci0KLXZvaWQKLXJ1bnRyYXAoVHJhcCAqcCkKLXsKLQlpbnQJaSA9IHAtPnNpZ25hbDsKLQljaGFyCSp0cmFwc3RyID0gcC0+dHJhcDsKLQlpbnQJb2V4c3RhdDsKLQlpbnQJb2xkX2NoYW5nZWQgPSAwOwotCi0JcC0+c2V0ID0gMDsKLQlpZiAodHJhcHN0ciA9PSBOVUxMKSB7IC8qIFNJR19ERkwgKi8KLQkJaWYgKHAtPmZsYWdzICYgVEZfRkFUQUwpIHsKLQkJCS8qIGVnLCBTSUdIVVAgKi8KLQkJCWV4c3RhdCA9IDEyOCArIGk7Ci0JCQl1bndpbmQoTExFQVZFKTsKLQkJfQotCQlpZiAocC0+ZmxhZ3MgJiBURl9ERkxfSU5UUikgewotCQkJLyogZWcsIFNJR0lOVCwgU0lHUVVJVCwgU0lHVEVSTSwgZXRjLiAqLwotCQkJZXhzdGF0ID0gMTI4ICsgaTsKLQkJCXVud2luZChMSU5UUik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAodHJhcHN0clswXSA9PSAnXDAnKSAvKiBTSUdfSUdOICovCi0JCXJldHVybjsKLQlpZiAoaSA9PSBTSUdFWElUXyB8fCBpID09IFNJR0VSUl8pIHsJLyogYXZvaWQgcmVjdXJzaW9uIG9uIHRoZXNlICovCi0JCW9sZF9jaGFuZ2VkID0gcC0+ZmxhZ3MgJiBURl9DSEFOR0VEOwotCQlwLT5mbGFncyAmPSB+VEZfQ0hBTkdFRDsKLQkJcC0+dHJhcCA9IE5VTEw7Ci0JfQotCW9leHN0YXQgPSBleHN0YXQ7Ci0JLyoKLQkgKiBOb3RlOiB0cmFwc3RyIGlzIGZ1bGx5IHBhcnNlZCBiZWZvcmUgYW55dGhpbmcgaXMgZXhlY3V0ZWQsIHRodXMKLQkgKiBubyBwcm9ibGVtIHdpdGggYWZyZWUocC0+dHJhcCkgaW4gc2V0dHJhcCgpIHdoaWxlIHN0aWxsIGluIHVzZS4KLQkgKi8KLQljb21tYW5kKHRyYXBzdHIsIGN1cnJlbnRfbGluZW5vKTsKLQlleHN0YXQgPSBvZXhzdGF0OwotCWlmIChpID09IFNJR0VYSVRfIHx8IGkgPT0gU0lHRVJSXykgewotCQlpZiAocC0+ZmxhZ3MgJiBURl9DSEFOR0VEKQotCQkJLyogZG9uJ3QgY2xlYXIgVEZfQ0hBTkdFRCAqLwotCQkJYWZyZWUodHJhcHN0ciwgQVBFUk0pOwotCQllbHNlCi0JCQlwLT50cmFwID0gdHJhcHN0cjsKLQkJcC0+ZmxhZ3MgfD0gb2xkX2NoYW5nZWQ7Ci0JfQotfQotCi0vKiBjbGVhciBwZW5kaW5nIHRyYXBzIGFuZCByZXNldCB1c2VyJ3MgdHJhcCBoYW5kbGVyczsgdXNlZCBhZnRlciBmb3JrKDIpICovCi12b2lkCi1jbGVhcnRyYXBzKHZvaWQpCi17Ci0JaW50IGk7Ci0JVHJhcCAqcDsKLQotCXRyYXAgPSAwOwotCWludHJzaWcgPSAwOwotCWZhdGFsX3RyYXAgPSAwOwotCWZvciAoaSA9IE5TSUcrMSwgcCA9IHNpZ3RyYXBzOyAtLWkgPj0gMDsgcCsrKSB7Ci0JCXAtPnNldCA9IDA7Ci0JCWlmICgocC0+ZmxhZ3MgJiBURl9VU0VSX1NFVCkgJiYgKHAtPnRyYXAgJiYgcC0+dHJhcFswXSkpCi0JCQlzZXR0cmFwKHAsIE5VTEwpOwotCX0KLX0KLQotLyogcmVzdG9yZSBzaWduYWxzIGp1c3QgYmVmb3JlIGFuIGV4ZWMoMikgKi8KLXZvaWQKLXJlc3RvcmVzaWdzKHZvaWQpCi17Ci0JaW50IGk7Ci0JVHJhcCAqcDsKLQotCWZvciAoaSA9IE5TSUcrMSwgcCA9IHNpZ3RyYXBzOyAtLWkgPj0gMDsgcCsrKQotCQlpZiAocC0+ZmxhZ3MgJiAoVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpKQotCQkJc2V0c2lnKHAsIChwLT5mbGFncyAmIFRGX0VYRUNfSUdOKSA/IFNJR19JR04gOiBTSUdfREZMLAotCQkJICAgIFNTX1JFU1RPUkVfQ1VSUnxTU19GT1JDRSk7Ci19Ci0KLXZvaWQKLXNldHRyYXAoVHJhcCAqcCwgY29uc3QgY2hhciAqcykKLXsKLQlzaWdfdCBmOwotCi0JaWYgKHAtPnRyYXApCi0JCWFmcmVlKHAtPnRyYXAsIEFQRVJNKTsKLQlzdHJkdXB4KHAtPnRyYXAsIHMsIEFQRVJNKTsgLyogaGFuZGxlcyBzID09IDAgKi8KLQlwLT5mbGFncyB8PSBURl9DSEFOR0VEOwotCWYgPSAhcyA/IFNJR19ERkwgOiBzWzBdID8gdHJhcHNpZyA6IFNJR19JR047Ci0KLQlwLT5mbGFncyB8PSBURl9VU0VSX1NFVDsKLQlpZiAoKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkgJiYgZiA9PSBTSUdfREZMKQotCQlmID0gdHJhcHNpZzsKLQllbHNlIGlmIChwLT5mbGFncyAmIFRGX1NIRUxMX1VTRVMpIHsKLQkJaWYgKCEocC0+ZmxhZ3MgJiBURl9PUklHX0lHTikgfHwgRmxhZyhGVEFMS0lORykpIHsKLQkJCS8qIGRvIHdoYXQgdXNlciB3YW50cyBhdCBleGVjIHRpbWUgKi8KLQkJCXAtPmZsYWdzICY9IH4oVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpOwotCQkJaWYgKGYgPT0gU0lHX0lHTikKLQkJCQlwLT5mbGFncyB8PSBURl9FWEVDX0lHTjsKLQkJCWVsc2UKLQkJCQlwLT5mbGFncyB8PSBURl9FWEVDX0RGTDsKLQkJfQotCi0JCS8qCi0JCSAqIGFzc3VtZXMgaGFuZGxlciBhbHJlYWR5IHNldCB0byB3aGF0IHNoZWxsIHdhbnRzIGl0Ci0JCSAqIChub3JtYWxseSB0cmFwc2lnLCBidXQgY291bGQgYmUgal9zaWdjaGxkKCkgb3IgU0lHX0lHTikKLQkJICovCi0JCXJldHVybjsKLQl9Ci0KLQkvKiB0b2RvOiBzaG91bGQgd2UgbGV0IHVzZXIga25vdyBzaWduYWwgaXMgaWdub3JlZD8gaG93PyAqLwotCXNldHNpZyhwLCBmLCBTU19SRVNUT1JFX0NVUlJ8U1NfVVNFUik7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYnkgY19wcmludCgpIHdoZW4gd3JpdGluZyB0byBhIGNvLXByb2Nlc3MgdG8gZW5zdXJlIFNJR1BJUEUgd29uJ3QKLSAqIGtpbGwgc2hlbGwgKHVubGVzcyB1c2VyIGNhdGNoZXMgaXQgYW5kIGV4aXRzKQotICovCi1pbnQKLWJsb2NrX3BpcGUodm9pZCkKLXsKLQlpbnQgcmVzdG9yZV9kZmwgPSAwOwotCVRyYXAgKnAgPSAmc2lndHJhcHNbU0lHUElQRV07Ci0KLQlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKSB7Ci0JCXNldHNpZyhwLCBTSUdfSUdOLCBTU19SRVNUT1JFX0NVUlIpOwotCQlpZiAocC0+ZmxhZ3MgJiBURl9PUklHX0RGTCkKLQkJCXJlc3RvcmVfZGZsID0gMTsKLQl9IGVsc2UgaWYgKHAtPmN1cnNpZyA9PSBTSUdfREZMKSB7Ci0JCXNldHNpZyhwLCBTSUdfSUdOLCBTU19SRVNUT1JFX0NVUlIpOwotCQlyZXN0b3JlX2RmbCA9IDE7IC8qIHJlc3RvcmUgdG8gU0lHX0RGTCAqLwotCX0KLQlyZXR1cm4gKHJlc3RvcmVfZGZsKTsKLX0KLQotLyogQ2FsbGVkIGJ5IGNfcHJpbnQoKSB0byB1bmRvIHdoYXRldmVyIGJsb2NrX3BpcGUoKSBkaWQgKi8KLXZvaWQKLXJlc3RvcmVfcGlwZShpbnQgcmVzdG9yZV9kZmwpCi17Ci0JaWYgKHJlc3RvcmVfZGZsKQotCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1BJUEVdLCBTSUdfREZMLCBTU19SRVNUT1JFX0NVUlIpOwotfQotCi0vKgotICogU2V0IGFjdGlvbiBmb3IgYSBzaWduYWwuIEFjdGlvbiBtYXkgbm90IGJlIHNldCBpZiBvcmlnaW5hbAotICogYWN0aW9uIHdhcyBTSUdfSUdOLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGZsYWdzIGFuZCBGVEFMS0lORy4KLSAqLwotaW50Ci1zZXRzaWcoVHJhcCAqcCwgc2lnX3QgZiwgaW50IGZsYWdzKQotewotCXN0cnVjdCBzaWdhY3Rpb24gc2lnYWN0OwotCi0JaWYgKHAtPnNpZ25hbCA9PSBTSUdFWElUXyB8fCBwLT5zaWduYWwgPT0gU0lHRVJSXykKLQkJcmV0dXJuICgxKTsKLQotCS8qCi0JICogRmlyc3QgdGltZSBzZXR0aW5nIHRoaXMgc2lnbmFsPyBJZiBzbywgZ2V0IGFuZCBub3RlIHRoZSBjdXJyZW50Ci0JICogc2V0dGluZy4KLQkgKi8KLQlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKSB7Ci0JCXNpZ2FjdGlvbihwLT5zaWduYWwsICZTaWdhY3RfaWduLCAmc2lnYWN0KTsKLQkJcC0+ZmxhZ3MgfD0gc2lnYWN0LnNhX2hhbmRsZXIgPT0gU0lHX0lHTiA/Ci0JCSAgICBURl9PUklHX0lHTiA6IFRGX09SSUdfREZMOwotCQlwLT5jdXJzaWcgPSBTSUdfSUdOOwotCX0KLQotCS8qLQotCSAqIEdlbmVyYWxseSwgYW4gaWdub3JlZCBzaWduYWwgc3RheXMgaWdub3JlZCwgZXhjZXB0IGlmCi0JICoJLSB0aGUgdXNlciBvZiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCB3YW50cyB0byBjaGFuZ2UgaXQKLQkgKgktIHRoZSBzaGVsbCB3YW50cyBmb3IgZm9yY2UgYSBjaGFuZ2UKLQkgKi8KLQlpZiAoKHAtPmZsYWdzICYgVEZfT1JJR19JR04pICYmICEoZmxhZ3MgJiBTU19GT1JDRSkgJiYKLQkgICAgKCEoZmxhZ3MgJiBTU19VU0VSKSB8fCAhRmxhZyhGVEFMS0lORykpKQotCQlyZXR1cm4gKDApOwotCi0Jc2V0ZXhlY3NpZyhwLCBmbGFncyAmIFNTX1JFU1RPUkVfTUFTSyk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgaGVyZSAnY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgd2F5IG9mIGNsZWFyaW5nCi0JICogc2h0cmFwcywgYnV0IGRvbid0IGtub3cgaWYgdGhpcyBpcyBhIHNhbmUgd2F5IG9mIGRvaW5nCi0JICogaXQuIEF0IHRoZSBtb21lbnQsIGFsbCB1c2VycyBvZiBzaHRyYXAgYXJlIGxpZmV0aW1lCi0JICogdXNlcnMgKFNJR0FMUk0sIFNJR0NITEQsIFNJR1dJTkNIKS4KLQkgKi8KLQlpZiAoIShmbGFncyAmIFNTX1VTRVIpKQotCQlwLT5zaHRyYXAgPSAoc2lnX3QpTlVMTDsKLQlpZiAoZmxhZ3MgJiBTU19TSFRSQVApIHsKLQkJcC0+c2h0cmFwID0gZjsKLQkJZiA9IHRyYXBzaWc7Ci0JfQotCi0JaWYgKHAtPmN1cnNpZyAhPSBmKSB7Ci0JCXAtPmN1cnNpZyA9IGY7Ci0JCSh2b2lkKXNpZ2VtcHR5c2V0KCZzaWdhY3Quc2FfbWFzayk7Ci0JCXNpZ2FjdC5zYV9mbGFncyA9IDAgLyogaW50ZXJydXB0aWJsZSAqLzsKLQkJc2lnYWN0LnNhX2hhbmRsZXIgPSBmOwotCQlzaWdhY3Rpb24ocC0+c2lnbmFsLCAmc2lnYWN0LCBOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gKDEpOwotfQotCi0vKiBjb250cm9sIHdoYXQgc2lnbmFsIGlzIHNldCB0byBiZWZvcmUgYW4gZXhlYygpICovCi12b2lkCi1zZXRleGVjc2lnKFRyYXAgKnAsIGludCByZXN0b3JlKQotewotCS8qIFhYWCBkZWJ1Z2dpbmcgKi8KLQlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNldGV4ZWNzaWc6IHVuc2V0IHNpZ25hbCAlZCglcykiLAotCQkgICAgcC0+c2lnbmFsLCBwLT5uYW1lKTsKLQotCS8qIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgZm9yIGV4ZWMnZCBraWRzICovCi0JcC0+ZmxhZ3MgJj0gfihURl9FWEVDX0lHTnxURl9FWEVDX0RGTCk7Ci0Jc3dpdGNoIChyZXN0b3JlICYgU1NfUkVTVE9SRV9NQVNLKSB7Ci0JY2FzZSBTU19SRVNUT1JFX0NVUlI6IC8qIGxlYXZlIHRoaW5ncyBhcyB0aGV5IGN1cnJlbnRseSBhcmUgKi8KLQkJYnJlYWs7Ci0JY2FzZSBTU19SRVNUT1JFX09SSUc6Ci0JCXAtPmZsYWdzIHw9IHAtPmZsYWdzICYgVEZfT1JJR19JR04gPyBURl9FWEVDX0lHTiA6IFRGX0VYRUNfREZMOwotCQlicmVhazsKLQljYXNlIFNTX1JFU1RPUkVfREZMOgotCQlwLT5mbGFncyB8PSBURl9FWEVDX0RGTDsKLQkJYnJlYWs7Ci0JY2FzZSBTU19SRVNUT1JFX0lHTjoKLQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19JR047Ci0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2pvYnMuYyBiL21rc2gvc3JjL2pvYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMjZhMS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9qb2JzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQ4ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBqb2JzLmMsdiAxLjM4IDIwMDkvMTIvMTIgMDQ6Mjg6NDQgZGVyYWFkdCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2pvYnMuYyx2IDEuNjkgMjAxMC8wNy8wNCAxNzozMzo1NCB0ZyBFeHAgJCIpOwotCi0jaWYgSEFWRV9LSUxMUEcKLSNkZWZpbmUgbWtzaF9raWxscGcJCWtpbGxwZwotI2Vsc2UKLS8qIGNyb3NzIGZpbmdlcnMgYW5kIGhvcGUga2lsbCBpcyBraWxscGctZW5kb3dlZCAqLwotI2RlZmluZSBta3NoX2tpbGxwZyhwLHMpCWtpbGwoLShwKSwgKHMpKQotI2VuZGlmCi0KLS8qIE9yZGVyIGltcG9ydGFudCEgKi8KLSNkZWZpbmUgUFJVTk5JTkcJMAotI2RlZmluZSBQRVhJVEVECQkxCi0jZGVmaW5lIFBTSUdOQUxMRUQJMgotI2RlZmluZSBQU1RPUFBFRAkzCi0KLXR5cGVkZWYgc3RydWN0IHByb2MJUHJvYzsKLXN0cnVjdCBwcm9jIHsKLQlQcm9jICpuZXh0OwkJLyogbmV4dCBwcm9jZXNzIGluIHBpcGVsaW5lIChpZiBhbnkpICovCi0JcGlkX3QgcGlkOwkJLyogcHJvY2VzcyBpZCAqLwotCWludCBzdGF0ZTsKLQlpbnQgc3RhdHVzOwkJLyogd2FpdCBzdGF0dXMgKi8KLQljaGFyIGNvbW1hbmRbNDhdOwkvKiBwcm9jZXNzIGNvbW1hbmQgc3RyaW5nICovCi19OwotCi0vKiBOb3RpZnkvcHJpbnQgZmxhZyAtIGpfcHJpbnQoKSBhcmd1bWVudCAqLwotI2RlZmluZSBKUF9OT05FCQkwCS8qIGRvbid0IHByaW50IGFueXRoaW5nICovCi0jZGVmaW5lIEpQX1NIT1JUCTEJLyogcHJpbnQgc2lnbmFscyBwcm9jZXNzZXMgd2VyZSBraWxsZWQgYnkgKi8KLSNkZWZpbmUgSlBfTUVESVVNCTIJLyogcHJpbnQgW2pvYi1udW1dIC0vKyBjb21tYW5kICovCi0jZGVmaW5lIEpQX0xPTkcJCTMJLyogcHJpbnQgW2pvYi1udW1dIC0vKyBwaWQgY29tbWFuZCAqLwotI2RlZmluZSBKUF9QR1JQCQk0CS8qIHByaW50IHBncnAgKi8KLQotLyogcHV0X2pvYigpIGZsYWdzICovCi0jZGVmaW5lIFBKX09OX0ZST05UCTAJLyogYXQgdmVyeSBmcm9udCAqLwotI2RlZmluZSBQSl9QQVNUX1NUT1BQRUQJMQkvKiBqdXN0IHBhc3QgYW55IHN0b3BwZWQgam9icyAqLwotCi0vKiBKb2IuZmxhZ3MgdmFsdWVzICovCi0jZGVmaW5lIEpGX1NUQVJURUQJMHgwMDEJLyogc2V0IHdoZW4gYWxsIHByb2Nlc3NlcyBpbiBqb2IgYXJlIHN0YXJ0ZWQgKi8KLSNkZWZpbmUgSkZfV0FJVElORwkweDAwMgkvKiBzZXQgaWYgal93YWl0aigpIGlzIHdhaXRpbmcgb24gam9iICovCi0jZGVmaW5lIEpGX1dfQVNZTkNOT1RJRlkgMHgwMDQJLyogc2V0IGlmIHdhaXRpbmcgYW5kIGFzeW5jIG5vdGlmaWNhdGlvbiBvayAqLwotI2RlZmluZSBKRl9YWENPTQkweDAwOAkvKiBzZXQgZm9yICQoY29tbWFuZCkgam9icyAqLwotI2RlZmluZSBKRl9GRwkJMHgwMTAJLyogcnVubmluZyBpbiBmb3JlZ3JvdW5kIChhbHNvIGhhcyB0dHkgcGdycCkgKi8KLSNkZWZpbmUgSkZfU0FWRURUVFkJMHgwMjAJLyogai0+dHR5c3RhdGUgaXMgdmFsaWQgKi8KLSNkZWZpbmUgSkZfQ0hBTkdFRAkweDA0MAkvKiBwcm9jZXNzIGhhcyBjaGFuZ2VkIHN0YXRlICovCi0jZGVmaW5lIEpGX0tOT1dOCTB4MDgwCS8qICQhIHJlZmVyZW5jZWQgKi8KLSNkZWZpbmUgSkZfWk9NQklFCTB4MTAwCS8qIGtub3duLCB1bndhaXRlZCBwcm9jZXNzICovCi0jZGVmaW5lIEpGX1JFTU9WRQkweDIwMAkvKiBmbGFnZ2VkIGZvciByZW1vdmFsIChqX2pvYnMoKS9qX25vaXR5ZigpKSAqLwotI2RlZmluZSBKRl9VU0VUVFlNT0RFCTB4NDAwCS8qIHR0eSBtb2RlIHNhdmVkIGlmIHByb2Nlc3MgZXhpdHMgbm9ybWFsbHkgKi8KLSNkZWZpbmUgSkZfU0FWRURUVFlQR1JQCTB4ODAwCS8qIGotPnNhdmVkX3R0eXBncnAgaXMgdmFsaWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgam9iIEpvYjsKLXN0cnVjdCBqb2IgewotCUpvYiAqbmV4dDsJCS8qIG5leHQgam9iIGluIGxpc3QgKi8KLQlQcm9jICpwcm9jX2xpc3Q7CS8qIHByb2Nlc3MgbGlzdCAqLwotCVByb2MgKmxhc3RfcHJvYzsJLyogbGFzdCBwcm9jZXNzIGluIGxpc3QgKi8KLQlzdHJ1Y3QgdGltZXZhbCBzeXN0aW1lOwkvKiBzeXN0ZW0gdGltZSB1c2VkIGJ5IGpvYiAqLwotCXN0cnVjdCB0aW1ldmFsIHVzcnRpbWU7CS8qIHVzZXIgdGltZSB1c2VkIGJ5IGpvYiAqLwotCXBpZF90IHBncnA7CQkvKiBwcm9jZXNzIGdyb3VwIG9mIGpvYiAqLwotCXBpZF90IHBwaWQ7CQkvKiBwaWQgb2YgcHJvY2VzcyB0aGF0IGZvcmtlZCBqb2IgKi8KLQlpbnQgam9iOwkJLyogam9iIG51bWJlcjogJW4gKi8KLQlpbnQgZmxhZ3M7CQkvKiBzZWUgSkZfKiAqLwotCXZvbGF0aWxlIGludCBzdGF0ZTsJLyogam9iIHN0YXRlICovCi0JaW50IHN0YXR1czsJCS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgcHJvY2VzcyAqLwotCWludDMyX3QJYWdlOwkJLyogbnVtYmVyIG9mIGpvYnMgc3RhcnRlZCAqLwotCUNvcHJvY19pZCBjb3Byb2NfaWQ7CS8qIDAgb3IgaWQgb2YgY29wcm9jZXNzIG91dHB1dCBwaXBlICovCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCXN0cnVjdCB0ZXJtaW9zIHR0eXN0YXRlOy8qIHNhdmVkIHR0eSBzdGF0ZSBmb3Igc3RvcHBlZCBqb2JzICovCi0JcGlkX3Qgc2F2ZWRfdHR5cGdycDsJLyogc2F2ZWQgdHR5IHByb2Nlc3MgZ3JvdXAgZm9yIHN0b3BwZWQgam9icyAqLwotI2VuZGlmCi19OwotCi0vKiBGbGFncyBmb3Igal93YWl0aigpICovCi0jZGVmaW5lIEpXX05PTkUJCTB4MDAKLSNkZWZpbmUgSldfSU5URVJSVVBUCTB4MDEJLyogXkMgd2lsbCBzdG9wIHRoZSB3YWl0ICovCi0jZGVmaW5lIEpXX0FTWU5DTk9USUZZCTB4MDIJLyogYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBkdXJpbmcgd2FpdCBvayAqLwotI2RlZmluZSBKV19TVE9QUEVEV0FJVAkweDA0CS8qIHdhaXQgZXZlbiBpZiBqb2Igc3RvcHBlZCAqLwotCi0vKiBFcnJvciBjb2RlcyBmb3Igal9sb29rdXAoKSAqLwotI2RlZmluZSBKTF9PSwkJMAotI2RlZmluZSBKTF9OT1NVQ0gJMQkvKiBubyBzdWNoIGpvYiAqLwotI2RlZmluZSBKTF9BTUJJRwkyCS8qICVmb28gb3IgJT9mb28gaXMgYW1iaWd1b3VzICovCi0jZGVmaW5lIEpMX0lOVkFMSUQJMwkvKiBub24tcGlkLCBub24tJSBqb2IgaWQgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvb2t1cF9tc2dzW10gPSB7Ci0JbnVsbCwKLQkibm8gc3VjaCBqb2IiLAotCSJhbWJpZ3VvdXMiLAotCSJhcmd1bWVudCBtdXN0IGJlICVqb2Igb3IgcHJvY2VzcyBpZCIsCi0JTlVMTAotfTsKLQotc3RhdGljIEpvYiAqam9iX2xpc3Q7CQkvKiBqb2IgbGlzdCAqLwotc3RhdGljIEpvYiAqbGFzdF9qb2I7Ci1zdGF0aWMgSm9iICphc3luY19qb2I7Ci1zdGF0aWMgcGlkX3QgYXN5bmNfcGlkOwotCi1zdGF0aWMgaW50IG56b21iaWU7CQkvKiAjIG9mIHpvbWJpZXMgb3duZWQgYnkgdGhpcyBwcm9jZXNzICovCi1zdGF0aWMgaW50MzJfdCBuam9iczsJCS8qICMgb2Ygam9icyBzdGFydGVkICovCi0KLSNpZm5kZWYgQ0hJTERfTUFYCi0jZGVmaW5lIENISUxEX01BWAkyNQotI2VuZGlmCi0KLS8qIGhlbGRfc2lnY2hsZCBpcyBzZXQgaWYgc2lnY2hsZCBvY2N1cnMgYmVmb3JlIGEgam9iIGlzIGNvbXBsZXRlbHkgc3RhcnRlZCAqLwotc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBoZWxkX3NpZ2NobGQ7Ci0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi1zdGF0aWMgc3RydWN0IHNoZgkqc2hsX2o7Ci1zdGF0aWMgYm9vbAkJdHR5cGdycF9vazsJLyogc2V0IGlmIGNhbiB1c2UgdHR5IHBncnBzICovCi1zdGF0aWMgcGlkX3QJCXJlc3RvcmVfdHR5cGdycCA9IC0xOwotc3RhdGljIGludCBjb25zdAl0dF9zaWdzW10gPSB7IFNJR1RTVFAsIFNJR1RUSU4sIFNJR1RUT1UgfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAkJal9zZXRfYXN5bmMoSm9iICopOwotc3RhdGljIHZvaWQJCWpfc3RhcnRqb2IoSm9iICopOwotc3RhdGljIGludAkJal93YWl0aihKb2IgKiwgaW50LCBjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQJCWpfc2lnY2hsZChpbnQpOwotc3RhdGljIHZvaWQJCWpfcHJpbnQoSm9iICosIGludCwgc3RydWN0IHNoZiAqKTsKLXN0YXRpYyBKb2IJCSpqX2xvb2t1cChjb25zdCBjaGFyICosIGludCAqKTsKLXN0YXRpYyBKb2IJCSpuZXdfam9iKHZvaWQpOwotc3RhdGljIFByb2MJCSpuZXdfcHJvYyh2b2lkKTsKLXN0YXRpYyB2b2lkCQljaGVja19qb2IoSm9iICopOwotc3RhdGljIHZvaWQJCXB1dF9qb2IoSm9iICosIGludCk7Ci1zdGF0aWMgdm9pZAkJcmVtb3ZlX2pvYihKb2IgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbnQJCWtpbGxfam9iKEpvYiAqLCBpbnQpOwotCi0vKiBpbml0aWFsaXNlIGpvYiBjb250cm9sICovCi12b2lkCi1qX2luaXQodm9pZCkKLXsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JYm9vbCBtZmxhZ3NldCA9IEZsYWcoRk1PTklUT1IpICE9IDEyNzsKLQotCUZsYWcoRk1PTklUT1IpID0gMDsKLSNlbmRpZgotCi0JKHZvaWQpc2lnZW1wdHlzZXQoJnNtX2RlZmF1bHQpOwotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc21fZGVmYXVsdCwgTlVMTCk7Ci0KLQkodm9pZClzaWdlbXB0eXNldCgmc21fc2lnY2hsZCk7Ci0JKHZvaWQpc2lnYWRkc2V0KCZzbV9zaWdjaGxkLCBTSUdDSExEKTsKLQotCXNldHNpZygmc2lndHJhcHNbU0lHQ0hMRF0sIGpfc2lnY2hsZCwKLQkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7Ci0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JaWYgKCFtZmxhZ3NldCAmJiBGbGFnKEZUQUxLSU5HKSkKLQkJRmxhZyhGTU9OSVRPUikgPSAxOwotCi0JLyoKLQkgKiBzaGxfaiBpcyB1c2VkIHRvIGRvIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gKHVzZWQgaW4KLQkgKiBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgc28gbmVlZCBhIGRpc3RpbmN0IHNoZikKLQkgKi8KLQlzaGxfaiA9IHNoZl9mZG9wZW4oMiwgU0hGX1dSLCBOVUxMKTsKLQotCWlmIChGbGFnKEZNT05JVE9SKSB8fCBGbGFnKEZUQUxLSU5HKSkgewotCQlpbnQgaTsKLQotCQkvKgotCQkgKiB0aGUgVEZfU0hFTExfVVNFUyB0ZXN0IGlzIGEga2x1ZGdlIHRoYXQgbGV0cyB1cyBrbm93IGlmCi0JCSAqIGlmIHRoZSBzaWduYWxzIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBzaGVsbC4KLQkJICovCi0JCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKSB7Ci0JCQlzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOwotCQkJLyogal9jaGFuZ2UoKSBzZXRzIHRoaXMgdG8gU1NfUkVTVE9SRV9ERkwgaWYgRk1PTklUT1IgKi8KLQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCi0JCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOwotCQl9Ci0JfQotCi0JLyogal9jaGFuZ2UoKSBjYWxscyB0dHlfaW5pdCgpICovCi0JaWYgKEZsYWcoRk1PTklUT1IpKQotCQlqX2NoYW5nZSgpOwotCWVsc2UKLSNlbmRpZgotCSAgaWYgKEZsYWcoRlRBTEtJTkcpKQotCQl0dHlfaW5pdCh0cnVlLCB0cnVlKTsKLX0KLQotLyogam9iIGNsZWFudXAgYmVmb3JlIHNoZWxsIGV4aXQgKi8KLXZvaWQKLWpfZXhpdCh2b2lkKQotewotCS8qIGtpbGwgc3RvcHBlZCwgYW5kIHBvc3NpYmx5IHJ1bm5pbmcsIGpvYnMgKi8KLQlKb2IJKmo7Ci0JaW50CWtpbGxlZCA9IDA7Ci0KLQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkgewotCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmCi0JCSAgICAoai0+c3RhdGUgPT0gUFNUT1BQRUQgfHwKLQkJICAgIChqLT5zdGF0ZSA9PSBQUlVOTklORyAmJgotCQkgICAgKChqLT5mbGFncyAmIEpGX0ZHKSB8fAotCQkgICAgKEZsYWcoRkxPR0lOKSAmJiAhRmxhZyhGTk9IVVApICYmIHByb2NwaWQgPT0ga3NocGlkKSkpKSkgewotCQkJa2lsbGVkID0gMTsKLQkJCWlmIChqLT5wZ3JwID09IDApCi0JCQkJa2lsbF9qb2IoaiwgU0lHSFVQKTsKLQkJCWVsc2UKLQkJCQlta3NoX2tpbGxwZyhqLT5wZ3JwLCBTSUdIVVApOwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkgewotCQkJCWlmIChqLT5wZ3JwID09IDApCi0JCQkJCWtpbGxfam9iKGosIFNJR0NPTlQpOwotCQkJCWVsc2UKLQkJCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCk7Ci0JCQl9Ci0jZW5kaWYKLQkJfQotCX0KLQlpZiAoa2lsbGVkKQotCQlzbGVlcCgxKTsKLQlqX25vdGlmeSgpOwotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCWlmIChrc2hwaWQgPT0gcHJvY3BpZCAmJiByZXN0b3JlX3R0eXBncnAgPj0gMCkgewotCQkvKgotCQkgKiBOZWVkIHRvIHJlc3RvcmUgdGhlIHR0eSBwZ3JwIHRvIHdoYXQgaXQgd2FzIHdoZW4gdGhlCi0JCSAqIHNoZWxsIHN0YXJ0ZWQgdXAsIHNvIHRoYXQgdGhlIHByb2Nlc3MgdGhhdCBzdGFydGVkIHVzCi0JCSAqIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHR0eSB3aGVuIHdlIGFyZSBkb25lLgotCQkgKiBBbHNvIG5lZWQgdG8gcmVzdG9yZSBvdXIgcHJvY2VzcyBncm91cCBpbiBjYXNlIHdlIGFyZQotCQkgKiBhYm91dCB0byBkbyBhbiBleGVjIHNvIHRoYXQgYm90aCBvdXIgcGFyZW50IGFuZCB0aGUKLQkJICogcHJvY2VzcyB3ZSBhcmUgdG8gYmVjb21lIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHR0eS4KLQkJICovCi0JCXRjc2V0cGdycCh0dHlfZmQsIHJlc3RvcmVfdHR5cGdycCk7Ci0JCXNldHBnaWQoMCwgcmVzdG9yZV90dHlwZ3JwKTsKLQl9Ci0JaWYgKEZsYWcoRk1PTklUT1IpKSB7Ci0JCUZsYWcoRk1PTklUT1IpID0gMDsKLQkJal9jaGFuZ2UoKTsKLQl9Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLS8qIHR1cm4gam9iIGNvbnRyb2wgb24gb3Igb2ZmIGFjY29yZGluZyB0byBGbGFnKEZNT05JVE9SKSAqLwotdm9pZAotal9jaGFuZ2Uodm9pZCkKLXsKLQlpbnQgaTsKLQotCWlmIChGbGFnKEZNT05JVE9SKSkgewotCQlib29sIHVzZV90dHkgPSBGbGFnKEZUQUxLSU5HKTsKLQotCQkvKiBEb24ndCBjYWxsIHRjZ2V0YXR0cigpICd0aWwgd2Ugb3duIHRoZSB0dHkgcHJvY2VzcyBncm91cCAqLwotCQlpZiAodXNlX3R0eSkKLQkJCXR0eV9pbml0KGZhbHNlLCB0cnVlKTsKLQotCQkvKiBubyBjb250cm9sbGluZyB0dHksIG5vIFNJR1QqICovCi0JCWlmICgodHR5cGdycF9vayA9IHVzZV90dHkgJiYgdHR5X2ZkID49IDAgJiYgdHR5X2RldnR0eSkpIHsKLQkJCXNldHNpZygmc2lndHJhcHNbU0lHVFRJTl0sIFNJR19ERkwsCi0JCQkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFKTsKLQkJCS8qIHdhaXQgdG8gYmUgZ2l2ZW4gdHR5IChQT1NJWC4xLCBCLjIsIGpvYiBjb250cm9sKSAqLwotCQkJd2hpbGUgKDEpIHsKLQkJCQlwaWRfdCB0dHlwZ3JwOwotCi0JCQkJaWYgKCh0dHlwZ3JwID0gdGNnZXRwZ3JwKHR0eV9mZCkpIDwgMCkgewotCQkJCQl3YXJuaW5nZihmYWxzZSwKLQkJCQkJICAgICJqX2luaXQ6IHRjZ2V0cGdycCgpIGZhaWxlZDogJXMiLAotCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQkJdHR5cGdycF9vayA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHR0eXBncnAgPT0ga3NocGdycCkKLQkJCQkJYnJlYWs7Ci0JCQkJa2lsbCgwLCBTSUdUVElOKTsKLQkJCX0KLQkJfQotCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkKLQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCi0JCQkgICAgU1NfUkVTVE9SRV9ERkx8U1NfRk9SQ0UpOwotCQlpZiAodHR5cGdycF9vayAmJiBrc2hwZ3JwICE9IGtzaHBpZCkgewotCQkJaWYgKHNldHBnaWQoMCwga3NocGlkKSA8IDApIHsKLQkJCQl3YXJuaW5nZihmYWxzZSwKLQkJCQkgICAgImpfaW5pdDogc2V0cGdpZCgpIGZhaWxlZDogJXMiLAotCQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJCXR0eXBncnBfb2sgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRjc2V0cGdycCh0dHlfZmQsIGtzaHBpZCkgPCAwKSB7Ci0JCQkJCXdhcm5pbmdmKGZhbHNlLAotCQkJCQkgICAgImpfaW5pdDogdGNzZXRwZ3JwKCkgZmFpbGVkOiAlcyIsCi0JCQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJCQl0dHlwZ3JwX29rID0gZmFsc2U7Ci0JCQkJfSBlbHNlCi0JCQkJCXJlc3RvcmVfdHR5cGdycCA9IGtzaHBncnA7Ci0JCQkJa3NocGdycCA9IGtzaHBpZDsKLQkJCX0KLQkJfQotCQlpZiAodXNlX3R0eSAmJiAhdHR5cGdycF9vaykKLQkJCXdhcm5pbmdmKGZhbHNlLCAid2FybmluZzogd29uJ3QgaGF2ZSBmdWxsIGpvYiBjb250cm9sIik7Ci0JCWlmICh0dHlfZmQgPj0gMCkKLQkJCXRjZ2V0YXR0cih0dHlfZmQsICZ0dHlfc3RhdGUpOwotCX0gZWxzZSB7Ci0JCXR0eXBncnBfb2sgPSBmYWxzZTsKLQkJaWYgKEZsYWcoRlRBTEtJTkcpKQotCQkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApCi0JCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwgU0lHX0lHTiwKLQkJCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOwotCQllbHNlCi0JCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkgewotCQkJCWlmIChzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyAmCi0JCQkJICAgIChURl9PUklHX0lHTiB8IFRGX09SSUdfREZMKSkKLQkJCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwKLQkJCQkJICAgIChzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyAmIFRGX09SSUdfSUdOKSA/Ci0JCQkJCSAgICBTSUdfSUdOIDogU0lHX0RGTCwKLQkJCQkJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRSk7Ci0JCQl9Ci0JCWlmICghRmxhZyhGVEFMS0lORykpCi0JCQl0dHlfY2xvc2UoKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyogZXhlY3V0ZSB0cmVlIGluIGNoaWxkIHN1YnByb2Nlc3MgKi8KLWludAotZXhjaGlsZChzdHJ1Y3Qgb3AgKnQsIGludCBmbGFncywKLSAgICB2b2xhdGlsZSBpbnQgKnhlcnJvaywKLSAgICAvKiB1c2VkIGlmIFhQQ0xPU0Ugb3IgWENDTE9TRSAqLyBpbnQgY2xvc2VfZmQpCi17Ci0Jc3RhdGljIFByb2MgKmxhc3RfcHJvYzsJCS8qIGZvciBwaXBlbGluZXMgKi8KLQotCWludCBydiA9IDAsIGZvcmtzbGVlcDsKLQlzaWdzZXRfdCBvbWFzazsKLQlzdHJ1Y3QgewotCQlQcm9jICpwOwotCQlKb2IgKmo7Ci0JCXBpZF90IGNsZHBpZDsKLQl9IHBpOwotCi0JaWYgKGZsYWdzICYgWEVYRUMpCi0JCS8qCi0JCSAqIENsZWFyIFhGT1JLfFhQQ0xPU0V8WENDTE9TRXxYQ09QUk9DfFhQSVBFT3xYUElQRUl8WFhDT018WEJHTkQKLQkJICogKGFsc28gZG9uZSBpbiBhbm90aGVyIGV4ZWN1dGUoKSBiZWxvdykKLQkJICovCi0JCXJldHVybiAoZXhlY3V0ZSh0LCBmbGFncyAmIChYRVhFQyB8IFhFUlJPSyksIHhlcnJvaykpOwotCi0JLyogbm8gU0lHQ0hMRHMgd2hpbGUgbWVzc2luZyB3aXRoIGpvYiBhbmQgcHJvY2VzcyBsaXN0cyAqLwotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQlwaS5wID0gbmV3X3Byb2MoKTsKLQlwaS5wLT5uZXh0ID0gTlVMTDsKLQlwaS5wLT5zdGF0ZSA9IFBSVU5OSU5HOwotCXBpLnAtPnN0YXR1cyA9IDA7Ci0JcGkucC0+cGlkID0gMDsKLQotCS8qIGxpbmsgcHJvY2VzcyBpbnRvIGpvYnMgbGlzdCAqLwotCWlmIChmbGFncyAmIFhQSVBFSSkgewotCQkvKiBjb250aW51aW5nIHdpdGggYSBwaXBlICovCi0JCWlmICghbGFzdF9qb2IpCi0JCQlpbnRlcm5hbF9lcnJvcmYoCi0JCQkgICAgImV4Y2hpbGQ6IFhQSVBFSSBhbmQgbm8gbGFzdF9qb2IgLSBwaWQgJWQiLAotCQkJICAgIChpbnQpcHJvY3BpZCk7Ci0JCXBpLmogPSBsYXN0X2pvYjsKLQkJaWYgKGxhc3RfcHJvYykKLQkJCWxhc3RfcHJvYy0+bmV4dCA9IHBpLnA7Ci0JCWxhc3RfcHJvYyA9IHBpLnA7Ci0JfSBlbHNlIHsKLQkJcGkuaiA9IG5ld19qb2IoKTsgLyogZmlsbHMgaW4gcGkuai0+am9iICovCi0JCS8qCi0JCSAqIHdlIGRvbid0IGNvbnNpZGVyIFhYQ09NcyBmb3JlZ3JvdW5kIHNpbmNlIHRoZXkgZG9uJ3QgZ2V0Ci0JCSAqIHR0eSBwcm9jZXNzIGdyb3VwIGFuZCB3ZSBkb24ndCBzYXZlIG9yIHJlc3RvcmUgdHR5IG1vZGVzLgotCQkgKi8KLQkJcGkuai0+ZmxhZ3MgPSAoZmxhZ3MgJiBYWENPTSkgPyBKRl9YWENPTSA6Ci0JCSAgICAoKGZsYWdzICYgWEJHTkQpID8gMCA6IChKRl9GR3xKRl9VU0VUVFlNT0RFKSk7Ci0JCXRpbWVyY2xlYXIoJnBpLmotPnVzcnRpbWUpOwotCQl0aW1lcmNsZWFyKCZwaS5qLT5zeXN0aW1lKTsKLQkJcGkuai0+c3RhdGUgPSBQUlVOTklORzsKLQkJcGkuai0+cGdycCA9IDA7Ci0JCXBpLmotPnBwaWQgPSBwcm9jcGlkOwotCQlwaS5qLT5hZ2UgPSArK25qb2JzOwotCQlwaS5qLT5wcm9jX2xpc3QgPSBwaS5wOwotCQlwaS5qLT5jb3Byb2NfaWQgPSAwOwotCQlsYXN0X2pvYiA9IHBpLmo7Ci0JCWxhc3RfcHJvYyA9IHBpLnA7Ci0JCXB1dF9qb2IocGkuaiwgUEpfUEFTVF9TVE9QUEVEKTsKLQl9Ci0KLQlzbnB0cmVlZihwaS5wLT5jb21tYW5kLCBzaXplb2YocGkucC0+Y29tbWFuZCksICIlVCIsIHQpOwotCi0JLyogY3JlYXRlIGNoaWxkIHByb2Nlc3MgKi8KLQlmb3Jrc2xlZXAgPSAxOwotCXdoaWxlICgocGkuY2xkcGlkID0gZm9yaygpKSA8IDAgJiYgZXJybm8gPT0gRUFHQUlOICYmIGZvcmtzbGVlcCA8IDMyKSB7Ci0JCWlmIChpbnRyc2lnKQkgLyogYWxsb3cgdXNlciB0byBeQyBvdXQuLi4gKi8KLQkJCWJyZWFrOwotCQlzbGVlcChmb3Jrc2xlZXApOwotCQlmb3Jrc2xlZXAgPDw9IDE7Ci0JfQotCWlmIChwaS5jbGRwaWQgPCAwKSB7Ci0JCWtpbGxfam9iKHBpLmosIFNJR0tJTEwpOwotCQlyZW1vdmVfam9iKHBpLmosICJmb3JrIGZhaWxlZCIpOwotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJZXJyb3JmKCJjYW5ub3QgZm9yayAtIHRyeSBhZ2FpbiIpOwotCX0KLQlwaS5wLT5waWQgPSBwaS5jbGRwaWQgPyBwaS5jbGRwaWQgOiAocHJvY3BpZCA9IGdldHBpZCgpKTsKLQotCS8qCi0JICogZW5zdXJlIG5leHQgY2hpbGQgZ2V0cyBhIChzbGlnaHRseSkgZGlmZmVyZW50ICRSQU5ET00gc2VxdWVuY2UKLQkgKiBmcm9tIGl0cyBwYXJlbnQgcHJvY2VzcyBhbmQgb3RoZXIgY2hpbGQgcHJvY2Vzc2VzCi0JICovCi0JY2hhbmdlX3JhbmRvbSgmcGksIHNpemVvZihwaSkpOwotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCS8qIGpvYiBjb250cm9sIHNldCB1cCAqLwotCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGZsYWdzJlhYQ09NKSkgewotCQlpbnQJZG90dHkgPSAwOwotCQlpZiAocGkuai0+cGdycCA9PSAwKSB7CS8qIEZpcnN0IHByb2Nlc3MgKi8KLQkJCXBpLmotPnBncnAgPSBwaS5wLT5waWQ7Ci0JCQlkb3R0eSA9IDE7Ci0JCX0KLQotCQkvKiBzZXQgcGdycCBpbiBib3RoIHBhcmVudCBhbmQgY2hpbGQgdG8gZGVhbCB3aXRoIHJhY2UKLQkJICogY29uZGl0aW9uCi0JCSAqLwotCQlzZXRwZ2lkKHBpLnAtPnBpZCwgcGkuai0+cGdycCk7Ci0JCWlmICh0dHlwZ3JwX29rICYmIGRvdHR5ICYmICEoZmxhZ3MgJiBYQkdORCkpCi0JCQl0Y3NldHBncnAodHR5X2ZkLCBwaS5qLT5wZ3JwKTsKLQl9Ci0jZW5kaWYKLQotCS8qIHVzZWQgdG8gY2xvc2UgcGlwZSBpbnB1dCBmZCAqLwotCWlmIChjbG9zZV9mZCA+PSAwICYmICgoKGZsYWdzICYgWFBDTE9TRSkgJiYgcGkuY2xkcGlkKSB8fAotCSAgICAoKGZsYWdzICYgWENDTE9TRSkgJiYgIXBpLmNsZHBpZCkpKQotCQljbG9zZShjbG9zZV9mZCk7Ci0JaWYgKCFwaS5jbGRwaWQpIHsKLQkJLyogY2hpbGQgKi8KLQotCQkvKiBEbyB0aGlzIGJlZm9yZSByZXN0b3Jpbmcgc2lnbmFsICovCi0JCWlmIChmbGFncyAmIFhDT1BST0MpCi0JCQljb3Byb2NfY2xlYW51cChmYWxzZSk7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQljbGVhbnVwX3BhcmVudHNfZW52KCk7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQkvKiBJZiBGTU9OSVRPUiBvciBGVEFMS0lORyBpcyBzZXQsIHRoZXNlIHNpZ25hbHMgYXJlIGlnbm9yZWQsCi0JCSAqIGlmIG5laXRoZXIgRk1PTklUT1Igbm9yIEZUQUxLSU5HIGFyZSBzZXQsIHRoZSBzaWduYWxzIGhhdmUKLQkJICogdGhlaXIgaW5oZXJpdGVkIHZhbHVlcy4KLQkJICovCi0JCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGZsYWdzICYgWFhDT00pKSB7Ci0JCQlmb3IgKGZvcmtzbGVlcCA9IE5FTEVNKHR0X3NpZ3MpOyAtLWZvcmtzbGVlcCA+PSAwOyApCi0JCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ZvcmtzbGVlcF1dLCBTSUdfREZMLAotCQkJCSAgICBTU19SRVNUT1JFX0RGTHxTU19GT1JDRSk7Ci0JCX0KLSNlbmRpZgotI2lmIEhBVkVfTklDRQotCQlpZiAoRmxhZyhGQkdOSUNFKSAmJiAoZmxhZ3MgJiBYQkdORCkpCi0JCQkodm9pZCluaWNlKDQpOwotI2VuZGlmCi0JCWlmICgoZmxhZ3MgJiBYQkdORCkKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCSAgICAmJiAhRmxhZyhGTU9OSVRPUikKLSNlbmRpZgotCQkgICAgKSB7Ci0JCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR0lOVF0sIFNJR19JR04sCi0JCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOwotCQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgU0lHX0lHTiwKLQkJCSAgICBTU19SRVNUT1JFX0lHTnxTU19GT1JDRSk7Ci0JCQlpZiAoKCEoZmxhZ3MgJiAoWFBJUEVJIHwgWENPUFJPQykpKSAmJgotCQkJICAgICgoZm9ya3NsZWVwID0gb3BlbigiL2Rldi9udWxsIiwgMCkpID4gMCkpIHsKLQkJCQkodm9pZClrc2hfZHVwMihmb3Jrc2xlZXAsIDAsIHRydWUpOwotCQkJCWNsb3NlKGZvcmtzbGVlcCk7Ci0JCQl9Ci0JCX0KLQkJcmVtb3ZlX2pvYihwaS5qLCAiY2hpbGQiKTsJLyogaW4gY2FzZSBvZiAkKGpvYnMpIGNvbW1hbmQgKi8KLQkJbnpvbWJpZSA9IDA7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQl0dHlwZ3JwX29rID0gZmFsc2U7Ci0JCUZsYWcoRk1PTklUT1IpID0gMDsKLSNlbmRpZgotCQlGbGFnKEZUQUxLSU5HKSA9IDA7Ci0JCXR0eV9jbG9zZSgpOwotCQljbGVhcnRyYXBzKCk7Ci0JCS8qIG5vIHJldHVybiAqLwotCQlleGVjdXRlKHQsIChmbGFncyAmIFhFUlJPSykgfCBYRVhFQywgTlVMTCk7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJaWYgKHQtPnR5cGUgPT0gVFBJUEUpCi0JCQl1bndpbmQoTExFQVZFKTsKLQkJaW50ZXJuYWxfd2FybmluZ2YoImV4Y2hpbGQ6IGV4ZWN1dGUoKSByZXR1cm5lZCIpOwotCQlmcHRyZWVmKHNobF9vdXQsIDIsICJleGNoaWxkOiB0cmllZCB0byBleGVjdXRlIHtcbiVUXG59XG4iLCB0KTsKLQkJc2hmX2ZsdXNoKHNobF9vdXQpOwotI2VuZGlmCi0JCXVud2luZChMTEVBVkUpOwotCQkvKiBOT1RSRUFDSEVEICovCi0JfQotCi0JLyogc2hlbGwgKHBhcmVudCkgc3R1ZmYgKi8KLQlpZiAoIShmbGFncyAmIFhQSVBFTykpIHsJLyogbGFzdCBwcm9jZXNzIGluIGEgam9iICovCi0JCWpfc3RhcnRqb2IocGkuaik7Ci0JCWlmIChmbGFncyAmIFhDT1BST0MpIHsKLQkJCXBpLmotPmNvcHJvY19pZCA9IGNvcHJvYy5pZDsKLQkJCS8qIG4gam9icyB1c2luZyBjby1wcm9jZXNzIG91dHB1dCAqLwotCQkJY29wcm9jLm5qb2JzKys7Ci0JCQkvKiBqIHVzaW5nIGNvLXByb2Nlc3MgaW5wdXQgKi8KLQkJCWNvcHJvYy5qb2IgPSAodm9pZCAqKXBpLmo7Ci0JCX0KLQkJaWYgKGZsYWdzICYgWEJHTkQpIHsKLQkJCWpfc2V0X2FzeW5jKHBpLmopOwotCQkJaWYgKEZsYWcoRlRBTEtJTkcpKSB7Ci0JCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIlslZF0iLCBwaS5qLT5qb2IpOwotCQkJCWZvciAocGkucCA9IHBpLmotPnByb2NfbGlzdDsgcGkucDsKLQkJCQkgICAgcGkucCA9IHBpLnAtPm5leHQpCi0JCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIgJWQiLAotCQkJCQkgICAgKGludClwaS5wLT5waWQpOwotCQkJCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOwotCQkJCXNoZl9mbHVzaChzaGxfb3V0KTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlydiA9IGpfd2FpdGoocGkuaiwgSldfTk9ORSwgImp3Omxhc3QgcHJvYyIpOwotCX0KLQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qIHN0YXJ0IHRoZSBsYXN0IGpvYjogb25seSB1c2VkIGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KLXZvaWQKLXN0YXJ0bGFzdCh2b2lkKQotewotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWlmIChsYXN0X2pvYikgeyAvKiBubyBuZWVkIHRvIHJlcG9ydCBlcnJvciAtIHdhaXRsYXN0KCkgd2lsbCBkbyBpdCAqLwotCQkvKiBlbnN1cmUgaXQgaXNuJ3QgcmVtb3ZlZCBieSBjaGVja19qb2IoKSAqLwotCQlsYXN0X2pvYi0+ZmxhZ3MgfD0gSkZfV0FJVElORzsKLQkJal9zdGFydGpvYihsYXN0X2pvYik7Ci0JfQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotfQotCi0vKiB3YWl0IGZvciBsYXN0IGpvYjogb25seSB1c2VkIGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KLWludAotd2FpdGxhc3Qodm9pZCkKLXsKLQlpbnQJcnY7Ci0JSm9iCSpqOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWogPSBsYXN0X2pvYjsKLQlpZiAoIWogfHwgIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7Ci0JCWlmICghaikKLQkJCXdhcm5pbmdmKHRydWUsICJ3YWl0bGFzdDogbm8gbGFzdCBqb2IiKTsKLQkJZWxzZQotCQkJaW50ZXJuYWxfd2FybmluZ2YoIndhaXRsYXN0OiBub3Qgc3RhcnRlZCIpOwotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJcmV0dXJuICgxMjUpOyAvKiBub3Qgc28gYXJiaXRyYXJ5LCBub24temVybyB2YWx1ZSAqLwotCX0KLQotCXJ2ID0gal93YWl0aihqLCBKV19OT05FLCAianc6d2FpdGxhc3QiKTsKLQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qIHdhaXQgZm9yIGNoaWxkLCBpbnRlcnJ1cHRhYmxlLiAqLwotaW50Ci13YWl0Zm9yKGNvbnN0IGNoYXIgKmNwLCBpbnQgKnNpZ3ApCi17Ci0JaW50CXJ2OwotCUpvYgkqajsKLQlpbnQJZWNvZGU7Ci0JaW50CWZsYWdzID0gSldfSU5URVJSVVBUfEpXX0FTWU5DTk9USUZZOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCSpzaWdwID0gMDsKLQotCWlmIChjcCA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIHdhaXQgZm9yIGFuIHVuc3BlY2lmaWVkIGpvYiAtIGFsd2F5cyByZXR1cm5zIDAsIHNvCi0JCSAqIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZXhpdGVkL3NpZ25hbGVkIGpvYnMKLQkJICovCi0JCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKLQkJCS8qIEFUJlQga3NoIHdpbGwgd2FpdCBmb3Igc3RvcHBlZCBqb2JzIC0gd2UgZG9uJ3QgKi8KLQkJCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYgai0+c3RhdGUgPT0gUFJVTk5JTkcpCi0JCQkJYnJlYWs7Ci0JCWlmICghaikgewotCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCX0gZWxzZSBpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkpIHsKLQkJLyogZG9uJ3QgcmVwb3J0IG5vcm1hbCBqb2IgY29tcGxldGlvbiAqLwotCQlmbGFncyAmPSB+SldfQVNZTkNOT1RJRlk7Ci0JCWlmIChqLT5wcGlkICE9IHByb2NwaWQpIHsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJaWYgKGVjb2RlICE9IEpMX05PU1VDSCkKLQkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCS8qIEFUJlQga3NoIHdpbGwgd2FpdCBmb3Igc3RvcHBlZCBqb2JzIC0gd2UgZG9uJ3QgKi8KLQlydiA9IGpfd2FpdGooaiwgZmxhZ3MsICJqdzp3YWl0Zm9yIik7Ci0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQotCWlmIChydiA8IDApIC8qIHdlIHdlcmUgaW50ZXJydXB0ZWQgKi8KLQkJKnNpZ3AgPSAxMjggKyAtcnY7Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyoga2lsbCAoYnVpbHQtaW4pIGEgam9iICovCi1pbnQKLWpfa2lsbChjb25zdCBjaGFyICpjcCwgaW50IHNpZykKLXsKLQlKb2IJKmo7Ci0JaW50CXJ2ID0gMDsKLQlpbnQJZWNvZGU7Ci0Jc2lnc2V0X3Qgb21hc2s7Ci0KLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOwotCi0JaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpID09IE5VTEwpIHsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JaWYgKGotPnBncnAgPT0gMCkgewkvKiBzdGFydGVkIHdoZW4gIUZsYWcoRk1PTklUT1IpICovCi0JCWlmIChraWxsX2pvYihqLCBzaWcpIDwgMCkgewotCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJ2ID0gMTsKLQkJfQotCX0gZWxzZSB7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQgJiYgKHNpZyA9PSBTSUdURVJNIHx8IHNpZyA9PSBTSUdIVVApKQotCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCk7Ci0jZW5kaWYKLQkJaWYgKG1rc2hfa2lsbHBnKGotPnBncnAsIHNpZykgPCAwKSB7Ci0JCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOwotCQkJcnYgPSAxOwotCQl9Ci0JfQotCi0Jc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLS8qIGZnIGFuZCBiZyBidWlsdC1pbnM6IGNhbGxlZCBvbmx5IGlmIEZsYWcoRk1PTklUT1IpIHNldCAqLwotaW50Ci1qX3Jlc3VtZShjb25zdCBjaGFyICpjcCwgaW50IGJnKQotewotCUpvYgkqajsKLQlQcm9jCSpwOwotCWludAllY29kZTsKLQlpbnQJcnVubmluZzsKLQlpbnQJcnYgPSAwOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChqLT5wZ3JwID09IDApIHsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWJpX2Vycm9yZigiam9iIG5vdCBqb2ItY29udHJvbGxlZCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChiZykKLQkJc2hwcmludGYoIlslZF0gIiwgai0+am9iKTsKLQotCXJ1bm5pbmcgPSAwOwotCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewotCQlpZiAocC0+c3RhdGUgPT0gUFNUT1BQRUQpIHsKLQkJCXAtPnN0YXRlID0gUFJVTk5JTkc7Ci0JCQlwLT5zdGF0dXMgPSAwOwotCQkJcnVubmluZyA9IDE7Ci0JCX0KLQkJc2hmX3B1dHMocC0+Y29tbWFuZCwgc2hsX3N0ZG91dCk7Ci0JCWlmIChwLT5uZXh0KQotCQkJc2hmX3B1dHMoInwgIiwgc2hsX3N0ZG91dCk7Ci0JfQotCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOwotCXNoZl9mbHVzaChzaGxfc3Rkb3V0KTsKLQlpZiAocnVubmluZykKLQkJai0+c3RhdGUgPSBQUlVOTklORzsKLQotCXB1dF9qb2IoaiwgUEpfUEFTVF9TVE9QUEVEKTsKLQlpZiAoYmcpCi0JCWpfc2V0X2FzeW5jKGopOwotCWVsc2UgewotCQkvKiBhdHRhY2ggdHR5IHRvIGpvYiAqLwotCQlpZiAoai0+c3RhdGUgPT0gUFJVTk5JTkcpIHsKLQkJCWlmICh0dHlwZ3JwX29rICYmIChqLT5mbGFncyAmIEpGX1NBVkVEVFRZKSkKLQkJCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZqLT50dHlzdGF0ZSk7Ci0JCQkvKiBTZWUgY29tbWVudCBpbiBqX3dhaXRqIHJlZ2FyZGluZyBzYXZlZF90dHlwZ3JwLiAqLwotCQkJaWYgKHR0eXBncnBfb2sgJiYKLQkJCSAgICB0Y3NldHBncnAodHR5X2ZkLCAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWVBHUlApID8KLQkJCSAgICBqLT5zYXZlZF90dHlwZ3JwIDogai0+cGdycCkgPCAwKSB7Ci0JCQkJcnYgPSBlcnJubzsKLQkJCQlpZiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkKLQkJCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKLQkJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLAotCQkJCSAgICBOVUxMKTsKLQkJCQliaV9lcnJvcmYoIjFzdCB0Y3NldHBncnAoJWQsICVkKSBmYWlsZWQ6ICVzIiwKLQkJCQkgICAgdHR5X2ZkLAotCQkJCSAgICAoaW50KSgoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWVBHUlApID8KLQkJCQkgICAgai0+c2F2ZWRfdHR5cGdycCA6IGotPnBncnApLAotCQkJCSAgICBzdHJlcnJvcihydikpOwotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCX0KLQkJai0+ZmxhZ3MgfD0gSkZfRkc7Ci0JCWotPmZsYWdzICY9IH5KRl9LTk9XTjsKLQkJaWYgKGogPT0gYXN5bmNfam9iKQotCQkJYXN5bmNfam9iID0gTlVMTDsKLQl9Ci0KLQlpZiAoai0+c3RhdGUgPT0gUFJVTk5JTkcgJiYgbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCkgPCAwKSB7Ci0JCWludCBlcnIgPSBlcnJubzsKLQotCQlpZiAoIWJnKSB7Ci0JCQlqLT5mbGFncyAmPSB+SkZfRkc7Ci0JCQlpZiAodHR5cGdycF9vayAmJiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkpCi0JCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKLQkJCWlmICh0dHlwZ3JwX29rICYmIHRjc2V0cGdycCh0dHlfZmQsIGtzaHBncnApIDwgMCkKLQkJCQl3YXJuaW5nZih0cnVlLAotCQkJCSAgICAiZmc6IDJuZCB0Y3NldHBncnAoJWQsICVsZCkgZmFpbGVkOiAlcyIsCi0JCQkJICAgIHR0eV9mZCwgKGxvbmcpa3NocGdycCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJfQotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJYmlfZXJyb3JmKCJjYW5ub3QgY29udGludWUgam9iICVzOiAlcyIsCi0JCSAgICBjcCwgc3RyZXJyb3IoZXJyKSk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmICghYmcpIHsKLQkJaWYgKHR0eXBncnBfb2spIHsKLQkJCWotPmZsYWdzICY9IH4oSkZfU0FWRURUVFkgfCBKRl9TQVZFRFRUWVBHUlApOwotCQl9Ci0JCXJ2ID0gal93YWl0aihqLCBKV19OT05FLCAianc6cmVzdW1lIik7Ci0JfQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCXJldHVybiAocnYpOwotfQotI2VuZGlmCi0KLS8qIGFyZSB0aGVyZSBhbnkgcnVubmluZyBvciBzdG9wcGVkIGpvYnMgPyAqLwotaW50Ci1qX3N0b3BwZWRfcnVubmluZyh2b2lkKQotewotCUpvYgkqajsKLQlpbnQJd2hpY2ggPSAwOwotCi0JZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpIHsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYgai0+c3RhdGUgPT0gUFNUT1BQRUQpCi0JCQl3aGljaCB8PSAxOwotI2VuZGlmCi0JCWlmIChGbGFnKEZMT0dJTikgJiYgIUZsYWcoRk5PSFVQKSAmJiBwcm9jcGlkID09IGtzaHBpZCAmJgotCQkgICAgai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBSVU5OSU5HKQotCQkJd2hpY2ggfD0gMjsKLQl9Ci0JaWYgKHdoaWNoKSB7Ci0JCXNoZWxsZigiWW91IGhhdmUgJXMlcyVzIGpvYnNcbiIsCi0JCSAgICB3aGljaCAmIDEgPyAic3RvcHBlZCIgOiAiIiwKLQkJICAgIHdoaWNoID09IDMgPyAiIGFuZCAiIDogIiIsCi0JCSAgICB3aGljaCAmIDIgPyAicnVubmluZyIgOiAiIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1qX25qb2JzKHZvaWQpCi17Ci0JSm9iICpqOwotCWludCBuaiA9IDA7Ci0Jc2lnc2V0X3Qgb21hc2s7Ci0KLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOwotCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKLQkJbmorKzsKLQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCXJldHVybiAobmopOwotfQotCi0KLS8qIGxpc3Qgam9icyBmb3Igam9icyBidWlsdC1pbiAqLwotaW50Ci1qX2pvYnMoY29uc3QgY2hhciAqY3AsIGludCBzbHAsCi0gICAgaW50IG5mbGFnKQkJLyogMDogc2hvcnQsIDE6IGxvbmcsIDI6IHBncnAgKi8KLXsKLQlKb2IJKmosICp0bXA7Ci0JaW50CWhvdzsKLQlpbnQJemZsYWcgPSAwOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWlmIChuZmxhZyA8IDApIHsgLyoga2x1ZGdlOiBwcmludCB6b21iaWVzICovCi0JCW5mbGFnID0gMDsKLQkJemZsYWcgPSAxOwotCX0KLQlpZiAoY3ApIHsKLQkJaW50CWVjb2RlOwotCi0JCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfSBlbHNlCi0JCWogPSBqb2JfbGlzdDsKLQlob3cgPSBzbHAgPT0gMCA/IEpQX01FRElVTSA6IChzbHAgPT0gMSA/IEpQX0xPTkcgOiBKUF9QR1JQKTsKLQlmb3IgKDsgajsgaiA9IGotPm5leHQpIHsKLQkJaWYgKCghKGotPmZsYWdzICYgSkZfWk9NQklFKSB8fCB6ZmxhZykgJiYKLQkJICAgICghbmZsYWcgfHwgKGotPmZsYWdzICYgSkZfQ0hBTkdFRCkpKSB7Ci0JCQlqX3ByaW50KGosIGhvdywgc2hsX3N0ZG91dCk7Ci0JCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKQotCQkJCWotPmZsYWdzIHw9IEpGX1JFTU9WRTsKLQkJfQotCQlpZiAoY3ApCi0JCQlicmVhazsKLQl9Ci0JLyogUmVtb3ZlIGpvYnMgYWZ0ZXIgcHJpbnRpbmcgc28gdGhlcmUgd29uJ3QgYmUgbXVsdGlwbGUgKyBvciAtIGpvYnMgKi8KLQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IHRtcCkgewotCQl0bXAgPSBqLT5uZXh0OwotCQlpZiAoai0+ZmxhZ3MgJiBKRl9SRU1PVkUpCi0JCQlyZW1vdmVfam9iKGosICJqb2JzIik7Ci0JfQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qIGxpc3Qgam9icyBmb3IgdG9wLWxldmVsIG5vdGlmaWNhdGlvbiAqLwotdm9pZAotal9ub3RpZnkodm9pZCkKLXsKLQlKb2IJKmosICp0bXA7Ci0Jc2lnc2V0X3Qgb21hc2s7Ci0KLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOwotCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkgewotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJaWYgKEZsYWcoRk1PTklUT1IpICYmIChqLT5mbGFncyAmIEpGX0NIQU5HRUQpKQotCQkJal9wcmludChqLCBKUF9NRURJVU0sIHNobF9vdXQpOwotI2VuZGlmCi0JCS8qIFJlbW92ZSBqb2IgYWZ0ZXIgZG9pbmcgcmVwb3J0cyBzbyB0aGVyZSBhcmVuJ3QKLQkJICogbXVsdGlwbGUgKy8tIGpvYnMuCi0JCSAqLwotCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKQotCQkJai0+ZmxhZ3MgfD0gSkZfUkVNT1ZFOwotCX0KLQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IHRtcCkgewotCQl0bXAgPSBqLT5uZXh0OwotCQlpZiAoai0+ZmxhZ3MgJiBKRl9SRU1PVkUpCi0JCQlyZW1vdmVfam9iKGosICJub3RpZnkiKTsKLQl9Ci0Jc2hmX2ZsdXNoKHNobF9vdXQpOwotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotfQotCi0vKiBSZXR1cm4gcGlkIG9mIGxhc3QgcHJvY2VzcyBpbiBsYXN0IGFzeW5jaHJvbm91cyBqb2IgKi8KLXBpZF90Ci1qX2FzeW5jKHZvaWQpCi17Ci0Jc2lnc2V0X3Qgb21hc2s7Ci0KLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOwotCi0JaWYgKGFzeW5jX2pvYikKLQkJYXN5bmNfam9iLT5mbGFncyB8PSBKRl9LTk9XTjsKLQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCi0JcmV0dXJuIChhc3luY19waWQpOwotfQotCi0vKgotICogTWFrZSBqIHRoZSBsYXN0IGFzeW5jIHByb2Nlc3MKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLWpfc2V0X2FzeW5jKEpvYiAqaikKLXsKLQlKb2IJKmpsLCAqb2xkZXN0OwotCi0JaWYgKGFzeW5jX2pvYiAmJiAoYXN5bmNfam9iLT5mbGFncyAmIChKRl9LTk9XTnxKRl9aT01CSUUpKSA9PSBKRl9aT01CSUUpCi0JCXJlbW92ZV9qb2IoYXN5bmNfam9iLCAiYXN5bmMiKTsKLQlpZiAoIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7Ci0JCWludGVybmFsX3dhcm5pbmdmKCJqX2FzeW5jOiBqb2Igbm90IHN0YXJ0ZWQiKTsKLQkJcmV0dXJuOwotCX0KLQlhc3luY19qb2IgPSBqOwotCWFzeW5jX3BpZCA9IGotPmxhc3RfcHJvYy0+cGlkOwotCXdoaWxlIChuem9tYmllID4gQ0hJTERfTUFYKSB7Ci0JCW9sZGVzdCA9IE5VTEw7Ci0JCWZvciAoamwgPSBqb2JfbGlzdDsgamw7IGpsID0gamwtPm5leHQpCi0JCQlpZiAoamwgIT0gYXN5bmNfam9iICYmIChqbC0+ZmxhZ3MgJiBKRl9aT01CSUUpICYmCi0JCQkgICAgKCFvbGRlc3QgfHwgamwtPmFnZSA8IG9sZGVzdC0+YWdlKSkKLQkJCQlvbGRlc3QgPSBqbDsKLQkJaWYgKCFvbGRlc3QpIHsKLQkJCS8qIFhYWCBkZWJ1Z2dpbmcgKi8KLQkJCWlmICghKGFzeW5jX2pvYi0+ZmxhZ3MgJiBKRl9aT01CSUUpIHx8IG56b21iaWUgIT0gMSkgewotCQkJCWludGVybmFsX3dhcm5pbmdmKCJqX2FzeW5jOiBiYWQgbnpvbWJpZSAoJWQpIiwKLQkJCQkgICAgbnpvbWJpZSk7Ci0JCQkJbnpvbWJpZSA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZW1vdmVfam9iKG9sZGVzdCwgInpvbWJpZSIpOwotCX0KLX0KLQotLyoKLSAqIFN0YXJ0IGEgam9iOiBzZXQgU1RBUlRFRCwgY2hlY2sgZm9yIGhlbGQgc2lnbmFscyBhbmQgc2V0IGotPmxhc3RfcHJvYwotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgdm9pZAotal9zdGFydGpvYihKb2IgKmopCi17Ci0JUHJvYwkqcDsKLQotCWotPmZsYWdzIHw9IEpGX1NUQVJURUQ7Ci0JZm9yIChwID0gai0+cHJvY19saXN0OyBwLT5uZXh0OyBwID0gcC0+bmV4dCkKLQkJOwotCWotPmxhc3RfcHJvYyA9IHA7Ci0KLQlpZiAoaGVsZF9zaWdjaGxkKSB7Ci0JCWhlbGRfc2lnY2hsZCA9IDA7Ci0JCS8qIERvbid0IGNhbGwgal9zaWdjaGxkKCkgYXMgaXQgbWF5IHJlbW92ZSBqb2IuLi4gKi8KLQkJa2lsbChwcm9jcGlkLCBTSUdDSExEKTsKLQl9Ci19Ci0KLS8qCi0gKiB3YWl0IGZvciBqb2IgdG8gY29tcGxldGUgb3IgY2hhbmdlIHN0YXRlCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQKLWpfd2FpdGooSm9iICpqLAotICAgIGludCBmbGFncywJCQkvKiBzZWUgSldfKiAqLwotICAgIGNvbnN0IGNoYXIgKndoZXJlKQotewotCWludAlydjsKLQotCS8qCi0JICogTm8gYXV0by1ub3RpZnkgb24gdGhlIGpvYiB3ZSBhcmUgd2FpdGluZyBvbi4KLQkgKi8KLQlqLT5mbGFncyB8PSBKRl9XQUlUSU5HOwotCWlmIChmbGFncyAmIEpXX0FTWU5DTk9USUZZKQotCQlqLT5mbGFncyB8PSBKRl9XX0FTWU5DTk9USUZZOwotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCWlmICghRmxhZyhGTU9OSVRPUikpCi0jZW5kaWYKLQkJZmxhZ3MgfD0gSldfU1RPUFBFRFdBSVQ7Ci0KLQl3aGlsZSAoai0+c3RhdGUgPT0gUFJVTk5JTkcgfHwKLQkgICAgKChmbGFncyAmIEpXX1NUT1BQRURXQUlUKSAmJiBqLT5zdGF0ZSA9PSBQU1RPUFBFRCkpIHsKLQkJc2lnc3VzcGVuZCgmc21fZGVmYXVsdCk7Ci0JCWlmIChmYXRhbF90cmFwKSB7Ci0JCQlpbnQgb2xkZiA9IGotPmZsYWdzICYgKEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7Ci0JCQlqLT5mbGFncyAmPSB+KEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7Ci0JCQlydW50cmFwcyhURl9GQVRBTCk7Ci0JCQlqLT5mbGFncyB8PSBvbGRmOyAvKiBub3QgcmVhY2hlZC4uLiAqLwotCQl9Ci0JCWlmICgoZmxhZ3MgJiBKV19JTlRFUlJVUFQpICYmIChydiA9IHRyYXBfcGVuZGluZygpKSkgewotCQkJai0+ZmxhZ3MgJj0gfihKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOwotCQkJcmV0dXJuICgtcnYpOwotCQl9Ci0JfQotCWotPmZsYWdzICY9IH4oSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKLQotCWlmIChqLT5mbGFncyAmIEpGX0ZHKSB7Ci0JCWotPmZsYWdzICY9IH5KRl9GRzsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCWlmIChGbGFnKEZNT05JVE9SKSAmJiB0dHlwZ3JwX29rICYmIGotPnBncnApIHsKLQkJCS8qCi0JCQkgKiBTYXZlIHRoZSB0dHkncyBjdXJyZW50IHBncnAgc28gaXQgY2FuIGJlIHJlc3RvcmVkCi0JCQkgKiB3aGVuIHRoZSBqb2IgaXMgZm9yZWdyb3VuZGVkLiBUaGlzIGlzIHRvCi0JCQkgKiBkZWFsIHdpdGggdGhpbmdzIGxpa2UgdGhlIEdOVSBzdSB3aGljaCBkb2VzCi0JCQkgKiBhIGZvcmsvZXhlYyBpbnN0ZWFkIG9mIGFuIGV4ZWMgKHRoZSBmb3JrIG1lYW5zCi0JCQkgKiB0aGUgZXhlY2VkIHNoZWxsIGdldHMgYSBkaWZmZXJlbnQgcGlkIGZyb20gaXRzCi0JCQkgKiBwZ3JwLCBzbyBuYXR1cmFsbHkgaXQgc2V0cyBpdHMgcGdycCBhbmQgZ2V0cyBob3NlZAotCQkJICogd2hlbiBpdCBnZXRzIGZvcmVncm91bmRlZCBieSB0aGUgcGFyZW50IHNoZWxsIHdoaWNoCi0JCQkgKiBoYXMgcmVzdG9yZWQgdGhlIHR0eSdzIHBncnAgdG8gdGhhdCBvZiB0aGUgc3UKLQkJCSAqIHByb2Nlc3MpLgotCQkJICovCi0JCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQgJiYKLQkJCSAgICAoai0+c2F2ZWRfdHR5cGdycCA9IHRjZ2V0cGdycCh0dHlfZmQpKSA+PSAwKQotCQkJCWotPmZsYWdzIHw9IEpGX1NBVkVEVFRZUEdSUDsKLQkJCWlmICh0Y3NldHBncnAodHR5X2ZkLCBrc2hwZ3JwKSA8IDApCi0JCQkJd2FybmluZ2YodHJ1ZSwKLQkJCQkgICAgImpfd2FpdGo6IHRjc2V0cGdycCglZCwgJWxkKSBmYWlsZWQ6ICVzIiwKLQkJCQkgICAgdHR5X2ZkLCAobG9uZylrc2hwZ3JwLCBzdHJlcnJvcihlcnJubykpOwotCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKSB7Ci0JCQkJai0+ZmxhZ3MgfD0gSkZfU0FWRURUVFk7Ci0JCQkJdGNnZXRhdHRyKHR0eV9mZCwgJmotPnR0eXN0YXRlKTsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCWlmICh0dHlfZmQgPj0gMCkgewotCQkJLyoKLQkJCSAqIE9ubHkgcmVzdG9yZSB0dHkgc2V0dGluZ3MgaWYgam9iIHdhcyBvcmlnaW5hbGx5Ci0JCQkgKiBzdGFydGVkIGluIHRoZSBmb3JlZ3JvdW5kLiBQcm9ibGVtcyBjYW4gYmUKLQkJCSAqIGNhdXNlZCBieSB0aGluZ3MgbGlrZSAnbW9yZSBmb29iYXIgJicgd2hpY2ggd2lsbAotCQkJICogdHlwaWNhbGx5IGdldCBhbmQgc2F2ZSB0aGUgc2hlbGwncyB2aS9lbWFjcyB0dHkKLQkJCSAqIHNldHRpbmdzIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSB0dHkgZm9yIGl0c2VsZjsKLQkJCSAqIHdoZW4gbW9yZSBleGl0cywgaXQgcmVzdG9yZXMgdGhlICdvcmlnaW5hbCcKLQkJCSAqIHNldHRpbmdzLCBhbmQgdGhpbmdzIGdvIGRvd24gaGlsbCBmcm9tIHRoZXJlLi4uCi0JCQkgKi8KLQkJCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEICYmIGotPnN0YXR1cyA9PSAwICYmCi0JCQkgICAgKGotPmZsYWdzICYgSkZfVVNFVFRZTU9ERSkpIHsKLQkJCQl0Y2dldGF0dHIodHR5X2ZkLCAmdHR5X3N0YXRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKLQkJCQkvKi0KLQkJCQkgKiBEb24ndCB1c2UgdHR5IG1vZGUgaWYgam9iIGlzIHN0b3BwZWQgYW5kCi0JCQkJICogbGF0ZXIgcmVzdGFydGVkIGFuZCBleGl0cy4gQ29uc2lkZXIKLQkJCQkgKiB0aGUgc2VxdWVuY2U6Ci0JCQkJICoJdmkgZm9vIChzdG9wcGVkKQotCQkJCSAqCS4uLgotCQkJCSAqCXN0dHkgc29tZXRoaW5nCi0JCQkJICoJLi4uCi0JCQkJICoJZmcgKHZpOyBaWikKLQkJCQkgKiBtb2RlIHNob3VsZCBiZSB0aGF0IG9mIHRoZSBzdHR5LCBub3Qgd2hhdAotCQkJCSAqIHdhcyBiZWZvcmUgdGhlIHZpIHN0YXJ0ZWQuCi0JCQkJICovCi0JCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKQotCQkJCQlqLT5mbGFncyAmPSB+SkZfVVNFVFRZTU9ERTsKLQkJCX0KLQkJfQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJLyoKLQkJICogSWYgaXQgbG9va3MgbGlrZSB1c2VyIGhpdCBeQyB0byBraWxsIGEgam9iLCBwcmV0ZW5kIHdlIGdvdAotCQkgKiBvbmUgdG9vIHRvIGJyZWFrIG91dCBvZiBmb3IgbG9vcHMsIGV0Yy4gKEFUJlQga3NoIGRvZXMgdGhpcwotCQkgKiBldmVuIHdoZW4gbm90IG1vbml0b3JpbmcsIGJ1dCB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZQotCQkgKiBhIHR0eSBnZW5lcmF0ZWQgXkMgZ29lcyB0byB0aGUgd2hvbGUgcHJvY2VzcyBncm91cCkKLQkJICovCi0JCXsKLQkJCWludCBzdGF0dXM7Ci0KLQkJCXN0YXR1cyA9IGotPmxhc3RfcHJvYy0+c3RhdHVzOwotCQkJaWYgKEZsYWcoRk1PTklUT1IpICYmIGotPnN0YXRlID09IFBTSUdOQUxMRUQgJiYKLQkJCSAgICBXSUZTSUdOQUxFRChzdGF0dXMpICYmCi0JCQkgICAgKHNpZ3RyYXBzW1dURVJNU0lHKHN0YXR1cyldLmZsYWdzICYgVEZfVFRZX0lOVFIpKQotCQkJCXRyYXBzaWcoV1RFUk1TSUcoc3RhdHVzKSk7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWpfdXNydGltZSA9IGotPnVzcnRpbWU7Ci0Jal9zeXN0aW1lID0gai0+c3lzdGltZTsKLQlydiA9IGotPnN0YXR1czsKLQotCWlmICghKGZsYWdzICYgSldfQVNZTkNOT1RJRlkpCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCSAgICAmJiAoIUZsYWcoRk1PTklUT1IpIHx8IGotPnN0YXRlICE9IFBTVE9QUEVEKQotI2VuZGlmCi0JICAgICkgewotCQlqX3ByaW50KGosIEpQX1NIT1JULCBzaGxfb3V0KTsKLQkJc2hmX2ZsdXNoKHNobF9vdXQpOwotCX0KLQlpZiAoai0+c3RhdGUgIT0gUFNUT1BQRUQKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JICAgICYmICghRmxhZyhGTU9OSVRPUikgfHwgIShmbGFncyAmIEpXX0FTWU5DTk9USUZZKSkKLSNlbmRpZgotCSAgICApCi0JCXJlbW92ZV9qb2Ioaiwgd2hlcmUpOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qCi0gKiBTSUdDSExEIGhhbmRsZXIgdG8gcmVhcCBjaGlsZHJlbiBhbmQgdXBkYXRlIGpvYiBzdGF0ZXMKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1qX3NpZ2NobGQoaW50IHNpZyBNS1NIX0FfVU5VU0VEKQotewotCS8qIHRoaXMgcnVucyBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQsIHdpdGggZXJybm8gc2F2ZWQgKi8KLQotCUpvYiAqajsKLQlQcm9jICpwID0gTlVMTDsKLQlwaWRfdCBwaWQ7Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3QgcnVzYWdlIHJ1MCwgcnUxOwotCi0JLyoKLQkgKiBEb24ndCB3YWl0IGZvciBhbnkgcHJvY2Vzc2VzIGlmIGEgam9iIGlzIHBhcnRpYWxseSBzdGFydGVkLgotCSAqIFRoaXMgaXMgc28gd2UgZG9uJ3QgZG8gYXdheSB3aXRoIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlcgotCSAqIGJlZm9yZSBhbGwgdGhlIHByb2Nlc3NlcyBpbiBhIHBpcGUgbGluZSBhcmUgc3RhcnRlZCAoc28gdGhlCi0JICogc2V0cGdpZCgpIHdvbid0IGZhaWwpCi0JICovCi0JZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSBqLT5uZXh0KQotCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmICEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgewotCQkJaGVsZF9zaWdjaGxkID0gMTsKLQkJCXJldHVybjsKLQkJfQotCi0JZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnJ1MCk7Ci0JZG8gewotCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCAoV05PSEFOR3xXVU5UUkFDRUQpKTsKLQotCQkvKgotCQkgKiByZXR1cm4gaWYgdGhpcyB3b3VsZCBibG9jayAoMCkgb3Igbm8gY2hpbGRyZW4KLQkJICogb3IgaW50ZXJydXB0ZWQgKC0xKQotCQkgKi8KLQkJaWYgKHBpZCA8PSAwKQotCQkJcmV0dXJuOwotCi0JCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydTEpOwotCi0JCS8qIGZpbmQgam9iIGFuZCBwcm9jZXNzIHN0cnVjdHVyZXMgZm9yIHRoaXMgcGlkICovCi0JCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQotCQkJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkJCWlmIChwLT5waWQgPT0gcGlkKQotCQkJCQlnb3RvIGZvdW5kOwotIGZvdW5kOgotCQlpZiAoaiA9PSBOVUxMKSB7Ci0JCQkvKiBDYW4gb2NjdXIgaWYgcHJvY2VzcyBoYXMga2lkcywgdGhlbiBleGVjcyBzaGVsbAotCQkJd2FybmluZ2YodHJ1ZSwgImJhZCBwcm9jZXNzIHdhaXRlZCBmb3IgKHBpZCA9ICVkKSIsCi0JCQkJcGlkKTsKLQkJCSAqLwotCQkJcnUwID0gcnUxOwotCQkJY29udGludWU7Ci0JCX0KLQotCQl0aW1lcmFkZCgmai0+dXNydGltZSwgJnJ1MS5ydV91dGltZSwgJmotPnVzcnRpbWUpOwotCQl0aW1lcnN1Yigmai0+dXNydGltZSwgJnJ1MC5ydV91dGltZSwgJmotPnVzcnRpbWUpOwotCQl0aW1lcmFkZCgmai0+c3lzdGltZSwgJnJ1MS5ydV9zdGltZSwgJmotPnN5c3RpbWUpOwotCQl0aW1lcnN1Yigmai0+c3lzdGltZSwgJnJ1MC5ydV9zdGltZSwgJmotPnN5c3RpbWUpOwotCQlydTAgPSBydTE7Ci0JCXAtPnN0YXR1cyA9IHN0YXR1czsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCWlmIChXSUZTVE9QUEVEKHN0YXR1cykpCi0JCQlwLT5zdGF0ZSA9IFBTVE9QUEVEOwotCQllbHNlCi0jZW5kaWYKLQkJICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKLQkJCXAtPnN0YXRlID0gUFNJR05BTExFRDsKLQkJZWxzZQotCQkJcC0+c3RhdGUgPSBQRVhJVEVEOwotCi0JCWNoZWNrX2pvYihqKTsJLyogY2hlY2sgdG8gc2VlIGlmIGVudGlyZSBqb2IgaXMgZG9uZSAqLwotCX0gd2hpbGUgKDEpOwotfQotCi0vKgotICogQ2FsbGVkIG9ubHkgd2hlbiBhIHByb2Nlc3MgaW4gaiBoYXMgZXhpdGVkL3N0b3BwZWQgKGllLCBjYWxsZWQgb25seQotICogZnJvbSBqX3NpZ2NobGQoKSkuIElmIG5vIHByb2Nlc3NlcyBhcmUgcnVubmluZywgdGhlIGpvYiBzdGF0dXMKLSAqIGFuZCBzdGF0ZSBhcmUgdXBkYXRlZCwgYXN5bmNocm9ub3VzIGpvYiBub3RpZmljYXRpb24gaXMgZG9uZSBhbmQsCi0gKiBpZiB1bm5lZWRlZCwgdGhlIGpvYiBpcyByZW1vdmVkLgotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgdm9pZAotY2hlY2tfam9iKEpvYiAqaikKLXsKLQlpbnQJanN0YXRlOwotCVByb2MJKnA7Ci0KLQkvKiBYWFggZGVidWdnaW5nIChuYXN0eSAtIGludGVycnVwdCByb3V0aW5lIHVzaW5nIHNobF9vdXQpICovCi0JaWYgKCEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgewotCQlpbnRlcm5hbF93YXJuaW5nZigiY2hlY2tfam9iOiBqb2Igc3RhcnRlZCAoZmxhZ3MgMHgleCkiLAotCQkgICAgai0+ZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JanN0YXRlID0gUFJVTk5JTkc7Ci0JZm9yIChwPWotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewotCQlpZiAocC0+c3RhdGUgPT0gUFJVTk5JTkcpCi0JCQlyZXR1cm47CS8qIHNvbWUgcHJvY2Vzc2VzIHN0aWxsIHJ1bm5pbmcgKi8KLQkJaWYgKHAtPnN0YXRlID4ganN0YXRlKQotCQkJanN0YXRlID0gcC0+c3RhdGU7Ci0JfQotCWotPnN0YXRlID0ganN0YXRlOwotCi0Jc3dpdGNoIChqLT5sYXN0X3Byb2MtPnN0YXRlKSB7Ci0JY2FzZSBQRVhJVEVEOgotCQlqLT5zdGF0dXMgPSBXRVhJVFNUQVRVUyhqLT5sYXN0X3Byb2MtPnN0YXR1cyk7Ci0JCWJyZWFrOwotCWNhc2UgUFNJR05BTExFRDoKLQkJai0+c3RhdHVzID0gMTI4ICsgV1RFUk1TSUcoai0+bGFzdF9wcm9jLT5zdGF0dXMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlqLT5zdGF0dXMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIE5vdGUgd2hlbiBjby1wcm9jZXNzIGRpZXM6IGNhbid0IGJlIGRvbmUgaW4gal93YWl0KCkgbm9yCi0JICogcmVtb3ZlX2pvYigpIHNpbmNlIG5laXRoZXIgbWF5IGJlIGNhbGxlZCBmb3Igbm9uLWludGVyYWN0aXZlCi0JICogc2hlbGxzLgotCSAqLwotCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEIHx8IGotPnN0YXRlID09IFBTSUdOQUxMRUQpIHsKLQkJLyoKLQkJICogTm8gbmVlZCB0byBrZWVwIGNvLXByb2Nlc3MgaW5wdXQgYW55IG1vcmUKLQkJICogKGF0IGxlYXN0LCB0aGlzIGlzIHdoYXQga3NoOTNkIHRoaW5rcykKLQkJICovCi0JCWlmIChjb3Byb2Muam9iID09IGopIHsKLQkJCWNvcHJvYy5qb2IgPSBOVUxMOwotCQkJLyoKLQkJCSAqIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGdldCB0aGUgY2xvc2VzIG91dCBvZiBoZXJlCi0JCQkgKiBzbyB0aGV5IGFyZW4ndCBkb25lIGluIHRoZSBzaWduYWwgaGFuZGxlci4KLQkJCSAqIFdvdWxkIG1lYW4gYSBjaGVjayBpbiBjb3Byb2NfZ2V0ZmQoKSB0bwotCQkJICogZG8gImlmIGpvYiA9PSAwICYmIHdyaXRlID49IDAsIGNsb3NlIHdyaXRlIi4KLQkJCSAqLwotCQkJY29wcm9jX3dyaXRlX2Nsb3NlKGNvcHJvYy53cml0ZSk7Ci0JCX0KLQkJLyogRG8gd2UgbmVlZCB0byBrZWVwIHRoZSBvdXRwdXQ/ICovCi0JCWlmIChqLT5jb3Byb2NfaWQgJiYgai0+Y29wcm9jX2lkID09IGNvcHJvYy5pZCAmJgotCQkgICAgLS1jb3Byb2MubmpvYnMgPT0gMCkKLQkJCWNvcHJvY19yZWFkd19jbG9zZShjb3Byb2MucmVhZCk7Ci0JfQotCi0Jai0+ZmxhZ3MgfD0gSkZfQ0hBTkdFRDsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JaWYgKEZsYWcoRk1PTklUT1IpICYmICEoai0+ZmxhZ3MgJiBKRl9YWENPTSkpIHsKLQkJLyoKLQkJICogT25seSBwdXQgc3RvcHBlZCBqb2JzIGF0IHRoZSBmcm9udCB0byBhdm9pZCBjb25mdXNpbmcKLQkJICogdGhlIHVzZXIgKGRvbid0IHdhbnQgZmluaXNoZWQgam9icyBlZmZlY3RpbmcgJSsgb3IgJS0pCi0JCSAqLwotCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpCi0JCQlwdXRfam9iKGosIFBKX09OX0ZST05UKTsKLQkJaWYgKEZsYWcoRk5PVElGWSkgJiYKLQkJICAgIChqLT5mbGFncyAmIChKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpKSAhPSBKRl9XQUlUSU5HKSB7Ci0JCQkvKiBMb29rIGZvciB0aGUgcmVhbCBmaWxlIGRlc2NyaXB0b3IgMiAqLwotCQkJewotCQkJCXN0cnVjdCBlbnYgKmVwOwotCQkJCWludCBmZCA9IDI7Ci0KLQkJCQlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpCi0JCQkJCWlmIChlcC0+c2F2ZWZkICYmIGVwLT5zYXZlZmRbMl0pCi0JCQkJCQlmZCA9IGVwLT5zYXZlZmRbMl07Ci0JCQkJc2hmX3Jlb3BlbihmZCwgU0hGX1dSLCBzaGxfaik7Ci0JCQl9Ci0JCQkvKgotCQkJICogQ2FuJ3QgY2FsbCBqX25vdGlmeSgpIGFzIGl0IHJlbW92ZXMgam9icy4gVGhlIGpvYgotCQkJICogbXVzdCBzdGF5IGluIHRoZSBqb2IgbGlzdCBhcyBqX3dhaXRqKCkgbWF5IGJlCi0JCQkgKiBydW5uaW5nIHdpdGggdGhpcyBqb2IuCi0JCQkgKi8KLQkJCWpfcHJpbnQoaiwgSlBfTUVESVVNLCBzaGxfaik7Ci0JCQlzaGZfZmx1c2goc2hsX2opOwotCQkJaWYgKCEoai0+ZmxhZ3MgJiBKRl9XQUlUSU5HKSAmJiBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkKLQkJCQlyZW1vdmVfam9iKGosICJub3RpZnkiKTsKLQkJfQotCX0KLSNlbmRpZgotCWlmICgKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JICAgICFGbGFnKEZNT05JVE9SKSAmJgotI2VuZGlmCi0JICAgICEoai0+ZmxhZ3MgJiAoSkZfV0FJVElOR3xKRl9GRykpICYmCi0JICAgIGotPnN0YXRlICE9IFBTVE9QUEVEKSB7Ci0JCWlmIChqID09IGFzeW5jX2pvYiB8fCAoai0+ZmxhZ3MgJiBKRl9LTk9XTikpIHsKLQkJCWotPmZsYWdzIHw9IEpGX1pPTUJJRTsKLQkJCWotPmpvYiA9IC0xOwotCQkJbnpvbWJpZSsrOwotCQl9IGVsc2UKLQkJCXJlbW92ZV9qb2IoaiwgImNoZWNram9iIik7Ci0JfQotfQotCi0vKgotICogUHJpbnQgam9iIHN0YXR1cyBpbiBlaXRoZXIgc2hvcnQsIG1lZGl1bSBvciBsb25nIGZvcm1hdC4KLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLWpfcHJpbnQoSm9iICpqLCBpbnQgaG93LCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JUHJvYwkqcDsKLQlpbnQJc3RhdGU7Ci0JaW50CXN0YXR1czsKLQlpbnQJY29yZWR1bXBlZDsKLQljaGFyCWpvYmNoYXIgPSAnICc7Ci0JY2hhcglidWZbNjRdOwotCWNvbnN0IGNoYXIgKmZpbGxlcjsKLQlpbnQJb3V0cHV0ID0gMDsKLQotCWlmIChob3cgPT0gSlBfUEdSUCkgewotCQkvKgotCQkgKiBQT1NJWCBkb2Vzbid0IHNheSB3aGF0IHRvIGRvIGl0IHRoZXJlIGlzIG5vIHByb2Nlc3MKLQkJICogZ3JvdXAgbGVhZGVyIChpZSwgIUZNT05JVE9SKS4gV2UgYXJiaXRyYXJpbHkgcmV0dXJuCi0JCSAqIGxhc3QgcGlkICh3aGljaCBpcyB3aGF0ICQhIHJldHVybnMpLgotCQkgKi8KLQkJc2hmX2ZwcmludGYoc2hmLCAiJWRcbiIsIChpbnQpKGotPnBncnAgPyBqLT5wZ3JwIDoKLQkJICAgIChqLT5sYXN0X3Byb2MgPyBqLT5sYXN0X3Byb2MtPnBpZCA6IDApKSk7Ci0JCXJldHVybjsKLQl9Ci0Jai0+ZmxhZ3MgJj0gfkpGX0NIQU5HRUQ7Ci0JZmlsbGVyID0gai0+am9iID4gMTAgPyAiXG4gICAgICAgIiA6ICJcbiAgICAgICI7Ci0JaWYgKGogPT0gam9iX2xpc3QpCi0JCWpvYmNoYXIgPSAnKyc7Ci0JZWxzZSBpZiAoaiA9PSBqb2JfbGlzdC0+bmV4dCkKLQkJam9iY2hhciA9ICctJzsKLQotCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOykgewotCQljb3JlZHVtcGVkID0gMDsKLQkJc3dpdGNoIChwLT5zdGF0ZSkgewotCQljYXNlIFBSVU5OSU5HOgotCQkJbWVtY3B5KGJ1ZiwgIlJ1bm5pbmciLCA4KTsKLQkJCWJyZWFrOwotCQljYXNlIFBTVE9QUEVEOgotCQkJc3RybGNweShidWYsIHNpZ3RyYXBzW1dTVE9QU0lHKHAtPnN0YXR1cyldLm1lc3MsCi0JCQkgICAgc2l6ZW9mKGJ1ZikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEVYSVRFRDoKLQkJCWlmIChob3cgPT0gSlBfU0hPUlQpCi0JCQkJYnVmWzBdID0gJ1wwJzsKLQkJCWVsc2UgaWYgKFdFWElUU1RBVFVTKHAtPnN0YXR1cykgPT0gMCkKLQkJCQltZW1jcHkoYnVmLCAiRG9uZSIsIDUpOwotCQkJZWxzZQotCQkJCXNoZl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRG9uZSAoJWQpIiwKLQkJCQkgICAgV0VYSVRTVEFUVVMocC0+c3RhdHVzKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQU0lHTkFMTEVEOgotI2lmZGVmIFdDT1JFRFVNUAotCQkJaWYgKFdDT1JFRFVNUChwLT5zdGF0dXMpKQotCQkJCWNvcmVkdW1wZWQgPSAxOwotI2VuZGlmCi0JCQkvKgotCQkJICoga2x1ZGdlIGZvciBub3QgcmVwb3J0aW5nICdub3JtYWwgdGVybWluYXRpb24KLQkJCSAqIHNpZ25hbHMnIChpLmUuIFNJR0lOVCwgU0lHUElQRSkKLQkJCSAqLwotCQkJaWYgKGhvdyA9PSBKUF9TSE9SVCAmJiAhY29yZWR1bXBlZCAmJgotCQkJICAgIChXVEVSTVNJRyhwLT5zdGF0dXMpID09IFNJR0lOVCB8fAotCQkJICAgIFdURVJNU0lHKHAtPnN0YXR1cykgPT0gU0lHUElQRSkpIHsKLQkJCQlidWZbMF0gPSAnXDAnOwotCQkJfSBlbHNlCi0JCQkJc3RybGNweShidWYsIHNpZ3RyYXBzW1dURVJNU0lHKHAtPnN0YXR1cyldLm1lc3MsCi0JCQkJICAgIHNpemVvZihidWYpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGhvdyAhPSBKUF9TSE9SVCkgewotCQkJaWYgKHAgPT0gai0+cHJvY19saXN0KQotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIlslZF0gJWMgIiwgai0+am9iLCBqb2JjaGFyKTsKLQkJCWVsc2UKLQkJCQlzaGZfZnByaW50ZihzaGYsICIlcyIsIGZpbGxlcik7Ci0JCX0KLQotCQlpZiAoaG93ID09IEpQX0xPTkcpCi0JCQlzaGZfZnByaW50ZihzaGYsICIlNWQgIiwgKGludClwLT5waWQpOwotCi0JCWlmIChob3cgPT0gSlBfU0hPUlQpIHsKLQkJCWlmIChidWZbMF0pIHsKLQkJCQlvdXRwdXQgPSAxOwotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJXMgIiwKLQkJCQkgICAgYnVmLCBjb3JlZHVtcGVkID8gIiAoY29yZSBkdW1wZWQpIiA6IG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3V0cHV0ID0gMTsKLQkJCXNoZl9mcHJpbnRmKHNoZiwgIiUtMjBzICVzJXMlcyIsIGJ1ZiwgcC0+Y29tbWFuZCwKLQkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCwKLQkJCSAgICBjb3JlZHVtcGVkID8gIiAoY29yZSBkdW1wZWQpIiA6IG51bGwpOwotCQl9Ci0KLQkJc3RhdGUgPSBwLT5zdGF0ZTsKLQkJc3RhdHVzID0gcC0+c3RhdHVzOwotCQlwID0gcC0+bmV4dDsKLQkJd2hpbGUgKHAgJiYgcC0+c3RhdGUgPT0gc3RhdGUgJiYgcC0+c3RhdHVzID09IHN0YXR1cykgewotCQkJaWYgKGhvdyA9PSBKUF9MT05HKQotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJTVkICUtMjBzICVzJXMiLCBmaWxsZXIsCi0JCQkJICAgIChpbnQpcC0+cGlkLCAiICIsIHAtPmNvbW1hbmQsCi0JCQkJICAgIHAtPm5leHQgPyAifCIgOiBudWxsKTsKLQkJCWVsc2UgaWYgKGhvdyA9PSBKUF9NRURJVU0pCi0JCQkJc2hmX2ZwcmludGYoc2hmLCAiICVzJXMiLCBwLT5jb21tYW5kLAotCQkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCk7Ci0JCQlwID0gcC0+bmV4dDsKLQkJfQotCX0KLQlpZiAob3V0cHV0KQotCQlzaGZfcHV0YygnXG4nLCBzaGYpOwotfQotCi0vKgotICogQ29udmVydCAlIHNlcXVlbmNlIHRvIGpvYgotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgSm9iICoKLWpfbG9va3VwKGNvbnN0IGNoYXIgKmNwLCBpbnQgKmVjb2RlcCkKLXsKLQlKb2IJCSpqLCAqbGFzdF9tYXRjaDsKLQlQcm9jCQkqcDsKLQlpbnQJCWxlbiwgam9iID0gMDsKLQotCWlmIChrc2hfaXNkaWdpdCgqY3ApKSB7Ci0JCWdldG4oY3AsICZqb2IpOwotCQkvKiBMb29rIGZvciBsYXN0X3Byb2MtPnBpZCAod2hhdCAkISByZXR1cm5zKSBmaXJzdC4uLiAqLwotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKLQkJCWlmIChqLT5sYXN0X3Byb2MgJiYgai0+bGFzdF9wcm9jLT5waWQgPT0gam9iKQotCQkJCXJldHVybiAoaik7Ci0JCS8qCi0JCSAqIC4uLnRoZW4gbG9vayBmb3IgcHJvY2VzcyBncm91cCAodGhpcyBpcyBub24tUE9TSVgsCi0JCSAqIGJ1dCBzaG91bGQgbm90IGJyZWFrIGFueXRoaW5nCi0JCSAqLwotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKLQkJCWlmIChqLT5wZ3JwICYmIGotPnBncnAgPT0gam9iKQotCQkJCXJldHVybiAoaik7Ci0JCWlmIChlY29kZXApCi0JCQkqZWNvZGVwID0gSkxfTk9TVUNIOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlpZiAoKmNwICE9ICclJykgewotCQlpZiAoZWNvZGVwKQotCQkJKmVjb2RlcCA9IEpMX0lOVkFMSUQ7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCXN3aXRjaCAoKisrY3ApIHsKLQljYXNlICdcMCc6IC8qIG5vbi1zdGFuZGFyZCAqLwotCWNhc2UgJysnOgotCWNhc2UgJyUnOgotCQlpZiAoam9iX2xpc3QgIT0gTlVMTCkKLQkJCXJldHVybiAoam9iX2xpc3QpOwotCQlicmVhazsKLQotCWNhc2UgJy0nOgotCQlpZiAoam9iX2xpc3QgIT0gTlVMTCAmJiBqb2JfbGlzdC0+bmV4dCkKLQkJCXJldHVybiAoam9iX2xpc3QtPm5leHQpOwotCQlicmVhazsKLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JCWdldG4oY3AsICZqb2IpOwotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKLQkJCWlmIChqLT5qb2IgPT0gam9iKQotCQkJCXJldHVybiAoaik7Ci0JCWJyZWFrOwotCi0JY2FzZSAnPyc6CQkvKiAlP3N0cmluZyAqLwotCQlsYXN0X21hdGNoID0gTlVMTDsKLQkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCi0JCQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCQkJaWYgKHN0cnN0cihwLT5jb21tYW5kLCBjcCsxKSAhPSBOVUxMKSB7Ci0JCQkJCWlmIChsYXN0X21hdGNoKSB7Ci0JCQkJCQlpZiAoZWNvZGVwKQotCQkJCQkJCSplY29kZXAgPSBKTF9BTUJJRzsKLQkJCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkJCX0KLQkJCQkJbGFzdF9tYXRjaCA9IGo7Ci0JCQkJfQotCQlpZiAobGFzdF9tYXRjaCkKLQkJCXJldHVybiAobGFzdF9tYXRjaCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoJCS8qICVzdHJpbmcgKi8KLQkJbGVuID0gc3RybGVuKGNwKTsKLQkJbGFzdF9tYXRjaCA9IE5VTEw7Ci0JCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQotCQkJaWYgKHN0cm5jbXAoY3AsIGotPnByb2NfbGlzdC0+Y29tbWFuZCwgbGVuKSA9PSAwKSB7Ci0JCQkJaWYgKGxhc3RfbWF0Y2gpIHsKLQkJCQkJaWYgKGVjb2RlcCkKLQkJCQkJCSplY29kZXAgPSBKTF9BTUJJRzsKLQkJCQkJcmV0dXJuIChOVUxMKTsKLQkJCQl9Ci0JCQkJbGFzdF9tYXRjaCA9IGo7Ci0JCQl9Ci0JCWlmIChsYXN0X21hdGNoKQotCQkJcmV0dXJuIChsYXN0X21hdGNoKTsKLQkJYnJlYWs7Ci0JfQotCWlmIChlY29kZXApCi0JCSplY29kZXAgPSBKTF9OT1NVQ0g7Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIEpvYgkqZnJlZV9qb2JzOwotc3RhdGljIFByb2MJKmZyZWVfcHJvY3M7Ci0KLS8qCi0gKiBhbGxvY2F0ZSBhIG5ldyBqb2IgYW5kIGZpbGwgaW4gdGhlIGpvYiBudW1iZXIuCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyBKb2IgKgotbmV3X2pvYih2b2lkKQotewotCWludAlpOwotCUpvYgkqbmV3aiwgKmo7Ci0KLQlpZiAoZnJlZV9qb2JzICE9IE5VTEwpIHsKLQkJbmV3aiA9IGZyZWVfam9iczsKLQkJZnJlZV9qb2JzID0gZnJlZV9qb2JzLT5uZXh0OwotCX0gZWxzZQotCQluZXdqID0gYWxsb2Moc2l6ZW9mKEpvYiksIEFQRVJNKTsKLQotCS8qIGJydXRlIGZvcmNlIG1ldGhvZCAqLwotCWZvciAoaSA9IDE7IDsgaSsrKSB7Ci0JCWZvciAoaiA9IGpvYl9saXN0OyBqICYmIGotPmpvYiAhPSBpOyBqID0gai0+bmV4dCkKLQkJCTsKLQkJaWYgKGogPT0gTlVMTCkKLQkJCWJyZWFrOwotCX0KLQluZXdqLT5qb2IgPSBpOwotCi0JcmV0dXJuIChuZXdqKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIG5ldyBwcm9jZXNzIHN0cnVjdAotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgUHJvYyAqCi1uZXdfcHJvYyh2b2lkKQotewotCVByb2MJKnA7Ci0KLQlpZiAoZnJlZV9wcm9jcyAhPSBOVUxMKSB7Ci0JCXAgPSBmcmVlX3Byb2NzOwotCQlmcmVlX3Byb2NzID0gZnJlZV9wcm9jcy0+bmV4dDsKLQl9IGVsc2UKLQkJcCA9IGFsbG9jKHNpemVvZihQcm9jKSwgQVBFUk0pOwotCi0JcmV0dXJuIChwKTsKLX0KLQotLyoKLSAqIFRha2Ugam9iIG91dCBvZiBqb2JfbGlzdCBhbmQgcHV0IG9sZCBzdHJ1Y3R1cmVzIGludG8gZnJlZSBsaXN0LgotICogS2VlcHMgbnpvbWJpZXMsIGxhc3Rfam9iIGFuZCBhc3luY19qb2IgdXAgdG8gZGF0ZS4KLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLXJlbW92ZV9qb2IoSm9iICpqLCBjb25zdCBjaGFyICp3aGVyZSkKLXsKLQlQcm9jCSpwLCAqdG1wOwotCUpvYgkqKnByZXYsICpjdXJyOwotCi0JcHJldiA9ICZqb2JfbGlzdDsKLQljdXJyID0gKnByZXY7Ci0JZm9yICg7IGN1cnIgIT0gTlVMTCAmJiBjdXJyICE9IGo7IHByZXYgPSAmY3Vyci0+bmV4dCwgY3VyciA9ICpwcmV2KQotCQk7Ci0JaWYgKGN1cnIgIT0gaikgewotCQlpbnRlcm5hbF93YXJuaW5nZigicmVtb3ZlX2pvYjogam9iIG5vdCBmb3VuZCAoJXMpIiwgd2hlcmUpOwotCQlyZXR1cm47Ci0JfQotCSpwcmV2ID0gY3Vyci0+bmV4dDsKLQotCS8qIGZyZWUgdXAgcHJvYyBzdHJ1Y3R1cmVzICovCi0JZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7ICkgewotCQl0bXAgPSBwOwotCQlwID0gcC0+bmV4dDsKLQkJdG1wLT5uZXh0ID0gZnJlZV9wcm9jczsKLQkJZnJlZV9wcm9jcyA9IHRtcDsKLQl9Ci0KLQlpZiAoKGotPmZsYWdzICYgSkZfWk9NQklFKSAmJiBqLT5wcGlkID09IHByb2NwaWQpCi0JCS0tbnpvbWJpZTsKLQlqLT5uZXh0ID0gZnJlZV9qb2JzOwotCWZyZWVfam9icyA9IGo7Ci0KLQlpZiAoaiA9PSBsYXN0X2pvYikKLQkJbGFzdF9qb2IgPSBOVUxMOwotCWlmIChqID09IGFzeW5jX2pvYikKLQkJYXN5bmNfam9iID0gTlVMTDsKLX0KLQotLyoKLSAqIHB1dCBqIGluIGEgcGFydGljdWxhciBsb2NhdGlvbiAodGFraW5nIGl0IG91dCBqb2JfbGlzdCBpZiBpdCBpcyB0aGVyZQotICogYWxyZWFkeSkKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLXB1dF9qb2IoSm9iICpqLCBpbnQgd2hlcmUpCi17Ci0JSm9iCSoqcHJldiwgKmN1cnI7Ci0KLQkvKiBSZW1vdmUgam9iIGZyb20gbGlzdCAoaWYgdGhlcmUpICovCi0JcHJldiA9ICZqb2JfbGlzdDsKLQljdXJyID0gam9iX2xpc3Q7Ci0JZm9yICg7IGN1cnIgJiYgY3VyciAhPSBqOyBwcmV2ID0gJmN1cnItPm5leHQsIGN1cnIgPSAqcHJldikKLQkJOwotCWlmIChjdXJyID09IGopCi0JCSpwcmV2ID0gY3Vyci0+bmV4dDsKLQotCXN3aXRjaCAod2hlcmUpIHsKLQljYXNlIFBKX09OX0ZST05UOgotCQlqLT5uZXh0ID0gam9iX2xpc3Q7Ci0JCWpvYl9saXN0ID0gajsKLQkJYnJlYWs7Ci0KLQljYXNlIFBKX1BBU1RfU1RPUFBFRDoKLQkJcHJldiA9ICZqb2JfbGlzdDsKLQkJY3VyciA9IGpvYl9saXN0OwotCQlmb3IgKDsgY3VyciAmJiBjdXJyLT5zdGF0ZSA9PSBQU1RPUFBFRDsgcHJldiA9ICZjdXJyLT5uZXh0LAotCQkgICAgY3VyciA9ICpwcmV2KQotCQkJOwotCQlqLT5uZXh0ID0gY3VycjsKLQkJKnByZXYgPSBqOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiBudWtlIGEgam9iIChjYWxsZWQgd2hlbiB1bmFibGUgdG8gc3RhcnQgZnVsbCBqb2IpLgotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgaW50Ci1raWxsX2pvYihKb2IgKmosIGludCBzaWcpCi17Ci0JUHJvYwkqcDsKLQlpbnQJcnZhbCA9IDA7Ci0KLQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCWlmIChwLT5waWQgIT0gMCkKLQkJCWlmIChraWxsKHAtPnBpZCwgc2lnKSA8IDApCi0JCQkJcnZhbCA9IC0xOwotCXJldHVybiAocnZhbCk7Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9sYWxsb2MuYyBiL21rc2gvc3JjL2xhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYyN2QxLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2xhbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IMKpIDIwMDkKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbuKAmXMgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2xhbGxvYy5jLHYgMS4xMSAyMDA5LzA4LzA4IDEzOjA4OjUxIHRnIEV4cCAkIik7Ci0KLS8qIGJ1aWxkIHdpdGggQ1BQRkxBR1MrPSAtRFVTRV9SRUFMTE9DX01BTExPQz0wIG9uIGFuY2llbnQgc3lzdGVtcyAqLwotI2lmIGRlZmluZWQoVVNFX1JFQUxMT0NfTUFMTE9DKSAmJiAoVVNFX1JFQUxMT0NfTUFMTE9DID09IDApCi0jZGVmaW5lIHJlbWFsbG9jKHAsbikJKChwKSA9PSBOVUxMID8gbWFsbG9jKG4pIDogcmVhbGxvYygocCksIChuKSkpCi0jZWxzZQotI2RlZmluZSByZW1hbGxvYyhwLG4pCXJlYWxsb2MoKHApLCAobikpCi0jZW5kaWYKLQotI2RlZmluZSBBTExPQ19JU1VOQUxJR05FRChwKSAoKChwdHJkaWZmX3QpKHApKSAlIEFMTE9DX1NJWkUpCi0KLXN0YXRpYyBBTExPQ19JVEVNICpmaW5kcHRyKEFMTE9DX0lURU0gKiosIGNoYXIgKiwgQXJlYSAqKTsKLQotdm9pZAotYWluaXQoQXJlYSAqYXApCi17Ci0JLyogYXJlYSBwb2ludGVyIGlzIGFuIEFMTE9DX0lURU0sIGp1c3QgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KLQlhcC0+bmV4dCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBBTExPQ19JVEVNICoKLWZpbmRwdHIoQUxMT0NfSVRFTSAqKmxwcCwgY2hhciAqcHRyLCBBcmVhICphcCkKLXsKLQl2b2lkICpscDsKLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JaWYgKEFMTE9DX0lTVU5BTElHTkVEKHB0cikpCi0JCWdvdG8gZmFpbDsKLSNlbmRpZgotCS8qIGdldCBhZGRyZXNzIG9mIEFMTE9DX0lURU0gZnJvbSB1c2VyIGl0ZW0gKi8KLQkvKgotCSAqIG5vdGU6IHRoZSBhbGlnbm1lbnQgb2YgInB0ciIgdG8gQUxMT0NfU0laRSBpcyBjaGVja2VkCi0JICogYWJvdmU7IHRoZSAidm9pZCAqIiBnZXRzIHVzIHJpZCBvZiBhIGdjYyAyLjk1IHdhcm5pbmcKLQkgKi8KLQkqbHBwID0gKGxwID0gcHRyIC0gQUxMT0NfU0laRSk7Ci0JLyogc2VhcmNoIGZvciBhbGxvY2F0aW9uIGl0ZW0gaW4gZ3JvdXAgbGlzdCAqLwotCXdoaWxlIChhcC0+bmV4dCAhPSBscCkKLQkJaWYgKChhcCA9IGFwLT5uZXh0KSA9PSBOVUxMKSB7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLSBmYWlsOgotI2VuZGlmCi0JCQlpbnRlcm5hbF9lcnJvcmYoInJvZ3VlIHBvaW50ZXIgJXAiLCBwdHIpOwotCQl9Ci0JcmV0dXJuIChhcCk7Ci19Ci0KLXZvaWQgKgotYXJlc2l6ZSh2b2lkICpwdHIsIHNpemVfdCBudW1iLCBBcmVhICphcCkKLXsKLQlBTExPQ19JVEVNICpscCA9IE5VTEw7Ci0KLQkvKiByZXNpemluZyAodHJ1ZSkgb3IgbmV3bHkgYWxsb2NhdGluZz8gKi8KLQlpZiAocHRyICE9IE5VTEwpIHsKLQkJQUxMT0NfSVRFTSAqcHA7Ci0KLQkJcHAgPSBmaW5kcHRyKCZscCwgcHRyLCBhcCk7Ci0JCXBwLT5uZXh0ID0gbHAtPm5leHQ7Ci0JfQotCi0JaWYgKChudW1iID49IFNJWkVfTUFYIC0gQUxMT0NfU0laRSkgfHwKLQkgICAgKGxwID0gcmVtYWxsb2MobHAsIG51bWIgKyBBTExPQ19TSVpFKSkgPT0gTlVMTAotI2lmbmRlZiBNS1NIX1NNQUxMCi0JICAgIHx8IEFMTE9DX0lTVU5BTElHTkVEKGxwKQotI2VuZGlmCi0JICAgICkKLQkJaW50ZXJuYWxfZXJyb3JmKCJjYW5ub3QgYWxsb2NhdGUgJWx1IGRhdGEgYnl0ZXMiLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpbnVtYik7Ci0JLyogdGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgQXJlYSBpcyBhbiBBTExPQ19JVEVNICovCi0JbHAtPm5leHQgPSBhcC0+bmV4dDsKLQlhcC0+bmV4dCA9IGxwOwotCS8qIHJldHVybiB1c2VyIGl0ZW0gYWRkcmVzcyAqLwotCXJldHVybiAoKGNoYXIgKilscCArIEFMTE9DX1NJWkUpOwotfQotCi12b2lkCi1hZnJlZSh2b2lkICpwdHIsIEFyZWEgKmFwKQotewotCWlmIChwdHIgIT0gTlVMTCkgewotCQlBTExPQ19JVEVNICpscCwgKnBwOwotCi0JCXBwID0gZmluZHB0cigmbHAsIHB0ciwgYXApOwotCQkvKiB1bmhvb2sgKi8KLQkJcHAtPm5leHQgPSBscC0+bmV4dDsKLQkJLyogbm93IGZyZWUgQUxMT0NfSVRFTSAqLwotCQlmcmVlKGxwKTsKLQl9Ci19Ci0KLXZvaWQKLWFmcmVlYWxsKEFyZWEgKmFwKQotewotCUFMTE9DX0lURU0gKmxwOwotCi0JLyogdHJhdmVyc2UgZ3JvdXAgKGxpbmtlZCBsaXN0KSAqLwotCXdoaWxlICgobHAgPSBhcC0+bmV4dCkgIT0gTlVMTCkgewotCQkvKiBtYWtlIG5leHQgQUxMT0NfSVRFTSBoZWFkIG9mIGxpc3QgKi8KLQkJYXAtPm5leHQgPSBscC0+bmV4dDsKLQkJLyogZnJlZSBvbGQgaGVhZCAqLwotCQlmcmVlKGxwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9sZXguYyBiL21rc2gvc3JjL2xleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDIxOWU3Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2xleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4MiArMCwwIEBACi0vKgkkT3BlbkJTRDogbGV4LmMsdiAxLjQ0IDIwMDgvMDcvMDMgMTc6NTI6MDggb3R0byBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2xleC5jLHYgMS4xMTggMjAxMC8wNy8yNSAxMTozNTo0MSB0ZyBFeHAgJCIpOwotCi0vKgotICogc3RhdGVzIHdoaWxlIGxleGluZyB3b3JkCi0gKi8KLSNkZWZpbmUgU0JBU0UJCTAJLyogb3V0c2lkZSBhbnkgbGV4aWNhbCBjb25zdHJ1Y3RzICovCi0jZGVmaW5lIFNXT1JECQkxCS8qIGltcGxpY2l0IHF1b3RpbmcgZm9yIHN1YnN0aXR1dGUoKSAqLwotI2RlZmluZSBTTEVUUEFSRU4JMgkvKiBpbnNpZGUgKCggKSksIGltcGxpY2l0IHF1b3RpbmcgKi8KLSNkZWZpbmUgU1NRVU9URQkJMwkvKiBpbnNpZGUgJycgKi8KLSNkZWZpbmUgU0RRVU9URQkJNAkvKiBpbnNpZGUgIiIgKi8KLSNkZWZpbmUgU0VRVU9URQkJNQkvKiBpbnNpZGUgJCcnICovCi0jZGVmaW5lIFNCUkFDRQkJNgkvKiBpbnNpZGUgJHt9ICovCi0jZGVmaW5lIFNRQlJBQ0UJCTcJLyogaW5zaWRlICIke30iICovCi0jZGVmaW5lIFNDU1BBUkVOCTgJLyogaW5zaWRlICQoKSAqLwotI2RlZmluZSBTQlFVT1RFCQk5CS8qIGluc2lkZSBgYCAqLwotI2RlZmluZSBTQVNQQVJFTgkxMAkvKiBpbnNpZGUgJCgoICkpICovCi0jZGVmaW5lIFNIRVJFREVMSU0JMTEJLyogcGFyc2luZyA8PCw8PC0gZGVsaW1pdGVyICovCi0jZGVmaW5lIFNIRVJFRFFVT1RFCTEyCS8qIHBhcnNpbmcgIiBpbiA8PCw8PC0gZGVsaW1pdGVyICovCi0jZGVmaW5lIFNQQVRURVJOCTEzCS8qIHBhcnNpbmcgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KLSNkZWZpbmUgU1RCUkFDRQkJMTQJLyogcGFyc2luZyAkey4uLlsjJV0uLi59ICovCi0jZGVmaW5lIFNMRVRBUlJBWQkxNQkvKiBpbnNpZGUgPSggKSwganVzdCBjb3B5ICovCi0jZGVmaW5lIFNBREVMSU0JCTE2CS8qIGxpa2UgU0JBU0UsIGxvb2tpbmcgZm9yIGRlbGltaXRlciAqLwotI2RlZmluZSBTSEVSRVNUUklORwkxNwkvKiBwYXJzaW5nIDw8PCBzdHJpbmcgKi8KLQotLyogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxleGluZyBzdGF0ZSBhbmQgdGhlIHZhcmlvdXMgcGllY2VzIG9mIGluZm8KLSAqIG5lZWRlZCBmb3IgZWFjaCBwYXJ0aWN1bGFyIHN0YXRlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGV4X3N0YXRlIExleF9zdGF0ZTsKLXN0cnVjdCBsZXhfc3RhdGUgewotCWludCBsc19zdGF0ZTsKLQl1bmlvbiB7Ci0JCS8qICQoLi4uKSAqLwotCQlzdHJ1Y3Qgc2NzcGFyZW5faW5mbyB7Ci0JCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCi0JCQlpbnQgY3NzdGF0ZTsJLyogWFhYIHJlbW92ZSAqLwotI2RlZmluZSBsc19zY3NwYXJlbiBsc19pbmZvLnVfc2NzcGFyZW4KLQkJfSB1X3Njc3BhcmVuOwotCi0JCS8qICQoKC4uLikpICovCi0JCXN0cnVjdCBzYXNwYXJlbl9pbmZvIHsKLQkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzaXMgKi8KLQkJCWludCBzdGFydDsJLyogbWFya3Mgc3RhcnQgb2YgJCgoIGluIG91dHB1dCBzdHIgKi8KLSNkZWZpbmUgbHNfc2FzcGFyZW4gbHNfaW5mby51X3Nhc3BhcmVuCi0JCX0gdV9zYXNwYXJlbjsKLQotCQkvKiAoKC4uLikpICovCi0JCXN0cnVjdCBzbGV0cGFyZW5faW5mbyB7Ci0JCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCi0jZGVmaW5lIGxzX3NsZXRwYXJlbiBsc19pbmZvLnVfc2xldHBhcmVuCi0JCX0gdV9zbGV0cGFyZW47Ci0KLQkJLyogYC4uLmAgKi8KLQkJc3RydWN0IHNicXVvdGVfaW5mbyB7Ci0JCQlpbnQgaW5kcXVvdGVzOwkvKiB0cnVlIGlmIGluIGRvdWJsZSBxdW90ZXM6ICJgLi4uYCIgKi8KLSNkZWZpbmUgbHNfc2JxdW90ZSBsc19pbmZvLnVfc2JxdW90ZQotCQl9IHVfc2JxdW90ZTsKLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCS8qID0oLi4uKSAqLwotCQlzdHJ1Y3Qgc2xldGFycmF5X2luZm8gewotCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBsc19zbGV0YXJyYXkgbHNfaW5mby51X3NsZXRhcnJheQotCQl9IHVfc2xldGFycmF5OwotI2VuZGlmCi0KLQkJLyogQURFTElNICovCi0JCXN0cnVjdCBzYWRlbGltX2luZm8gewotCQkJdW5zaWduZWQgY2hhciBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzZXMgKi8KLSNkZWZpbmUgU0FERUxJTV9CQVNICTAKLSNkZWZpbmUgU0FERUxJTV9NQUtFCTEKLQkJCXVuc2lnbmVkIGNoYXIgc3R5bGU7Ci0JCQl1bnNpZ25lZCBjaGFyIGRlbGltaXRlcjsKLQkJCXVuc2lnbmVkIGNoYXIgbnVtOwotCQkJdW5zaWduZWQgY2hhciBmbGFnczsJLyogb2ZzLiBpbnRvIHNhZGVsaW1fZmxhZ3NbXSAqLwotI2RlZmluZSBsc19zYWRlbGltIGxzX2luZm8udV9zYWRlbGltCi0JCX0gdV9zYWRlbGltOwotCi0JCS8qICQnLi4uJyAqLwotCQlzdHJ1Y3Qgc2VxdW90ZV9pbmZvIHsKLQkJCWJvb2wgZ290X05VTDsJLyogaWdub3JlIHJlc3Qgb2Ygc3RyaW5nICovCi0jZGVmaW5lIGxzX3NlcXVvdGUgbHNfaW5mby51X3NlcXVvdGUKLQkJfSB1X3NlcXVvdGU7Ci0KLQkJTGV4X3N0YXRlICpiYXNlOwkvKiB1c2VkIHRvIHBvaW50IHRvIG5leHQgc3RhdGUgYmxvY2sgKi8KLQl9IGxzX2luZm87Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JTGV4X3N0YXRlICpiYXNlOwotCUxleF9zdGF0ZSAqZW5kOwotfSBTdGF0ZV9pbmZvOwotCi1zdGF0aWMgdm9pZCByZWFkaGVyZShzdHJ1Y3QgaW93b3JkICopOwotc3RhdGljIGludCBnZXRzY19fKHZvaWQpOwotc3RhdGljIHZvaWQgZ2V0c2NfbGluZShTb3VyY2UgKik7Ci1zdGF0aWMgaW50IGdldHNjX2JuKHZvaWQpOwotc3RhdGljIGludCBzX2dldCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNfcHV0KGludCk7Ci1zdGF0aWMgY2hhciAqZ2V0X2JyYWNlX3ZhcihYU3RyaW5nICosIGNoYXIgKik7Ci1zdGF0aWMgaW50IGFycmF5c3ViKGNoYXIgKiopOwotc3RhdGljIGNvbnN0IGNoYXIgKnVuZ2V0c2MoaW50KTsKLXN0YXRpYyB2b2lkIGdldGhlcmUoYm9vbCk7Ci1zdGF0aWMgTGV4X3N0YXRlICpwdXNoX3N0YXRlXyhTdGF0ZV9pbmZvICosIExleF9zdGF0ZSAqKTsKLXN0YXRpYyBMZXhfc3RhdGUgKnBvcF9zdGF0ZV8oU3RhdGVfaW5mbyAqLCBMZXhfc3RhdGUgKik7Ci0KLXN0YXRpYyBpbnQgZG9wcHJvbXB0KGNvbnN0IGNoYXIgKiwgaW50LCBib29sKTsKLQotc3RhdGljIGludCBiYWNrc2xhc2hfc2tpcDsKLXN0YXRpYyBpbnQgaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lOwotCi0vKiBvcHRpbWlzZWQgZ2V0c2NfYm4oKSAqLwotI2RlZmluZSBfZ2V0c2MoKQkoKnNvdXJjZS0+c3RyICE9ICdcMCcgJiYgKnNvdXJjZS0+c3RyICE9ICdcXCcgXAotCQkJICYmICFiYWNrc2xhc2hfc2tpcCAmJiAhKHNvdXJjZS0+ZmxhZ3MgJiBTRl9GSVJTVCkgXAotCQkJID8gKnNvdXJjZS0+c3RyKysgOiBnZXRzY19ibigpKQotLyogb3B0aW1pc2VkIGdldHNjX18oKSAqLwotI2RlZmluZQlfZ2V0c2NfKCkJKCgqc291cmNlLT5zdHIgIT0gJ1wwJykgJiYgIShzb3VyY2UtPmZsYWdzICYgU0ZfRklSU1QpIFwKLQkJCSA/ICpzb3VyY2UtPnN0cisrIDogZ2V0c2NfXygpKQotCi0jaWZkZWYgTUtTSF9TTUFMTAotc3RhdGljIGludCBnZXRzYyh2b2lkKTsKLXN0YXRpYyBpbnQgZ2V0c2NfKHZvaWQpOwotCi1zdGF0aWMgaW50Ci1nZXRzYyh2b2lkKQotewotCXJldHVybiAoX2dldHNjKCkpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRzY18odm9pZCkKLXsKLQlyZXR1cm4gKF9nZXRzY18oKSk7Ci19Ci0jZWxzZQotLyogIU1LU0hfU01BTEw6IHVzZSB0aGVtIGlubGluZSAqLwotI2RlZmluZSBnZXRzYygpCQlfZ2V0c2MoKQotI2RlZmluZSBnZXRzY18oKQlfZ2V0c2NfKCkKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRFX0JTSVpFCTMyCi0KLSNkZWZpbmUgUFVTSF9TVEFURShzKQlkbyB7CQkJCQlcCi0JaWYgKCsrc3RhdGVwID09IHN0YXRlX2luZm8uZW5kKQkJCQlcCi0JCXN0YXRlcCA9IHB1c2hfc3RhdGVfKCZzdGF0ZV9pbmZvLCBzdGF0ZXApOwlcCi0Jc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gKHMpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFBPUF9TVEFURSgpCWRvIHsJCQkJCVwKLQlpZiAoLS1zdGF0ZXAgPT0gc3RhdGVfaW5mby5iYXNlKQkJCVwKLQkJc3RhdGVwID0gcG9wX3N0YXRlXygmc3RhdGVfaW5mbywgc3RhdGVwKTsJXAotCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZTsJCQkJXAotfSB3aGlsZSAoMCkKLQotLyoqCi0gKiBMZXhpY2FsIGFuYWx5c2VyCi0gKgotICogdG9rZW5zIGFyZSBub3QgcmVndWxhciBleHByZXNzaW9ucywgdGhleSBhcmUgTEwoMSkuCi0gKiBmb3IgZXhhbXBsZSwgIiR7dmFyOi0ke1BXRH19IiwgYW5kICIkKHNpemUgJCh3aGVuY2Uga3NoKSkiLgotICogaGVuY2UgdGhlIHN0YXRlIHN0YWNrLgotICovCi0KLWludAoteXlsZXgoaW50IGNmKQotewotCUxleF9zdGF0ZSBzdGF0ZXNbU1RBVEVfQlNJWkVdLCAqc3RhdGVwLCAqczIsICpiYXNlOwotCVN0YXRlX2luZm8gc3RhdGVfaW5mbzsKLQlpbnQgYywgYzIsIHN0YXRlOwotCVhTdHJpbmcgd3M7CQkvKiBleHBhbmRhYmxlIG91dHB1dCB3b3JkICovCi0JY2hhciAqd3A7CQkvKiBvdXRwdXQgd29yZCBwb2ludGVyICovCi0JY2hhciAqc3AsICpkcDsKLQotIEFnYWluOgotCXN0YXRlc1swXS5sc19zdGF0ZSA9IC0xOwotCXN0YXRlc1swXS5sc19pbmZvLmJhc2UgPSBOVUxMOwotCXN0YXRlcCA9ICZzdGF0ZXNbMV07Ci0Jc3RhdGVfaW5mby5iYXNlID0gc3RhdGVzOwotCXN0YXRlX2luZm8uZW5kID0gJnN0YXRlX2luZm8uYmFzZVtTVEFURV9CU0laRV07Ci0KLQlYaW5pdCh3cywgd3AsIDY0LCBBVEVNUCk7Ci0KLQliYWNrc2xhc2hfc2tpcCA9IDA7Ci0JaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lID0gMDsKLQotCWlmIChjZiZPTkVXT1JEKQotCQlzdGF0ZSA9IFNXT1JEOwotCWVsc2UgaWYgKGNmJkxFVEVYUFIpIHsKLQkJLyogZW5jbG9zZSBhcmd1bWVudHMgaW4gKGRvdWJsZSkgcXVvdGVzICovCi0JCSp3cCsrID0gT1FVT1RFOwotCQlzdGF0ZSA9IFNMRVRQQVJFTjsKLQkJc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuID0gMDsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCX0gZWxzZSBpZiAoY2YmTEVUQVJSQVkpIHsKLQkJc3RhdGUgPSBTTEVUQVJSQVk7Ci0JCXN0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbiA9IDA7Ci0jZW5kaWYKLQl9IGVsc2UgewkJLyogbm9ybWFsIGxleGluZyAqLwotCQlzdGF0ZSA9IChjZiAmIEhFUkVERUxJTSkgPyBTSEVSRURFTElNIDogU0JBU0U7Ci0JCXdoaWxlICgoYyA9IGdldHNjKCkpID09ICcgJyB8fCBjID09ICdcdCcpCi0JCQk7Ci0JCWlmIChjID09ICcjJykgewotCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0JCQl3aGlsZSAoKGMgPSBnZXRzYygpKSAhPSAnXDAnICYmIGMgIT0gJ1xuJykKLQkJCQk7Ci0JCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKLQkJfQotCQl1bmdldHNjKGMpOwotCX0KLQlpZiAoc291cmNlLT5mbGFncyAmIFNGX0FMSUFTKSB7CS8qIHRyYWlsaW5nICcgJyBpbiBhbGlhcyBkZWZpbml0aW9uICovCi0JCXNvdXJjZS0+ZmxhZ3MgJj0gflNGX0FMSUFTOwotCQljZiB8PSBBTElBUzsKLQl9Ci0KLQkvKiBJbml0aWFsIHN0YXRlOiBvbmUgb2YgU0JBU0UgU0hFUkVERUxJTSBTV09SRCBTQVNQQVJFTiAqLwotCXN0YXRlcC0+bHNfc3RhdGUgPSBzdGF0ZTsKLQotCS8qIGNoZWNrIGZvciBoZXJlIHN0cmluZyAqLwotCWlmIChzdGF0ZSA9PSBTSEVSRURFTElNKSB7Ci0JCWMgPSBnZXRzYygpOwotCQlpZiAoYyA9PSAnPCcpIHsKLQkJCXN0YXRlID0gU0hFUkVTVFJJTkc7Ci0JCQl3aGlsZSAoKGMgPSBnZXRzYygpKSA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJCTsKLQkJCXVuZ2V0c2MoYyk7Ci0JCQljID0gJzwnOwotCQkJZ290byBhY2NlcHRfbm9ud29yZDsKLQkJfQotCQl1bmdldHNjKGMpOwotCX0KLQotCS8qIGNvbGxlY3Qgbm9uLXNwZWNpYWwgb3IgcXVvdGVkIGNoYXJhY3RlcnMgdG8gZm9ybSB3b3JkICovCi0Jd2hpbGUgKCEoKGMgPSBnZXRzYygpKSA9PSAwIHx8Ci0JICAgICgoc3RhdGUgPT0gU0JBU0UgfHwgc3RhdGUgPT0gU0hFUkVERUxJTSB8fCBzdGF0ZSA9PSBTSEVSRVNUUklORykgJiYKLQkgICAgY3R5cGUoYywgQ19MRVgxKSkpKSB7Ci0gYWNjZXB0X25vbndvcmQ6Ci0JCVhjaGVjayh3cywgd3ApOwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgU0FERUxJTToKLQkJCWlmIChjID09ICcoJykKLQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuKys7Ci0JCQllbHNlIGlmIChjID09ICcpJykKLQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuLS07Ci0JCQllbHNlIGlmIChzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID09IDAgJiYKLQkJCSAgICAoYyA9PSAvKnsqLyAnfScgfHwgYyA9PSBzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyKSkgewotCQkJCSp3cCsrID0gQURFTElNOwotCQkJCSp3cCsrID0gYzsKLQkJCQlpZiAoYyA9PSAvKnsqLyAnfScgfHwgLS1zdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID09IDApCi0JCQkJCVBPUF9TVEFURSgpOwotCQkJCWlmIChjID09IC8qeyovICd9JykKLQkJCQkJUE9QX1NUQVRFKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIFNCQVNFOgotCQkJaWYgKGMgPT0gJ1snICYmIChjZiAmIChWQVJBU058QVJSQVlWQVIpKSkgewotCQkJCSp3cCA9IEVPUzsJLyogdGVtcG9yYXJ5ICovCi0JCQkJaWYgKGlzX3dkdmFybmFtZShYc3RyaW5nKHdzLCB3cCksIGZhbHNlKSkgewotCQkJCQljaGFyICpwLCAqdG1wOwotCi0JCQkJCWlmIChhcnJheXN1YigmdG1wKSkgewotCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQkJZm9yIChwID0gdG1wOyAqcDsgKSB7Ci0JCQkJCQkJWGNoZWNrKHdzLCB3cCk7Ci0JCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJCSp3cCsrID0gKnArKzsKLQkJCQkJCX0KLQkJCQkJCWFmcmVlKHRtcCwgQVRFTVApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTb3VyY2UgKnM7Ci0KLQkJCQkJCXMgPSBwdXNocyhTUkVSRUFELAotCQkJCQkJICAgIHNvdXJjZS0+YXJlYXApOwotCQkJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPQotCQkJCQkJICAgIHMtPnUuZnJlZW1lID0gdG1wOwotCQkJCQkJcy0+bmV4dCA9IHNvdXJjZTsKLQkJCQkJCXNvdXJjZSA9IHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJKndwKysgPSBDSEFSOwotCQkJCSp3cCsrID0gYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIEZBTExUSFJPVUdIICovCi0gU2Jhc2UxOgkJLyogaW5jbHVkZXMgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KLQkJCWlmIChjID09ICcqJyB8fCBjID09ICdAJyB8fCBjID09ICcrJyB8fCBjID09ICc/JyB8fAotCQkJICAgIGMgPT0gJyEnKSB7Ci0JCQkJYzIgPSBnZXRzYygpOwotCQkJCWlmIChjMiA9PSAnKCcgLyopKi8gKSB7Ci0JCQkJCSp3cCsrID0gT1BBVDsKLQkJCQkJKndwKysgPSBjOwotCQkJCQlQVVNIX1NUQVRFKFNQQVRURVJOKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXVuZ2V0c2MoYzIpOwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLSBTYmFzZTI6CQkvKiBkb2Vzbid0IGluY2x1ZGUgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXFwnOgotIGdldHNjX3FjaGFyOgotCQkJCWlmICgoYyA9IGdldHNjKCkpKSB7Ci0JCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLwotCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkqd3ArKyA9IGM7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotIG9wZW5fc3NxdW90ZToKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKLQkJCQlQVVNIX1NUQVRFKFNTUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0gb3Blbl9zZHF1b3RlOgotCQkJCSp3cCsrID0gT1FVT1RFOwotCQkJCVBVU0hfU1RBVEUoU0RRVU9URSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWdvdG8gU3Vic3Q7Ci0JCQl9Ci0JCQlicmVhazsKLQotIFN1YnN0OgotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdcXCc6Ci0JCQkJYyA9IGdldHNjKCk7Ci0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCWlmICgoY2YgJiBIRVJFRE9DKSkKLQkJCQkJCWdvdG8gaGVyZWRvY3F1b3RlOwotCQkJCQkvKiBGQUxMVEhST1VHSCAqLwotCQkJCWNhc2UgJ1xcJzoKLQkJCQljYXNlICckJzogY2FzZSAnYCc6Ci0gc3RvcmVfcWNoYXI6Ci0JCQkJCSp3cCsrID0gUUNIQVI7Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLSBoZXJlZG9jcXVvdGU6Ci0JCQkJCVhjaGVjayh3cywgd3ApOwotCQkJCQlpZiAoYykgewotCQkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCi0JCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkqd3ArKyA9ICdcXCc7Ci0JCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnJCc6Ci0gc3Vic3RfZG9sbGFyOgotCQkJCWMgPSBnZXRzYygpOwotCQkJCWlmIChjID09ICcoJykgLyopKi8gewotCQkJCQljID0gZ2V0c2MoKTsKLQkJCQkJaWYgKGMgPT0gJygnKSAvKikqLyB7Ci0JCQkJCQlQVVNIX1NUQVRFKFNBU1BBUkVOKTsKLQkJCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuID0gMjsKLQkJCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4uc3RhcnQgPQotCQkJCQkJICAgIFhzYXZlcG9zKHdzLCB3cCk7Ci0JCQkJCQkqd3ArKyA9IEVYUFJTVUI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl1bmdldHNjKGMpOwotCQkJCQkJUFVTSF9TVEFURShTQ1NQQVJFTik7Ci0JCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbiA9IDE7Ci0JCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOwotCQkJCQkJKndwKysgPSBDT01TVUI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGMgPT0gJ3snKSAvKn0qLyB7Ci0JCQkJCSp3cCsrID0gT1NVQlNUOwotCQkJCQkqd3ArKyA9ICd7JzsgLyp9Ki8KLQkJCQkJd3AgPSBnZXRfYnJhY2VfdmFyKCZ3cywgd3ApOwotCQkJCQljID0gZ2V0c2MoKTsKLQkJCQkJLyogYWxsb3cgOiMgYW5kIDolIChrc2g4OCBjb21wYXQpICovCi0JCQkJCWlmIChjID09ICc6JykgewotCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQkJYyA9IGdldHNjKCk7Ci0JCQkJCQlpZiAoYyA9PSAnOicpIHsKLQkJCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkJKndwKysgPSAnMCc7Ci0JCQkJCQkJKndwKysgPSBBREVMSU07Ci0JCQkJCQkJKndwKysgPSAnOic7Ci0JCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOwotCQkJCQkJCVBVU0hfU1RBVEUoU0FERUxJTSk7Ci0JCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLnN0eWxlID0gU0FERUxJTV9CQVNIOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIgPSAnOic7Ci0JCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm51bSA9IDE7Ci0JCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpIHx8Ci0JCQkJCQkgICAgYyA9PSAnKCcvKikqLyB8fCBjID09ICcgJyB8fAotCQkJCQkJICAgIGMgPT0gJyQnIC8qIFhYWCB3aGF0IGVsc2U/ICovKSB7Ci0JCQkJCQkJLyogc3Vic3RyaW5nIHN1YnN0LiAqLwotCQkJCQkJCWlmIChjICE9ICcgJykgewotCQkJCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkJCSp3cCsrID0gJyAnOwotCQkJCQkJCX0KLQkJCQkJCQl1bmdldHNjKGMpOwotCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKLQkJCQkJCQlQVVNIX1NUQVRFKFNBREVMSU0pOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJzonOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPSAyOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGMgPT0gJy8nKSB7Ci0JCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCQlpZiAoKGMgPSBnZXRzYygpKSA9PSAnLycpIHsKLQkJCQkJCQkqd3ArKyA9IEFERUxJTTsKLQkJCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQl1bmdldHNjKGMpOwotCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOwotCQkJCQkJUFVTSF9TVEFURShTQURFTElNKTsKLQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKLQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIgPSAnLyc7Ci0JCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID0gMTsKLQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyogSWYgdGhpcyBpcyBhIHRyaW0gb3BlcmF0aW9uLAotCQkJCQkgKiB0cmVhdCAoLHwsKSBzcGVjaWFsbHkgaW4gU1RCUkFDRS4KLQkJCQkJICovCi0JCQkJCWlmIChjdHlwZShjLCBDX1NVQk9QMikpIHsKLQkJCQkJCXVuZ2V0c2MoYyk7Ci0JCQkJCQlQVVNIX1NUQVRFKFNUQlJBQ0UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5nZXRzYyhjKTsKLQkJCQkJCWlmIChzdGF0ZSA9PSBTRFFVT1RFKQotCQkJCQkJCVBVU0hfU1RBVEUoU1FCUkFDRSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChrc2hfaXNhbHBoeChjKSkgewotCQkJCQkqd3ArKyA9IE9TVUJTVDsKLQkJCQkJKndwKysgPSAnWCc7Ci0JCQkJCWRvIHsKLQkJCQkJCVhjaGVjayh3cywgd3ApOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQkJYyA9IGdldHNjKCk7Ci0JCQkJCX0gd2hpbGUgKGtzaF9pc2FsbnV4KGMpKTsKLQkJCQkJKndwKysgPSAnXDAnOwotCQkJCQkqd3ArKyA9IENTVUJTVDsKLQkJCQkJKndwKysgPSAnWCc7Ci0JCQkJCXVuZ2V0c2MoYyk7Ci0JCQkJfSBlbHNlIGlmIChjdHlwZShjLCBDX1ZBUjEgfCBDX0RJR0lUKSkgewotCQkJCQlYY2hlY2sod3MsIHdwKTsKLQkJCQkJKndwKysgPSBPU1VCU1Q7Ci0JCQkJCSp3cCsrID0gJ1gnOwotCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCSp3cCsrID0gJ1wwJzsKLQkJCQkJKndwKysgPSBDU1VCU1Q7Ci0JCQkJCSp3cCsrID0gJ1gnOwotCQkJCX0gZWxzZSBpZiAoYyA9PSAnXCcnICYmIChzdGF0ZSA9PSBTQkFTRSkpIHsKLQkJCQkJLyogWFhYIHdoaWNoIG90aGVyIHN0YXRlcyBhcmUgdmFsaWQ/ICovCi0JCQkJCSp3cCsrID0gT1FVT1RFOwotCQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKLQkJCQkJUFVTSF9TVEFURShTRVFVT1RFKTsKLQkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkqd3ArKyA9ICckJzsKLQkJCQkJdW5nZXRzYyhjKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdgJzoKLSBzdWJzdF9ncmF2aXM6Ci0JCQkJUFVTSF9TVEFURShTQlFVT1RFKTsKLQkJCQkqd3ArKyA9IENPTVNVQjsKLQkJCQkvKiBOZWVkIHRvIGtub3cgaWYgd2UgYXJlIGluc2lkZSBkb3VibGUgcXVvdGVzCi0JCQkJICogc2luY2Ugc2gvQVQmVC1rc2ggdHJhbnNsYXRlIHRoZSBcIiB0byAiIGluCi0JCQkJICogImAuLi5cIi4uLmAiLgotCQkJCSAqIFRoaXMgaXMgbm90IGRvbmUgaW4gUE9TSVggbW9kZSAoc2VjdGlvbgotCQkJCSAqIDMuMi4zLCBEb3VibGUgUXVvdGVzOiAiVGhlIGJhY2txdW90ZSBzaGFsbAotCQkJCSAqIHJldGFpbiBpdHMgc3BlY2lhbCBtZWFuaW5nIGludHJvZHVjaW5nIHRoZQotCQkJCSAqIG90aGVyIGZvcm0gb2YgY29tbWFuZCBzdWJzdGl0dXRpb24gKHNlZQotCQkJCSAqIDMuNi4zKS4gVGhlIHBvcnRpb24gb2YgdGhlIHF1b3RlZCBzdHJpbmcKLQkJCQkgKiBmcm9tIHRoZSBpbml0aWFsIGJhY2txdW90ZSBhbmQgdGhlCi0JCQkJICogY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCBiYWNrcXVvdGUgdGhhdAotCQkJCSAqIGlzIG5vdCBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaCAoaGF2aW5nCi0JCQkJICogZXNjYXBlIGNoYXJhY3RlcnMgcmVtb3ZlZCkgZGVmaW5lcyB0aGF0Ci0JCQkJICogY29tbWFuZCB3aG9zZSBvdXRwdXQgcmVwbGFjZXMgYC4uLmAgd2hlbgotCQkJCSAqIHRoZSB3b3JkIGlzIGV4cGFuZGVkLiIKLQkJCQkgKiBTZWN0aW9uIDMuNi4zLCBDb21tYW5kIFN1YnN0aXR1dGlvbjoKLQkJCQkgKiAiV2l0aGluIHRoZSBiYWNrcXVvdGVkIHN0eWxlIG9mIGNvbW1hbmQKLQkJCQkgKiBzdWJzdGl0dXRpb24sIGJhY2tzbGFzaCBzaGFsbCByZXRhaW4gaXRzCi0JCQkJICogbGl0ZXJhbCBtZWFuaW5nLCBleGNlcHQgd2hlbiBmb2xsb3dlZCBieQotCQkJCSAqICQgYCBcLiIpLgotCQkJCSAqLwotCQkJCXN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMgPSAwOwotCQkJCXMyID0gc3RhdGVwOwotCQkJCWJhc2UgPSBzdGF0ZV9pbmZvLmJhc2U7Ci0JCQkJd2hpbGUgKDEpIHsKLQkJCQkJZm9yICg7IHMyICE9IGJhc2U7IHMyLS0pIHsKLQkJCQkJCWlmIChzMi0+bHNfc3RhdGUgPT0gU0RRVU9URSkgewotCQkJCQkJCXN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMgPSAxOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzMiAhPSBiYXNlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmICghKHMyID0gczItPmxzX2luZm8uYmFzZSkpCi0JCQkJCQlicmVhazsKLQkJCQkJYmFzZSA9IHMyLS0gLSBTVEFURV9CU0laRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFDSEFSOgotCQkJCWlmIChjZiAmIExRQ0hBUikgewotCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkqd3ArKyA9IGdldHNjKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBGQUxMVEhST1VHSCAqLwotCQkJZGVmYXVsdDoKLSBzdG9yZV9jaGFyOgotCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkqd3ArKyA9IGM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNFUVVPVEU6Ci0JCQlpZiAoYyA9PSAnXCcnKSB7Ci0JCQkJUE9QX1NUQVRFKCk7Ci0JCQkJKndwKysgPSBDUVVPVEU7Ci0JCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ1xcJykgewotCQkJCWlmICgoYzIgPSB1bmJrc2wodHJ1ZSwgc19nZXQsIHNfcHV0KSkgPT0gLTEpCi0JCQkJCWMyID0gc19nZXQoKTsKLQkJCQlpZiAoYzIgPT0gMCkKLQkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSB0cnVlOwotCQkJCWlmICghc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwpIHsKLQkJCQkJY2hhciB0c1s0XTsKLQotCQkJCQlpZiAoKHVuc2lnbmVkIGludCljMiA8IDB4MTAwKSB7Ci0JCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkJKndwKysgPSBjMjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWMgPSB1dGZfd2N0b21iKHRzLCBjMiAtIDB4MTAwKTsKLQkJCQkJCXRzW2NdID0gMDsKLQkJCQkJCWZvciAoYyA9IDA7IHRzW2NdOyArK2MpIHsKLQkJCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkJCSp3cCsrID0gdHNbY107Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCkgewotCQkJCSp3cCsrID0gUUNIQVI7Ci0JCQkJKndwKysgPSBjOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU1FVT1RFOgotCQkJaWYgKGMgPT0gJ1wnJykgewotCQkJCVBPUF9TVEFURSgpOwotCQkJCSp3cCsrID0gQ1FVT1RFOwotCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOwotCQkJfSBlbHNlIHsKLQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCSp3cCsrID0gYzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU0RRVU9URToKLQkJCWlmIChjID09ICciJykgewotCQkJCVBPUF9TVEFURSgpOwotCQkJCSp3cCsrID0gQ1FVT1RFOwotCQkJfSBlbHNlCi0JCQkJZ290byBTdWJzdDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0NTUEFSRU46CS8qICQoIC4uLiApICovCi0JCQkvKiB0b2RvOiBkZWFsIHdpdGggJCguLi4pIHF1b3RpbmcgcHJvcGVybHkKLQkJCSAqIGtsdWRnZSB0byBwYXJ0bHkgZmFrZSBxdW90aW5nIGluc2lkZSAkKC4uLik6IGRvZXNuJ3QKLQkJCSAqIHJlYWxseSB3b3JrIGJlY2F1c2UgbmVzdGVkICQoLi4uKSBvciAkey4uLn0gaW5zaWRlCi0JCQkgKiBkb3VibGUgcXVvdGVzIGFyZW4ndCBkZWFsdCB3aXRoLgotCQkJICovCi0JCQlzd2l0Y2ggKHN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSkgewotCQkJY2FzZSAwOgkvKiBub3JtYWwgKi8KLQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICcoJzoKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKSc6Ci0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gNDsKLQkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgkvKiBiYWNrc2xhc2ggaW4gbm9ybWFsIG1vZGUgKi8KLQkJCWNhc2UgMzoJLyogYmFja3NsYXNoIGluIGRvdWJsZSBxdW90ZXMgKi8KLQkJCQktLXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOgkvKiBkb3VibGUgcXVvdGVzICovCi0JCQkJaWYgKGMgPT0gJyInKQotCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOwotCQkJCWVsc2UgaWYgKGMgPT0gJ1xcJykKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMzsKLQkJCQlicmVhazsKLQotCQkJY2FzZSA0OgkvKiBzaW5nbGUgcXVvdGVzICovCi0JCQkJaWYgKGMgPT0gJ1wnJykgewotCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOwotCQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPT0gMCkgewotCQkJCVBPUF9TVEFURSgpOwotCQkJCSp3cCsrID0gMDsJLyogZW5kIG9mIENPTVNVQiAqLwotCQkJfSBlbHNlCi0JCQkJKndwKysgPSBjOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTQVNQQVJFTjoJLyogJCgoIC4uLiApKSAqLwotCQkJLyogWFhYIHNob3VsZCBuZXN0IHVzaW5nIGV4aXN0aW5nIHN0YXRlIG1hY2hpbmUKLQkJCSAqIChlbWJlZCAiLi4uIiwgJCguLi4pLCBldGMuKSAqLwotCQkJaWYgKGMgPT0gJygnKQotCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuKys7Ci0JCQllbHNlIGlmIChjID09ICcpJykgewotCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuLS07Ci0JCQkJaWYgKHN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuID09IDEpIHsKLQkJCQkJLyooKi8KLQkJCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICcpJykgewotCQkJCQkJUE9QX1NUQVRFKCk7Ci0JCQkJCQkvKiBlbmQgb2YgRVhQUlNVQiAqLwotCQkJCQkJKndwKysgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGFyICpzOwotCi0JCQkJCQl1bmdldHNjKGMyKTsKLQkJCQkJCS8qIG1pc21hdGNoZWQgcGFyZW50aGVzaXMgLQotCQkJCQkJICogYXNzdW1lIHdlIHdlcmUgcmVhbGx5Ci0JCQkJCQkgKiBwYXJzaW5nIGEgJCguLi4pIGV4cHJlc3Npb24KLQkJCQkJCSAqLwotCQkJCQkJcyA9IFhyZXN0cG9zKHdzLCB3cCwKLQkJCQkJCSAgICBzdGF0ZXAtPmxzX3Nhc3BhcmVuLnN0YXJ0KTsKLQkJCQkJCW1lbW1vdmUocyArIDEsIHMsIHdwIC0gcyk7Ci0JCQkJCQkqcysrID0gQ09NU1VCOwotCQkJCQkJKnMgPSAnKCc7IC8qKSovCi0JCQkJCQl3cCsrOwotCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPSAxOwotCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKLQkJCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9Ci0JCQkJCQkgICAgU0NTUEFSRU47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkqd3ArKyA9IGM7Ci0JCQlicmVhazsKLQotCQljYXNlIFNRQlJBQ0U6Ci0JCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJLyoKLQkJCQkgKiBwZXJmb3JtIFBPU0lYICJxdW90ZSByZW1vdmFsIiBpZiB0aGUgYmFjay0KLQkJCQkgKiBzbGFzaCBpcyAic3BlY2lhbCIsIGkuZS4gc2FtZSBjYXNlcyBhcyB0aGUKLQkJCQkgKiB7Y2FzZSAnXFwnOn0gaW4gU3Vic3Q6IHBsdXMgY2xvc2luZyBicmFjZTsKLQkJCQkgKiBpbiBta3NoIGNvZGUgInF1b3RlIHJlbW92YWwiIG9uICdcYycgbWVhbnMKLQkJCQkgKiB3cml0ZSBRQ0hBUitjLCBvdGhlcndpc2UgQ0hBUitcK0NIQVIrYyBhcmUKLQkJCQkgKiBlbWl0dGVkIChpbiBoZXJlZG9jcXVvdGU6KQotCQkJCSAqLwotCQkJCWlmICgoYyA9IGdldHNjKCkpID09ICciJyB8fCBjID09ICdcXCcgfHwKLQkJCQkgICAgYyA9PSAnJCcgfHwgYyA9PSAnYCcgfHwgYyA9PSAvKnsqLyd9JykKLQkJCQkJZ290byBzdG9yZV9xY2hhcjsKLQkJCQlnb3RvIGhlcmVkb2NxdW90ZTsKLQkJCX0KLQkJCWdvdG8gY29tbW9uX1NRQlJBQ0U7Ci0KLQkJY2FzZSBTQlJBQ0U6Ci0JCQlpZiAoYyA9PSAnXCcnKQotCQkJCWdvdG8gb3Blbl9zc3F1b3RlOwotCQkJZWxzZSBpZiAoYyA9PSAnXFwnKQotCQkJCWdvdG8gZ2V0c2NfcWNoYXI7Ci0gY29tbW9uX1NRQlJBQ0U6Ci0JCQlpZiAoYyA9PSAnIicpCi0JCQkJZ290byBvcGVuX3NkcXVvdGU7Ci0JCQllbHNlIGlmIChjID09ICckJykKLQkJCQlnb3RvIHN1YnN0X2RvbGxhcjsKLQkJCWVsc2UgaWYgKGMgPT0gJ2AnKQotCQkJCWdvdG8gc3Vic3RfZ3JhdmlzOwotCQkJZWxzZSBpZiAoYyAhPSAvKnsqLyAnfScpCi0JCQkJZ290byBzdG9yZV9jaGFyOwotCQkJUE9QX1NUQVRFKCk7Ci0JCQkqd3ArKyA9IENTVUJTVDsKLQkJCSp3cCsrID0gLyp7Ki8gJ30nOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEJSQUNFOgotCQkJLyogU2FtZSBhcyBTQkFTRSwgZXhjZXB0ICgsfCwpIHRyZWF0ZWQgc3BlY2lhbGx5ICovCi0JCQlpZiAoYyA9PSAvKnsqLyAnfScpIHsKLQkJCQlQT1BfU1RBVEUoKTsKLQkJCQkqd3ArKyA9IENTVUJTVDsKLQkJCQkqd3ArKyA9IC8qeyovICd9JzsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnfCcpIHsKLQkJCQkqd3ArKyA9IFNQQVQ7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJygnKSB7Ci0JCQkJKndwKysgPSBPUEFUOwotCQkJCSp3cCsrID0gJyAnOwkvKiBzaW1pbGUgZm9yIEAgKi8KLQkJCQlQVVNIX1NUQVRFKFNQQVRURVJOKTsKLQkJCX0gZWxzZQotCQkJCWdvdG8gU2Jhc2UxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTQlFVT1RFOgotCQkJaWYgKGMgPT0gJ2AnKSB7Ci0JCQkJKndwKysgPSAwOwotCQkJCVBPUF9TVEFURSgpOwotCQkJfSBlbHNlIGlmIChjID09ICdcXCcpIHsKLQkJCQlzd2l0Y2ggKGMgPSBnZXRzYygpKSB7Ci0JCQkJY2FzZSAnXFwnOgotCQkJCWNhc2UgJyQnOiBjYXNlICdgJzoKLQkJCQkJKndwKysgPSBjOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzoKLQkJCQkJaWYgKHN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMpIHsKLQkJCQkJCSp3cCsrID0gYzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qIEZBTExUSFJPVUdIICovCi0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKGMpIHsKLQkJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLwotCQkJCQkJKndwKysgPSAnXFwnOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCSp3cCsrID0gYzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1dPUkQ6CS8qIE9ORVdPUkQgKi8KLQkJCWdvdG8gU3Vic3Q7Ci0KLQkJY2FzZSBTTEVUUEFSRU46CS8qIExFVEVYUFI6ICgoIC4uLiApKSAqLwotCQkJLyooKi8KLQkJCWlmIChjID09ICcpJykgewotCQkJCWlmIChzdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW4gPiAwKQotCQkJCQktLXN0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbjsKLQkJCQllbHNlIGlmICgoYzIgPSBnZXRzYygpKSA9PSAvKigqLyAnKScpIHsKLQkJCQkJYyA9IDA7Ci0JCQkJCSp3cCsrID0gQ1FVT1RFOwotCQkJCQlnb3RvIERvbmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU291cmNlICpzOwotCi0JCQkJCXVuZ2V0c2MoYzIpOwotCQkJCQkvKiBtaXNtYXRjaGVkIHBhcmVudGhlc2lzIC0KLQkJCQkJICogYXNzdW1lIHdlIHdlcmUgcmVhbGx5Ci0JCQkJCSAqIHBhcnNpbmcgYSAkKC4uLikgZXhwcmVzc2lvbgotCQkJCQkgKi8KLQkJCQkJKndwID0gRU9TOwotCQkJCQlzcCA9IFhzdHJpbmcod3MsIHdwKTsKLQkJCQkJZHAgPSB3ZHN0cmlwKHNwLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCXMgPSBwdXNocyhTUkVSRUFELCBzb3VyY2UtPmFyZWFwKTsKLQkJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBzLT51LmZyZWVtZSA9IGRwOwotCQkJCQlzLT5uZXh0ID0gc291cmNlOwotCQkJCQlzb3VyY2UgPSBzOwotCQkJCQlyZXR1cm4gKCcoJy8qKSovKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJygnKQotCQkJCS8qIHBhcmVudGhlc2lzIGluc2lkZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzCi0JCQkJICogYXJlIGxvc3QsIGJ1dCBBVCZUIGtzaCBkb2Vzbid0IGNvdW50IHRoZW0KLQkJCQkgKiBlaXRoZXIKLQkJCQkgKi8KLQkJCQkrK3N0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbjsKLQkJCWdvdG8gU2Jhc2UyOwotCi0jaWZuZGVmIE1LU0hfU01BTEwKLQkJY2FzZSBTTEVUQVJSQVk6CS8qIExFVEFSUkFZOiA9KCAuLi4gKSAqLwotCQkJaWYgKGMgPT0gJygnLyopKi8pCi0JCQkJKytzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW47Ci0JCQllbHNlIGlmIChjID09IC8qKCovJyknKQotCQkJCWlmIChzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW4tLSA9PSAwKSB7Ci0JCQkJCWMgPSAwOwotCQkJCQlnb3RvIERvbmU7Ci0JCQkJfQotCQkJKndwKysgPSBDSEFSOwotCQkJKndwKysgPSBjOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQljYXNlIFNIRVJFU1RSSU5HOgkvKiA8PDwgZGVsaW1pdGVyICovCi0JCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJYyA9IGdldHNjKCk7Ci0JCQkJaWYgKGMpIHsKLQkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCi0JCQkJCSp3cCsrID0gUUNIQVI7Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQl9Ci0JCQkJLyogaW52b2tlIHF1b3RpbmcgbW9kZSAqLwotCQkJCVhzdHJpbmcod3MsIHdwKVswXSA9IFFDSEFSOwotCQkJfSBlbHNlIGlmIChjID09ICckJykgewotCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnXCcnKSB7Ci0JCQkJCVBVU0hfU1RBVEUoU0VRVU9URSk7Ci0JCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gZmFsc2U7Ci0JCQkJCWdvdG8gc2hlcmVzdHJpbmdfcXVvdGVkOwotCQkJCX0KLQkJCQl1bmdldHNjKGMyKTsKLQkJCQlnb3RvIHNoZXJlc3RyaW5nX3JlZ3VsYXI7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgewotCQkJCVBVU0hfU1RBVEUoU1NRVU9URSk7Ci0gc2hlcmVzdHJpbmdfcXVvdGVkOgotCQkJCSp3cCsrID0gT1FVT1RFOwotCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOwotCQkJCS8qIGludm9rZSBxdW90aW5nIG1vZGUgKi8KLQkJCQlYc3RyaW5nKHdzLCB3cClbMF0gPSBRQ0hBUjsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnIicpIHsKLQkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPSBTSEVSRURRVU9URTsKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQkvKiBqdXN0IGRvbid0IElGUyBzcGxpdDsgbm8gcXVvdGluZyBtb2RlICovCi0JCQl9IGVsc2UgewotIHNoZXJlc3RyaW5nX3JlZ3VsYXI6Ci0JCQkJKndwKysgPSBDSEFSOwotCQkJCSp3cCsrID0gYzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU0hFUkVERUxJTToJLyogPDwsPDwtIGRlbGltaXRlciAqLwotCQkJLyogWFhYIGNodWNrIHRoaXMgc3RhdGUgKGFuZCB0aGUgbmV4dCkgLSB1c2UKLQkJCSAqIHRoZSBleGlzdGluZyBzdGF0ZXMgKCQgYW5kIFxgLi4uYCBzaG91bGQgYmUKLQkJCSAqIHN0cmlwcGVkIG9mIHRoZWlyIHNwZWNpYWxuZXNzIGFmdGVyIHRoZQotCQkJICogZmFjdCkuCi0JCQkgKi8KLQkJCS8qIGhlcmUgZGVsaW1pdGVycyBuZWVkIGEgc3BlY2lhbCBjYXNlIHNpbmNlCi0JCQkgKiAkIGFuZCBgLi4uYCBhcmUgbm90IHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5Ci0JCQkgKi8KLQkJCWlmIChjID09ICdcXCcpIHsKLQkJCQljID0gZ2V0c2MoKTsKLQkJCQlpZiAoYykgewotCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KLQkJCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkJKndwKysgPSBjOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYyA9PSAnJCcpIHsKLQkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJ1wnJykgewotCQkJCQlQVVNIX1NUQVRFKFNFUVVPVEUpOwotCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IGZhbHNlOwotCQkJCQlnb3RvIHNoZXJlZGVsaW1fcXVvdGVkOwotCQkJCX0KLQkJCQl1bmdldHNjKGMyKTsKLQkJCQlnb3RvIHNoZXJlZGVsaW1fcmVndWxhcjsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7Ci0JCQkJUFVTSF9TVEFURShTU1FVT1RFKTsKLSBzaGVyZWRlbGltX3F1b3RlZDoKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnIicpIHsKLQkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPSBTSEVSRURRVU9URTsKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCX0gZWxzZSB7Ci0gc2hlcmVkZWxpbV9yZWd1bGFyOgotCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkqd3ArKyA9IGM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNIRVJFRFFVT1RFOgkvKiAiIGluIDw8LDw8LSBkZWxpbWl0ZXIgKi8KLQkJCWlmIChjID09ICciJykgewotCQkJCSp3cCsrID0gQ1FVT1RFOwotCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9Ci0JCQkJICAgIC8qIGRwWzFdID09ICc8JyBtZWFucyBoZXJlIHN0cmluZyAqLwotCQkJCSAgICBYc3RyaW5nKHdzLCB3cClbMV0gPT0gJzwnID8KLQkJCQkgICAgU0hFUkVTVFJJTkcgOiBTSEVSRURFTElNOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJCXN3aXRjaCAoYyA9IGdldHNjKCkpIHsKLQkJCQkJY2FzZSAnXFwnOiBjYXNlICciJzoKLQkJCQkJY2FzZSAnJCc6IGNhc2UgJ2AnOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlpZiAoYykgewotCQkJCQkJCS8qIHRyYWlsaW5nIFwgbG9zdCAqLwotCQkJCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkJCQkqd3ArKyA9ICdcXCc7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJKndwKysgPSBjOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEFUVEVSTjoJLyogaW4gKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KLQkJCWlmICggLyooKi8gYyA9PSAnKScpIHsKLQkJCQkqd3ArKyA9IENQQVQ7Ci0JCQkJUE9QX1NUQVRFKCk7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7Ci0JCQkJKndwKysgPSBTUEFUOwotCQkJfSBlbHNlIGlmIChjID09ICcoJykgewotCQkJCSp3cCsrID0gT1BBVDsKLQkJCQkqd3ArKyA9ICcgJzsJLyogc2ltaWxlIGZvciBAICovCi0JCQkJUFVTSF9TVEFURShTUEFUVEVSTik7Ci0JCQl9IGVsc2UKLQkJCQlnb3RvIFNiYXNlMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotIERvbmU6Ci0JWGNoZWNrKHdzLCB3cCk7Ci0JaWYgKHN0YXRlcCAhPSAmc3RhdGVzWzFdKQotCQkvKiBYWFggZmlndXJlIG91dCB3aGF0IGlzIG1pc3NpbmcgKi8KLQkJeXllcnJvcigibm8gY2xvc2luZyBxdW90ZVxuIik7Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCWlmIChzdGF0ZSA9PSBTTEVUQVJSQVkgJiYgc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuICE9IC0xKQotCQl5eWVycm9yKCIlczogJyknIG1pc3NpbmdcbiIsIFRfc3luZXJyKTsKLSNlbmRpZgotCi0JLyogVGhpcyBkb25lIHRvIGF2b2lkIHRlc3RzIGZvciBTSEVSRURFTElNIHdoZXJldmVyIFNCQVNFIHRlc3RlZCAqLwotCWlmIChzdGF0ZSA9PSBTSEVSRURFTElNIHx8IHN0YXRlID09IFNIRVJFU1RSSU5HKQotCQlzdGF0ZSA9IFNCQVNFOwotCi0JZHAgPSBYc3RyaW5nKHdzLCB3cCk7Ci0JaWYgKChjID09ICc8JyB8fCBjID09ICc+JyB8fCBjID09ICcmJykgJiYgc3RhdGUgPT0gU0JBU0UpIHsKLQkJc3RydWN0IGlvd29yZCAqaW9wID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dvcmQpLCBBVEVNUCk7Ci0KLQkJaWYgKFhsZW5ndGgod3MsIHdwKSA9PSAwKQotCQkJaW9wLT51bml0ID0gYyA9PSAnPCcgPyAwIDogMTsKLQkJZWxzZSBmb3IgKGlvcC0+dW5pdCA9IDAsIGMyID0gMDsgYzIgPCBYbGVuZ3RoKHdzLCB3cCk7IGMyICs9IDIpIHsKLQkJCWlmIChkcFtjMl0gIT0gQ0hBUikKLQkJCQlnb3RvIG5vX2lvcDsKLQkJCWlmICgha3NoX2lzZGlnaXQoZHBbYzIgKyAxXSkpCi0JCQkJZ290byBub19pb3A7Ci0JCQlpb3AtPnVuaXQgPSAoaW9wLT51bml0ICogMTApICsgZHBbYzIgKyAxXSAtICcwJzsKLQkJfQotCi0JCWlmIChpb3AtPnVuaXQgPj0gRkRCQVNFKQotCQkJZ290byBub19pb3A7Ci0KLQkJaWYgKGMgPT0gJyYnKSB7Ci0JCQlpZiAoKGMyID0gZ2V0c2MoKSkgIT0gJz4nKSB7Ci0JCQkJdW5nZXRzYyhjMik7Ci0JCQkJZ290byBub19pb3A7Ci0JCQl9Ci0JCQljID0gYzI7Ci0JCQlpb3AtPmZsYWcgPSBJT0JBU0g7Ci0JCX0gZWxzZQotCQkJaW9wLT5mbGFnID0gMDsKLQotCQljMiA9IGdldHNjKCk7Ci0JCS8qIDw8LCA+PiwgPD4gYXJlIG9rLCA+PCBpcyBub3QgKi8KLQkJaWYgKGMgPT0gYzIgfHwgKGMgPT0gJzwnICYmIGMyID09ICc+JykpIHsKLQkJCWlvcC0+ZmxhZyB8PSBjID09IGMyID8KLQkJCSAgICAoYyA9PSAnPicgPyBJT0NBVCA6IElPSEVSRSkgOiBJT1JEV1I7Ci0JCQlpZiAoaW9wLT5mbGFnID09IElPSEVSRSkgewotCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnLScpCi0JCQkJCWlvcC0+ZmxhZyB8PSBJT1NLSVA7Ci0JCQkJZWxzZQotCQkJCQl1bmdldHNjKGMyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjMiA9PSAnJicpCi0JCQlpb3AtPmZsYWcgfD0gSU9EVVAgfCAoYyA9PSAnPCcgPyBJT1JEVVAgOiAwKTsKLQkJZWxzZSB7Ci0JCQlpb3AtPmZsYWcgfD0gYyA9PSAnPicgPyBJT1dSSVRFIDogSU9SRUFEOwotCQkJaWYgKGMgPT0gJz4nICYmIGMyID09ICd8JykKLQkJCQlpb3AtPmZsYWcgfD0gSU9DTE9COwotCQkJZWxzZQotCQkJCXVuZ2V0c2MoYzIpOwotCQl9Ci0KLQkJaW9wLT5uYW1lID0gTlVMTDsKLQkJaW9wLT5kZWxpbSA9IE5VTEw7Ci0JCWlvcC0+aGVyZWRvYyA9IE5VTEw7Ci0JCVhmcmVlKHdzLCB3cCk7CS8qIGZyZWUgd29yZCAqLwotCQl5eWx2YWwuaW9wID0gaW9wOwotCQlyZXR1cm4gKFJFRElSKTsKLSBub19pb3A6Ci0JCTsKLQl9Ci0KLQlpZiAod3AgPT0gZHAgJiYgc3RhdGUgPT0gU0JBU0UpIHsKLQkJWGZyZWUod3MsIHdwKTsJLyogZnJlZSB3b3JkICovCi0JCS8qIG5vIHdvcmQsIHByb2Nlc3MgTEVYMSBjaGFyYWN0ZXIgKi8KLQkJaWYgKChjID09ICd8JykgfHwgKGMgPT0gJyYnKSB8fCAoYyA9PSAnOycpIHx8IChjID09ICcoJy8qKSovKSkgewotCQkJaWYgKChjMiA9IGdldHNjKCkpID09IGMpCi0JCQkJYyA9IChjID09ICc7JykgPyBCUkVBSyA6Ci0JCQkJICAgIChjID09ICd8JykgPyBMT0dPUiA6Ci0JCQkJICAgIChjID09ICcmJykgPyBMT0dBTkQgOgotCQkJCSAgICAvKiBjID09ICcoJyApICovIE1EUEFSRU47Ci0JCQllbHNlIGlmIChjID09ICd8JyAmJiBjMiA9PSAnJicpCi0JCQkJYyA9IENPUFJPQzsKLQkJCWVsc2UKLQkJCQl1bmdldHNjKGMyKTsKLQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKLQkJCWdldGhlcmUoZmFsc2UpOwotCQkJaWYgKGNmICYgQ09OVElOKQotCQkJCWdvdG8gQWdhaW47Ci0JCX0gZWxzZSBpZiAoYyA9PSAnXDAnKQotCQkJLyogbmVlZCBoZXJlIHN0cmluZ3MgYXQgRU9GICovCi0JCQlnZXRoZXJlKHRydWUpOwotCQlyZXR1cm4gKGMpOwotCX0KLQotCSp3cCsrID0gRU9TOwkJLyogdGVybWluYXRlIHdvcmQgKi8KLQl5eWx2YWwuY3AgPSBYY2xvc2Uod3MsIHdwKTsKLQlpZiAoc3RhdGUgPT0gU1dPUkQgfHwgc3RhdGUgPT0gU0xFVFBBUkVOCi0JICAgIC8qIFhYWCBPTkVXT1JEPyAqLwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JICAgIHx8IHN0YXRlID09IFNMRVRBUlJBWQotI2VuZGlmCi0JICAgICkKLQkJcmV0dXJuIChMV09SRCk7Ci0KLQkvKiB1bmdldCB0ZXJtaW5hdG9yICovCi0JdW5nZXRzYyhjKTsKLQotCS8qCi0JICogbm90ZTogdGhlIGFsaWFzLXZzLWZ1bmN0aW9uIGNvZGUgYmVsb3cgZGVwZW5kcyBvbiBzZXZlcmFsCi0JICogaW50ZXJuYTogc3RhcnRpbmcgZnJvbSBoZXJlLCBzb3VyY2UtPnN0ciBpcyBub3QgbW9kaWZpZWQ7Ci0JICogdGhlIHdheSBnZXRzYygpIGFuZCB1bmdldHNjKCkgb3BlcmF0ZTsgZXRjLgotCSAqLwotCi0JLyogY29weSB3b3JkIHRvIHVucHJlZml4ZWQgc3RyaW5nIGlkZW50ICovCi0Jc3AgPSB5eWx2YWwuY3A7Ci0JZHAgPSBpZGVudDsKLQlpZiAoKGNmICYgSEVSRURFTElNKSAmJiAoc3BbMV0gPT0gJzwnKSkKLQkJd2hpbGUgKGRwIDwgaWRlbnQrSURFTlQpIHsKLQkJCWlmICgoYyA9ICpzcCsrKSA9PSBDSEFSKQotCQkJCSpkcCsrID0gKnNwKys7Ci0JCQllbHNlIGlmICgoYyAhPSBPUVVPVEUpICYmIChjICE9IENRVU9URSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQllbHNlCi0JCXdoaWxlIChkcCA8IGlkZW50K0lERU5UICYmIChjID0gKnNwKyspID09IENIQVIpCi0JCQkqZHArKyA9ICpzcCsrOwotCS8qIE1ha2Ugc3VyZSB0aGUgaWRlbnQgYXJyYXkgc3RheXMgJ1wwJyBwYWRkZWQgKi8KLQltZW1zZXQoZHAsIDAsIChpZGVudCtJREVOVCkgLSBkcCArIDEpOwotCWlmIChjICE9IEVPUykKLQkJKmlkZW50ID0gJ1wwJzsJLyogd29yZCBpcyBub3QgdW5xdW90ZWQgKi8KLQotCWlmICgqaWRlbnQgIT0gJ1wwJyAmJiAoY2YmKEtFWVdPUkR8QUxJQVMpKSkgewotCQlzdHJ1Y3QgdGJsICpwOwotCQl1aW50MzJfdCBoID0gaGFzaChpZGVudCk7Ci0KLQkJLyogeyAqLwotCQlpZiAoKGNmICYgS0VZV09SRCkgJiYgKHAgPSBrdHNlYXJjaCgma2V5d29yZHMsIGlkZW50LCBoKSkgJiYKLQkJICAgICghKGNmICYgRVNBQ09OTFkpIHx8IHAtPnZhbC5pID09IEVTQUMgfHwgcC0+dmFsLmkgPT0gJ30nKSkgewotCQkJYWZyZWUoeXlsdmFsLmNwLCBBVEVNUCk7Ci0JCQlyZXR1cm4gKHAtPnZhbC5pKTsKLQkJfQotCQlpZiAoKGNmICYgQUxJQVMpICYmIChwID0ga3RzZWFyY2goJmFsaWFzZXMsIGlkZW50LCBoKSkgJiYKLQkJICAgIChwLT5mbGFnICYgSVNTRVQpKSB7Ci0JCQkvKgotCQkJICogdGhpcyBzdGlsbCBwb2ludHMgdG8gdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZQotCQkJICogdW5nZXRzYydkIHRlcm1pbmF0b3IgZnJvbSBhYm92ZQotCQkJICovCi0JCQljb25zdCBjaGFyICpjcCA9IHNvdXJjZS0+c3RyOwotCi0JCQkvKiBwcmVmZXIgUE9TSVggYnV0IG5vdCBLb3JuIGZ1bmN0aW9ucyBvdmVyIGFsaWFzZXMgKi8KLQkJCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQotCQkJCS8qCi0JCQkJICogdGhpcyBpcyBsaWtlIGdldHNjKCkgd2l0aG91dCBza2lwcGluZwotCQkJCSAqIG92ZXIgU291cmNlIGJvdW5kYXJpZXMgKGluY2x1ZGluZyBub3QKLQkJCQkgKiBwYXJzaW5nIHVuZ2V0c2MnZCBjaGFyYWN0ZXJzIHRoYXQgZ290Ci0JCQkJICogcHVzaGVkIGludG8gYW4gU1JFUkVBRCkgd2hpY2ggaXMgd2hhdAotCQkJCSAqIHdlIHdhbnQgaGVyZSBhbnl3YXk6IGZpbmQgb3V0IHdoZXRoZXIKLQkJCQkgKiB0aGUgYWxpYXMgbmFtZSBpcyBmb2xsb3dlZCBieSBhIFBPU0lYCi0JCQkJICogZnVuY3Rpb24gZGVmaW5pdGlvbiAob25seSB0aGUgb3BlbmluZwotCQkJCSAqIHBhcmVudGhlc2lzIGlzIGNoZWNrZWQgdGhvdWdoKQotCQkJCSAqLwotCQkJCSsrY3A7Ci0JCQkvKiBwcmVmZXIgZnVuY3Rpb25zIG92ZXIgYWxpYXNlcyAqLwotCQkJaWYgKCpjcCA9PSAnKCcgLyopKi8pCi0JCQkJLyoKLQkJCQkgKiBkZWxldGUgYWxpYXMgdXBvbiBlbmNvdW50ZXJpbmcgZnVuY3Rpb24KLQkJCQkgKiBkZWZpbml0aW9uCi0JCQkJICovCi0JCQkJa3RkZWxldGUocCk7Ci0JCQllbHNlIHsKLQkJCQlTb3VyY2UgKnMgPSBzb3VyY2U7Ci0KLQkJCQl3aGlsZSAocyAmJiAocy0+ZmxhZ3MgJiBTRl9IQVNBTElBUykpCi0JCQkJCWlmIChzLT51LnRibHAgPT0gcCkKLQkJCQkJCXJldHVybiAoTFdPUkQpOwotCQkJCQllbHNlCi0JCQkJCQlzID0gcy0+bmV4dDsKLQkJCQkvKiBwdXNoIGFsaWFzIGV4cGFuc2lvbiAqLwotCQkJCXMgPSBwdXNocyhTQUxJQVMsIHNvdXJjZS0+YXJlYXApOwotCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcC0+dmFsLnM7Ci0JCQkJcy0+dS50YmxwID0gcDsKLQkJCQlzLT5mbGFncyB8PSBTRl9IQVNBTElBUzsKLQkJCQlzLT5uZXh0ID0gc291cmNlOwotCQkJCWlmIChzb3VyY2UtPnR5cGUgPT0gU0VPRikgewotCQkJCQkvKiBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBhdCBFT1MgKi8KLQkJCQkJc291cmNlLT51LnRibHAgPSBwOwotCQkJCQlzb3VyY2UtPmZsYWdzIHw9IFNGX0hBU0FMSUFTOwotCQkJCX0KLQkJCQlzb3VyY2UgPSBzOwotCQkJCWFmcmVlKHl5bHZhbC5jcCwgQVRFTVApOwotCQkJCWdvdG8gQWdhaW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKExXT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWdldGhlcmUoYm9vbCBpc2VvZikKLXsKLQlzdHJ1Y3QgaW93b3JkICoqcDsKLQotCWZvciAocCA9IGhlcmVzOyBwIDwgaGVyZXA7IHArKykKLQkJaWYgKGlzZW9mICYmICgqcCktPmRlbGltWzFdICE9ICc8JykKLQkJCS8qIG9ubHkgaGVyZSBzdHJpbmdzIGF0IEVPRiAqLwotCQkJcmV0dXJuOwotCQllbHNlCi0JCQlyZWFkaGVyZSgqcCk7Ci0JaGVyZXAgPSBoZXJlczsKLX0KLQotLyoKLSAqIHJlYWQgIjw8d29yZCIgdGV4dCBpbnRvIHRlbXAgZmlsZQotICovCi0KLXN0YXRpYyB2b2lkCi1yZWFkaGVyZShzdHJ1Y3QgaW93b3JkICppb3ApCi17Ci0JaW50IGM7Ci0JY2hhciAqdm9sYXRpbGUgZW9mOwotCWNoYXIgKmVvZnA7Ci0JaW50IHNraXB0YWJzOwotCVhTdHJpbmcgeHM7Ci0JY2hhciAqeHA7Ci0JaW50IHhwb3M7Ci0KLQlpZiAoaW9wLT5kZWxpbVsxXSA9PSAnPCcpIHsKLQkJLyogcHJvY2VzcyB0aGUgaGVyZSBzdHJpbmcgKi8KLQkJeHAgPSBpb3AtPmhlcmVkb2MgPSBldmFsc3RyKGlvcC0+ZGVsaW0sIERPQkxBTkspOwotCQljID0gc3RybGVuKHhwKSAtIDE7Ci0JCW1lbW1vdmUoeHAsIHhwICsgMSwgYyk7Ci0JCXhwW2NdID0gJ1xuJzsKLQkJcmV0dXJuOwotCX0KLQotCWVvZiA9IGV2YWxzdHIoaW9wLT5kZWxpbSwgMCk7Ci0KLQlpZiAoIShpb3AtPmZsYWcgJiBJT0VWQUwpKQotCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKLQotCVhpbml0KHhzLCB4cCwgMjU2LCBBVEVNUCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCWVvZnAgPSBlb2Y7Ci0JCXNraXB0YWJzID0gaW9wLT5mbGFnICYgSU9TS0lQOwotCQl4cG9zID0gWHNhdmVwb3MoeHMsIHhwKTsKLQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gMCkgewotCQkJaWYgKHNraXB0YWJzKSB7Ci0JCQkJaWYgKGMgPT0gJ1x0JykKLQkJCQkJY29udGludWU7Ci0JCQkJc2tpcHRhYnMgPSAwOwotCQkJfQotCQkJaWYgKGMgIT0gKmVvZnApCi0JCQkJYnJlYWs7Ci0JCQlYY2hlY2soeHMsIHhwKTsKLQkJCVhwdXQoeHMsIHhwLCBjKTsKLQkJCWVvZnArKzsKLQkJfQotCQkvKiBBbGxvdyBFT0YgaGVyZSBzbyBjb21tYW5kcyB3aXRoIG91dCB0cmFpbGluZyBuZXdsaW5lcwotCQkgKiB3aWxsIHdvcmsgKGVnLCBrc2ggLWMgJy4uLicsICQoLi4uKSwgZXRjKS4KLQkJICovCi0JCWlmICgqZW9mcCA9PSAnXDAnICYmIChjID09IDAgfHwgYyA9PSAnXG4nKSkgewotCQkJeHAgPSBYcmVzdHBvcyh4cywgeHAsIHhwb3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdW5nZXRzYyhjKTsKLQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gJ1xuJykgewotCQkJaWYgKGMgPT0gMCkKLQkJCQl5eWVycm9yKCJoZXJlIGRvY3VtZW50ICclcycgdW5jbG9zZWRcbiIsIGVvZik7Ci0JCQlYY2hlY2soeHMsIHhwKTsKLQkJCVhwdXQoeHMsIHhwLCBjKTsKLQkJfQotCQlYY2hlY2soeHMsIHhwKTsKLQkJWHB1dCh4cywgeHAsIGMpOwotCX0KLQlYcHV0KHhzLCB4cCwgJ1wwJyk7Ci0JaW9wLT5oZXJlZG9jID0gWGNsb3NlKHhzLCB4cCk7Ci0KLQlpZiAoIShpb3AtPmZsYWcgJiBJT0VWQUwpKQotCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKLX0KLQotdm9pZAoteXllcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0JLyogcG9wIGFsaWFzZXMgYW5kIHJlLXJlYWRzICovCi0Jd2hpbGUgKHNvdXJjZS0+dHlwZSA9PSBTQUxJQVMgfHwgc291cmNlLT50eXBlID09IFNSRVJFQUQpCi0JCXNvdXJjZSA9IHNvdXJjZS0+bmV4dDsKLQlzb3VyY2UtPnN0ciA9IG51bGw7CS8qIHphcCBwZW5kaW5nIGlucHV0ICovCi0KLQllcnJvcl9wcmVmaXgodHJ1ZSk7Ci0JdmFfc3RhcnQodmEsIGZtdCk7Ci0Jc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JZXJyb3JmeigpOwotfQotCi0vKgotICogaW5wdXQgZm9yIHl5bGV4IHdpdGggYWxpYXMgZXhwYW5zaW9uCi0gKi8KLQotU291cmNlICoKLXB1c2hzKGludCB0eXBlLCBBcmVhICphcmVhcCkKLXsKLQlTb3VyY2UgKnM7Ci0KLQlzID0gYWxsb2Moc2l6ZW9mKFNvdXJjZSksIGFyZWFwKTsKLQltZW1zZXQocywgMCwgc2l6ZW9mKFNvdXJjZSkpOwotCXMtPnR5cGUgPSB0eXBlOwotCXMtPnN0ciA9IG51bGw7Ci0Jcy0+YXJlYXAgPSBhcmVhcDsKLQlpZiAodHlwZSA9PSBTRklMRSB8fCB0eXBlID09IFNTVERJTikKLQkJWGluaXROKHMtPnhzLCAyNTYsIHMtPmFyZWFwKTsKLQlyZXR1cm4gKHMpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRzY19fKHZvaWQpCi17Ci0JU291cmNlICpzID0gc291cmNlOwotCWludCBjOwotCi0gZ2V0c2NfYWdhaW46Ci0Jd2hpbGUgKChjID0gKnMtPnN0cisrKSA9PSAwKSB7Ci0JCXMtPnN0ciA9IE5VTEw7CQkvKiByZXR1cm4gMCBmb3IgRU9GIGJ5IGRlZmF1bHQgKi8KLQkJc3dpdGNoIChzLT50eXBlKSB7Ci0JCWNhc2UgU0VPRjoKLQkJCXMtPnN0ciA9IG51bGw7Ci0JCQlyZXR1cm4gKDApOwotCi0JCWNhc2UgU1NURElOOgotCQljYXNlIFNGSUxFOgotCQkJZ2V0c2NfbGluZShzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1dTVFI6Ci0JCQlicmVhazsKLQotCQljYXNlIFNTVFJJTkc6Ci0JCQlicmVhazsKLQotCQljYXNlIFNXT1JEUzoKLQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gKnMtPnUuc3RydisrOwotCQkJcy0+dHlwZSA9IFNXT1JEU0VQOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTV09SRFNFUDoKLQkJCWlmICgqcy0+dS5zdHJ2ID09IE5VTEwpIHsKLQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9ICJcbiI7Ci0JCQkJcy0+dHlwZSA9IFNFT0Y7Ci0JCQl9IGVsc2UgewotCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gIiAiOwotCQkJCXMtPnR5cGUgPSBTV09SRFM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNBTElBUzoKLQkJCWlmIChzLT5mbGFncyAmIFNGX0FMSUFTRU5EKSB7Ci0JCQkJLyogcGFzcyBvbiBhbiB1bnVzZWQgU0ZfQUxJQVMgZmxhZyAqLwotCQkJCXNvdXJjZSA9IHMtPm5leHQ7Ci0JCQkJc291cmNlLT5mbGFncyB8PSBzLT5mbGFncyAmIFNGX0FMSUFTOwotCQkJCXMgPSBzb3VyY2U7Ci0JCQl9IGVsc2UgaWYgKCpzLT51LnRibHAtPnZhbC5zICYmCi0JCQkgICAgKGMgPSBzdHJudWwocy0+dS50YmxwLT52YWwucylbLTFdLCBrc2hfaXNzcGFjZShjKSkpIHsKLQkJCQlzb3VyY2UgPSBzID0gcy0+bmV4dDsJLyogcG9wIHNvdXJjZSBzdGFjayAqLwotCQkJCS8qIE5vdGUgdGhhdCB0aGlzIGFsaWFzIGVuZGVkIHdpdGggYSBzcGFjZSwKLQkJCQkgKiBlbmFibGluZyBhbGlhcyBleHBhbnNpb24gb24gdGhlIGZvbGxvd2luZwotCQkJCSAqIHdvcmQuCi0JCQkJICovCi0JCQkJcy0+ZmxhZ3MgfD0gU0ZfQUxJQVM7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8ga2VlcCB0aGUgY3VycmVudAotCQkJCSAqIGFsaWFzIGluIHRoZSBzb3VyY2UgbGlzdCBzbyByZWN1cnNpdmUKLQkJCQkgKiBhbGlhc2VzIGNhbiBiZSBkZXRlY3RlZCBhbmQgd2UgYWxzbyBuZWVkCi0JCQkJICogdG8gcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3Rlci4gRG8gdGhpcwotCQkJCSAqIGJ5IHRlbXBvcmFyaWx5IHBvcHBpbmcgdGhlIGFsaWFzIHRvIGdldAotCQkJCSAqIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgdGhlbiBwdXQgaXQgYmFjawotCQkJCSAqIGluIHRoZSBzb3VyY2UgbGlzdCB3aXRoIHRoZSBTRl9BTElBU0VORAotCQkJCSAqIGZsYWcgc2V0LgotCQkJCSAqLwotCQkJCXNvdXJjZSA9IHMtPm5leHQ7CS8qIHBvcCBzb3VyY2Ugc3RhY2sgKi8KLQkJCQlzb3VyY2UtPmZsYWdzIHw9IHMtPmZsYWdzICYgU0ZfQUxJQVM7Ci0JCQkJYyA9IGdldHNjX18oKTsKLQkJCQlpZiAoYykgewotCQkJCQlzLT5mbGFncyB8PSBTRl9BTElBU0VORDsKLQkJCQkJcy0+dWdidWZbMF0gPSBjOyBzLT51Z2J1ZlsxXSA9ICdcMCc7Ci0JCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcy0+dWdidWY7Ci0JCQkJCXMtPm5leHQgPSBzb3VyY2U7Ci0JCQkJCXNvdXJjZSA9IHM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcyA9IHNvdXJjZTsKLQkJCQkJLyogYXZvaWQgcmVhZGluZyBlb2YgdHdpY2UgKi8KLQkJCQkJcy0+c3RyID0gTlVMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJY29udGludWU7Ci0KLQkJY2FzZSBTUkVSRUFEOgotCQkJaWYgKHMtPnN0YXJ0ICE9IHMtPnVnYnVmKQkvKiB5dWNrICovCi0JCQkJYWZyZWUocy0+dS5mcmVlbWUsIEFURU1QKTsKLQkJCXNvdXJjZSA9IHMgPSBzLT5uZXh0OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHMtPnN0ciA9PSBOVUxMKSB7Ci0JCQlzLT50eXBlID0gU0VPRjsKLQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gbnVsbDsKLQkJCXJldHVybiAoJ1wwJyk7Ci0JCX0KLQkJaWYgKHMtPmZsYWdzICYgU0ZfRUNITykgewotCQkJc2hmX3B1dHMocy0+c3RyLCBzaGxfb3V0KTsKLQkJCXNoZl9mbHVzaChzaGxfb3V0KTsKLQkJfQotCX0KLQkvKiBjaGVjayBmb3IgVVRGLTggYnl0ZSBvcmRlciBtYXJrICovCi0JaWYgKHMtPmZsYWdzICYgU0ZfRklSU1QpIHsKLQkJcy0+ZmxhZ3MgJj0gflNGX0ZJUlNUOwotCQlpZiAoKCh1bnNpZ25lZCBjaGFyKWMgPT0gMHhFRikgJiYKLQkJICAgICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocy0+c3RyKSlbMF0gPT0gMHhCQikgJiYKLQkJICAgICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocy0+c3RyKSlbMV0gPT0gMHhCRikpIHsKLQkJCXMtPnN0ciArPSAyOwotCQkJVVRGTU9ERSA9IDE7Ci0JCQlnb3RvIGdldHNjX2FnYWluOwotCQl9Ci0JfQotCXJldHVybiAoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRzY19saW5lKFNvdXJjZSAqcykKLXsKLQljaGFyICp4cCA9IFhzdHJpbmcocy0+eHMsIHhwKSwgKmNwOwotCWJvb2wgaW50ZXJhY3RpdmUgPSBGbGFnKEZUQUxLSU5HKSAmJiBzLT50eXBlID09IFNTVERJTjsKLQlpbnQgaGF2ZV90dHkgPSBpbnRlcmFjdGl2ZSAmJiAocy0+ZmxhZ3MgJiBTRl9UVFkpOwotCi0JLyogRG9uZSBoZXJlIHRvIGVuc3VyZSBub3RoaW5nIG9kZCBoYXBwZW5zIHdoZW4gYSB0aW1lb3V0IG9jY3VycyAqLwotCVhjaGVja04ocy0+eHMsIHhwLCBMSU5FKTsKLQkqeHAgPSAnXDAnOwotCXMtPnN0YXJ0ID0gcy0+c3RyID0geHA7Ci0KLQlpZiAoaGF2ZV90dHkgJiYga3NoX3Rtb3V0KSB7Ci0JCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX1JFQURJTkc7Ci0JCWFsYXJtKGtzaF90bW91dCk7Ci0JfQotCWlmIChpbnRlcmFjdGl2ZSkKLQkJY2hhbmdlX3dpbnN6KCk7Ci0JaWYgKGhhdmVfdHR5ICYmICgKLSNpZiAhTUtTSF9TX05PVkkKLQkgICAgRmxhZyhGVkkpIHx8Ci0jZW5kaWYKLQkgICAgRmxhZyhGRU1BQ1MpIHx8IEZsYWcoRkdNQUNTKSkpIHsKLQkJaW50IG5yZWFkOwotCi0JCW5yZWFkID0geF9yZWFkKHhwLCBMSU5FKTsKLQkJaWYgKG5yZWFkIDwgMCkJLyogcmVhZCBlcnJvciAqLwotCQkJbnJlYWQgPSAwOwotCQl4cFtucmVhZF0gPSAnXDAnOwotCQl4cCArPSBucmVhZDsKLQl9IGVsc2UgewotCQlpZiAoaW50ZXJhY3RpdmUpCi0JCQlwcHJvbXB0KHByb21wdCwgMCk7Ci0JCWVsc2UKLQkJCXMtPmxpbmUrKzsKLQotCQl3aGlsZSAoMSkgewotCQkJY2hhciAqcCA9IHNoZl9nZXRzZSh4cCwgWG5sZWZ0KHMtPnhzLCB4cCksIHMtPnUuc2hmKTsKLQotCQkJaWYgKCFwICYmIHNoZl9lcnJvcihzLT51LnNoZikgJiYKLQkJCSAgICBzaGZfZXJybm8ocy0+dS5zaGYpID09IEVJTlRSKSB7Ci0JCQkJc2hmX2NsZWFyZXJyKHMtPnUuc2hmKTsKLQkJCQlpZiAodHJhcCkKLQkJCQkJcnVudHJhcHMoMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXAgfHwgKHhwID0gcCwgeHBbLTFdID09ICdcbicpKQotCQkJCWJyZWFrOwotCQkJLyogZG91YmxlIGJ1ZmZlciBzaXplICovCi0JCQl4cCsrOwkvKiBtb3ZlIHBhc3QgTlVMIHNvIGRvdWJsaW5nIHdvcmtzLi4uICovCi0JCQlYY2hlY2tOKHMtPnhzLCB4cCwgWGxlbmd0aChzLT54cywgeHApKTsKLQkJCXhwLS07CS8qIC4uLmFuZCBtb3ZlIGJhY2sgYWdhaW4gKi8KLQkJfQotCQkvKiBmbHVzaCBhbnkgdW53YW50ZWQgaW5wdXQgc28gb3RoZXIgcHJvZ3JhbXMvYnVpbHRpbnMKLQkJICogY2FuIHJlYWQgaXQuIE5vdCB2ZXJ5IG9wdGltYWwsIGJ1dCBsZXNzIGVycm9yIHByb25lCi0JCSAqIHRoYW4gZmx1c2hpbmcgZWxzZSB3aGVyZSwgZGVhbGluZyB3aXRoIHJlZGlyZWN0aW9ucywKLQkJICogZXRjLgotCQkgKiB0b2RvOiByZWR1Y2Ugc2l6ZSBvZiBzaGYgYnVmZmVyICh+MTI4PykgaWYgU1NURElOCi0JCSAqLwotCQlpZiAocy0+dHlwZSA9PSBTU1RESU4pCi0JCQlzaGZfZmx1c2gocy0+dS5zaGYpOwotCX0KLQkvKiBYWFg6IHRlbXBvcmFyeSBrbHVkZ2UgdG8gcmVzdG9yZSBzb3VyY2UgYWZ0ZXIgYQotCSAqIHRyYXAgbWF5IGhhdmUgYmVlbiBleGVjdXRlZC4KLQkgKi8KLQlzb3VyY2UgPSBzOwotCWlmIChoYXZlX3R0eSAmJiBrc2hfdG1vdXQpIHsKLQkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOwotCQlhbGFybSgwKTsKLQl9Ci0JY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQlpZiAoaW50ZXJhY3RpdmUgJiYgKmNwID09ICchJyAmJiBjdXJfcHJvbXB0ID09IFBTMSkgewotCQlpbnQgbGluZWxlbjsKLQotCQlsaW5lbGVuID0gWGxlbmd0aChzLT54cywgeHApOwotCQlYY2hlY2tOKHMtPnhzLCB4cCwgZmNfZV9uICsgLyogTlVMICovIDEpOwotCQkvKiByZWxvYWQgYWZ0ZXIgcG90ZW50aWFsIHJlYWxsb2MgKi8KLQkJY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7Ci0JCS8qIGNoYW5nZSBpbml0aWFsICchJyBpbnRvIHNwYWNlICovCi0JCSpjcCA9ICcgJzsKLQkJLyogTlVMIHRlcm1pbmF0ZSB0aGUgY3VycmVudCBzdHJpbmcgKi8KLQkJKnhwID0gJ1wwJzsKLQkJLyogbW92ZSB0aGUgYWN0dWFsIHN0cmluZyBmb3J3YXJkICovCi0JCW1lbW1vdmUoY3AgKyBmY19lX24sIGNwLCBsaW5lbGVuICsgLyogTlVMICovIDEpOwotCQl4cCArPSBmY19lX247Ci0JCS8qIHByZXBlbmQgaXQgd2l0aCAiZmMgLWUgLSIgKi8KLQkJbWVtY3B5KGNwLCBmY19lXywgZmNfZV9uKTsKLQl9Ci0jZW5kaWYKLQlzLT5zdGFydCA9IHMtPnN0ciA9IGNwOwotCXN0cmlwX251bHMoWHN0cmluZyhzLT54cywgeHApLCBYbGVuZ3RoKHMtPnhzLCB4cCkpOwotCS8qIE5vdGU6IGlmIGlucHV0IGlzIGFsbCBudWxscywgdGhpcyBpcyBub3QgZW9mICovCi0JaWYgKFhsZW5ndGgocy0+eHMsIHhwKSA9PSAwKSB7Ci0JCS8qIEVPRiAqLwotCQlpZiAocy0+dHlwZSA9PSBTRklMRSkKLQkJCXNoZl9mZGNsb3NlKHMtPnUuc2hmKTsKLQkJcy0+c3RyID0gTlVMTDsKLQl9IGVsc2UgaWYgKGludGVyYWN0aXZlICYmICpzLT5zdHIgJiYKLQkgICAgKGN1cl9wcm9tcHQgIT0gUFMxIHx8ICFjdHlwZSgqcy0+c3RyLCBDX0lGUyB8IENfSUZTV1MpKSkgewotCQloaXN0c2F2ZSgmcy0+bGluZSwgcy0+c3RyLCB0cnVlLCB0cnVlKTsKLSNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCX0gZWxzZSBpZiAoaW50ZXJhY3RpdmUgJiYgY3VyX3Byb21wdCA9PSBQUzEpIHsKLQkJY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7Ci0JCXdoaWxlICgqY3AgJiYgY3R5cGUoKmNwLCBDX0lGU1dTKSkKLQkJCSsrY3A7Ci0JCWlmICghKmNwKQotCQkJaGlzdHN5bmMoKTsKLSNlbmRpZgotCX0KLQlpZiAoaW50ZXJhY3RpdmUpCi0JCXNldF9wcm9tcHQoUFMyLCBOVUxMKTsKLX0KLQotdm9pZAotc2V0X3Byb21wdChpbnQgdG8sIFNvdXJjZSAqcykKLXsKLQljdXJfcHJvbXB0ID0gdG87Ci0KLQlzd2l0Y2ggKHRvKSB7Ci0JY2FzZSBQUzE6CS8qIGNvbW1hbmQgKi8KLQkJLyogU3Vic3RpdHV0ZSAhIGFuZCAhISBoZXJlLCBiZWZvcmUgc3Vic3RpdHV0aW9ucyBhcmUgZG9uZQotCQkgKiBzbyAhIGluIGV4cGFuZGVkIHZhcmlhYmxlcyBhcmUgbm90IGV4cGFuZGVkLgotCQkgKiBOT1RFOiB0aGlzIGlzIG5vdCB3aGF0IEFUJlQga3NoIGRvZXMgKGl0IGRvZXMgaXQgYWZ0ZXIKLQkJICogc3Vic3RpdHV0aW9ucywgUE9TSVggZG9lc24ndCBzYXkgd2hpY2ggaXMgdG8gYmUgZG9uZS4KLQkJICovCi0JCXsKLQkJCXN0cnVjdCBzaGYgKnNoZjsKLQkJCWNoYXIgKiB2b2xhdGlsZSBwczE7Ci0JCQlBcmVhICpzYXZlZF9hdGVtcDsKLQotCQkJcHMxID0gc3RyX3ZhbChnbG9iYWwoIlBTMSIpKTsKLQkJCXNoZiA9IHNoZl9zb3BlbihOVUxMLCBzdHJsZW4ocHMxKSAqIDIsCi0JCQkgICAgU0hGX1dSIHwgU0hGX0RZTkFNSUMsIE5VTEwpOwotCQkJd2hpbGUgKCpwczEpCi0JCQkJaWYgKCpwczEgIT0gJyEnIHx8ICorK3BzMSA9PSAnIScpCi0JCQkJCXNoZl9wdXRjaGFyKCpwczErKywgc2hmKTsKLQkJCQllbHNlCi0JCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwKLQkJCQkJCXMgPyBzLT5saW5lICsgMSA6IDApOwotCQkJcHMxID0gc2hmX3NjbG9zZShzaGYpOwotCQkJc2F2ZWRfYXRlbXAgPSBBVEVNUDsKLQkJCW5ld2VudihFX0VSUkgpOwotCQkJaWYgKHNpZ3NldGptcChlLT5qYnVmLCAwKSkgewotCQkJCXByb21wdCA9IHNhZmVfcHJvbXB0OwotCQkJCS8qIERvbid0IHByaW50IGFuIGVycm9yIC0gYXNzdW1lIGl0IGhhcyBhbHJlYWR5Ci0JCQkJICogYmVlbiBwcmludGVkLiBSZWFzb24gaXMgd2UgbWF5IGhhdmUgZm9ya2VkCi0JCQkJICogdG8gcnVuIGEgY29tbWFuZCBhbmQgdGhlIGNoaWxkIG1heSBiZQotCQkJCSAqIHVud2luZGluZyBpdHMgc3RhY2sgdGhyb3VnaCB0aGlzIGNvZGUgYXMgaXQKLQkJCQkgKiBleGl0cy4KLQkJCQkgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJY2hhciAqY3AgPSBzdWJzdGl0dXRlKHBzMSwgMCk7Ci0JCQkJc3RyZHVweChwcm9tcHQsIGNwLCBzYXZlZF9hdGVtcCk7Ci0JCQl9Ci0JCQlxdWl0ZW52KE5VTEwpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUFMyOgkvKiBjb21tYW5kIGNvbnRpbnVhdGlvbiAqLwotCQlwcm9tcHQgPSBzdHJfdmFsKGdsb2JhbCgiUFMyIikpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWRvcHByb21wdChjb25zdCBjaGFyICpjcCwgaW50IG50cnVuY2F0ZSwgYm9vbCBkb3ByaW50KQotewotCWludCBjb2x1bW5zID0gMCwgbGluZXMgPSAwLCBpbmRlbGltaXQgPSAwOwotCWNoYXIgZGVsaW1pdGVyID0gMDsKLQotCS8qIFVuZG9jdW1lbnRlZCBBVCZUIGtzaCBmZWF0dXJlOgotCSAqIElmIHRoZSBzZWNvbmQgY2hhciBpbiB0aGUgcHJvbXB0IHN0cmluZyBpcyBcciB0aGVuIHRoZSBmaXJzdCBjaGFyCi0JICogaXMgdGFrZW4gdG8gYmUgYSBub24tcHJpbnRpbmcgZGVsaW1pdGVyIGFuZCBhbnkgY2hhcnMgYmV0d2VlbiB0d28KLQkgKiBpbnN0YW5jZXMgb2YgdGhlIGRlbGltaXRlciBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUKLQkgKiBwcm9tcHQgbGVuZ3RoCi0JICovCi0JaWYgKCpjcCAmJiBjcFsxXSA9PSAnXHInKSB7Ci0JCWRlbGltaXRlciA9ICpjcDsKLQkJY3AgKz0gMjsKLQl9Ci0JZm9yICg7ICpjcDsgY3ArKykgewotCQlpZiAoaW5kZWxpbWl0ICYmICpjcCAhPSBkZWxpbWl0ZXIpCi0JCQk7Ci0JCWVsc2UgaWYgKCpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSB7Ci0JCQlsaW5lcyArPSBjb2x1bW5zIC8geF9jb2xzICsgKCgqY3AgPT0gJ1xuJykgPyAxIDogMCk7Ci0JCQljb2x1bW5zID0gMDsKLQkJfSBlbHNlIGlmICgqY3AgPT0gJ1x0JykgewotCQkJY29sdW1ucyA9IChjb2x1bW5zIHwgNykgKyAxOwotCQl9IGVsc2UgaWYgKCpjcCA9PSAnXGInKSB7Ci0JCQlpZiAoY29sdW1ucyA+IDApCi0JCQkJY29sdW1ucy0tOwotCQl9IGVsc2UgaWYgKCpjcCA9PSBkZWxpbWl0ZXIpCi0JCQlpbmRlbGltaXQgPSAhaW5kZWxpbWl0OwotCQllbHNlIGlmIChVVEZNT0RFICYmICgodW5zaWduZWQgY2hhcikqY3AgPiAweDdGKSkgewotCQkJY29uc3QgY2hhciAqY3AyOwotCQkJY29sdW1ucyArPSB1dGZfd2lkdGhhZGooY3AsICZjcDIpOwotCQkJaWYgKGRvcHJpbnQgJiYgKGluZGVsaW1pdCB8fAotCQkJICAgIChudHJ1bmNhdGUgPCAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKSkpKQotCQkJCXNoZl93cml0ZShjcCwgY3AyIC0gY3AsIHNobF9vdXQpOwotCQkJY3AgPSBjcDIgLSAvKiBsb29wIGluY3JlbWVudCAqLyAxOwotCQkJY29udGludWU7Ci0JCX0gZWxzZQotCQkJY29sdW1ucysrOwotCQlpZiAoZG9wcmludCAmJiAoKmNwICE9IGRlbGltaXRlcikgJiYKLQkJICAgIChpbmRlbGltaXQgfHwgKG50cnVuY2F0ZSA8ICh4X2NvbHMgKiBsaW5lcyArIGNvbHVtbnMpKSkpCi0JCQlzaGZfcHV0YygqY3AsIHNobF9vdXQpOwotCX0KLQlpZiAoZG9wcmludCkKLQkJc2hmX2ZsdXNoKHNobF9vdXQpOwotCXJldHVybiAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKTsKLX0KLQotCi12b2lkCi1wcHJvbXB0KGNvbnN0IGNoYXIgKmNwLCBpbnQgbnRydW5jYXRlKQotewotCWRvcHByb21wdChjcCwgbnRydW5jYXRlLCB0cnVlKTsKLX0KLQotaW50Ci1wcm9tcHRsZW4oY29uc3QgY2hhciAqY3ApCi17Ci0JcmV0dXJuIChkb3Bwcm9tcHQoY3AsIDAsIGZhbHNlKSk7Ci19Ci0KLS8qIFJlYWQgdGhlIHZhcmlhYmxlIHBhcnQgb2YgYSAkey4uLn0gZXhwcmVzc2lvbiAoaWUsIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nCi0gKiB0aGUgOlstKz89IyVdIG9yIGNsb3NlLWJyYWNlLgotICovCi1zdGF0aWMgY2hhciAqCi1nZXRfYnJhY2VfdmFyKFhTdHJpbmcgKndzcCwgY2hhciAqd3ApCi17Ci0JZW51bSBwYXJzZV9zdGF0ZSB7Ci0JCVBTX0lOSVRJQUwsIFBTX1NBV19IQVNILCBQU19JREVOVCwKLQkJUFNfTlVNQkVSLCBQU19WQVIxCi0JfSBzdGF0ZTsKLQljaGFyIGM7Ci0KLQlzdGF0ZSA9IFBTX0lOSVRJQUw7Ci0Jd2hpbGUgKDEpIHsKLQkJYyA9IGdldHNjKCk7Ci0JCS8qIFN0YXRlIG1hY2hpbmUgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgdmFyaWFibGUgcGFydCBlbmRzLiAqLwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgUFNfSU5JVElBTDoKLQkJCWlmIChjID09ICcjJyB8fCBjID09ICchJyB8fCBjID09ICclJykgewotCQkJCXN0YXRlID0gUFNfU0FXX0hBU0g7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIFBTX1NBV19IQVNIOgotCQkJaWYgKGtzaF9pc2FscGh4KGMpKQotCQkJCXN0YXRlID0gUFNfSURFTlQ7Ci0JCQllbHNlIGlmIChrc2hfaXNkaWdpdChjKSkKLQkJCQlzdGF0ZSA9IFBTX05VTUJFUjsKLQkJCWVsc2UgaWYgKGN0eXBlKGMsIENfVkFSMSkpCi0JCQkJc3RhdGUgPSBQU19WQVIxOwotCQkJZWxzZQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUFNfSURFTlQ6Ci0JCQlpZiAoIWtzaF9pc2FsbnV4KGMpKSB7Ci0JCQkJaWYgKGMgPT0gJ1snKSB7Ci0JCQkJCWNoYXIgKnRtcCwgKnA7Ci0KLQkJCQkJaWYgKCFhcnJheXN1YigmdG1wKSkKLQkJCQkJCXl5ZXJyb3IoIm1pc3NpbmcgXVxuIik7Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQkJZm9yIChwID0gdG1wOyAqcDsgKSB7Ci0JCQkJCQlYY2hlY2soKndzcCwgd3ApOwotCQkJCQkJKndwKysgPSAqcCsrOwotCQkJCQl9Ci0JCQkJCWFmcmVlKHRtcCwgQVRFTVApOwotCQkJCQljID0gZ2V0c2MoKTsJLyogdGhlIF0gKi8KLQkJCQl9Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQU19OVU1CRVI6Ci0JCQlpZiAoIWtzaF9pc2RpZ2l0KGMpKQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUFNfVkFSMToKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCVhjaGVjaygqd3NwLCB3cCk7Ci0JCSp3cCsrID0gYzsKLQl9Ci0gb3V0OgotCSp3cCsrID0gJ1wwJzsJLyogZW5kIG9mIHZhcmlhYmxlIHBhcnQgKi8KLQl1bmdldHNjKGMpOwotCXJldHVybiAod3ApOwotfQotCi0vKgotICogU2F2ZSBhbiBhcnJheSBzdWJzY3JpcHQgLSByZXR1cm5zIHRydWUgaWYgbWF0Y2hpbmcgYnJhY2tldCBmb3VuZCwgZmFsc2UKLSAqIGlmIGVvZiBvciBuZXdsaW5lIHdhcyBmb3VuZC4KLSAqIChSZXR1cm5lZCBzdHJpbmcgZG91YmxlIG51bGwgdGVybWluYXRlZCkKLSAqLwotc3RhdGljIGludAotYXJyYXlzdWIoY2hhciAqKnN0cnApCi17Ci0JWFN0cmluZyB3czsKLQljaGFyCSp3cDsKLQljaGFyCWM7Ci0JaW50CWRlcHRoID0gMTsJLyogd2UgYXJlIGp1c3QgcGFzdCB0aGUgaW5pdGlhbCBbICovCi0KLQlYaW5pdCh3cywgd3AsIDMyLCBBVEVNUCk7Ci0KLQlkbyB7Ci0JCWMgPSBnZXRzYygpOwotCQlYY2hlY2sod3MsIHdwKTsKLQkJKndwKysgPSBjOwotCQlpZiAoYyA9PSAnWycpCi0JCQlkZXB0aCsrOwotCQllbHNlIGlmIChjID09ICddJykKLQkJCWRlcHRoLS07Ci0JfSB3aGlsZSAoZGVwdGggPiAwICYmIGMgJiYgYyAhPSAnXG4nKTsKLQotCSp3cCsrID0gJ1wwJzsKLQkqc3RycCA9IFhjbG9zZSh3cywgd3ApOwotCi0JcmV0dXJuIChkZXB0aCA9PSAwID8gMSA6IDApOwotfQotCi0vKiBVbmdldCBhIGNoYXI6IGhhbmRsZXMgY2FzZSB3aGVuIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi11bmdldHNjKGludCBjKQotewotCWlmIChiYWNrc2xhc2hfc2tpcCkKLQkJYmFja3NsYXNoX3NraXAtLTsKLQkvKiBEb24ndCB1bmdldCBlb2YuLi4gKi8KLQlpZiAoc291cmNlLT5zdHIgPT0gbnVsbCAmJiBjID09ICdcMCcpCi0JCXJldHVybiAoc291cmNlLT5zdHIpOwotCWlmIChzb3VyY2UtPnN0ciA+IHNvdXJjZS0+c3RhcnQpCi0JCXNvdXJjZS0+c3RyLS07Ci0JZWxzZSB7Ci0JCVNvdXJjZSAqczsKLQotCQlzID0gcHVzaHMoU1JFUkVBRCwgc291cmNlLT5hcmVhcCk7Ci0JCXMtPnVnYnVmWzBdID0gYzsgcy0+dWdidWZbMV0gPSAnXDAnOwotCQlzLT5zdGFydCA9IHMtPnN0ciA9IHMtPnVnYnVmOwotCQlzLT5uZXh0ID0gc291cmNlOwotCQlzb3VyY2UgPSBzOwotCX0KLQlyZXR1cm4gKHNvdXJjZS0+c3RyKTsKLX0KLQotCi0vKiBDYWxsZWQgdG8gZ2V0IGEgY2hhciB0aGF0IGlzbid0IGEgXG5ld2xpbmUgc2VxdWVuY2UuICovCi1zdGF0aWMgaW50Ci1nZXRzY19ibih2b2lkKQotewotCWludCBjLCBjMjsKLQotCWlmIChpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUpCi0JCXJldHVybiAoZ2V0c2NfKCkpOwotCi0JaWYgKGJhY2tzbGFzaF9za2lwID09IDEpIHsKLQkJYmFja3NsYXNoX3NraXAgPSAyOwotCQlyZXR1cm4gKGdldHNjXygpKTsKLQl9Ci0KLQliYWNrc2xhc2hfc2tpcCA9IDA7Ci0KLQl3aGlsZSAoMSkgewotCQljID0gZ2V0c2NfKCk7Ci0JCWlmIChjID09ICdcXCcpIHsKLQkJCWlmICgoYzIgPSBnZXRzY18oKSkgPT0gJ1xuJykKLQkJCQkvKiBpZ25vcmUgdGhlIFxuZXdsaW5lOyBnZXQgdGhlIG5leHQgY2hhci4uLiAqLwotCQkJCWNvbnRpbnVlOwotCQkJdW5nZXRzYyhjMik7Ci0JCQliYWNrc2xhc2hfc2tpcCA9IDE7Ci0JCX0KLQkJcmV0dXJuIChjKTsKLQl9Ci19Ci0KLXN0YXRpYyBMZXhfc3RhdGUgKgotcHVzaF9zdGF0ZV8oU3RhdGVfaW5mbyAqc2ksIExleF9zdGF0ZSAqb2xkX2VuZCkKLXsKLQlMZXhfc3RhdGUgKm5ld3MgPSBhbGxvYyhTVEFURV9CU0laRSAqIHNpemVvZihMZXhfc3RhdGUpLCBBVEVNUCk7Ci0KLQluZXdzWzBdLmxzX2luZm8uYmFzZSA9IG9sZF9lbmQ7Ci0Jc2ktPmJhc2UgPSAmbmV3c1swXTsKLQlzaS0+ZW5kID0gJm5ld3NbU1RBVEVfQlNJWkVdOwotCXJldHVybiAoJm5ld3NbMV0pOwotfQotCi1zdGF0aWMgTGV4X3N0YXRlICoKLXBvcF9zdGF0ZV8oU3RhdGVfaW5mbyAqc2ksIExleF9zdGF0ZSAqb2xkX2VuZCkKLXsKLQlMZXhfc3RhdGUgKm9sZF9iYXNlID0gc2ktPmJhc2U7Ci0KLQlzaS0+YmFzZSA9IG9sZF9lbmQtPmxzX2luZm8uYmFzZSAtIFNUQVRFX0JTSVpFOwotCXNpLT5lbmQgPSBvbGRfZW5kLT5sc19pbmZvLmJhc2U7Ci0KLQlhZnJlZShvbGRfYmFzZSwgQVRFTVApOwotCi0JcmV0dXJuIChzaS0+YmFzZSArIFNUQVRFX0JTSVpFIC0gMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNfZ2V0KHZvaWQpCi17Ci0JcmV0dXJuIChnZXRzYygpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHV0KGludCBjKQotewotCXVuZ2V0c2MoYyk7Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9tYWluLmMgYi9ta3NoL3NyYy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjJkZDQuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3OSArMCwwIEBACi0vKgkkT3BlbkJTRDogbWFpbi5jLHYgMS40NiAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHR0eS5jLHYgMS45IDIwMDYvMDMvMTQgMjI6MDg6MDEgZGVyYWFkdCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IGlvLmMsdiAxLjIyIDIwMDYvMDMvMTcgMTY6MzA6MTMgbWlsbGVydCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHRhYmxlLmMsdiAxLjEzIDIwMDkvMDEvMTcgMjI6MDY6NDQgbWlsbGVydCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2RlZmluZQlFWFRFUk4KLSNpbmNsdWRlICJzaC5oIgotCi0jaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCi0jaW5jbHVkZSA8bGFuZ2luZm8uaD4KLSNlbmRpZgotI2lmIEhBVkVfU0VUTE9DQUxFX0NUWVBFCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbWFpbi5jLHYgMS4xNjcgMjAxMC8wNy8wNCAxNzo0NToxNSB0ZyBFeHAgJCIpOwotCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0KLSNpZiAhSEFWRV9TRVRSRVNVR0lECi1leHRlcm4gdWlkX3Qga3NodWlkOwotZXh0ZXJuIGdpZF90IGtzaGdpZCwga3NoZWdpZDsKLSNlbmRpZgotCi0jaWZuZGVmIE1LU0hSQ19QQVRICi0jZGVmaW5lIE1LU0hSQ19QQVRICSJ+Ly5ta3NocmMiCi0jZW5kaWYKLQotI2lmbmRlZiBNS1NIX0RFRkFVTFRfVE1QRElSCi0jZGVmaW5lIE1LU0hfREVGQVVMVF9UTVBESVIJIi90bXAiCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgcmVjbGFpbSh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV90ZW1wcyhzdHJ1Y3QgdGVtcCAqKTsKLXZvaWQgY2h2dF9yZWluaXQodm9pZCk7Ci1Tb3VyY2UgKm1rc2hfaW5pdChpbnQsIGNvbnN0IGNoYXIgKltdKTsKLSNpZmRlZiBTSUdXSU5DSAotc3RhdGljIHZvaWQgeF9zaWd3aW5jaChpbnQpOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyIGluaXRpZnNbXSA9ICJJRlM9IFx0XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBpbml0c3Vic1tdID0KLSAgICAiJHtQUzI9PiB9ICR7UFMzPSM/IH0gJHtQUzQ9KyB9ICR7U0VDT05EUz0wfSAke1RNT1VUPTB9IjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmluaXRjb21zW10gPSB7Ci0JVF90eXBlc2V0LCAiLXIiLCBpbml0dnNuLCBOVUxMLAotCVRfdHlwZXNldCwgIi14IiwgIkhPTUUiLCAiUEFUSCIsICJSQU5ET00iLCAiU0hFTEwiLCBOVUxMLAotCVRfdHlwZXNldCwgIi1pMTAiLCAiQ09MVU1OUyIsICJMSU5FUyIsICJPUFRJTkQiLCAiUEdSUCIsICJQUElEIiwKLQkgICAgIlJBTkRPTSIsICJTRUNPTkRTIiwgIlRNT1VUIiwgIlVTRVJfSUQiLCBOVUxMLAotCSJhbGlhcyIsCi0JImludGVnZXI9dHlwZXNldCAtaSIsCi0JVF9sb2NhbF90eXBlc2V0LAotCSJoYXNoPWFsaWFzIC10IiwJLyogbm90ICJhbGlhcyAtdCAtLSI6IGhhc2ggLXIgbmVlZHMgdG8gd29yayAqLwotCSJ0eXBlPXdoZW5jZSAtdiIsCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCSJzdXNwZW5kPWtpbGwgLVNUT1AgJCQiLAotI2VuZGlmCi0JImF1dG9sb2FkPXR5cGVzZXQgLWZ1IiwKLQkiZnVuY3Rpb25zPXR5cGVzZXQgLWYiLAotCSJoaXN0b3J5PWZjIC1sIiwKLQkibmFtZXJlZj10eXBlc2V0IC1uIiwKLQkibm9odXA9bm9odXAgIiwKLQlyX2ZjX2VfLAotCSJzb3VyY2U9UEFUSD0kUEFUSDouIGNvbW1hbmQgLiIsCi0JImxvZ2luPWV4ZWMgbG9naW4iLAotCU5VTEwsCi0JIC8qIHRoaXMgaXMgd2hhdCBBVCZUIGtzaCBzZWVtcyB0byB0cmFjaywgd2l0aCB0aGUgYWRkaXRpb24gb2YgZW1hY3MgKi8KLQkiYWxpYXMiLCAiLXRVIiwKLQkiY2F0IiwgImNjIiwgImNobW9kIiwgImNwIiwgImRhdGUiLCAiZWQiLCAiZW1hY3MiLCAiZ3JlcCIsICJscyIsCi0JIm1ha2UiLCAibXYiLCAicHIiLCAicm0iLCAic2VkIiwgInNoIiwgInZpIiwgIndobyIsIE5VTEwsCi0JTlVMTAotfTsKLQotc3RhdGljIGludCBpbml0aW9fZG9uZTsKLQotc3RydWN0IGVudiAqZSA9ICZrc2hzdGF0ZV92LmVudl87Ci0KLXZvaWQKLWNodnRfcmVpbml0KHZvaWQpCi17Ci0Ja3NocGlkID0gcHJvY3BpZCA9IGdldHBpZCgpOwotCWtzaGV1aWQgPSBnZXRldWlkKCk7Ci0Ja3NocGdycCA9IGdldHBncnAoKTsKLQlrc2hwcGlkID0gZ2V0cHBpZCgpOwotfQotCi1Tb3VyY2UgKgotbWtzaF9pbml0KGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCi17Ci0JaW50IGFyZ2ksIGk7Ci0JU291cmNlICpzOwotCXN0cnVjdCBibG9jayAqbDsKLQl1bnNpZ25lZCBjaGFyIHJlc3RyaWN0ZWQsIGVycmV4aXQsIHV0Zl9mbGFnOwotCWNvbnN0IGNoYXIgKip3cDsKLQlzdHJ1Y3QgdGJsICp2cDsKLQlzdHJ1Y3Qgc3RhdCBzX3N0ZGluOwotI2lmICFkZWZpbmVkKF9QQVRIX0RFRlBBVEgpICYmIGRlZmluZWQoX0NTX1BBVEgpCi0Jc2l6ZV90IGs7Ci0JY2hhciAqY3A7Ci0jZW5kaWYKLQotCS8qIGRvIHRoaW5ncyBsaWtlIGdldHBncnAoKSBldCBhbC4gKi8KLQljaHZ0X3JlaW5pdCgpOwotCi0JLyogbWFrZSBzdXJlIGFyZ3ZbXSBpcyBzYW5lICovCi0JaWYgKCEqYXJndikgewotCQlzdGF0aWMgY29uc3QgY2hhciAqZW1wdHlfYXJndltdID0gewotCQkJIm1rc2giLCBOVUxMCi0JCX07Ci0KLQkJYXJndiA9IGVtcHR5X2FyZ3Y7Ci0JCWFyZ2MgPSAxOwotCX0KLQlrc2huYW1lID0gKmFyZ3Y7Ci0KLQlhaW5pdCgmYXBlcm0pOwkJLyogaW5pdGlhbGlzZSBwZXJtYW5lbnQgQXJlYSAqLwotCi0JLyogc2V0IHVwIGJhc2UgZW52aXJvbm1lbnQgKi8KLQlrc2hzdGF0ZV92LmVudl8udHlwZSA9IEVfTk9ORTsKLQlhaW5pdCgma3Noc3RhdGVfdi5lbnZfLmFyZWEpOwotCW5ld2Jsb2NrKCk7CQkvKiBzZXQgdXAgZ2xvYmFsIGwtPnZhcnMgYW5kIGwtPmZ1bnMgKi8KLQotCS8qIERvIHRoaXMgZmlyc3Qgc28gb3V0cHV0IHJvdXRpbmVzIChlZywgZXJyb3JmLCBzaGVsbGYpIGNhbiB3b3JrICovCi0JaW5pdGlvKCk7Ci0KLQlhcmdpID0gcGFyc2VfYXJncyhhcmd2LCBPRl9GSVJTVFRJTUUsIE5VTEwpOwotCWlmIChhcmdpIDwgMCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCWluaXR2YXIoKTsKLQotCWluaXRjdHlwZXMoKTsKLQotCWluaXR0cmFwcygpOwotCi0JY29wcm9jX2luaXQoKTsKLQotCS8qIHNldCB1cCB2YXJpYWJsZSBhbmQgY29tbWFuZCBkaWN0aW9uYXJpZXMgKi8KLQlrdGluaXQoJnRhbGlhc2VzLCBBUEVSTSwgMCk7Ci0Ja3Rpbml0KCZhbGlhc2VzLCBBUEVSTSwgMCk7Ci0jaWZuZGVmIE1LU0hfTk9QV05BTQotCWt0aW5pdCgmaG9tZWRpcnMsIEFQRVJNLCAwKTsKLSNlbmRpZgotCi0JLyogZGVmaW5lIHNoZWxsIGtleXdvcmRzICovCi0JaW5pdGtleXdvcmRzKCk7Ci0KLQkvKiBkZWZpbmUgYnVpbHQtaW4gY29tbWFuZHMgKi8KLQlrdGluaXQoJmJ1aWx0aW5zLCBBUEVSTSwKLQkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgNDQgYnVpbHRpbnMpICovIDY0KTsKLQlmb3IgKGkgPSAwOyBta3NoYnVpbHRpbnNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCWJ1aWx0aW4obWtzaGJ1aWx0aW5zW2ldLm5hbWUsIG1rc2hidWlsdGluc1tpXS5mdW5jKTsKLQotCWluaXRfaGlzdHZlYygpOwotCi0jaWZkZWYgX1BBVEhfREVGUEFUSAotCWRlZl9wYXRoID0gX1BBVEhfREVGUEFUSDsKLSNlbHNlCi0jaWZkZWYgX0NTX1BBVEgKLQlpZiAoKGsgPSBjb25mc3RyKF9DU19QQVRILCBOVUxMLCAwKSkgIT0gKHNpemVfdCktMSAmJiBrID4gMCAmJgotCSAgICBjb25mc3RyKF9DU19QQVRILCBjcCA9IGFsbG9jKGsgKyAxLCBBUEVSTSksIGsgKyAxKSA9PSBrICsgMSkKLQkJZGVmX3BhdGggPSBjcDsKLQllbHNlCi0jZW5kaWYKLQkJLyoKLQkJICogdGhpcyBpcyB1bmlmb3JtIGFjcm9zcyBhbGwgT1NlcyB1bmxlc3MgaXQKLQkJICogYnJlYWtzIHNvbWV3aGVyZTsgZG9uJ3QgdHJ5IHRvIG9wdGltaXNlLAotCQkgKiBlLmcuIGFkZCBzdHVmZiBmb3IgSW50ZXJpeCBvciByZW1vdmUgL3VzcgotCQkgKiBmb3IgSFVSRCwgYmVjYXVzZSBlLmcuIERlYmlhbiBHTlUvSFVSRCBpcwotCQkgKiAia2VlcGluZyBhIHJlZ3VsYXIgL3VzciI7IHRoaXMgaXMgc3VwcG9zZWQKLQkJICogdG8gYmUgYSBzYW5lICdiYXNpYycgZGVmYXVsdCBQQVRICi0JCSAqLwotCQlkZWZfcGF0aCA9ICIvYmluOi91c3IvYmluOi9zYmluOi91c3Ivc2JpbiI7Ci0jZW5kaWYKLQotCS8qIFNldCBQQVRIIHRvIGRlZl9wYXRoICh3aWxsIHNldCB0aGUgcGF0aCBnbG9iYWwgdmFyaWFibGUpLgotCSAqIChpbXBvcnQgb2YgZW52aXJvbm1lbnQgYmVsb3cgd2lsbCBwcm9iYWJseSBjaGFuZ2UgdGhpcyBzZXR0aW5nKS4KLQkgKi8KLQl2cCA9IGdsb2JhbCgiUEFUSCIpOwotCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KLQlzZXRzdHIodnAsIGRlZl9wYXRoLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQotCS8qIFR1cm4gb24gbm9odXAgYnkgZGVmYXVsdCBmb3Igbm93IC0gd2lsbCBjaGFuZ2UgdG8gb2ZmCi0JICogYnkgZGVmYXVsdCBvbmNlIHBlb3BsZSBhcmUgYXdhcmUgb2YgaXRzIGV4aXN0ZW5jZQotCSAqIChBVCZUIGtzaCBkb2VzIG5vdCBoYXZlIGEgbm9odXAgb3B0aW9uIC0gaXQgYWx3YXlzIHNlbmRzCi0JICogdGhlIGh1cCkuCi0JICovCi0JRmxhZyhGTk9IVVApID0gMTsKLQotCS8qIFR1cm4gb24gYnJhY2UgZXhwYW5zaW9uIGJ5IGRlZmF1bHQuIEFUJlQga3NocyB0aGF0IGhhdmUKLQkgKiBhbHRlcm5hdGlvbiBhbHdheXMgaGF2ZSBpdCBvbi4KLQkgKi8KLQlGbGFnKEZCUkFDRUVYUEFORCkgPSAxOwotCi0JLyogU2V0IGVkaXQgbW9kZSB0byBlbWFjcyBieSBkZWZhdWx0LCBtYXkgYmUgb3ZlcnJpZGRlbgotCSAqIGJ5IHRoZSBlbnZpcm9ubWVudCBvciB0aGUgdXNlci4gQWxzbywgd2Ugd2FudCB0YWIgY29tcGxldGlvbgotCSAqIG9uIGluIHZpIGJ5IGRlZmF1bHQuICovCi0JY2hhbmdlX2ZsYWcoRkVNQUNTLCBPRl9TUEVDSUFMLCAxKTsKLSNpZiAhTUtTSF9TX05PVkkKLQlGbGFnKEZWSVRBQkNPTVBMRVRFKSA9IDE7Ci0jZW5kaWYKLQotI2lmZGVmIE1LU0hfQklOU0hSRURVQ0VECi0JLyogc2V0IEZTSCBpZiB3ZSdyZSBjYWxsZWQgYXMgLXNoIG9yIC9iaW4vc2ggb3Igc28gKi8KLQl7Ci0JCWNvbnN0IGNoYXIgKmNjOwotCi0JCWNjID0ga3NobmFtZTsKLQkJaSA9IDA7IGFyZ2kgPSAwOwotCQl3aGlsZSAoY2NbaV0gIT0gJ1wwJykKLQkJCS8qIHRoZSBmb2xsb3dpbmcgbGluZSBtYXRjaGVzICctJyBhbmQgJy8nIDstKSAqLwotCQkJaWYgKChjY1tpKytdIHwgMikgPT0gJy8nKQotCQkJCWFyZ2kgPSBpOwotCQlpZiAoKChjY1thcmdpXSB8IDB4MjApID09ICdzJykgJiYgKChjY1thcmdpICsgMV0gfCAweDIwKSA9PSAnaCcpKQotCQkJY2hhbmdlX2ZsYWcoRlNILCBPRl9GSVJTVFRJTUUsIDEpOwotCX0KLSNlbmRpZgotCi0JLyogaW1wb3J0IGVudmlyb25tZW50ICovCi0JaWYgKGVudmlyb24gIT0gTlVMTCkKLQkJZm9yICh3cCA9IChjb25zdCBjaGFyICoqKWVudmlyb247ICp3cCAhPSBOVUxMOyB3cCsrKQotCQkJdHlwZXNldCgqd3AsIElNUE9SVCB8IEVYUE9SVCwgMCwgMCwgMCk7Ci0KLQl0eXBlc2V0KGluaXRpZnMsIDAsIDAsIDAsIDApOwkvKiBmb3Igc2VjdXJpdHkgKi8KLQotCS8qIGFzc2lnbiBkZWZhdWx0IHNoZWxsIHZhcmlhYmxlIHZhbHVlcyAqLwotCXN1YnN0aXR1dGUoaW5pdHN1YnMsIDApOwotCi0JLyogRmlndXJlIG91dCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgc2V0ICRQV0QgKi8KLQl7Ci0JCXN0cnVjdCBzdGF0IHNfcHdkLCBzX2RvdDsKLQkJc3RydWN0IHRibCAqcHdkX3YgPSBnbG9iYWwoIlBXRCIpOwotCQljaGFyICpwd2QgPSBzdHJfdmFsKHB3ZF92KTsKLQkJY2hhciAqcHdkeCA9IHB3ZDsKLQotCQkvKiBUcnkgdG8gdXNlIGV4aXN0aW5nICRQV0QgaWYgaXQgaXMgdmFsaWQgKi8KLQkJaWYgKHB3ZFswXSAhPSAnLycgfHwKLQkJICAgIHN0YXQocHdkLCAmc19wd2QpIDwgMCB8fCBzdGF0KCIuIiwgJnNfZG90KSA8IDAgfHwKLQkJICAgIHNfcHdkLnN0X2RldiAhPSBzX2RvdC5zdF9kZXYgfHwKLQkJICAgIHNfcHdkLnN0X2lubyAhPSBzX2RvdC5zdF9pbm8pCi0JCQlwd2R4ID0gTlVMTDsKLQkJc2V0X2N1cnJlbnRfd2QocHdkeCk7Ci0JCWlmIChjdXJyZW50X3dkWzBdKQotCQkJc2ltcGxpZnlfcGF0aChjdXJyZW50X3dkKTsKLQkJLyogT25seSBzZXQgcHdkIGlmIHdlIGtub3cgd2hlcmUgd2UgYXJlIG9yIGlmIGl0IGhhZCBhCi0JCSAqIGJvZ3VzIHZhbHVlCi0JCSAqLwotCQlpZiAoY3VycmVudF93ZFswXSB8fCBwd2QgIT0gbnVsbCkKLQkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KLQkJCXNldHN0cihwd2RfdiwgY3VycmVudF93ZCwgS1NIX1JFVFVSTl9FUlJPUik7Ci0JfQotCi0JZm9yICh3cCA9IGluaXRjb21zOyAqd3AgIT0gTlVMTDsgd3ArKykgewotCQlzaGNvbWV4ZWMod3ApOwotCQl3aGlsZSAoKndwICE9IE5VTEwpCi0JCQl3cCsrOwotCX0KLQlzZXRpbnQoZ2xvYmFsKCJDT0xVTU5TIiksIDApOwotCXNldGludChnbG9iYWwoIkxJTkVTIiksIDApOwotCXNldGludChnbG9iYWwoIk9QVElORCIpLCAxKTsKLQotCXNhZmVfcHJvbXB0ID0ga3NoZXVpZCA/ICIkICIgOiAiIyAiOwotCXZwID0gZ2xvYmFsKCJQUzEiKTsKLQkvKiBTZXQgUFMxIGlmIHVuc2V0IG9yIHdlIGFyZSByb290IGFuZCBwcm9tcHQgZG9lc24ndCBjb250YWluIGEgIyAqLwotCWlmICghKHZwLT5mbGFnICYgSVNTRVQpIHx8Ci0JICAgICgha3NoZXVpZCAmJiAhc3RyY2hyKHN0cl92YWwodnApLCAnIycpKSkKLQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLwotCQlzZXRzdHIodnAsIHNhZmVfcHJvbXB0LCBLU0hfUkVUVVJOX0VSUk9SKTsKLQlzZXRpbnQoKHZwID0gZ2xvYmFsKCJQR1JQIikpLCAobWtzaF91YXJpX3Qpa3NocGdycCk7Ci0JdnAtPmZsYWcgfD0gSU5UX1U7Ci0Jc2V0aW50KCh2cCA9IGdsb2JhbCgiUFBJRCIpKSwgKG1rc2hfdWFyaV90KWtzaHBwaWQpOwotCXZwLT5mbGFnIHw9IElOVF9VOwotCXNldGludCgodnAgPSBnbG9iYWwoIlJBTkRPTSIpKSwgKG1rc2hfdWFyaV90KWV2aWxoYXNoKGtzaG5hbWUpKTsKLQl2cC0+ZmxhZyB8PSBJTlRfVTsKLQlzZXRpbnQoKHZwID0gZ2xvYmFsKCJVU0VSX0lEIikpLCAobWtzaF91YXJpX3Qpa3NoZXVpZCk7Ci0JdnAtPmZsYWcgfD0gSU5UX1U7Ci0KLQkvKiBTZXQgdGhpcyBiZWZvcmUgcGFyc2luZyBhcmd1bWVudHMgKi8KLSNpZiBIQVZFX1NFVFJFU1VHSUQKLQlGbGFnKEZQUklWSUxFR0VEKSA9IGdldHVpZCgpICE9IGtzaGV1aWQgfHwgZ2V0Z2lkKCkgIT0gZ2V0ZWdpZCgpOwotI2Vsc2UKLQlGbGFnKEZQUklWSUxFR0VEKSA9IChrc2h1aWQgPSBnZXR1aWQoKSkgIT0ga3NoZXVpZCB8fAotCSAgICAoa3NoZ2lkID0gZ2V0Z2lkKCkpICE9IChrc2hlZ2lkID0gZ2V0ZWdpZCgpKTsKLSNlbmRpZgotCi0JLyogdGhpcyB0byBub3RlIGlmIG1vbml0b3IgaXMgc2V0IG9uIGNvbW1hbmQgbGluZSAoc2VlIGJlbG93KSAqLwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQlGbGFnKEZNT05JVE9SKSA9IDEyNzsKLSNlbmRpZgotCS8qIHRoaXMgdG8gbm90ZSBpZiB1dGYtOCBtb2RlIGlzIHNldCBvbiBjb21tYW5kIGxpbmUgKHNlZSBiZWxvdykgKi8KLQlVVEZNT0RFID0gMjsKLQotCWFyZ2kgPSBwYXJzZV9hcmdzKGFyZ3YsIE9GX0NNRExJTkUsIE5VTEwpOwotCWlmIChhcmdpIDwgMCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCS8qIHByb2Nlc3MgdGhpcyBsYXRlciBvbmx5LCBkZWZhdWx0IHRvIG9mZiAoaHlzdGVyaWNhbCByYWlzaW5zKSAqLwotCXV0Zl9mbGFnID0gVVRGTU9ERTsKLQlVVEZNT0RFID0gMDsKLQotCWlmIChGbGFnKEZDT01NQU5EKSkgewotCQlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOwotCQlpZiAoIShzLT5zdGFydCA9IHMtPnN0ciA9IGFyZ3ZbYXJnaSsrXSkpCi0JCQllcnJvcmYoIi1jIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7Ci0jaWZkZWYgTUtTSF9NSUROSUdIVEJTRDAxQVNIX0NPTVBBVAotCQkvKiBjb21wYXRpYmlsaXR5IHRvIE1pZG5pZ2h0QlNEIDAuMSAvYmluL3NoIChrbHVkZ2UpICovCi0JCWlmIChGbGFnKEZTSCkgJiYgYXJndlthcmdpXSAmJiAhc3RyY21wKGFyZ3ZbYXJnaV0sICItLSIpKQotCQkJKythcmdpOwotI2VuZGlmCi0JCWlmIChhcmd2W2FyZ2ldKQotCQkJa3NobmFtZSA9IGFyZ3ZbYXJnaSsrXTsKLQl9IGVsc2UgaWYgKGFyZ2kgPCBhcmdjICYmICFGbGFnKEZTVERJTikpIHsKLQkJcyA9IHB1c2hzKFNGSUxFLCBBVEVNUCk7Ci0JCXMtPmZpbGUgPSBhcmd2W2FyZ2krK107Ci0JCXMtPnUuc2hmID0gc2hmX29wZW4ocy0+ZmlsZSwgT19SRE9OTFksIDAsCi0JCSAgICBTSEZfTUFQSEkgfCBTSEZfQ0xFWEVDKTsKLQkJaWYgKHMtPnUuc2hmID09IE5VTEwpIHsKLQkJCXNobF9zdGRvdXRfb2sgPSAwOwotCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyIsIHMtPmZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkvKiBtYW5kYXRlZCBieSBTVVN2NCAqLwotCQkJZXhzdGF0ID0gMTI3OwotCQkJdW53aW5kKExFUlJPUik7Ci0JCX0KLQkJa3NobmFtZSA9IHMtPmZpbGU7Ci0JfSBlbHNlIHsKLQkJRmxhZyhGU1RESU4pID0gMTsKLQkJcyA9IHB1c2hzKFNTVERJTiwgQVRFTVApOwotCQlzLT5maWxlID0gIjxzdGRpbj4iOwotCQlzLT51LnNoZiA9IHNoZl9mZG9wZW4oMCwgU0hGX1JEIHwgY2FuX3NlZWsoMCksCi0JCSAgICBOVUxMKTsKLQkJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMikpIHsKLQkJCUZsYWcoRlRBTEtJTkcpID0gRmxhZyhGVEFMS0lOR19JKSA9IDE7Ci0JCQkvKiBUaGUgZm9sbG93aW5nIG9ubHkgaWYgaXNhdHR5KDApICovCi0JCQlzLT5mbGFncyB8PSBTRl9UVFk7Ci0JCQlzLT51LnNoZi0+ZmxhZ3MgfD0gU0hGX0lOVEVSUlVQVDsKLQkJCXMtPmZpbGUgPSBOVUxMOwotCQl9Ci0JfQotCi0JLyogdGhpcyBiaXphcnJlbmVzcyBpcyBtYW5kYXRlZCBieSBQT1NJWCAqLwotCWlmIChmc3RhdCgwLCAmc19zdGRpbikgPj0gMCAmJiBTX0lTQ0hSKHNfc3RkaW4uc3RfbW9kZSkgJiYKLQkgICAgRmxhZyhGVEFMS0lORykpCi0JCXJlc2V0X25vbmJsb2NrKDApOwotCi0JLyogaW5pdGlhbGlzZSBqb2IgY29udHJvbCAqLwotCWpfaW5pdCgpOwotCS8qIHNldDogMC8xOyB1bnNldDogMi0+MCAqLwotCVVURk1PREUgPSB1dGZfZmxhZyAmIDE7Ci0JLyogRG8gdGhpcyBhZnRlciBqX2luaXQoKSwgYXMgdHR5X2ZkIGlzIG5vdCBpbml0aWFsaXNlZCB1bnRpbCB0aGVuICovCi0JaWYgKEZsYWcoRlRBTEtJTkcpKSB7Ci0JCWlmICh1dGZfZmxhZyA9PSAyKSB7Ci0jaWZuZGVmIE1LU0hfQVNTVU1FX1VURjgKLSNkZWZpbmUgaXN1Yyh4KQkoKCh4KSAhPSBOVUxMKSAmJiBcCi0JCSAgICAoc3RyaXN0cigoeCksICJVVEYtOCIpIHx8IHN0cmlzdHIoKHgpLCAidXRmOCIpKSkKLQkJLyogQ2hlY2sgaWYgd2UncmUgaW4gYSBVVEYtOCBsb2NhbGUgKi8KLQkJCWNvbnN0IGNoYXIgKmNjcDsKLQotI2lmIEhBVkVfU0VUTE9DQUxFX0NUWVBFCi0JCQljY3AgPSBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKLSNpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKLQkJCWlmICghaXN1YyhjY3ApKQotCQkJCWNjcCA9IG5sX2xhbmdpbmZvKENPREVTRVQpOwotI2VuZGlmCi0jZWxzZQotCQkJLyogdGhlc2Ugd2VyZSBpbXBvcnRlZCBmcm9tIGVudmlyb24gZWFybGllciAqLwotCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxDX0FMTCIpKTsKLQkJCWlmIChjY3AgPT0gbnVsbCkKLQkJCQljY3AgPSBzdHJfdmFsKGdsb2JhbCgiTENfQ1RZUEUiKSk7Ci0JCQlpZiAoY2NwID09IG51bGwpCi0JCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxBTkciKSk7Ci0jZW5kaWYKLQkJCVVURk1PREUgPSBpc3VjKGNjcCk7Ci0jdW5kZWYgaXN1YwotI2VsaWYgTUtTSF9BU1NVTUVfVVRGOAotCQkJVVRGTU9ERSA9IDE7Ci0jZWxzZQotCQkJVVRGTU9ERSA9IDA7Ci0jZW5kaWYKLQkJfQotCQl4X2luaXQoKTsKLQl9Ci0KLSNpZmRlZiBTSUdXSU5DSAotCXNpZ3RyYXBzW1NJR1dJTkNIXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOwotCXNldHNpZygmc2lndHJhcHNbU0lHV0lOQ0hdLCB4X3NpZ3dpbmNoLAotCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0V8U1NfU0hUUkFQKTsKLSNlbmRpZgotCi0JbCA9IGUtPmxvYzsKLQlsLT5hcmd2ID0gJmFyZ3ZbYXJnaSAtIDFdOwotCWwtPmFyZ2MgPSBhcmdjIC0gYXJnaTsKLQlsLT5hcmd2WzBdID0ga3NobmFtZTsKLQlnZXRvcHRzX3Jlc2V0KDEpOwotCi0JLyogRGlzYWJsZSBkdXJpbmcgLnByb2ZpbGUvRU5WIHJlYWRpbmcgKi8KLQlyZXN0cmljdGVkID0gRmxhZyhGUkVTVFJJQ1RFRCk7Ci0JRmxhZyhGUkVTVFJJQ1RFRCkgPSAwOwotCWVycmV4aXQgPSBGbGFnKEZFUlJFWElUKTsKLQlGbGFnKEZFUlJFWElUKSA9IDA7Ci0KLQkvKiBEbyB0aGlzIGJlZm9yZSBwcm9maWxlLyRFTlYgc28gdGhhdCBpZiBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gdGhlbSwKLQkgKiB1c2VyIHdpbGwga25vdyB3aHkgdGhpbmdzIGJyb2tlLgotCSAqLwotCWlmICghY3VycmVudF93ZFswXSAmJiBGbGFnKEZUQUxLSU5HKSkKLQkJd2FybmluZ2YoZmFsc2UsICJDYW5ub3QgZGV0ZXJtaW5lIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKTsKLQotCWlmIChGbGFnKEZMT0dJTikpIHsKLQkJaW5jbHVkZShLU0hfU1lTVEVNX1BST0ZJTEUsIDAsIE5VTEwsIDEpOwotCQlpZiAoIUZsYWcoRlBSSVZJTEVHRUQpKQotCQkJaW5jbHVkZShzdWJzdGl0dXRlKCIkSE9NRS8ucHJvZmlsZSIsIDApLCAwLAotCQkJICAgIE5VTEwsIDEpOwotCX0KLQlpZiAoRmxhZyhGUFJJVklMRUdFRCkpCi0JCWluY2x1ZGUoIi9ldGMvc3VpZF9wcm9maWxlIiwgMCwgTlVMTCwgMSk7Ci0JZWxzZSBpZiAoRmxhZyhGVEFMS0lORykpIHsKLQkJY2hhciAqZW52X2ZpbGU7Ci0KLQkJLyogaW5jbHVkZSAkRU5WICovCi0JCWVudl9maWxlID0gc3Vic3RpdHV0ZShzdWJzdGl0dXRlKCIke0VOVjotIiBNS1NIUkNfUEFUSCAifSIsIDApLAotCQkgICAgRE9USUxERSk7Ci0JCWlmICgqZW52X2ZpbGUgIT0gJ1wwJykKLQkJCWluY2x1ZGUoZW52X2ZpbGUsIDAsIE5VTEwsIDEpOwotCX0KLQotCWlmIChyZXN0cmljdGVkKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICpyZXN0cl9jb21bXSA9IHsKLQkJCVRfdHlwZXNldCwgIi1yIiwgIlBBVEgiLAotCQkJIkVOViIsICJTSEVMTCIsCi0JCQlOVUxMCi0JCX07Ci0JCXNoY29tZXhlYyhyZXN0cl9jb20pOwotCQkvKiBBZnRlciB0eXBlc2V0IGNvbW1hbmQuLi4gKi8KLQkJRmxhZyhGUkVTVFJJQ1RFRCkgPSAxOwotCX0KLQlGbGFnKEZFUlJFWElUKSA9IGVycmV4aXQ7Ci0KLQlpZiAoRmxhZyhGVEFMS0lORykpIHsKLQkJaGlzdF9pbml0KHMpOwotCQlhbGFybV9pbml0KCk7Ci0JfSBlbHNlCi0JCUZsYWcoRlRSQUNLQUxMKSA9IDE7CS8qIHNldCBhZnRlciBFTlYgKi8KLQotCXJldHVybiAocyk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQotewotCVNvdXJjZSAqczsKLQotCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IDUzODE7Ci0KLQlpZiAoKHMgPSBta3NoX2luaXQoYXJnYywgYXJndikpKSB7Ci0JCS8qIHB1dCBtb3JlIGVudHJvcHkgaW50byB0aGUgTENHICovCi0JCWNoYW5nZV9yYW5kb20ocywgc2l6ZW9mKCpzKSk7Ci0JCS8qIGRvZXNu4oCZdCByZXR1cm4gKi8KLQkJc2hlbGwocywgdHJ1ZSk7Ci0JfQotCXJldHVybiAoMSk7Ci19Ci0KLWludAotaW5jbHVkZShjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBpbnRyX29rKQotewotCVNvdXJjZSAqdm9sYXRpbGUgcyA9IE5VTEw7Ci0Jc3RydWN0IHNoZiAqc2hmOwotCWNvbnN0IGNoYXIgKip2b2xhdGlsZSBvbGRfYXJndjsKLQl2b2xhdGlsZSBpbnQgb2xkX2FyZ2M7Ci0JaW50IGk7Ci0KLQlzaGYgPSBzaGZfb3BlbihuYW1lLCBPX1JET05MWSwgMCwgU0hGX01BUEhJIHwgU0hGX0NMRVhFQyk7Ci0JaWYgKHNoZiA9PSBOVUxMKQotCQlyZXR1cm4gKC0xKTsKLQotCWlmIChhcmd2KSB7Ci0JCW9sZF9hcmd2ID0gZS0+bG9jLT5hcmd2OwotCQlvbGRfYXJnYyA9IGUtPmxvYy0+YXJnYzsKLQl9IGVsc2UgewotCQlvbGRfYXJndiA9IE5VTEw7Ci0JCW9sZF9hcmdjID0gMDsKLQl9Ci0JbmV3ZW52KEVfSU5DTCk7Ci0JaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQlpZiAoaSkgewotCQlxdWl0ZW52KHMgPyBzLT51LnNoZiA6IE5VTEwpOwotCQlpZiAob2xkX2FyZ3YpIHsKLQkJCWUtPmxvYy0+YXJndiA9IG9sZF9hcmd2OwotCQkJZS0+bG9jLT5hcmdjID0gb2xkX2FyZ2M7Ci0JCX0KLQkJc3dpdGNoIChpKSB7Ci0JCWNhc2UgTFJFVFVSTjoKLQkJY2FzZSBMRVJST1I6Ci0JCQlyZXR1cm4gKGV4c3RhdCAmIDB4ZmYpOyAvKiBzZWUgYmVsb3cgKi8KLQkJY2FzZSBMSU5UUjoKLQkJCS8qIGludHJfb2sgaXMgc2V0IGlmIHdlIGFyZSBpbmNsdWRpbmcgLnByb2ZpbGUgb3IgJEVOVi4KLQkJCSAqIElmIHVzZXIgXkNzIG91dCwgd2UgZG9uJ3Qgd2FudCB0byBraWxsIHRoZSBzaGVsbC4uLgotCQkJICovCi0JCQlpZiAoaW50cl9vayAmJiAoZXhzdGF0IC0gMTI4KSAhPSBTSUdURVJNKQotCQkJCXJldHVybiAoMSk7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIExFWElUOgotCQljYXNlIExMRUFWRToKLQkJY2FzZSBMU0hFTEw6Ci0JCQl1bndpbmQoaSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCWRlZmF1bHQ6Ci0JCQlpbnRlcm5hbF9lcnJvcmYoImluY2x1ZGU6ICVkIiwgaSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCX0KLQl9Ci0JaWYgKGFyZ3YpIHsKLQkJZS0+bG9jLT5hcmd2ID0gYXJndjsKLQkJZS0+bG9jLT5hcmdjID0gYXJnYzsKLQl9Ci0JcyA9IHB1c2hzKFNGSUxFLCBBVEVNUCk7Ci0Jcy0+dS5zaGYgPSBzaGY7Ci0Jc3RyZHVweChzLT5maWxlLCBuYW1lLCBBVEVNUCk7Ci0JaSA9IHNoZWxsKHMsIGZhbHNlKTsKLQlxdWl0ZW52KHMtPnUuc2hmKTsKLQlpZiAob2xkX2FyZ3YpIHsKLQkJZS0+bG9jLT5hcmd2ID0gb2xkX2FyZ3Y7Ci0JCWUtPmxvYy0+YXJnYyA9IG9sZF9hcmdjOwotCX0KLQlyZXR1cm4gKGkgJiAweGZmKTsJLyogJiAweGZmIHRvIGVuc3VyZSB2YWx1ZSBub3QgLTEgKi8KLX0KLQotLyogc3Bhd24gYSBjb21tYW5kIGludG8gYSBzaGVsbCBvcHRpb25hbGx5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGxpbmUgbnVtYmVyICovCi1pbnQKLWNvbW1hbmQoY29uc3QgY2hhciAqY29tbSwgaW50IGxpbmUpCi17Ci0JU291cmNlICpzOwotCi0JcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKLQlzLT5zdGFydCA9IHMtPnN0ciA9IGNvbW07Ci0Jcy0+bGluZSA9IGxpbmU7Ci0JcmV0dXJuIChzaGVsbChzLCBmYWxzZSkpOwotfQotCi0vKgotICogcnVuIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UsIHJldHVybmluZyBzdGF0dXMuCi0gKi8KLWludAotc2hlbGwoU291cmNlICogdm9sYXRpbGUgcywgdm9sYXRpbGUgaW50IHRvcGxldmVsKQotewotCXN0cnVjdCBvcCAqdDsKLQl2b2xhdGlsZSBpbnQgd2FzdHR5ID0gcy0+ZmxhZ3MgJiBTRl9UVFk7Ci0Jdm9sYXRpbGUgaW50IGF0dGVtcHRzID0gMTM7Ci0Jdm9sYXRpbGUgaW50IGludGVyYWN0aXZlID0gRmxhZyhGVEFMS0lORykgJiYgdG9wbGV2ZWw7Ci0JU291cmNlICp2b2xhdGlsZSBvbGRfc291cmNlID0gc291cmNlOwotCWludCBpOwotCi0Jcy0+ZmxhZ3MgfD0gU0ZfRklSU1Q7CS8qIGVuYWJsZSBVVEYtOCBCT00gY2hlY2sgKi8KLQotCW5ld2VudihFX1BBUlNFKTsKLQlpZiAoaW50ZXJhY3RpdmUpCi0JCXJlYWxseV9leGl0ID0gMDsKLQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOwotCWlmIChpKSB7Ci0JCXN3aXRjaCAoaSkgewotCQljYXNlIExJTlRSOiAvKiB3ZSBnZXQgaGVyZSBpZiBTSUdJTlQgbm90IGNhdWdodCBvciBpZ25vcmVkICovCi0JCWNhc2UgTEVSUk9SOgotCQljYXNlIExTSEVMTDoKLQkJCWlmIChpbnRlcmFjdGl2ZSkgewotCQkJCWlmIChpID09IExJTlRSKQotCQkJCQlzaGVsbGYoIlxuIik7Ci0JCQkJLyogUmVzZXQgYW55IGVvZiB0aGF0IHdhcyByZWFkIGFzIHBhcnQgb2YgYQotCQkJCSAqIG11bHRpbGluZSBjb21tYW5kLgotCQkJCSAqLwotCQkJCWlmIChGbGFnKEZJR05PUkVFT0YpICYmIHMtPnR5cGUgPT0gU0VPRiAmJgotCQkJCSAgICB3YXN0dHkpCi0JCQkJCXMtPnR5cGUgPSBTU1RESU47Ci0JCQkJLyogVXNlZCBieSBleGl0IGNvbW1hbmQgdG8gZ2V0IGJhY2sgdG8KLQkJCQkgKiB0b3AgbGV2ZWwgc2hlbGwuIEtpbmQgb2Ygc3RyYW5nZSBzaW5jZQotCQkJCSAqIGludGVyYWN0aXZlIGlzIHNldCBpZiB3ZSBhcmUgcmVhZGluZyBmcm9tCi0JCQkJICogYSB0dHksIGJ1dCB0byBoYXZlIHN0b3BwZWQgam9icywgb25lIG9ubHkKLQkJCQkgKiBuZWVkcyBGTU9OSVRPUiBzZXQgKG5vdCBGVEFMS0lORy9TRl9UVFkpLi4uCi0JCQkJICovCi0JCQkJLyogdG9zcyBhbnkgaW5wdXQgd2UgaGF2ZSBzbyBmYXIgKi8KLQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIExFWElUOgotCQljYXNlIExMRUFWRToKLQkJY2FzZSBMUkVUVVJOOgotCQkJc291cmNlID0gb2xkX3NvdXJjZTsKLQkJCXF1aXRlbnYoTlVMTCk7Ci0JCQl1bndpbmQoaSk7CS8qIGtlZXAgb24gZ29pbmcgKi8KLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJZGVmYXVsdDoKLQkJCXNvdXJjZSA9IG9sZF9zb3VyY2U7Ci0JCQlxdWl0ZW52KE5VTEwpOwotCQkJaW50ZXJuYWxfZXJyb3JmKCJzaGVsbDogJWQiLCBpKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCX0KLQl3aGlsZSAoMSkgewotCQlpZiAodHJhcCkKLQkJCXJ1bnRyYXBzKDApOwotCi0JCWlmIChzLT5uZXh0ID09IE5VTEwpIHsKLQkJCWlmIChGbGFnKEZWRVJCT1NFKSkKLQkJCQlzLT5mbGFncyB8PSBTRl9FQ0hPOwotCQkJZWxzZQotCQkJCXMtPmZsYWdzICY9IH5TRl9FQ0hPOwotCQl9Ci0JCWlmIChpbnRlcmFjdGl2ZSkgewotCQkJal9ub3RpZnkoKTsKLQkJCXNldF9wcm9tcHQoUFMxLCBzKTsKLQkJfQotCQl0ID0gY29tcGlsZShzKTsKLQkJaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRFT0YpIHsKLQkJCWlmICh3YXN0dHkgJiYgRmxhZyhGSUdOT1JFRU9GKSAmJiAtLWF0dGVtcHRzID4gMCkgewotCQkJCXNoZWxsZigiVXNlICdleGl0JyB0byBsZWF2ZSBrc2hcbiIpOwotCQkJCXMtPnR5cGUgPSBTU1RESU47Ci0JCQl9IGVsc2UgaWYgKHdhc3R0eSAmJiAhcmVhbGx5X2V4aXQgJiYKLQkJCSAgICBqX3N0b3BwZWRfcnVubmluZygpKSB7Ci0JCQkJcmVhbGx5X2V4aXQgPSAxOwotCQkJCXMtPnR5cGUgPSBTU1RESU47Ci0JCQl9IGVsc2UgewotCQkJCS8qIHRoaXMgZm9yIFBPU0lYIHdoaWNoIHNheXMgRVhJVCB0cmFwcwotCQkJCSAqIHNoYWxsIGJlIHRha2VuIGluIHRoZSBlbnZpcm9ubWVudAotCQkJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGNvbW1hbmQKLQkJCQkgKiBleGVjdXRlZC4KLQkJCQkgKi8KLQkJCQlpZiAodG9wbGV2ZWwpCi0JCQkJCXVud2luZChMRVhJVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHQgJiYgKCFGbGFnKEZOT0VYRUMpIHx8IChzLT5mbGFncyAmIFNGX1RUWSkpKQotCQkJZXhzdGF0ID0gZXhlY3V0ZSh0LCAwLCBOVUxMKTsKLQotCQlpZiAodCAhPSBOVUxMICYmIHQtPnR5cGUgIT0gVEVPRiAmJiBpbnRlcmFjdGl2ZSAmJiByZWFsbHlfZXhpdCkKLQkJCXJlYWxseV9leGl0ID0gMDsKLQotCQlyZWNsYWltKCk7Ci0JfQotCXF1aXRlbnYoTlVMTCk7Ci0Jc291cmNlID0gb2xkX3NvdXJjZTsKLQlyZXR1cm4gKGV4c3RhdCk7Ci19Ci0KLS8qIHJldHVybiB0byBjbG9zZXN0IGVycm9yIGhhbmRsZXIgb3Igc2hlbGwoKSwgZXhpdCBpZiBub25lIGZvdW5kICovCi12b2lkCi11bndpbmQoaW50IGkpCi17Ci0JLyogb3JkZXJpbmcgZm9yIEVYSVQgdnMgRVJSIGlzIGEgYml0IG9kZCAodGhpcyBpcyB3aGF0IEFUJlQga3NoIGRvZXMpICovCi0JaWYgKGkgPT0gTEVYSVQgfHwgKEZsYWcoRkVSUkVYSVQpICYmIChpID09IExFUlJPUiB8fCBpID09IExJTlRSKSAmJgotCSAgICBzaWd0cmFwc1tTSUdFWElUX10udHJhcCkpIHsKLQkJcnVudHJhcCgmc2lndHJhcHNbU0lHRVhJVF9dKTsKLQkJaSA9IExMRUFWRTsKLQl9IGVsc2UgaWYgKEZsYWcoRkVSUkVYSVQpICYmIChpID09IExFUlJPUiB8fCBpID09IExJTlRSKSkgewotCQlydW50cmFwKCZzaWd0cmFwc1tTSUdFUlJfXSk7Ci0JCWkgPSBMTEVBVkU7Ci0JfQotCXdoaWxlICgxKSB7Ci0JCXN3aXRjaCAoZS0+dHlwZSkgewotCQljYXNlIEVfUEFSU0U6Ci0JCWNhc2UgRV9GVU5DOgotCQljYXNlIEVfSU5DTDoKLQkJY2FzZSBFX0xPT1A6Ci0JCWNhc2UgRV9FUlJIOgotCQkJc2lnbG9uZ2ptcChlLT5qYnVmLCBpKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJY2FzZSBFX05PTkU6Ci0JCQlpZiAoaSA9PSBMSU5UUikKLQkJCQllLT5mbGFncyB8PSBFRl9GQUtFX1NJR0RJRTsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQlxdWl0ZW52KE5VTEwpOwotCQl9Ci0JfQotfQotCi12b2lkCi1uZXdlbnYoaW50IHR5cGUpCi17Ci0Jc3RydWN0IGVudiAqZXA7Ci0JY2hhciAqY3A7Ci0KLQkvKgotCSAqIHN0cnVjdCBlbnYgaW5jbHVkZXMgQUxMT0NfSVRFTSBmb3IgYWxpZ25tZW50IGNvbnN0cmFpbnRzCi0JICogc28gZmlyc3QgZ2V0IHRoZSBhY3R1YWxseSB1c2VkIG1lbW9yeSwgdGhlbiBhc3NpZ24gaXQKLQkgKi8KLQljcCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgZW52KSAtIEFMTE9DX1NJWkUsIEFURU1QKTsKLQllcCA9ICh2b2lkICopKGNwIC0gQUxMT0NfU0laRSk7CS8qIHVuZG8gd2hhdCBhbGxvYygpIGRpZCAqLwotCS8qIGluaXRpYWxpc2UgcHVibGljIG1lbWJlcnMgb2Ygc3RydWN0IGVudiAobm90IHRoZSBBTExPQ19JVEVNKSAqLwotCWFpbml0KCZlcC0+YXJlYSk7Ci0JZXAtPm9lbnYgPSBlOwotCWVwLT5sb2MgPSBlLT5sb2M7Ci0JZXAtPnNhdmVmZCA9IE5VTEw7Ci0JZXAtPnRlbXBzID0gTlVMTDsKLQllcC0+dHlwZSA9IHR5cGU7Ci0JZXAtPmZsYWdzID0gMDsKLQkvKiBqdW1wIGJ1ZmZlciBpcyBpbnZhbGlkIGJlY2F1c2UgZmxhZ3MgPT0gMCAqLwotCWUgPSBlcDsKLX0KLQotdm9pZAotcXVpdGVudihzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0Jc3RydWN0IGVudiAqZXAgPSBlOwotCWNoYXIgKmNwOwotCWludCBmZDsKLQotCWlmIChlcC0+b2VudiAmJiBlcC0+b2Vudi0+bG9jICE9IGVwLT5sb2MpCi0JCXBvcGJsb2NrKCk7Ci0JaWYgKGVwLT5zYXZlZmQgIT0gTlVMTCkgewotCQlmb3IgKGZkID0gMDsgZmQgPCBOVUZJTEU7IGZkKyspCi0JCQkvKiBpZiBlcC0+c2F2ZWZkW2ZkXSA8IDAsIG1lYW5zIGZkIHdhcyBjbG9zZWQgKi8KLQkJCWlmIChlcC0+c2F2ZWZkW2ZkXSkKLQkJCQlyZXN0ZmQoZmQsIGVwLT5zYXZlZmRbZmRdKTsKLQkJaWYgKGVwLT5zYXZlZmRbMl0pCS8qIENsZWFyIGFueSB3cml0ZSBlcnJvcnMgKi8KLQkJCXNoZl9yZW9wZW4oMiwgU0hGX1dSLCBzaGxfb3V0KTsKLQl9Ci0JLyogQm90dG9tIG9mIHRoZSBzdGFjay4KLQkgKiBFaXRoZXIgbWFpbiBzaGVsbCBpcyBleGl0aW5nIG9yIGNsZWFudXBfcGFyZW50c19lbnYoKSB3YXMgY2FsbGVkLgotCSAqLwotCWlmIChlcC0+b2VudiA9PSBOVUxMKSB7Ci0JCWlmIChlcC0+dHlwZSA9PSBFX05PTkUpIHsJLyogTWFpbiBzaGVsbCBleGl0aW5nPyAqLwotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi0JCQlpZiAoRmxhZyhGVEFMS0lORykpCi0JCQkJaGlzdF9maW5pc2goKTsKLSNlbmRpZgotCQkJal9leGl0KCk7Ci0JCQlpZiAoZXAtPmZsYWdzICYgRUZfRkFLRV9TSUdESUUpIHsKLQkJCQlpbnQgc2lnID0gZXhzdGF0IC0gMTI4OwotCi0JCQkJLyogaGFtIHVwIG91ciBkZWF0aCBhIGJpdCAoQVQmVCBrc2gKLQkJCQkgKiBvbmx5IHNlZW1zIHRvIGRvIHRoaXMgZm9yIFNJR1RFUk0pCi0JCQkJICogRG9uJ3QgZG8gaXQgZm9yIFNJR1FVSVQsIHNpbmNlIHdlJ2QKLQkJCQkgKiBkdW1wIGEgY29yZS4uCi0JCQkJICovCi0JCQkJaWYgKChzaWcgPT0gU0lHSU5UIHx8IHNpZyA9PSBTSUdURVJNKSAmJgotCQkJCSAgICAoa3NocGdycCA9PSBrc2hwaWQpKSB7Ci0JCQkJCXNldHNpZygmc2lndHJhcHNbc2lnXSwgU0lHX0RGTCwKLQkJCQkJICAgIFNTX1JFU1RPUkVfQ1VSUiB8IFNTX0ZPUkNFKTsKLQkJCQkJa2lsbCgwLCBzaWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2hmKQotCQkJc2hmX2Nsb3NlKHNoZik7Ci0JCXJlY2xhaW0oKTsKLQkJZXhpdChleHN0YXQpOwotCX0KLQlpZiAoc2hmKQotCQlzaGZfY2xvc2Uoc2hmKTsKLQlyZWNsYWltKCk7Ci0KLQllID0gZS0+b2VudjsKLQotCS8qIGZyZWUgdGhlIHN0cnVjdCBlbnYgLSB0cmlja3kgZHVlIHRvIHRoZSBBTExPQ19JVEVNIGluc2lkZSAqLwotCWNwID0gKHZvaWQgKillcDsKLQlhZnJlZShjcCArIEFMTE9DX1NJWkUsIEFURU1QKTsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIGEgZm9yayB0byBjbGVhbnVwIHN0dWZmIGxlZnQgb3ZlciBmcm9tIHBhcmVudHMgZW52aXJvbm1lbnQgKi8KLXZvaWQKLWNsZWFudXBfcGFyZW50c19lbnYodm9pZCkKLXsKLQlzdHJ1Y3QgZW52ICplcDsKLQlpbnQgZmQ7Ci0KLQlta3NzZXJ0KGUgIT0gTlVMTCk7Ci0KLQkvKgotCSAqIERvbid0IGNsZWFuIHVwIHRlbXBvcmFyeSBmaWxlcyAtIHBhcmVudCB3aWxsIHByb2JhYmx5IG5lZWQgdGhlbS4KLQkgKiBBbHNvLCBjYW4ndCBlYXNpbHkgcmVjbGFpbSBtZW1vcnkgc2luY2UgdmFyaWFibGVzLCBldGMuIGNvdWxkIGJlCi0JICogYW55d2hlcmUuCi0JICovCi0KLQkvKiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBoaWRpbmcgaW4gc2F2ZWZkICovCi0JZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KSB7Ci0JCWlmIChlcC0+c2F2ZWZkKSB7Ci0JCQlmb3IgKGZkID0gMDsgZmQgPCBOVUZJTEU7IGZkKyspCi0JCQkJaWYgKGVwLT5zYXZlZmRbZmRdID4gMCkKLQkJCQkJY2xvc2UoZXAtPnNhdmVmZFtmZF0pOwotCQkJYWZyZWUoZXAtPnNhdmVmZCwgJmVwLT5hcmVhKTsKLQkJCWVwLT5zYXZlZmQgPSBOVUxMOwotCQl9Ci0JfQotCWUtPm9lbnYgPSBOVUxMOwotfQotCi0vKiBDYWxsZWQganVzdCBiZWZvcmUgYW4gZXhlY3ZlIGNsZWFudXAgc3R1ZmYgdGVtcG9yYXJ5IGZpbGVzICovCi12b2lkCi1jbGVhbnVwX3Byb2NfZW52KHZvaWQpCi17Ci0Jc3RydWN0IGVudiAqZXA7Ci0KLQlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpCi0JCXJlbW92ZV90ZW1wcyhlcC0+dGVtcHMpOwotfQotCi0vKiByZW1vdmUgdGVtcCBmaWxlcyBhbmQgZnJlZSBBVEVNUCBBcmVhICovCi1zdGF0aWMgdm9pZAotcmVjbGFpbSh2b2lkKQotewotCXJlbW92ZV90ZW1wcyhlLT50ZW1wcyk7Ci0JZS0+dGVtcHMgPSBOVUxMOwotCWFmcmVlYWxsKCZlLT5hcmVhKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbW92ZV90ZW1wcyhzdHJ1Y3QgdGVtcCAqdHApCi17Ci0JZm9yICg7IHRwICE9IE5VTEw7IHRwID0gdHAtPm5leHQpCi0JCWlmICh0cC0+cGlkID09IHByb2NwaWQpCi0JCQl1bmxpbmsodHAtPm5hbWUpOwotfQotCi0vKiBJbml0aWFsaXNlIHR0eV9mZC4gVXNlZCBmb3Igc2F2aW5nL3Jlc2V0aW5nIHR0eSBtb2RlcyB1cG9uCi0gKiBmb3JlZ3JvdW5kIGpvYiBjb21wbGV0aW9uIGFuZCBmb3Igc2V0dGluZyB1cCB0dHkgcHJvY2VzcyBncm91cC4KLSAqLwotdm9pZAotdHR5X2luaXQoYm9vbCBpbml0X3R0eXN0YXRlLCBib29sIG5lZWRfdHR5KQotewotCWJvb2wgZG9fY2xvc2UgPSB0cnVlOwotCWludCB0ZmQ7Ci0KLQlpZiAodHR5X2ZkID49IDApIHsKLQkJY2xvc2UodHR5X2ZkKTsKLQkJdHR5X2ZkID0gLTE7Ci0JfQotCXR0eV9kZXZ0dHkgPSAxOwotCi0jaWZkZWYgX1VXSU4KLQkvKiBYWFggaW1ha2Ugc3R5bGUgKi8KLQlpZiAoaXNhdHR5KDMpKQotCQl0ZmQgPSAzOwotCWVsc2UKLSNlbmRpZgotCWlmICgodGZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IsIDApKSA8IDApIHsKLQkJdHR5X2RldnR0eSA9IDA7Ci0JCWlmIChuZWVkX3R0eSkKLQkJCXdhcm5pbmdmKGZhbHNlLAotCQkJICAgICJObyBjb250cm9sbGluZyB0dHkgKG9wZW4gL2Rldi90dHk6ICVzKSIsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JaWYgKHRmZCA8IDApIHsKLQkJZG9fY2xvc2UgPSBmYWxzZTsKLQkJaWYgKGlzYXR0eSgwKSkKLQkJCXRmZCA9IDA7Ci0JCWVsc2UgaWYgKGlzYXR0eSgyKSkKLQkJCXRmZCA9IDI7Ci0JCWVsc2UgewotCQkJaWYgKG5lZWRfdHR5KQotCQkJCXdhcm5pbmdmKGZhbHNlLAotCQkJCSAgICAiQ2FuJ3QgZmluZCB0dHkgZmlsZSBkZXNjcmlwdG9yIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JaWYgKCh0dHlfZmQgPSBmY250bCh0ZmQsIEZfRFVQRkQsIEZEQkFTRSkpIDwgMCkgewotCQlpZiAobmVlZF90dHkpCi0JCQl3YXJuaW5nZihmYWxzZSwgImpfdHR5aW5pdDogZHVwIG9mIHR0eSBmZCBmYWlsZWQ6ICVzIiwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCX0gZWxzZSBpZiAoZmNudGwodHR5X2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA8IDApIHsKLQkJaWYgKG5lZWRfdHR5KQotCQkJd2FybmluZ2YoZmFsc2UsCi0JCQkgICAgImpfdHR5aW5pdDogY2FuJ3Qgc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZzogJXMiLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKHR0eV9mZCk7Ci0JCXR0eV9mZCA9IC0xOwotCX0gZWxzZSBpZiAoaW5pdF90dHlzdGF0ZSkKLQkJdGNnZXRhdHRyKHR0eV9mZCwgJnR0eV9zdGF0ZSk7Ci0JaWYgKGRvX2Nsb3NlKQotCQljbG9zZSh0ZmQpOwotfQotCi12b2lkCi10dHlfY2xvc2Uodm9pZCkKLXsKLQlpZiAodHR5X2ZkID49IDApIHsKLQkJY2xvc2UodHR5X2ZkKTsKLQkJdHR5X2ZkID0gLTE7Ci0JfQotfQotCi0vKiBBIHNoZWxsIGVycm9yIG9jY3VycmVkIChlZywgc3ludGF4IGVycm9yLCBldGMuKSAqLwotdm9pZAotZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQlzaGxfc3Rkb3V0X29rID0gMDsJLyogZGVidWdnaW5nOiBub3RlIHRoYXQgc3Rkb3V0IG5vdCB2YWxpZCAqLwotCWV4c3RhdCA9IDE7Ci0JaWYgKCpmbXQgIT0gMSkgewotCQllcnJvcl9wcmVmaXgodHJ1ZSk7Ci0JCXZhX3N0YXJ0KHZhLCBmbXQpOwotCQlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOwotCX0KLQlzaGZfZmx1c2goc2hsX291dCk7Ci0JdW53aW5kKExFUlJPUik7Ci19Ci0KLS8qIGxpa2UgZXJyb3JmKCksIGJ1dCBubyB1bndpbmQgaXMgZG9uZSAqLwotdm9pZAotd2FybmluZ2YoYm9vbCBmaWxlbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCWVycm9yX3ByZWZpeChmaWxlbGluZSk7Ci0JdmFfc3RhcnQodmEsIGZtdCk7Ci0Jc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0Jc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7Ci0Jc2hmX2ZsdXNoKHNobF9vdXQpOwotfQotCi0vKiBVc2VkIGJ5IGJ1aWx0LWluIHV0aWxpdGllcyB0byBwcmVmaXggc2hlbGwgYW5kIHV0aWxpdHkgbmFtZSB0byBtZXNzYWdlCi0gKiAoYWxzbyB1bndpbmRzIGVudmlyb25tZW50cyBmb3Igc3BlY2lhbCBidWlsdGlucykuCi0gKi8KLXZvaWQKLWJpX2Vycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0Jc2hsX3N0ZG91dF9vayA9IDA7CS8qIGRlYnVnZ2luZzogbm90ZSB0aGF0IHN0ZG91dCBub3QgdmFsaWQgKi8KLQlleHN0YXQgPSAxOwotCWlmICgqZm10ICE9IDEpIHsKLQkJZXJyb3JfcHJlZml4KHRydWUpOwotCQkvKiBub3Qgc2V0IHdoZW4gbWFpbigpIGNhbGxzIHBhcnNlX2FyZ3MoKSAqLwotCQlpZiAoYnVpbHRpbl9hcmd2MCkKLQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlczogIiwgYnVpbHRpbl9hcmd2MCk7Ci0JCXZhX3N0YXJ0KHZhLCBmbXQpOwotCQlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOwotCX0KLQlzaGZfZmx1c2goc2hsX291dCk7Ci0JLyogUE9TSVggc3BlY2lhbCBidWlsdGlucyBhbmQga3NoIHNwZWNpYWwgYnVpbHRpbnMgY2F1c2UKLQkgKiBub24taW50ZXJhY3RpdmUgc2hlbGxzIHRvIGV4aXQuCi0JICogWFhYIG9kZCB1c2Ugb2YgS0VFUEFTTjsgYWxzbyBtYXkgbm90IHdhbnQgTEVSUk9SIGhlcmUKLQkgKi8KLQlpZiAoYnVpbHRpbl9mbGFnICYgU1BFQ19CSSkgewotCQlidWlsdGluX2FyZ3YwID0gTlVMTDsKLQkJdW53aW5kKExFUlJPUik7Ci0JfQotfQotCi0vKiBDYWxsZWQgd2hlbiBzb21ldGhpbmcgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIGRvZXMgKi8KLXZvaWQKLWludGVybmFsX3ZlcnJvcmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCXNoZl9mcHJpbnRmKHNobF9vdXQsICJpbnRlcm5hbCBlcnJvcjogIik7Ci0Jc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgYXApOwotCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOwotCXNoZl9mbHVzaChzaGxfb3V0KTsKLX0KLQotdm9pZAotaW50ZXJuYWxfZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQl2YV9zdGFydCh2YSwgZm10KTsKLQlpbnRlcm5hbF92ZXJyb3JmKGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JdW53aW5kKExFUlJPUik7Ci19Ci0KLXZvaWQKLWludGVybmFsX3dhcm5pbmdmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQl2YV9zdGFydCh2YSwgZm10KTsKLQlpbnRlcm5hbF92ZXJyb3JmKGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci19Ci0KLS8qIHVzZWQgYnkgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9ucyB0byBwcmludCAia3NoOiAua3NocmNbMjVdOiAiICovCi12b2lkCi1lcnJvcl9wcmVmaXgoYm9vbCBmaWxlbGluZSkKLXsKLQkvKiBBdm9pZCBmb286IGZvb1syXTogLi4uICovCi0JaWYgKCFmaWxlbGluZSB8fCAhc291cmNlIHx8ICFzb3VyY2UtPmZpbGUgfHwKLQkgICAgc3RyY21wKHNvdXJjZS0+ZmlsZSwga3NobmFtZSkgIT0gMCkKLQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzOiAiLCBrc2huYW1lICsgKCprc2huYW1lID09ICctJykpOwotCWlmIChmaWxlbGluZSAmJiBzb3VyY2UgJiYgc291cmNlLT5maWxlICE9IE5VTEwpIHsKLQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzWyVkXTogIiwgc291cmNlLT5maWxlLAotCQkgICAgc291cmNlLT5lcnJsaW5lID4gMCA/IHNvdXJjZS0+ZXJybGluZSA6IHNvdXJjZS0+bGluZSk7Ci0JCXNvdXJjZS0+ZXJybGluZSA9IDA7Ci0JfQotfQotCi0vKiBwcmludGYgdG8gc2hsX291dCAoc3RkZXJyKSB3aXRoIGZsdXNoICovCi12b2lkCi1zaGVsbGYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCWlmICghaW5pdGlvX2RvbmUpIC8qIHNobF9vdXQgbWF5IG5vdCBiZSBzZXQgdXAgeWV0Li4uICovCi0JCXJldHVybjsKLQl2YV9zdGFydCh2YSwgZm10KTsKLQlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7Ci0JdmFfZW5kKHZhKTsKLQlzaGZfZmx1c2goc2hsX291dCk7Ci19Ci0KLS8qIHByaW50ZiB0byBzaGxfc3Rkb3V0IChzdGRvdXQpICovCi12b2lkCi1zaHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0JaWYgKCFzaGxfc3Rkb3V0X29rKQotCQlpbnRlcm5hbF9lcnJvcmYoInNobF9zdGRvdXQgbm90IHZhbGlkIik7Ci0JdmFfc3RhcnQodmEsIGZtdCk7Ci0Jc2hmX3ZmcHJpbnRmKHNobF9zdGRvdXQsIGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci19Ci0KLS8qIHRlc3QgaWYgd2UgY2FuIHNlZWsgYmFja3dhcmRzIGZkIChyZXR1cm5zIDAgb3IgU0hGX1VOQlVGKSAqLwotaW50Ci1jYW5fc2VlayhpbnQgZmQpCi17Ci0Jc3RydWN0IHN0YXQgc3RhdGI7Ci0KLQlyZXR1cm4gKGZzdGF0KGZkLCAmc3RhdGIpID09IDAgJiYgIVNfSVNSRUcoc3RhdGIuc3RfbW9kZSkgPwotCSAgICBTSEZfVU5CVUYgOiAwKTsKLX0KLQotc3RydWN0IHNoZiBzaGZfaW9iWzNdOwotCi12b2lkCi1pbml0aW8odm9pZCkKLXsKLQlzaGZfZmRvcGVuKDEsIFNIRl9XUiwgc2hsX3N0ZG91dCk7CS8qIGZvcmNlIGJ1ZmZlciBhbGxvY2F0aW9uICovCi0Jc2hmX2Zkb3BlbigyLCBTSEZfV1IsIHNobF9vdXQpOwotCXNoZl9mZG9wZW4oMiwgU0hGX1dSLCBzaGxfc3BhcmUpOwkvKiBmb3JjZSBidWZmZXIgYWxsb2NhdGlvbiAqLwotCWluaXRpb19kb25lID0gMTsKLX0KLQotLyogQSBkdXAyKCkgd2l0aCBlcnJvciBjaGVja2luZyAqLwotaW50Ci1rc2hfZHVwMihpbnQgb2ZkLCBpbnQgbmZkLCBib29sIGVycm9rKQotewotCWludCBydjsKLQotCWlmICgoKHJ2ID0gZHVwMihvZmQsIG5mZCkpIDwgMCkgJiYgIWVycm9rICYmIChlcnJubyAhPSBFQkFERikpCi0JCWVycm9yZigidG9vIG1hbnkgZmlsZXMgb3BlbiBpbiBzaGVsbCIpOwotCi0jaWZkZWYgX191bHRyaXgKLQkvKiBYWFggaW1ha2Ugc3R5bGUgKi8KLQlpZiAocnYgPj0gMCkKLQkJZmNudGwobmZkLCBGX1NFVEZELCAwKTsKLSNlbmRpZgotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qCi0gKiBtb3ZlIGZkIGZyb20gdXNlciBzcGFjZSAoMDw9ZmQ8MTApIHRvIHNoZWxsIHNwYWNlIChmZD49MTApLAotICogc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZy4KLSAqLwotc2hvcnQKLXNhdmVmZChpbnQgZmQpCi17Ci0JaW50IG5mZCA9IGZkOwotCi0JaWYgKGZkIDwgRkRCQVNFICYmIChuZmQgPSBmY250bChmZCwgRl9EVVBGRCwgRkRCQVNFKSkgPCAwICYmCi0JICAgIGVycm5vID09IEVCQURGKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAobmZkIDwgMCB8fCBuZmQgPiBTSFJUX01BWCkKLQkJZXJyb3JmKCJ0b28gbWFueSBmaWxlcyBvcGVuIGluIHNoZWxsIik7Ci0JZmNudGwobmZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQlyZXR1cm4gKChzaG9ydCluZmQpOwotfQotCi12b2lkCi1yZXN0ZmQoaW50IGZkLCBpbnQgb2ZkKQotewotCWlmIChmZCA9PSAyKQotCQlzaGZfZmx1c2goJnNoZl9pb2JbZmRdKTsKLQlpZiAob2ZkIDwgMCkJCS8qIG9yaWdpbmFsIGZkIGNsb3NlZCAqLwotCQljbG9zZShmZCk7Ci0JZWxzZSBpZiAoZmQgIT0gb2ZkKSB7Ci0JCWtzaF9kdXAyKG9mZCwgZmQsIHRydWUpOyAvKiBYWFg6IHdoYXQgdG8gZG8gaWYgdGhpcyBmYWlscz8gKi8KLQkJY2xvc2Uob2ZkKTsKLQl9Ci19Ci0KLXZvaWQKLW9wZW5waXBlKGludCAqcHYpCi17Ci0JaW50IGxwdlsyXTsKLQotCWlmIChwaXBlKGxwdikgPCAwKQotCQllcnJvcmYoImNhbid0IGNyZWF0ZSBwaXBlIC0gdHJ5IGFnYWluIik7Ci0JcHZbMF0gPSBzYXZlZmQobHB2WzBdKTsKLQlpZiAocHZbMF0gIT0gbHB2WzBdKQotCQljbG9zZShscHZbMF0pOwotCXB2WzFdID0gc2F2ZWZkKGxwdlsxXSk7Ci0JaWYgKHB2WzFdICE9IGxwdlsxXSkKLQkJY2xvc2UobHB2WzFdKTsKLX0KLQotdm9pZAotY2xvc2VwaXBlKGludCAqcHYpCi17Ci0JY2xvc2UocHZbMF0pOwotCWNsb3NlKHB2WzFdKTsKLX0KLQotLyogQ2FsbGVkIGJ5IGlvc2V0dXAoKSAoZGVhbHMgd2l0aCAyPiY0LCBldGMuKSwgY19yZWFkLCBjX3ByaW50IHRvIHR1cm4KLSAqIGEgc3RyaW5nICh0aGUgWCBpbiAyPiZYLCByZWFkIC11WCwgcHJpbnQgLXVYKSBpbnRvIGEgZmlsZSBkZXNjcmlwdG9yLgotICovCi1pbnQKLWNoZWNrX2ZkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBjb25zdCBjaGFyICoqZW1zZ3ApCi17Ci0JaW50IGZkLCBmbDsKLQotCWlmIChuYW1lWzBdID09ICdwJyAmJiAhbmFtZVsxXSkKLQkJcmV0dXJuIChjb3Byb2NfZ2V0ZmQobW9kZSwgZW1zZ3ApKTsKLQlmb3IgKGZkID0gMDsga3NoX2lzZGlnaXQoKm5hbWUpOyArK25hbWUpCi0JCWZkID0gKGZkICogMTApICsgKm5hbWUgLSAnMCc7Ci0JaWYgKCpuYW1lIHx8IGZkID49IEZEQkFTRSkgewotCQlpZiAoZW1zZ3ApCi0JCQkqZW1zZ3AgPSAiaWxsZWdhbCBmaWxlIGRlc2NyaXB0b3IgbmFtZSI7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoKGZsID0gZmNudGwoZmQsIEZfR0VURkwsIDApKSA8IDApIHsKLQkJaWYgKGVtc2dwKQotCQkJKmVtc2dwID0gImJhZCBmaWxlIGRlc2NyaXB0b3IiOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JZmwgJj0gT19BQ0NNT0RFOwotCS8qIFhfT0sgaXMgYSBrbHVkZ2UgdG8gZGlzYWJsZSB0aGlzIGNoZWNrIGZvciBkdXBzICh4PCYxKToKLQkgKiBoaXN0b3JpY2FsIHNoZWxscyBuZXZlciBkaWQgdGhpcyBjaGVjayAoWFhYIGRvbid0IGtub3cgd2hhdAotCSAqIFBPU0lYIGhhcyB0byBzYXkpLgotCSAqLwotCWlmICghKG1vZGUgJiBYX09LKSAmJiBmbCAhPSBPX1JEV1IgJiYgKAotCSAgICAoKG1vZGUgJiBSX09LKSAmJiBmbCAhPSBPX1JET05MWSkgfHwKLQkgICAgKChtb2RlICYgV19PSykgJiYgZmwgIT0gT19XUk9OTFkpKSkgewotCQlpZiAoZW1zZ3ApCi0JCQkqZW1zZ3AgPSAoZmwgPT0gT19XUk9OTFkpID8KLQkJCSAgICAiZmQgbm90IG9wZW4gZm9yIHJlYWRpbmciIDoKLQkJCSAgICAiZmQgbm90IG9wZW4gZm9yIHdyaXRpbmciOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuIChmZCk7Ci19Ci0KLS8qIENhbGxlZCBvbmNlIGZyb20gbWFpbiAqLwotdm9pZAotY29wcm9jX2luaXQodm9pZCkKLXsKLQljb3Byb2MucmVhZCA9IGNvcHJvYy5yZWFkdyA9IGNvcHJvYy53cml0ZSA9IC0xOwotCWNvcHJvYy5uam9icyA9IDA7Ci0JY29wcm9jLmlkID0gMDsKLX0KLQotLyogQ2FsbGVkIGJ5IGNfcmVhZCgpIHdoZW4gZW9mIGlzIHJlYWQgLSBjbG9zZSBmZCBpZiBpdCBpcyB0aGUgY28tcHJvY2VzcyBmZCAqLwotdm9pZAotY29wcm9jX3JlYWRfY2xvc2UoaW50IGZkKQotewotCWlmIChjb3Byb2MucmVhZCA+PSAwICYmIGZkID09IGNvcHJvYy5yZWFkKSB7Ci0JCWNvcHJvY19yZWFkd19jbG9zZShmZCk7Ci0JCWNsb3NlKGNvcHJvYy5yZWFkKTsKLQkJY29wcm9jLnJlYWQgPSAtMTsKLQl9Ci19Ci0KLS8qIENhbGxlZCBieSBjX3JlYWQoKSBhbmQgYnkgaW9zZXR1cCgpIHRvIGNsb3NlIHRoZSBvdGhlciBzaWRlIG9mIHRoZQotICogcmVhZCBwaXBlLCBzbyByZWFkcyB3aWxsIGFjdHVhbGx5IHRlcm1pbmF0ZS4KLSAqLwotdm9pZAotY29wcm9jX3JlYWR3X2Nsb3NlKGludCBmZCkKLXsKLQlpZiAoY29wcm9jLnJlYWR3ID49IDAgJiYgY29wcm9jLnJlYWQgPj0gMCAmJiBmZCA9PSBjb3Byb2MucmVhZCkgewotCQljbG9zZShjb3Byb2MucmVhZHcpOwotCQljb3Byb2MucmVhZHcgPSAtMTsKLQl9Ci19Ci0KLS8qIENhbGxlZCBieSBjX3ByaW50IHdoZW4gYSB3cml0ZSB0byBhIGZkIGZhaWxzIHdpdGggRVBJUEUgYW5kIGJ5IGlvc2V0dXAKLSAqIHdoZW4gY28tcHJvY2VzcyBpbnB1dCBpcyBkdXAnZAotICovCi12b2lkCi1jb3Byb2Nfd3JpdGVfY2xvc2UoaW50IGZkKQotewotCWlmIChjb3Byb2Mud3JpdGUgPj0gMCAmJiBmZCA9PSBjb3Byb2Mud3JpdGUpIHsKLQkJY2xvc2UoY29wcm9jLndyaXRlKTsKLQkJY29wcm9jLndyaXRlID0gLTE7Ci0JfQotfQotCi0vKiBDYWxsZWQgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZi92YWx1ZSBvZiB0aGUgY28tcHJvY2VzcyBmaWxlIGRlc2NyaXB0b3IuCi0gKiAoVXNlZCBieSBjaGVja19mZCgpIGFuZCBieSBjX3JlYWQvY19wcmludCB0byBkZWFsIHdpdGggLXAgb3B0aW9uKS4KLSAqLwotaW50Ci1jb3Byb2NfZ2V0ZmQoaW50IG1vZGUsIGNvbnN0IGNoYXIgKiplbXNncCkKLXsKLQlpbnQgZmQgPSAobW9kZSAmIFJfT0spID8gY29wcm9jLnJlYWQgOiBjb3Byb2Mud3JpdGU7Ci0KLQlpZiAoZmQgPj0gMCkKLQkJcmV0dXJuIChmZCk7Ci0JaWYgKGVtc2dwKQotCQkqZW1zZ3AgPSAibm8gY29wcm9jZXNzIjsKLQlyZXR1cm4gKC0xKTsKLX0KLQotLyogY2FsbGVkIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMgcmVsYXRlZCB0byB0aGUgY29wcm9jZXNzIChpZiBhbnkpCi0gKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggU0lHQ0hMRCBibG9ja2VkLgotICovCi12b2lkCi1jb3Byb2NfY2xlYW51cChpbnQgcmV1c2UpCi17Ci0JLyogVGhpcyB0byBhbGxvdyBjby1wcm9jZXNzZXMgdG8gc2hhcmUgb3V0cHV0IHBpcGUgKi8KLQlpZiAoIXJldXNlIHx8IGNvcHJvYy5yZWFkdyA8IDAgfHwgY29wcm9jLnJlYWQgPCAwKSB7Ci0JCWlmIChjb3Byb2MucmVhZCA+PSAwKSB7Ci0JCQljbG9zZShjb3Byb2MucmVhZCk7Ci0JCQljb3Byb2MucmVhZCA9IC0xOwotCQl9Ci0JCWlmIChjb3Byb2MucmVhZHcgPj0gMCkgewotCQkJY2xvc2UoY29wcm9jLnJlYWR3KTsKLQkJCWNvcHJvYy5yZWFkdyA9IC0xOwotCQl9Ci0JfQotCWlmIChjb3Byb2Mud3JpdGUgPj0gMCkgewotCQljbG9zZShjb3Byb2Mud3JpdGUpOwotCQljb3Byb2Mud3JpdGUgPSAtMTsKLQl9Ci19Ci0KLXN0cnVjdCB0ZW1wICoKLW1ha2V0ZW1wKEFyZWEgKmFwLCBUZW1wX3R5cGUgdHlwZSwgc3RydWN0IHRlbXAgKip0bGlzdCkKLXsKLQlzdHJ1Y3QgdGVtcCAqdHA7Ci0JaW50IGxlbjsKLQlpbnQgZmQ7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JY29uc3QgY2hhciAqZGlyOwotCi0JZGlyID0gdG1wZGlyID8gdG1wZGlyIDogTUtTSF9ERUZBVUxUX1RNUERJUjsKLSNpZiBIQVZFX01LU1RFTVAKLQlsZW4gPSBzdHJsZW4oZGlyKSArIDYgKyAxMCArIDE7Ci0jZWxzZQotCXBhdGhuYW1lID0gdGVtcG5hbShkaXIsICJta3NoLiIpOwotCWxlbiA9ICgocGF0aG5hbWUgPT0gTlVMTCkgPyAwIDogc3RybGVuKHBhdGhuYW1lKSkgKyAxOwotI2VuZGlmCi0JdHAgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHRlbXApICsgbGVuLCBhcCk7Ci0JdHAtPm5hbWUgPSAoY2hhciAqKSZ0cFsxXTsKLSNpZiAhSEFWRV9NS1NURU1QCi0JaWYgKHBhdGhuYW1lID09IE5VTEwpCi0JCXRwLT5uYW1lWzBdID0gJ1wwJzsKLQllbHNlIHsKLQkJbWVtY3B5KHRwLT5uYW1lLCBwYXRobmFtZSwgbGVuKTsKLQkJZnJlZShwYXRobmFtZSk7Ci0JfQotI2VuZGlmCi0JcGF0aG5hbWUgPSB0cC0+bmFtZTsKLQl0cC0+c2hmID0gTlVMTDsKLQl0cC0+dHlwZSA9IHR5cGU7Ci0jaWYgSEFWRV9NS1NURU1QCi0Jc2hmX3NucHJpbnRmKHBhdGhuYW1lLCBsZW4sICIlcy9ta3NoLlhYWFhYWFhYWFgiLCBkaXIpOwotCWlmICgoZmQgPSBta3N0ZW1wKHBhdGhuYW1lKSkgPj0gMCkKLSNlbHNlCi0JaWYgKHRwLT5uYW1lWzBdICYmIChmZCA9IG9wZW4odHAtPm5hbWUsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2MDApKSA+PSAwKQotI2VuZGlmCi0JCXRwLT5zaGYgPSBzaGZfZmRvcGVuKGZkLCBTSEZfV1IsIE5VTEwpOwotCXRwLT5waWQgPSBwcm9jcGlkOwotCi0JdHAtPm5leHQgPSAqdGxpc3Q7Ci0JKnRsaXN0ID0gdHA7Ci0JcmV0dXJuICh0cCk7Ci19Ci0KLS8qCi0gKiBXZSB1c2UgYSBzaW1pbGFyIGNvbGxpc2lvbiByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBQeXRob24gMi41LjQKLSAqIGJ1dCB3aXRoIGEgc2xpZ2h0bHkgdHdlYWtlZCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZyb20gc2NyYXRjaC4KLSAqLwotCi0jZGVmaW5lCUlOSVRfVEJMUwk4CS8qIGluaXRpYWwgdGFibGUgc2l6ZSAocG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgUEVSVFVSQl9TSElGVAk1CS8qIHNlZSBQeXRob24gMi41LjQgT2JqZWN0cy9kaWN0b2JqZWN0LmMgKi8KLQotc3RhdGljIHZvaWQgdGV4cGFuZChzdHJ1Y3QgdGFibGUgKiwgc2l6ZV90KTsKLXN0YXRpYyBpbnQgdG5hbWVjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwotc3RhdGljIHN0cnVjdCB0YmwgKmt0c2NhbihzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCwKLSAgICBzdHJ1Y3QgdGJsICoqKik7Ci0KLXN0YXRpYyB2b2lkCi10ZXhwYW5kKHN0cnVjdCB0YWJsZSAqdHAsIHNpemVfdCBuc2l6ZSkKLXsKLQlzaXplX3QgaSwgaiwgb3NpemUgPSB0cC0+c2l6ZSwgcGVydHVyYjsKLQlzdHJ1Y3QgdGJsICp0YmxwLCAqKnBwOwotCXN0cnVjdCB0YmwgKipudGJscCwgKipvdGJscCA9IHRwLT50YmxzOwotCi0JbnRibHAgPSBhbGxvYyhuc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdGJsICopLCB0cC0+YXJlYXApOwotCWZvciAoaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKQotCQludGJscFtpXSA9IE5VTEw7Ci0JdHAtPnNpemUgPSBuc2l6ZTsKLQl0cC0+bmZyZWUgPSAobnNpemUgKiA0KSAvIDU7CS8qIHRhYmxlIGNhbiBnZXQgODAlIGZ1bGwgKi8KLQl0cC0+dGJscyA9IG50YmxwOwotCWlmIChvdGJscCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JbnNpemUtLTsJCQkvKiBmcm9tIGhlcmUgb24gbnNpemUgOj0gbWFzayAqLwotCWZvciAoaSA9IDA7IGkgPCBvc2l6ZTsgaSsrKQotCQlpZiAoKHRibHAgPSBvdGJscFtpXSkgIT0gTlVMTCkgewotCQkJaWYgKCh0YmxwLT5mbGFnICYgREVGSU5FRCkpIHsKLQkJCQkvKiBzZWFyY2ggZm9yIGZyZWUgaGFzaCB0YWJsZSBzbG90ICovCi0JCQkJaiA9IChwZXJ0dXJiID0gdGJscC0+dWEuaHZhbCkgJiBuc2l6ZTsKLQkJCQlnb3RvIGZpbmRfZmlyc3RfZW1wdHlfc2xvdDsKLSBmaW5kX25leHRfZW1wdHlfc2xvdDoKLQkJCQlqID0gKGogPDwgMikgKyBqICsgcGVydHVyYiArIDE7Ci0JCQkJcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKLSBmaW5kX2ZpcnN0X2VtcHR5X3Nsb3Q6Ci0JCQkJcHAgPSAmbnRibHBbaiAmIG5zaXplXTsKLQkJCQlpZiAoKnBwICE9IE5VTEwpCi0JCQkJCWdvdG8gZmluZF9uZXh0X2VtcHR5X3Nsb3Q7Ci0JCQkJLyogZm91bmQgYW4gZW1wdHkgaGFzaCB0YWJsZSBzbG90ICovCi0JCQkJKnBwID0gdGJscDsKLQkJCQl0cC0+bmZyZWUtLTsKLQkJCX0gZWxzZSBpZiAoISh0YmxwLT5mbGFnICYgRklOVVNFKSkgewotCQkJCWFmcmVlKHRibHAsIHRwLT5hcmVhcCk7Ci0JCQl9Ci0JCX0KLQlhZnJlZShvdGJscCwgdHAtPmFyZWFwKTsKLX0KLQotdm9pZAota3Rpbml0KHN0cnVjdCB0YWJsZSAqdHAsIEFyZWEgKmFwLCBzaXplX3QgdHNpemUpCi17Ci0JdHAtPmFyZWFwID0gYXA7Ci0JdHAtPnRibHMgPSBOVUxMOwotCXRwLT5zaXplID0gdHAtPm5mcmVlID0gMDsKLQlpZiAodHNpemUpCi0JCXRleHBhbmQodHAsIHRzaXplKTsKLX0KLQotLyogdGFibGUsIG5hbWUgKGtleSkgdG8gc2VhcmNoIGZvciwgaGFzaChuYW1lKSwgcnYgcG9pbnRlciB0byB0YmwgcHRyICovCi1zdGF0aWMgc3RydWN0IHRibCAqCi1rdHNjYW4oc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgaCwgc3RydWN0IHRibCAqKipwcHApCi17Ci0Jc2l6ZV90IGosIHBlcnR1cmIsIG1hc2s7Ci0Jc3RydWN0IHRibCAqKnBwLCAqcDsKLQotCW1hc2sgPSB0cC0+c2l6ZSAtIDE7Ci0JLyogc2VhcmNoIGZvciBoYXNoIHRhYmxlIHNsb3QgbWF0Y2hpbmcgbmFtZSAqLwotCWogPSAocGVydHVyYiA9IGgpICYgbWFzazsKLQlnb3RvIGZpbmRfZmlyc3Rfc2xvdDsKLSBmaW5kX25leHRfc2xvdDoKLQlqID0gKGogPDwgMikgKyBqICsgcGVydHVyYiArIDE7Ci0JcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKLSBmaW5kX2ZpcnN0X3Nsb3Q6Ci0JcHAgPSAmdHAtPnRibHNbaiAmIG1hc2tdOwotCWlmICgocCA9ICpwcCkgIT0gTlVMTCAmJiAocC0+dWEuaHZhbCAhPSBoIHx8ICEocC0+ZmxhZyAmIERFRklORUQpIHx8Ci0JICAgIHN0cmNtcChwLT5uYW1lLCBuYW1lKSkpCi0JCWdvdG8gZmluZF9uZXh0X3Nsb3Q7Ci0JLyogcCA9PSBOVUxMIGlmIG5vdCBmb3VuZCwgY29ycmVjdCBmb3VuZCBlbnRyeSBvdGhlcndpc2UgKi8KLQlpZiAocHBwKQotCQkqcHBwID0gcHA7Ci0JcmV0dXJuIChwKTsKLX0KLQotLyogdGFibGUsIG5hbWUgKGtleSkgdG8gc2VhcmNoIGZvciwgaGFzaChuKSAqLwotc3RydWN0IHRibCAqCi1rdHNlYXJjaChzdHJ1Y3QgdGFibGUgKnRwLCBjb25zdCBjaGFyICpuLCB1aW50MzJfdCBoKQotewotCXJldHVybiAodHAtPnNpemUgPyBrdHNjYW4odHAsIG4sIGgsIE5VTEwpIDogTlVMTCk7Ci19Ci0KLS8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIGVudGVyLCBoYXNoKG4pICovCi1zdHJ1Y3QgdGJsICoKLWt0ZW50ZXIoc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbiwgdWludDMyX3QgaCkKLXsKLQlzdHJ1Y3QgdGJsICoqcHAsICpwOwotCWludCBsZW47Ci0KLQlpZiAodHAtPnNpemUgPT0gMCkKLQkJdGV4cGFuZCh0cCwgSU5JVF9UQkxTKTsKLSBTZWFyY2g6Ci0JaWYgKChwID0ga3RzY2FuKHRwLCBuLCBoLCAmcHApKSkKLQkJcmV0dXJuIChwKTsKLQotCWlmICh0cC0+bmZyZWUgPD0gMCkgewotCQkvKiB0b28gZnVsbCAqLwotCQl0ZXhwYW5kKHRwLCAyICogdHAtPnNpemUpOwotCQlnb3RvIFNlYXJjaDsKLQl9Ci0KLQkvKiBjcmVhdGUgbmV3IHRibCBlbnRyeSAqLwotCWxlbiA9IHN0cmxlbihuKSArIDE7Ci0JcCA9IGFsbG9jKG9mZnNldG9mKHN0cnVjdCB0YmwsIG5hbWVbMF0pICsgbGVuLCB0cC0+YXJlYXApOwotCXAtPmZsYWcgPSAwOwotCXAtPnR5cGUgPSAwOwotCXAtPmFyZWFwID0gdHAtPmFyZWFwOwotCXAtPnVhLmh2YWwgPSBoOwotCXAtPnUyLmZpZWxkID0gMDsKLQlwLT51LmFycmF5ID0gTlVMTDsKLQltZW1jcHkocC0+bmFtZSwgbiwgbGVuKTsKLQotCS8qIGVudGVyIGluIHRwLT50YmxzICovCi0JdHAtPm5mcmVlLS07Ci0JKnBwID0gcDsKLQlyZXR1cm4gKHApOwotfQotCi12b2lkCi1rdHdhbGsoc3RydWN0IHRzdGF0ZSAqdHMsIHN0cnVjdCB0YWJsZSAqdHApCi17Ci0JdHMtPmxlZnQgPSB0cC0+c2l6ZTsKLQl0cy0+bmV4dCA9IHRwLT50YmxzOwotfQotCi1zdHJ1Y3QgdGJsICoKLWt0bmV4dChzdHJ1Y3QgdHN0YXRlICp0cykKLXsKLQl3aGlsZSAoLS10cy0+bGVmdCA+PSAwKSB7Ci0JCXN0cnVjdCB0YmwgKnAgPSAqdHMtPm5leHQrKzsKLQkJaWYgKHAgIT0gTlVMTCAmJiAocC0+ZmxhZyAmIERFRklORUQpKQotCQkJcmV0dXJuIChwKTsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIGludAotdG5hbWVjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotCWNvbnN0IHN0cnVjdCB0YmwgKmEgPSAqKChjb25zdCBzdHJ1Y3QgdGJsICogY29uc3QgKilwMSk7Ci0JY29uc3Qgc3RydWN0IHRibCAqYiA9ICooKGNvbnN0IHN0cnVjdCB0YmwgKiBjb25zdCAqKXAyKTsKLQotCXJldHVybiAoc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpKTsKLX0KLQotc3RydWN0IHRibCAqKgota3Rzb3J0KHN0cnVjdCB0YWJsZSAqdHApCi17Ci0Jc2l6ZV90IGk7Ci0Jc3RydWN0IHRibCAqKnAsICoqc3AsICoqZHA7Ci0KLQlwID0gYWxsb2MoKHRwLT5zaXplICsgMSkgKiBzaXplb2Yoc3RydWN0IHRibCAqKSwgQVRFTVApOwotCXNwID0gdHAtPnRibHM7CQkvKiBzb3VyY2UgKi8KLQlkcCA9IHA7CQkJLyogZGVzdCAqLwotCWkgPSAoc2l6ZV90KXRwLT5zaXplOwotCXdoaWxlIChpLS0pCi0JCWlmICgoKmRwID0gKnNwKyspICE9IE5VTEwgJiYgKCgoKmRwKS0+ZmxhZyAmIERFRklORUQpIHx8Ci0JCSAgICAoKCpkcCktPmZsYWcgJiBBUlJBWSkpKQotCQkJZHArKzsKLQlxc29ydChwLCAoaSA9IGRwIC0gcCksIHNpemVvZih2b2lkICopLCB0bmFtZWNtcCk7Ci0JcFtpXSA9IE5VTEw7Ci0JcmV0dXJuIChwKTsKLX0KLQotI2lmZGVmIFNJR1dJTkNICi1zdGF0aWMgdm9pZAoteF9zaWd3aW5jaChpbnQgc2lnIE1LU0hfQV9VTlVTRUQpCi17Ci0JLyogdGhpcyBydW5zIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCwgd2l0aCBlcnJubyBzYXZlZCAqLwotCi0JZ290X3dpbmNoID0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbWlzYy5jIGIvbWtzaC9zcmMvbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWE0ZGUxLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL21pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NzkgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IG1pc2MuYyx2IDEuMzcgMjAwOS8wNC8xOSAyMDozNDowNSBzdGhlbiBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHBhdGguYyx2IDEuMTIgMjAwNS8wMy8zMCAxNzoxNjozNyBkZXJhYWR0IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLSNpZiAhSEFWRV9HRVRSVVNBR0UKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotI2lmIEhBVkVfR1JQX0gKLSNpbmNsdWRlIDxncnAuaD4KLSNlbmRpZgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9taXNjLmMsdiAxLjE0MSAyMDEwLzA3LzE3IDIyOjA5OjM2IHRnIEV4cCAkIik7Ci0KLXVuc2lnbmVkIGNoYXIgY2h0eXBlc1tVQ0hBUl9NQVggKyAxXTsJLyogdHlwZSBiaXRzIGZvciB1bnNpZ25lZCBjaGFyICovCi0KLSNpZiAhSEFWRV9TRVRSRVNVR0lECi11aWRfdCBrc2h1aWQ7Ci1naWRfdCBrc2hnaWQsIGtzaGVnaWQ7Ci0jZW5kaWYKLQotc3RhdGljIGludCBkb19nbWF0Y2goY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICopOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNjbGFzcyhjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci0jaWZkZWYgVElPQ1NDVFRZCi1zdGF0aWMgdm9pZCBjaHZ0KGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotLyoKLSAqIEZhc3QgY2hhcmFjdGVyIGNsYXNzZXMKLSAqLwotdm9pZAotc2V0Y3R5cGVzKGNvbnN0IGNoYXIgKnMsIGludCB0KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKHQgJiBDX0lGUykgewotCQlmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKQotCQkJY2h0eXBlc1tpXSAmPSB+Q19JRlM7Ci0JCWNodHlwZXNbMF0gfD0gQ19JRlM7IC8qIGluY2x1ZGUgXDAgaW4gQ19JRlMgKi8KLQl9Ci0Jd2hpbGUgKCpzICE9IDApCi0JCWNodHlwZXNbKHVuc2lnbmVkIGNoYXIpKnMrK10gfD0gdDsKLX0KLQotdm9pZAotaW5pdGN0eXBlcyh2b2lkKQotewotCWludCBjOwotCi0JZm9yIChjID0gJ2EnOyBjIDw9ICd6JzsgYysrKQotCQljaHR5cGVzW2NdIHw9IENfQUxQSEE7Ci0JZm9yIChjID0gJ0EnOyBjIDw9ICdaJzsgYysrKQotCQljaHR5cGVzW2NdIHw9IENfQUxQSEE7Ci0JY2h0eXBlc1snXyddIHw9IENfQUxQSEE7Ci0Jc2V0Y3R5cGVzKCIwMTIzNDU2Nzg5IiwgQ19ESUdJVCk7Ci0Jc2V0Y3R5cGVzKCIgXHRcbnwmOzw+KCkiLCBDX0xFWDEpOyAvKiBcMCBhZGRlZCBhdXRvbWF0aWNhbGx5ICovCi0Jc2V0Y3R5cGVzKCIqQCMhJC0/IiwgQ19WQVIxKTsKLQlzZXRjdHlwZXMoIiBcdFxuIiwgQ19JRlNXUyk7Ci0Jc2V0Y3R5cGVzKCI9LSs/IiwgQ19TVUJPUDEpOwotCXNldGN0eXBlcygiXHRcbiBcIiMkJicoKSo7PD0+P1tcXF1gfCIsIENfUVVPVEUpOwotfQotCi0vKiBjYWxsZWQgZnJvbSBYY2hlY2tOKCkgdG8gZ3JvdyBidWZmZXIgKi8KLWNoYXIgKgotWGNoZWNrX2dyb3dfKFhTdHJpbmcgKnhzcCwgY29uc3QgY2hhciAqeHAsIHVuc2lnbmVkIGludCBtb3JlKQotewotCWNvbnN0IGNoYXIgKm9sZF9iZWcgPSB4c3AtPmJlZzsKLQotCXhzcC0+bGVuICs9IG1vcmUgPiB4c3AtPmxlbiA/IG1vcmUgOiB4c3AtPmxlbjsKLQl4c3AtPmJlZyA9IGFyZXNpemUoeHNwLT5iZWcsIHhzcC0+bGVuICsgOCwgeHNwLT5hcmVhcCk7Ci0JeHNwLT5lbmQgPSB4c3AtPmJlZyArIHhzcC0+bGVuOwotCXJldHVybiAoeHNwLT5iZWcgKyAoeHAgLSBvbGRfYmVnKSk7Ci19Ci0KLSNkZWZpbmUgU0hGTEFHU19ERUZOUwotI2luY2x1ZGUgInNoX2ZsYWdzLmgiCi0KLWNvbnN0IHN0cnVjdCBzaG9wdGlvbiBvcHRpb25zW10gPSB7Ci0jZGVmaW5lIFNIRkxBR1NfSVRFTVMKLSNpbmNsdWRlICJzaF9mbGFncy5oIgotfTsKLQotLyoKLSAqIHRyYW5zbGF0ZSAtbyBvcHRpb24gaW50byBGKiBjb25zdGFudCAoYWxzbyB1c2VkIGZvciB0ZXN0IC1vIG9wdGlvbikKLSAqLwotc2l6ZV90Ci1vcHRpb24oY29uc3QgY2hhciAqbikKLXsKLQlzaXplX3QgaTsKLQotCWlmICgoblswXSA9PSAnLScgfHwgblswXSA9PSAnKycpICYmIG5bMV0gJiYgIW5bMl0pIHsKLQkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCi0JCQlpZiAob3B0aW9uc1tpXS5jID09IG5bMV0pCi0JCQkJcmV0dXJuIChpKTsKLQl9IGVsc2UgZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCi0JCWlmIChvcHRpb25zW2ldLm5hbWUgJiYgc3RyY21wKG9wdGlvbnNbaV0ubmFtZSwgbikgPT0gMCkKLQkJCXJldHVybiAoaSk7Ci0KLQlyZXR1cm4gKChzaXplX3QpLTEpOwotfQotCi1zdHJ1Y3Qgb3B0aW9uc19pbmZvIHsKLQlpbnQgb3B0X3dpZHRoOwotCWludCBvcHRzW05FTEVNKG9wdGlvbnMpXTsKLX07Ci0KLXN0YXRpYyBjaGFyICpvcHRpb25zX2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOwotc3RhdGljIHZvaWQgcHJpbnRvcHRpb25zKGJvb2wpOwotCi0vKiBmb3JtYXQgYSBzaW5nbGUgc2VsZWN0IG1lbnUgaXRlbSAqLwotc3RhdGljIGNoYXIgKgotb3B0aW9uc19mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQotewotCWNvbnN0IHN0cnVjdCBvcHRpb25zX2luZm8gKm9pID0gKGNvbnN0IHN0cnVjdCBvcHRpb25zX2luZm8gKilhcmc7Ci0KLQlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlLSpzICVzIiwKLQkgICAgb2ktPm9wdF93aWR0aCwgb3B0aW9uc1tvaS0+b3B0c1tpXV0ubmFtZSwKLQkgICAgRmxhZyhvaS0+b3B0c1tpXSkgPyAib24iIDogIm9mZiIpOwotCXJldHVybiAoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50b3B0aW9ucyhib29sIHZlcmJvc2UpCi17Ci0JaW50IGkgPSAwOwotCi0JaWYgKHZlcmJvc2UpIHsKLQkJaW50IG4gPSAwLCBsZW4sIG9jdHMgPSAwOwotCQlzdHJ1Y3Qgb3B0aW9uc19pbmZvIG9pOwotCi0JCS8qIHZlcmJvc2UgdmVyc2lvbiAqLwotCQlzaGZfcHV0cygiQ3VycmVudCBvcHRpb24gc2V0dGluZ3NcbiIsIHNobF9zdGRvdXQpOwotCi0JCW9pLm9wdF93aWR0aCA9IDA7Ci0JCXdoaWxlIChpIDwgKGludClORUxFTShvcHRpb25zKSkgewotCQkJaWYgKG9wdGlvbnNbaV0ubmFtZSkgewotCQkJCW9pLm9wdHNbbisrXSA9IGk7Ci0JCQkJbGVuID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7Ci0JCQkJaWYgKGxlbiA+IG9jdHMpCi0JCQkJCW9jdHMgPSBsZW47Ci0JCQkJbGVuID0gdXRmX21ic3dpZHRoKG9wdGlvbnNbaV0ubmFtZSk7Ci0JCQkJaWYgKGxlbiA+IG9pLm9wdF93aWR0aCkKLQkJCQkJb2kub3B0X3dpZHRoID0gbGVuOwotCQkJfQotCQkJKytpOwotCQl9Ci0JCXByaW50X2NvbHVtbnMoc2hsX3N0ZG91dCwgbiwgb3B0aW9uc19mbXRfZW50cnksICZvaSwKLQkJICAgIG9jdHMgKyA0LCBvaS5vcHRfd2lkdGggKyA0LCB0cnVlKTsKLQl9IGVsc2UgewotCQkvKiBzaG9ydCB2ZXJzaW9uIMOhIGxhIEFUJlQga3NoOTMgKi8KLQkJc2hmX3B1dHMoInNldCIsIHNobF9zdGRvdXQpOwotCQl3aGlsZSAoaSA8IChpbnQpTkVMRU0ob3B0aW9ucykpIHsKLQkJCWlmIChGbGFnKGkpICYmIG9wdGlvbnNbaV0ubmFtZSkKLQkJCQlzaHByaW50ZigiIC1vICVzIiwgb3B0aW9uc1tpXS5uYW1lKTsKLQkJCSsraTsKLQkJfQotCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQl9Ci19Ci0KLWNoYXIgKgotZ2V0b3B0aW9ucyh2b2lkKQotewotCXVuc2lnbmVkIGludCBpOwotCWNoYXIgbVsoaW50KSBGTkZMQUdTICsgMV07Ci0JY2hhciAqY3AgPSBtOwotCi0JZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCi0JCWlmIChvcHRpb25zW2ldLmMgJiYgRmxhZyhpKSkKLQkJCSpjcCsrID0gb3B0aW9uc1tpXS5jOwotCXN0cm5kdXB4KGNwLCBtLCBjcCAtIG0sIEFURU1QKTsKLQlyZXR1cm4gKGNwKTsKLX0KLQotLyogY2hhbmdlIGEgRmxhZygqKSB2YWx1ZTsgdGFrZXMgY2FyZSBvZiBzcGVjaWFsIGFjdGlvbnMgKi8KLXZvaWQKLWNoYW5nZV9mbGFnKGVudW0gc2hfZmxhZyBmLCBpbnQgd2hhdCwgdW5zaWduZWQgaW50IG5ld3ZhbCkKLXsKLQl1bnNpZ25lZCBjaGFyIG9sZHZhbDsKLQotCW9sZHZhbCA9IEZsYWcoZik7Ci0JRmxhZyhmKSA9IG5ld3ZhbCA/IDEgOiAwOwkvKiBuZWVkZWQgZm9yIHRyaXN0YXRlcyAqLwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQlpZiAoZiA9PSBGTU9OSVRPUikgewotCQlpZiAod2hhdCAhPSBPRl9DTURMSU5FICYmIG5ld3ZhbCAhPSBvbGR2YWwpCi0JCQlqX2NoYW5nZSgpOwotCX0gZWxzZQotI2VuZGlmCi0JICBpZiAoKAotI2lmICFNS1NIX1NfTk9WSQotCSAgICBmID09IEZWSSB8fAotI2VuZGlmCi0JICAgIGYgPT0gRkVNQUNTIHx8IGYgPT0gRkdNQUNTKSAmJiBuZXd2YWwpIHsKLSNpZiAhTUtTSF9TX05PVkkKLQkJRmxhZyhGVkkpID0KLSNlbmRpZgotCQkgICAgRmxhZyhGRU1BQ1MpID0gRmxhZyhGR01BQ1MpID0gMDsKLQkJRmxhZyhmKSA9ICh1bnNpZ25lZCBjaGFyKW5ld3ZhbDsKLQl9IGVsc2UgaWYgKGYgPT0gRlBSSVZJTEVHRUQgJiYgb2xkdmFsICYmICFuZXd2YWwpIHsKLQkJLyogVHVybmluZyBvZmYgLXA/ICovCi0jaWYgSEFWRV9TRVRSRVNVR0lECi0JCWdpZF90IGtzaGVnaWQgPSBnZXRnaWQoKTsKLQotCQlzZXRyZXNnaWQoa3NoZWdpZCwga3NoZWdpZCwga3NoZWdpZCk7Ci0jaWYgSEFWRV9TRVRHUk9VUFMKLQkJc2V0Z3JvdXBzKDEsICZrc2hlZ2lkKTsKLSNlbmRpZgotCQlzZXRyZXN1aWQoa3NoZXVpZCwga3NoZXVpZCwga3NoZXVpZCk7Ci0jZWxzZQotCQlzZXRldWlkKGtzaGV1aWQgPSBrc2h1aWQgPSBnZXR1aWQoKSk7Ci0JCXNldHVpZChrc2hldWlkKTsKLQkJc2V0ZWdpZChrc2hlZ2lkID0ga3NoZ2lkID0gZ2V0Z2lkKCkpOwotCQlzZXRnaWQoa3NoZWdpZCk7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKChmID09IEZQT1NJWCB8fCBmID09IEZTSCkgJiYgbmV3dmFsKSB7Ci0JCUZsYWcoRlBPU0lYKSA9IEZsYWcoRlNIKSA9IEZsYWcoRkJSQUNFRVhQQU5EKSA9IDA7Ci0JCUZsYWcoZikgPSAodW5zaWduZWQgY2hhciluZXd2YWw7Ci0JfQotCS8qIENoYW5naW5nIGludGVyYWN0aXZlIGZsYWc/ICovCi0JaWYgKGYgPT0gRlRBTEtJTkcpIHsKLQkJaWYgKCh3aGF0ID09IE9GX0NNRExJTkUgfHwgd2hhdCA9PSBPRl9TRVQpICYmIHByb2NwaWQgPT0ga3NocGlkKQotCQkJRmxhZyhGVEFMS0lOR19JKSA9ICh1bnNpZ25lZCBjaGFyKW5ld3ZhbDsKLQl9Ci19Ci0KLS8qIFBhcnNlIGNvbW1hbmQgbGluZSAmIHNldCBjb21tYW5kIGFyZ3VtZW50cy4gUmV0dXJucyB0aGUgaW5kZXggb2YKLSAqIG5vbi1vcHRpb24gYXJndW1lbnRzLCAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAqLwotaW50Ci1wYXJzZV9hcmdzKGNvbnN0IGNoYXIgKiphcmd2LAotICAgIGludCB3aGF0LAkJCS8qIE9GX0NNRExJTkUgb3IgT0ZfU0VUICovCi0gICAgYm9vbCAqc2V0YXJnc3ApCi17Ci0Jc3RhdGljIGNoYXIgY21kX29wdHNbTkVMRU0ob3B0aW9ucykgKyA1XTsgLyogbzpUOlwwICovCi0Jc3RhdGljIGNoYXIgc2V0X29wdHNbTkVMRU0ob3B0aW9ucykgKyA2XTsgLyogQTpvO3NcMCAqLwotCWNoYXIgc2V0LCAqb3B0czsKLQljb25zdCBjaGFyICphcnJheSA9IE5VTEw7Ci0JR2V0b3B0IGdvOwotCXNpemVfdCBpOwotCWludCBvcHRjLCBzb3J0YXJncyA9IDAsIGFycmF5c2V0ID0gMDsKLQotCS8qIEZpcnN0IGNhbGw/IEJ1aWxkIG9wdGlvbiBzdHJpbmdzLi4uICovCi0JaWYgKGNtZF9vcHRzWzBdID09ICdcMCcpIHsKLQkJY2hhciAqcCA9IGNtZF9vcHRzLCAqcSA9IHNldF9vcHRzOwotCi0JCS8qIHNlZSBjbWRfb3B0c1tdIGRlY2xhcmF0aW9uICovCi0JCSpwKysgPSAnbyc7Ci0JCSpwKysgPSAnOic7Ci0jaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgfHwgZGVmaW5lZChUSU9DU0NUVFkpCi0JCSpwKysgPSAnVCc7Ci0JCSpwKysgPSAnOic7Ci0jZW5kaWYKLQkJLyogc2VlIHNldF9vcHRzW10gZGVjbGFyYXRpb24gKi8KLQkJKnErKyA9ICdBJzsKLQkJKnErKyA9ICc6JzsKLQkJKnErKyA9ICdvJzsKLQkJKnErKyA9ICc7JzsKLQkJKnErKyA9ICdzJzsKLQotCQlmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykgewotCQkJaWYgKG9wdGlvbnNbaV0uYykgewotCQkJCWlmIChvcHRpb25zW2ldLmZsYWdzICYgT0ZfQ01ETElORSkKLQkJCQkJKnArKyA9IG9wdGlvbnNbaV0uYzsKLQkJCQlpZiAob3B0aW9uc1tpXS5mbGFncyAmIE9GX1NFVCkKLQkJCQkJKnErKyA9IG9wdGlvbnNbaV0uYzsKLQkJCX0KLQkJfQotCQkqcCA9ICdcMCc7Ci0JCSpxID0gJ1wwJzsKLQl9Ci0KLQlpZiAod2hhdCA9PSBPRl9DTURMSU5FKSB7Ci0JCWNvbnN0IGNoYXIgKnAgPSBhcmd2WzBdLCAqcTsKLQkJLyogU2V0IEZMT0dJTiBiZWZvcmUgcGFyc2luZyBvcHRpb25zIHNvIHVzZXIgY2FuIGNsZWFyCi0JCSAqIGZsYWcgdXNpbmcgK2wuCi0JCSAqLwotCQlpZiAoKnAgIT0gJy0nKQotCQkJZm9yIChxID0gcDsgKnE7ICkKLQkJCQlpZiAoKnErKyA9PSAnLycpCi0JCQkJCXAgPSBxOwotCQlGbGFnKEZMT0dJTikgPSAoKnAgPT0gJy0nKTsKLQkJb3B0cyA9IGNtZF9vcHRzOwotCX0gZWxzZSBpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpIHsKLQkJb3B0cyA9IGNtZF9vcHRzOwotCX0gZWxzZQotCQlvcHRzID0gc2V0X29wdHM7Ci0Ja3NoX2dldG9wdF9yZXNldCgmZ28sIEdGX0VSUk9SfEdGX1BMVVNPUFQpOwotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoYXJndiwgJmdvLCBvcHRzKSkgIT0gLTEpIHsKLQkJc2V0ID0gKGdvLmluZm8gJiBHSV9QTFVTKSA/IDAgOiAxOwotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnQSc6Ci0JCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCi0JCQkJYnJlYWs7Ci0JCQlhcnJheXNldCA9IHNldCA/IDEgOiAtMTsKLQkJCWFycmF5ID0gZ28ub3B0YXJnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnbyc6Ci0JCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoZ28ub3B0YXJnID09IE5VTEwpIHsKLQkJCQkvKiBsb25lIC1vOiBwcmludCBvcHRpb25zCi0JCQkJICoKLQkJCQkgKiBOb3RlIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSwgLW8gcmVxdWlyZXMKLQkJCQkgKiBhbiBvcHRpb24gKGllLCBjYW4ndCBnZXQgaGVyZSBpZiB3aGF0IGlzCi0JCQkJICogT0ZfQ01ETElORSkuCi0JCQkJICovCi0JCQkJcHJpbnRvcHRpb25zKHNldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpID0gb3B0aW9uKGdvLm9wdGFyZyk7Ci0JCQlpZiAoKGVudW0gc2hfZmxhZylpID09IEZBUkM0UkFORE9NKSB7Ci0JCQkJd2FybmluZ2YodHJ1ZSwgIkRvIG5vdCB1c2Ugc2V0IMKxbyBhcmM0cmFuZG9tLCIKLQkJCQkgICAgIiBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbiIKLQkJCQkgICAgIiBvZiBta3NoISIpOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlpZiAoKGkgIT0gKHNpemVfdCktMSkgJiYgc2V0ID09IEZsYWcoaSkpCi0JCQkJLyogRG9uJ3QgY2hlY2sgdGhlIGNvbnRleHQgaWYgdGhlIGZsYWcKLQkJCQkgKiBpc24ndCBjaGFuZ2luZyAtIG1ha2VzICJzZXQgLW8gaW50ZXJhY3RpdmUiCi0JCQkJICogd29yayBpZiB5b3UncmUgYWxyZWFkeSBpbnRlcmFjdGl2ZS4gTmVlZGVkCi0JCQkJICogaWYgdGhlIG91dHB1dCBvZiAic2V0ICtvIiBpcyB0byBiZSB1c2VkLgotCQkJCSAqLwotCQkJCTsKLQkJCWVsc2UgaWYgKChpICE9IChzaXplX3QpLTEpICYmIChvcHRpb25zW2ldLmZsYWdzICYgd2hhdCkpCi0JCQkJY2hhbmdlX2ZsYWcoKGVudW0gc2hfZmxhZylpLCB3aGF0LCBzZXQpOwotCQkJZWxzZSB7Ci0JCQkJYmlfZXJyb3JmKCIlczogYmFkIG9wdGlvbiIsIGdvLm9wdGFyZyk7Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpIHx8IGRlZmluZWQoVElPQ1NDVFRZKQotCQljYXNlICdUJzoKLQkJCWlmICh3aGF0ICE9IE9GX0ZJUlNUVElNRSkKLQkJCQlicmVhazsKLSNpZm5kZWYgVElPQ1NDVFRZCi0JCQllcnJvcmYoIm5vIFRJT0NTQ1RUWSBpb2N0bCIpOwotI2Vsc2UKLQkJCWNoYW5nZV9mbGFnKEZUQUxLSU5HLCBPRl9DTURMSU5FLCAxKTsKLQkJCWNodnQoZ28ub3B0YXJnKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotCQljYXNlICc/JzoKLQkJCXJldHVybiAoLTEpOwotCi0JCWRlZmF1bHQ6Ci0JCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCi0JCQkJYnJlYWs7Ci0JCQkvKiAtczogc29ydCBwb3NpdGlvbmFsIHBhcmFtcyAoQVQmVCBrc2ggc3R1cGlkaXR5KSAqLwotCQkJaWYgKHdoYXQgPT0gT0ZfU0VUICYmIG9wdGMgPT0gJ3MnKSB7Ci0JCQkJc29ydGFyZ3MgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCi0JCQkJaWYgKG9wdGMgPT0gb3B0aW9uc1tpXS5jICYmCi0JCQkJICAgICh3aGF0ICYgb3B0aW9uc1tpXS5mbGFncykpIHsKLQkJCQkJY2hhbmdlX2ZsYWcoKGVudW0gc2hfZmxhZylpLCB3aGF0LCBzZXQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQlpZiAoaSA9PSBORUxFTShvcHRpb25zKSkKLQkJCQlpbnRlcm5hbF9lcnJvcmYoInBhcnNlX2FyZ3M6ICclYyciLCBvcHRjKTsKLQkJfQotCX0KLQlpZiAoIShnby5pbmZvICYgR0lfTUlOVVNNSU5VUykgJiYgYXJndltnby5vcHRpbmRdICYmCi0JICAgIChhcmd2W2dvLm9wdGluZF1bMF0gPT0gJy0nIHx8IGFyZ3ZbZ28ub3B0aW5kXVswXSA9PSAnKycpICYmCi0JICAgIGFyZ3ZbZ28ub3B0aW5kXVsxXSA9PSAnXDAnKSB7Ci0JCS8qIGxvbmUgLSBjbGVhcnMgLXYgYW5kIC14IGZsYWdzICovCi0JCWlmIChhcmd2W2dvLm9wdGluZF1bMF0gPT0gJy0nKQotCQkJRmxhZyhGVkVSQk9TRSkgPSBGbGFnKEZYVFJBQ0UpID0gMDsKLQkJLyogc2V0IHNraXBzIGxvbmUgLSBvciArIG9wdGlvbiAqLwotCQlnby5vcHRpbmQrKzsKLQl9Ci0JaWYgKHNldGFyZ3NwKQotCQkvKiAtLSBtZWFucyBzZXQgJCMvJCogZXZlbiBpZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzICovCi0JCSpzZXRhcmdzcCA9ICFhcnJheXNldCAmJiAoKGdvLmluZm8gJiBHSV9NSU5VU01JTlVTKSB8fAotCQkgICAgYXJndltnby5vcHRpbmRdKTsKLQotCWlmIChhcnJheXNldCAmJiAoISphcnJheSB8fCAqc2tpcF92YXJuYW1lKGFycmF5LCBmYWxzZSkpKSB7Ci0JCWJpX2Vycm9yZigiJXM6IGlzIG5vdCBhbiBpZGVudGlmaWVyIiwgYXJyYXkpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKHNvcnRhcmdzKSB7Ci0JCWZvciAoaSA9IGdvLm9wdGluZDsgYXJndltpXTsgaSsrKQotCQkJOwotCQlxc29ydCgmYXJndltnby5vcHRpbmRdLCBpIC0gZ28ub3B0aW5kLCBzaXplb2Yodm9pZCAqKSwKLQkJICAgIHhzdHJjbXApOwotCX0KLQlpZiAoYXJyYXlzZXQpCi0JCWdvLm9wdGluZCArPSBzZXRfYXJyYXkoYXJyYXksIGFycmF5c2V0ID4gMCA/IHRydWUgOiBmYWxzZSwKLQkJICAgIGFyZ3YgKyBnby5vcHRpbmQpOwotCi0JcmV0dXJuIChnby5vcHRpbmQpOwotfQotCi0vKiBwYXJzZSBhIGRlY2ltYWwgbnVtYmVyOiByZXR1cm5zIDAgaWYgc3RyaW5nIGlzbid0IGEgbnVtYmVyLCAxIG90aGVyd2lzZSAqLwotaW50Ci1nZXRuKGNvbnN0IGNoYXIgKnMsIGludCAqYWkpCi17Ci0JaW50IGksIGMsIHJ2ID0gMDsKLQlib29sIG5lZyA9IGZhbHNlOwotCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChrc2hfaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IHRydWU7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCSphaSA9IGkgPSAwOwotCWRvIHsKLQkJaWYgKCFrc2hfaXNkaWdpdChjKSkKLQkJCWdvdG8gZ2V0bl9vdXQ7Ci0JCWkgKj0gMTA7Ci0JCWlmIChpIDwgKmFpKQotCQkJLyogb3ZlcmZsb3cgKi8KLQkJCWdvdG8gZ2V0bl9vdXQ7Ci0JCWkgKz0gYyAtICcwJzsKLQkJKmFpID0gaTsKLQl9IHdoaWxlICgoYyA9ICpzKyspKTsKLQlydiA9IDE7Ci0KLSBnZXRuX291dDoKLQlpZiAobmVnKQotCQkqYWkgPSAtKmFpOwotCXJldHVybiAocnYpOwotfQotCi0vKiBnZXRuKCkgdGhhdCBwcmludHMgZXJyb3IgKi8KLWludAotYmlfZ2V0bihjb25zdCBjaGFyICphcywgaW50ICphaSkKLXsKLQlpbnQgcnY7Ci0KLQlpZiAoIShydiA9IGdldG4oYXMsIGFpKSkpCi0JCWJpX2Vycm9yZigiJXM6IGJhZCBudW1iZXIiLCBhcyk7Ci0JcmV0dXJuIChydik7Ci19Ci0KLS8qIC0tLS0tLS0tIGdtYXRjaC5jIC0tLS0tLS0tICovCi0KLS8qCi0gKiBpbnQgZ21hdGNoKHN0cmluZywgcGF0dGVybikKLSAqIGNoYXIgKnN0cmluZywgKnBhdHRlcm47Ci0gKgotICogTWF0Y2ggYSBwYXR0ZXJuIGFzIGluIHNoKDEpLgotICogcGF0dGVybiBjaGFyYWN0ZXIgYXJlIHByZWZpeGVkIHdpdGggTUFHSUMgYnkgZXhwYW5kLgotICovCi0KLWludAotZ21hdGNoeChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwLCBib29sIGlzZmlsZSkKLXsKLQljb25zdCBjaGFyICpzZSwgKnBlOwotCi0JaWYgKHMgPT0gTlVMTCB8fCBwID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0KLQlzZSA9IHMgKyBzdHJsZW4ocyk7Ci0JcGUgPSBwICsgc3RybGVuKHApOwotCS8qIGlzZmlsZSBpcyBmYWxzZSBpZmYgbm8gc3ludGF4IGNoZWNrIGhhcyBiZWVuIGRvbmUgb24KLQkgKiB0aGUgcGF0dGVybi4gSWYgY2hlY2sgZmFpbHMsIGp1c3QgdG8gYSBzdHJjbXAoKS4KLQkgKi8KLQlpZiAoIWlzZmlsZSAmJiAhaGFzX2dsb2JiaW5nKHAsIHBlKSkgewotCQlzaXplX3QgbGVuID0gcGUgLSBwICsgMTsKLQkJY2hhciB0YnVmWzY0XTsKLQkJY2hhciAqdCA9IGxlbiA8PSBzaXplb2YodGJ1ZikgPyB0YnVmIDogYWxsb2MobGVuLCBBVEVNUCk7Ci0JCWRlYnVuayh0LCBwLCBsZW4pOwotCQlyZXR1cm4gKCFzdHJjbXAodCwgcykpOwotCX0KLQlyZXR1cm4gKGRvX2dtYXRjaCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzZSwKLQkgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcGUpKTsKLX0KLQotLyogUmV0dXJucyBpZiBwIGlzIGEgc3ludGFjdGljbHkgY29ycmVjdCBnbG9iYmluZyBwYXR0ZXJuLCBmYWxzZQotICogaWYgaXQgY29udGFpbnMgbm8gcGF0dGVybiBjaGFyYWN0ZXJzIG9yIGlmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yLgotICogU3ludGF4IGVycm9ycyBhcmU6Ci0gKgktIFsgd2l0aCBubyBjbG9zaW5nIF0KLSAqCS0gaW1iYWxhbmNlZCAkKC4uLikgZXhwcmVzc2lvbgotICoJLSBbLi4uXSBhbmQgKiguLi4pIG5vdCBuZXN0ZWQgKGVnLCBbYSQoYnxdYyksICooYVtifGNdZCkpCi0gKi8KLS8qWFhYCi0tIGlmIG5vIG1hZ2ljLAotCWlmIGRlc3QgZ2l2ZW4sIGNvcHkgdG8gZHN0Ci0JcmV0dXJuID8KLS0gaWYgbWFnaWMgJiYgKG5vIGdsb2JiaW5nIHx8IHN5bnRheCBlcnJvcikKLQlkZWJ1bmsgdG8gZHN0Ci0JcmV0dXJuID8KLS0gcmV0dXJuID8KLSovCi1pbnQKLWhhc19nbG9iYmluZyhjb25zdCBjaGFyICp4cCwgY29uc3QgY2hhciAqeHBlKQotewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB4cDsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpwZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHhwZTsKLQlpbnQgYzsKLQlpbnQgbmVzdCA9IDAsIGJuZXN0ID0gMDsKLQlpbnQgc2F3X2dsb2IgPSAwOwotCWludCBpbl9icmFja2V0ID0gMDsgLyogaW5zaWRlIFsuLi5dICovCi0KLQlmb3IgKDsgcCA8IHBlOyBwKyspIHsKLQkJaWYgKCFJU01BR0lDKCpwKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGMgPSAqKytwKSA9PSAnKicgfHwgYyA9PSAnPycpCi0JCQlzYXdfZ2xvYiA9IDE7Ci0JCWVsc2UgaWYgKGMgPT0gJ1snKSB7Ci0JCQlpZiAoIWluX2JyYWNrZXQpIHsKLQkJCQlzYXdfZ2xvYiA9IDE7Ci0JCQkJaW5fYnJhY2tldCA9IDE7Ci0JCQkJaWYgKElTTUFHSUMocFsxXSkgJiYgcFsyXSA9PSBOT1QpCi0JCQkJCXAgKz0gMjsKLQkJCQlpZiAoSVNNQUdJQyhwWzFdKSAmJiBwWzJdID09ICddJykKLQkJCQkJcCArPSAyOwotCQkJfQotCQkJLyogWFhYIERvIHdlIG5lZWQgdG8gY2hlY2sgcmFuZ2VzIGhlcmU/IFBPU0lYIFEgKi8KLQkJfSBlbHNlIGlmIChjID09ICddJykgewotCQkJaWYgKGluX2JyYWNrZXQpIHsKLQkJCQlpZiAoYm5lc3QpCQkvKiBbYSooYl0pICovCi0JCQkJCXJldHVybiAoMCk7Ci0JCQkJaW5fYnJhY2tldCA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGMgJiAweDgwKSAmJiB2c3RyY2hyKCIqKz9AISAiLCBjICYgMHg3ZikpIHsKLQkJCXNhd19nbG9iID0gMTsKLQkJCWlmIChpbl9icmFja2V0KQotCQkJCWJuZXN0Kys7Ci0JCQllbHNlCi0JCQkJbmVzdCsrOwotCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7Ci0JCQlpZiAoaW5fYnJhY2tldCAmJiAhYm5lc3QpCS8qICooYVtmb298YmFyXSkgKi8KLQkJCQlyZXR1cm4gKDApOwotCQl9IGVsc2UgaWYgKGMgPT0gLyooKi8gJyknKSB7Ci0JCQlpZiAoaW5fYnJhY2tldCkgewotCQkJCWlmICghYm5lc3QtLSkJCS8qICooYVtiKWNdICovCi0JCQkJCXJldHVybiAoMCk7Ci0JCQl9IGVsc2UgaWYgKG5lc3QpCi0JCQkJbmVzdC0tOwotCQl9Ci0JCS8qCi0JCSAqIGVsc2UgbXVzdCBiZSBhIE1BR0lDLU1BR0lDLCBvciBNQUdJQy0hLAotCQkgKiBNQUdJQy0tLCBNQUdJQy1dLCBNQUdJQy17LCBNQUdJQy0sIE1BR0lDLX0KLQkJICovCi0JfQotCXJldHVybiAoc2F3X2dsb2IgJiYgIWluX2JyYWNrZXQgJiYgIW5lc3QpOwotfQotCi0vKiBGdW5jdGlvbiBtdXN0IHJldHVybiBlaXRoZXIgMCBvciAxIChhc3N1bWVkIGJ5IGNvZGUgZm9yIDB4ODB8JyEnKSAqLwotc3RhdGljIGludAotZG9fZ21hdGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlKQotewotCWludCBzYywgcGM7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcHJlc3QsICpwc3ViLCAqcG5leHQ7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqc3Jlc3Q7Ci0KLQlpZiAocyA9PSBOVUxMIHx8IHAgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQl3aGlsZSAocCA8IHBlKSB7Ci0JCXBjID0gKnArKzsKLQkJc2MgPSBzIDwgc2UgPyAqcyA6ICdcMCc7Ci0JCXMrKzsKLQkJaWYgKCFJU01BR0lDKHBjKSkgewotCQkJaWYgKHNjICE9IHBjKQotCQkJCXJldHVybiAoMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzd2l0Y2ggKCpwKyspIHsKLQkJY2FzZSAnWyc6Ci0JCQlpZiAoc2MgPT0gMCB8fCAocCA9IGNjbGFzcyhwLCBzYykpID09IE5VTEwpCi0JCQkJcmV0dXJuICgwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJz8nOgotCQkJaWYgKHNjID09IDApCi0JCQkJcmV0dXJuICgwKTsKLQkJCWlmIChVVEZNT0RFKSB7Ci0JCQkJLS1zOwotCQkJCXMgKz0gdXRmX3B0cmFkaigoY29uc3Qgdm9pZCAqKXMpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnKic6Ci0JCQlpZiAocCA9PSBwZSkKLQkJCQlyZXR1cm4gKDEpOwotCQkJcy0tOwotCQkJZG8gewotCQkJCWlmIChkb19nbWF0Y2gocywgc2UsIHAsIHBlKSkKLQkJCQkJcmV0dXJuICgxKTsKLQkJCX0gd2hpbGUgKHMrKyA8IHNlKTsKLQkJCXJldHVybiAoMCk7Ci0KLQkJLyoqCi0JCSAqIFsqKz9AIV0ocGF0dGVybnxwYXR0ZXJufC4uKQotCQkgKiBUaGlzIGlzIGFsc28gbmVlZGVkIGZvciAkey4uJS4ufSwgZXRjLgotCQkgKi8KLQkJY2FzZSAweDgwfCcrJzogLyogbWF0Y2hlcyBvbmUgb3IgbW9yZSB0aW1lcyAqLwotCQljYXNlIDB4ODB8JyonOiAvKiBtYXRjaGVzIHplcm8gb3IgbW9yZSB0aW1lcyAqLwotCQkJaWYgKCEocHJlc3QgPSBwYXRfc2NhbihwLCBwZSwgMCkpKQotCQkJCXJldHVybiAoMCk7Ci0JCQlzLS07Ci0JCQkvKiB0YWtlIGNhcmUgb2YgemVybyBtYXRjaGVzICovCi0JCQlpZiAocFstMV0gPT0gKDB4ODAgfCAnKicpICYmCi0JCQkgICAgZG9fZ21hdGNoKHMsIHNlLCBwcmVzdCwgcGUpKQotCQkJCXJldHVybiAoMSk7Ci0JCQlmb3IgKHBzdWIgPSBwOyA7IHBzdWIgPSBwbmV4dCkgewotCQkJCXBuZXh0ID0gcGF0X3NjYW4ocHN1YiwgcGUsIDEpOwotCQkJCWZvciAoc3Jlc3QgPSBzOyBzcmVzdCA8PSBzZTsgc3Jlc3QrKykgewotCQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNyZXN0LCBwc3ViLCBwbmV4dCAtIDIpICYmCi0JCQkJCSAgICAoZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSB8fAotCQkJCQkgICAgKHMgIT0gc3Jlc3QgJiYgZG9fZ21hdGNoKHNyZXN0LAotCQkJCQkgICAgc2UsIHAgLSAyLCBwZSkpKSkKLQkJCQkJCXJldHVybiAoMSk7Ci0JCQkJfQotCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gKDApOwotCi0JCWNhc2UgMHg4MHwnPyc6IC8qIG1hdGNoZXMgemVybyBvciBvbmNlICovCi0JCWNhc2UgMHg4MHwnQCc6IC8qIG1hdGNoZXMgb25lIG9mIHRoZSBwYXR0ZXJucyAqLwotCQljYXNlIDB4ODB8JyAnOiAvKiBzaW1pbGUgZm9yIEAgKi8KLQkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKLQkJCQlyZXR1cm4gKDApOwotCQkJcy0tOwotCQkJLyogVGFrZSBjYXJlIG9mIHplcm8gbWF0Y2hlcyAqLwotCQkJaWYgKHBbLTFdID09ICgweDgwIHwgJz8nKSAmJgotCQkJICAgIGRvX2dtYXRjaChzLCBzZSwgcHJlc3QsIHBlKSkKLQkJCQlyZXR1cm4gKDEpOwotCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKLQkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKLQkJCQlzcmVzdCA9IHByZXN0ID09IHBlID8gc2UgOiBzOwotCQkJCWZvciAoOyBzcmVzdCA8PSBzZTsgc3Jlc3QrKykgewotCQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNyZXN0LCBwc3ViLCBwbmV4dCAtIDIpICYmCi0JCQkJCSAgICBkb19nbWF0Y2goc3Jlc3QsIHNlLCBwcmVzdCwgcGUpKQotCQkJCQkJcmV0dXJuICgxKTsKLQkJCQl9Ci0JCQkJaWYgKHBuZXh0ID09IHByZXN0KQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiAoMCk7Ci0KLQkJY2FzZSAweDgwfCchJzogLyogbWF0Y2hlcyBub25lIG9mIHRoZSBwYXR0ZXJucyAqLwotCQkJaWYgKCEocHJlc3QgPSBwYXRfc2NhbihwLCBwZSwgMCkpKQotCQkJCXJldHVybiAoMCk7Ci0JCQlzLS07Ci0JCQlmb3IgKHNyZXN0ID0gczsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKLQkJCQlpbnQgbWF0Y2hlZCA9IDA7Ci0KLQkJCQlmb3IgKHBzdWIgPSBwOyA7IHBzdWIgPSBwbmV4dCkgewotCQkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKLQkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwKLQkJCQkJICAgIHBuZXh0IC0gMikpIHsKLQkJCQkJCW1hdGNoZWQgPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHBuZXh0ID09IHByZXN0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghbWF0Y2hlZCAmJgotCQkJCSAgICBkb19nbWF0Y2goc3Jlc3QsIHNlLCBwcmVzdCwgcGUpKQotCQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJcmV0dXJuICgwKTsKLQotCQlkZWZhdWx0OgotCQkJaWYgKHNjICE9IHBbLTFdKQotCQkJCXJldHVybiAoMCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKHMgPT0gc2UpOwotfQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqCi1jY2xhc3MoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IHN1YikKLXsKLQlpbnQgYywgZCwgbm90cCwgZm91bmQgPSAwOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9yaWdfcCA9IHA7Ci0KLQlpZiAoKG5vdHAgPSAoSVNNQUdJQygqcCkgJiYgKisrcCA9PSBOT1QpKSkKLQkJcCsrOwotCWRvIHsKLQkJYyA9ICpwKys7Ci0JCWlmIChJU01BR0lDKGMpKSB7Ci0JCQljID0gKnArKzsKLQkJCWlmICgoYyAmIDB4ODApICYmICFJU01BR0lDKGMpKSB7Ci0JCQkJYyAmPSAweDdmOy8qIGV4dGVuZGVkIHBhdHRlcm4gbWF0Y2hpbmc6ICorP0AhICovCi0JCQkJLyogWFhYIHRoZSAoIGNoYXIgaXNuJ3QgaGFuZGxlZCBhcyBwYXJ0IG9mIFtdICovCi0JCQkJaWYgKGMgPT0gJyAnKSAvKiBzaW1pbGUgZm9yIEA6IHBsYWluICguLikgKi8KLQkJCQkJYyA9ICcoJyAvKikqLzsKLQkJCX0KLQkJfQotCQlpZiAoYyA9PSAnXDAnKQotCQkJLyogTm8gY2xvc2luZyBdIC0gYWN0IGFzIGlmIHRoZSBvcGVuaW5nIFsgd2FzIHF1b3RlZCAqLwotCQkJcmV0dXJuIChzdWIgPT0gJ1snID8gb3JpZ19wIDogTlVMTCk7Ci0JCWlmIChJU01BR0lDKHBbMF0pICYmIHBbMV0gPT0gJy0nICYmCi0JCSAgICAoIUlTTUFHSUMocFsyXSkgfHwgcFszXSAhPSAnXScpKSB7Ci0JCQlwICs9IDI7IC8qIE1BR0lDLSAqLwotCQkJZCA9ICpwKys7Ci0JCQlpZiAoSVNNQUdJQyhkKSkgewotCQkJCWQgPSAqcCsrOwotCQkJCWlmICgoZCAmIDB4ODApICYmICFJU01BR0lDKGQpKQotCQkJCQlkICY9IDB4N2Y7Ci0JCQl9Ci0JCQkvKiBQT1NJWCBzYXlzIHRoaXMgaXMgYW4gaW52YWxpZCBleHByZXNzaW9uICovCi0JCQlpZiAoYyA+IGQpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJfSBlbHNlCi0JCQlkID0gYzsKLQkJaWYgKGMgPT0gc3ViIHx8IChjIDw9IHN1YiAmJiBzdWIgPD0gZCkpCi0JCQlmb3VuZCA9IDE7Ci0JfSB3aGlsZSAoIShJU01BR0lDKHBbMF0pICYmIHBbMV0gPT0gJ10nKSk7Ci0KLQlyZXR1cm4gKChmb3VuZCAhPSBub3RwKSA/IHArMiA6IE5VTEwpOwotfQotCi0vKiBMb29rIGZvciBuZXh0ICkgb3IgfCAoaWYgbWF0Y2hfc2VwKSBpbiAqKGZvb3xiYXIpIHBhdHRlcm4gKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgKgotcGF0X3NjYW4oY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcGUsIGludCBtYXRjaF9zZXApCi17Ci0JaW50IG5lc3QgPSAwOwotCi0JZm9yICg7IHAgPCBwZTsgcCsrKSB7Ci0JCWlmICghSVNNQUdJQygqcCkpCi0JCQljb250aW51ZTsKLQkJaWYgKCgqKytwID09IC8qKCovICcpJyAmJiBuZXN0LS0gPT0gMCkgfHwKLQkJICAgICgqcCA9PSAnfCcgJiYgbWF0Y2hfc2VwICYmIG5lc3QgPT0gMCkpCi0JCQlyZXR1cm4gKHAgKyAxKTsKLQkJaWYgKCgqcCAmIDB4ODApICYmIHZzdHJjaHIoIiorP0AhICIsICpwICYgMHg3ZikpCi0JCQluZXN0Kys7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLWludAoteHN0cmNtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0JcmV0dXJuIChzdHJjbXAoKihjb25zdCBjaGFyICogY29uc3QgKilwMSwgKihjb25zdCBjaGFyICogY29uc3QgKilwMikpOwotfQotCi0vKiBJbml0aWFsaXNlIGEgR2V0b3B0IHN0cnVjdHVyZSAqLwotdm9pZAota3NoX2dldG9wdF9yZXNldChHZXRvcHQgKmdvLCBpbnQgZmxhZ3MpCi17Ci0JZ28tPm9wdGluZCA9IDE7Ci0JZ28tPm9wdGFyZyA9IE5VTEw7Ci0JZ28tPnAgPSAwOwotCWdvLT5mbGFncyA9IGZsYWdzOwotCWdvLT5pbmZvID0gMDsKLQlnby0+YnVmWzFdID0gJ1wwJzsKLX0KLQotCi0vKiBnZXRvcHQoKSB1c2VkIGZvciBzaGVsbCBidWlsdC1pbiBjb21tYW5kcywgdGhlIGdldG9wdHMgY29tbWFuZCwgYW5kCi0gKiBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLSAqIEEgbGVhZGluZyAnOicgaW4gb3B0aW9ucyBtZWFucyBkb24ndCBwcmludCBlcnJvcnMsIGluc3RlYWQgcmV0dXJuICc/JwotICogb3IgJzonIGFuZCBzZXQgZ28tPm9wdGFyZyB0byB0aGUgb2ZmZW5kaW5nIG9wdGlvbiBjaGFyYWN0ZXIuCi0gKiBJZiBHRl9FUlJPUiBpcyBzZXQgKGFuZCBvcHRpb24gZG9lc24ndCBzdGFydCB3aXRoIDopLCBlcnJvcnMgcmVzdWx0IGluCi0gKiBhIGNhbGwgdG8gYmlfZXJyb3JmKCkuCi0gKgotICogTm9uLXN0YW5kYXJkIGZlYXR1cmVzOgotICoJLSAnOycgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhjZXB0IHRoZSBhcmd1bWVudCBpcyBvcHRpb25hbAotICoJICAoaWYgaXQgaXNuJ3QgcHJlc2VudCwgb3B0YXJnIGlzIHNldCB0byAwKS4KLSAqCSAgVXNlZCBmb3IgJ3NldCAtbycuCi0gKgktICcsJyBpcyBsaWtlICc6JyBpbiBvcHRpb25zLCBleGNlcHQgdGhlIGFyZ3VtZW50IGFsd2F5cyBpbW1lZGlhdGVseQotICoJICBmb2xsb3dzIHRoZSBvcHRpb24gY2hhcmFjdGVyIChvcHRhcmcgaXMgc2V0IHRvIHRoZSBudWxsIHN0cmluZyBpZgotICoJICB0aGUgb3B0aW9uIGlzIG1pc3NpbmcpLgotICoJICBVc2VkIGZvciAncmVhZCAtdTInLCAncHJpbnQgLXUyJyBhbmQgZmMgLTQwLgotICoJLSAnIycgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhwZWN0IHRoYXQgdGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsCi0gKgkgIGFuZCBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdC4gSWYgdGhlIGFyZ3VtZW50IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCi0gKgkgIGRpZ2l0LCBpdCBpcyBhc3N1bWVkIHRvIGJlIG1pc3NpbmcgYW5kIG5vcm1hbCBvcHRpb24gcHJvY2Vzc2luZwotICoJICBjb250aW51ZXMgKG9wdGFyZyBpcyBzZXQgdG8gMCBpZiB0aGUgb3B0aW9uIGlzIG1pc3NpbmcpLgotICoJICBVc2VkIGZvciAndHlwZXNldCAtTFo0Jy4KLSAqCS0gYWNjZXB0cyArYyBhcyB3ZWxsIGFzIC1jIElGIHRoZSBHRl9QTFVTT1BUIGZsYWcgaXMgcHJlc2VudC4gSWYgYW4KLSAqCSAgb3B0aW9uIHN0YXJ0aW5nIHdpdGggKyBpcyBhY2NlcHRlZCwgdGhlIEdJX1BMVVMgZmxhZyB3aWxsIGJlIHNldAotICoJICBpbiBnby0+aW5mby4KLSAqLwotaW50Ci1rc2hfZ2V0b3B0KGNvbnN0IGNoYXIgKiphcmd2LCBHZXRvcHQgKmdvLCBjb25zdCBjaGFyICpvcHRpb25zcCkKLXsKLQljaGFyIGM7Ci0JY29uc3QgY2hhciAqbzsKLQotCWlmIChnby0+cCA9PSAwIHx8IChjID0gYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKSA9PSAnXDAnKSB7Ci0JCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbZ28tPm9wdGluZF0sIGZsYWcgPSBhcmcgPyAqYXJnIDogJ1wwJzsKLQotCQlnby0+cCA9IDE7Ci0JCWlmIChmbGFnID09ICctJyAmJiBhcmdbMV0gPT0gJy0nICYmIGFyZ1syXSA9PSAnXDAnKSB7Ci0JCQlnby0+b3B0aW5kKys7Ci0JCQlnby0+cCA9IDA7Ci0JCQlnby0+aW5mbyB8PSBHSV9NSU5VU01JTlVTOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJaWYgKGFyZyA9PSBOVUxMIHx8Ci0JCSAgICAoKGZsYWcgIT0gJy0nICkgJiYgLyogbmVpdGhlciBhIC0gbm9yIGEgKyAoaWYgKyBhbGxvd2VkKSAqLwotCQkgICAgKCEoZ28tPmZsYWdzICYgR0ZfUExVU09QVCkgfHwgZmxhZyAhPSAnKycpKSB8fAotCQkgICAgKGMgPSBhcmdbMV0pID09ICdcMCcpIHsKLQkJCWdvLT5wID0gMDsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCWdvLT5vcHRpbmQrKzsKLQkJZ28tPmluZm8gJj0gfihHSV9NSU5VU3xHSV9QTFVTKTsKLQkJZ28tPmluZm8gfD0gZmxhZyA9PSAnLScgPyBHSV9NSU5VUyA6IEdJX1BMVVM7Ci0JfQotCWdvLT5wKys7Ci0JaWYgKGMgPT0gJz8nIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnIHx8IGMgPT0gJywnIHx8IGMgPT0gJyMnIHx8Ci0JICAgICEobyA9IGNzdHJjaHIob3B0aW9uc3AsIGMpKSkgewotCQlpZiAob3B0aW9uc3BbMF0gPT0gJzonKSB7Ci0JCQlnby0+YnVmWzBdID0gYzsKLQkJCWdvLT5vcHRhcmcgPSBnby0+YnVmOwotCQl9IGVsc2UgewotCQkJd2FybmluZ2YodHJ1ZSwgIiVzJXMtJWM6IHVua25vd24gb3B0aW9uIiwKLQkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogYXJndlswXSwKLQkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogIjogIiwgYyk7Ci0JCQlpZiAoZ28tPmZsYWdzICYgR0ZfRVJST1IpCi0JCQkJYmlfZXJyb3JmeigpOwotCQl9Ci0JCXJldHVybiAoJz8nKTsKLQl9Ci0JLyogOiBtZWFucyBhcmd1bWVudCBtdXN0IGJlIHByZXNlbnQsIG1heSBiZSBwYXJ0IG9mIG9wdGlvbiBhcmd1bWVudAotCSAqICAgb3IgdGhlIG5leHQgYXJndW1lbnQKLQkgKiA7IHNhbWUgYXMgOiBidXQgYXJndW1lbnQgbWF5IGJlIG1pc3NpbmcKLQkgKiAsIG1lYW5zIGFyZ3VtZW50IGlzIHBhcnQgb2Ygb3B0aW9uIGFyZ3VtZW50LCBhbmQgbWF5IGJlIG51bGwuCi0JICovCi0JaWYgKCorK28gPT0gJzonIHx8ICpvID09ICc7JykgewotCQlpZiAoYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKQotCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdICsgZ28tPnA7Ci0JCWVsc2UgaWYgKGFyZ3ZbZ28tPm9wdGluZF0pCi0JCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kKytdOwotCQllbHNlIGlmICgqbyA9PSAnOycpCi0JCQlnby0+b3B0YXJnID0gTlVMTDsKLQkJZWxzZSB7Ci0JCQlpZiAob3B0aW9uc3BbMF0gPT0gJzonKSB7Ci0JCQkJZ28tPmJ1ZlswXSA9IGM7Ci0JCQkJZ28tPm9wdGFyZyA9IGdvLT5idWY7Ci0JCQkJcmV0dXJuICgnOicpOwotCQkJfQotCQkJd2FybmluZ2YodHJ1ZSwgIiVzJXMtJyVjJyByZXF1aXJlcyBhcmd1bWVudCIsCi0JCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6IGFyZ3ZbMF0sCi0JCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6ICI6ICIsIGMpOwotCQkJaWYgKGdvLT5mbGFncyAmIEdGX0VSUk9SKQotCQkJCWJpX2Vycm9yZnooKTsKLQkJCXJldHVybiAoJz8nKTsKLQkJfQotCQlnby0+cCA9IDA7Ci0JfSBlbHNlIGlmICgqbyA9PSAnLCcpIHsKLQkJLyogYXJndW1lbnQgaXMgYXR0YWNoZWQgdG8gb3B0aW9uIGNoYXJhY3RlciwgZXZlbiBpZiBudWxsICovCi0JCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXSArIGdvLT5wOwotCQlnby0+cCA9IDA7Ci0JfSBlbHNlIGlmICgqbyA9PSAnIycpIHsKLQkJLyogYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIG1heSBiZSBhdHRhY2hlZCBvciB1bmF0dGFjaGVkCi0JCSAqIGJ1dCBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdC4gb3B0YXJnIGlzIHNldCB0byAwIGlmIHRoZQotCQkgKiBhcmd1bWVudCBpcyBtaXNzaW5nLgotCQkgKi8KLQkJaWYgKGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkgewotCQkJaWYgKGtzaF9pc2RpZ2l0KGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkpIHsKLQkJCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kIC0gMV0gKyBnby0+cDsKLQkJCQlnby0+cCA9IDA7Ci0JCQl9IGVsc2UKLQkJCQlnby0+b3B0YXJnID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWlmIChhcmd2W2dvLT5vcHRpbmRdICYmIGtzaF9pc2RpZ2l0KGFyZ3ZbZ28tPm9wdGluZF1bMF0pKSB7Ci0JCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCsrXTsKLQkJCQlnby0+cCA9IDA7Ci0JCQl9IGVsc2UKLQkJCQlnby0+b3B0YXJnID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gKGMpOwotfQotCi0vKiBwcmludCB2YXJpYWJsZS9hbGlhcyB2YWx1ZSB1c2luZyBuZWNlc3NhcnkgcXVvdGVzCi0gKiAoUE9TSVggc2F5cyB0aGV5IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgcmUtZW50cnkuLi4pCi0gKiBObyB0cmFpbGluZyBuZXdsaW5lIGlzIHByaW50ZWQuCi0gKi8KLXZvaWQKLXByaW50X3ZhbHVlX3F1b3RlZChjb25zdCBjaGFyICpzKQotewotCWNvbnN0IGNoYXIgKnA7Ci0JaW50IGlucXVvdGUgPSAwOwotCi0JLyogVGVzdCBpZiBhbnkgcXVvdGVzIGFyZSBuZWVkZWQgKi8KLQlmb3IgKHAgPSBzOyAqcDsgcCsrKQotCQlpZiAoY3R5cGUoKnAsIENfUVVPVEUpKQotCQkJYnJlYWs7Ci0JaWYgKCEqcCkgewotCQlzaGZfcHV0cyhzLCBzaGxfc3Rkb3V0KTsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKHAgPSBzOyAqcDsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXCcnKSB7Ci0JCQlpZiAoaW5xdW90ZSkKLQkJCQlzaGZfcHV0YygnXCcnLCBzaGxfc3Rkb3V0KTsKLQkJCXNoZl9wdXRjKCdcXCcsIHNobF9zdGRvdXQpOwotCQkJaW5xdW90ZSA9IDA7Ci0JCX0gZWxzZSBpZiAoIWlucXVvdGUpIHsKLQkJCXNoZl9wdXRjKCdcJycsIHNobF9zdGRvdXQpOwotCQkJaW5xdW90ZSA9IDE7Ci0JCX0KLQkJc2hmX3B1dGMoKnAsIHNobF9zdGRvdXQpOwotCX0KLQlpZiAoaW5xdW90ZSkKLQkJc2hmX3B1dGMoJ1wnJywgc2hsX3N0ZG91dCk7Ci19Ci0KLS8qCi0gKiBQcmludCB0aGluZ3MgaW4gY29sdW1ucyBhbmQgcm93cyAtIGZ1bmMoKSBpcyBjYWxsZWQgdG8gZm9ybWF0Ci0gKiB0aGUgaS10aCBlbGVtZW50Ci0gKi8KLXZvaWQKLXByaW50X2NvbHVtbnMoc3RydWN0IHNoZiAqc2hmLCBpbnQgbiwKLSAgICBjaGFyICooKmZ1bmMpKGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKiksCi0gICAgY29uc3Qgdm9pZCAqYXJnLCBpbnQgbWF4X29jdCwgaW50IG1heF9jb2wsIGJvb2wgcHJlZmNvbCkKLXsKLQlpbnQgaSwgciwgYywgcm93cywgY29scywgbnNwYWNlOwotCWNoYXIgKnN0cjsKLQotCWlmIChuIDw9IDApIHsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQlpbnRlcm5hbF93YXJuaW5nZigicHJpbnRfY29sdW1ucyBjYWxsZWQgd2l0aCBuPSVkIDw9IDAiLCBuKTsKLSNlbmRpZgotCQlyZXR1cm47Ci0JfQotCi0JKyttYXhfb2N0OwotCXN0ciA9IGFsbG9jKG1heF9vY3QsIEFURU1QKTsKLQotCS8qIGVuc3VyZSB4X2NvbHMgaXMgdmFsaWQgZmlyc3QgKi8KLQlpZiAoeF9jb2xzIDwgTUlOX0NPTFMpCi0JCWNoYW5nZV93aW5zeigpOwotCi0JLyoKLQkgKiBXZSB1c2UgKG1heF9jb2wgKyAxKSB0byBjb25zaWRlciB0aGUgc3BhY2Ugc2VwYXJhdG9yLgotCSAqIE5vdGUgdGhhdCBubyBzcGFjZSBpcyBwcmludGVkIGFmdGVyIHRoZSBsYXN0IGNvbHVtbgotCSAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGVybWluYWxzIHRoYXQgaGF2ZSBhdXRvLXdyYXAuCi0JICovCi0JY29scyA9IHhfY29scyAvIChtYXhfY29sICsgMSk7Ci0KLQkvKiBpZiB3ZSBjYW4gb25seSBwcmludCBvbmUgY29sdW1uIGFueXdheSwgc2tpcCB0aGUgZ29vICovCi0JaWYgKGNvbHMgPCAyKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JCQlzaGZfZnByaW50ZihzaGYsICIlcyBcbiIsCi0JCQkgICAgKCpmdW5jKShzdHIsIG1heF9vY3QsIGksIGFyZykpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyb3dzID0gKG4gKyBjb2xzIC0gMSkgLyBjb2xzOwotCWlmIChwcmVmY29sICYmIGNvbHMgPiByb3dzKSB7Ci0JCWkgPSByb3dzOwotCQlyb3dzID0gY29scyA+IG4gPyBuIDogY29sczsKLQkJY29scyA9IGk7Ci0JfQotCi0JbWF4X2NvbCA9IC1tYXhfY29sOwotCW5zcGFjZSA9ICh4X2NvbHMgKyBtYXhfY29sICogY29scykgLyBjb2xzOwotCWlmIChuc3BhY2UgPD0gMCkKLQkJbnNwYWNlID0gMTsKLQlmb3IgKHIgPSAwOyByIDwgcm93czsgcisrKSB7Ci0JCWZvciAoYyA9IDA7IGMgPCBjb2xzOyBjKyspIHsKLQkJCWkgPSBjICogcm93cyArIHI7Ci0JCQlpZiAoaSA8IG4pIHsKLQkJCQlzaGZfZnByaW50ZihzaGYsICIlKnMiLCBtYXhfY29sLAotCQkJCSAgICAoKmZ1bmMpKHN0ciwgbWF4X29jdCwgaSwgYXJnKSk7Ci0JCQkJaWYgKGMgKyAxIDwgY29scykKLQkJCQkJc2hmX2ZwcmludGYoc2hmLCAiJSpzIiwgbnNwYWNlLCBudWxsKTsKLQkJCX0KLQkJfQotCQlzaGZfcHV0Y2hhcignXG4nLCBzaGYpOwotCX0KLSBvdXQ6Ci0JYWZyZWUoc3RyLCBBVEVNUCk7Ci19Ci0KLS8qIFN0cmlwIGFueSBudWwgYnl0ZXMgZnJvbSBidWYgLSByZXR1cm5zIG5ldyBsZW5ndGggKG5ieXRlcyAtICMgb2YgbnVscykgKi8KLXZvaWQKLXN0cmlwX251bHMoY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotCWNoYXIgKmRzdDsKLQotCS8qIG5ieXRlcyBjaGVjayBiZWNhdXNlIHNvbWUgc3lzdGVtcyAob2xkZXIgRnJlZUJTRHMpIGhhdmUgYSBidWdneQotCSAqIG1lbWNocigpCi0JICovCi0JaWYgKG5ieXRlcyAmJiAoZHN0ID0gbWVtY2hyKGJ1ZiwgJ1wwJywgbmJ5dGVzKSkpIHsKLQkJY2hhciAqZW5kID0gYnVmICsgbmJ5dGVzOwotCQljaGFyICpwLCAqcTsKLQotCQlmb3IgKHAgPSBkc3Q7IHAgPCBlbmQ7IHAgPSBxKSB7Ci0JCQkvKiBza2lwIGEgYmxvY2sgb2YgbnVsbHMgKi8KLQkJCXdoaWxlICgrK3AgPCBlbmQgJiYgKnAgPT0gJ1wwJykKLQkJCQk7Ci0JCQkvKiBmaW5kIGVuZCBvZiBub24tbnVsbCBibG9jayAqLwotCQkJaWYgKCEocSA9IG1lbWNocihwLCAnXDAnLCBlbmQgLSBwKSkpCi0JCQkJcSA9IGVuZDsKLQkJCW1lbW1vdmUoZHN0LCBwLCBxIC0gcCk7Ci0JCQlkc3QgKz0gcSAtIHA7Ci0JCX0KLQkJKmRzdCA9ICdcMCc7Ci0JfQotfQotCi0vKiBMaWtlIHJlYWQoMiksIGJ1dCBpZiByZWFkIGZhaWxzIGR1ZSB0byBub24tYmxvY2tpbmcgZmxhZywgcmVzZXRzIGZsYWcKLSAqIGFuZCByZXN0YXJ0cyByZWFkLgotICovCi1pbnQKLWJsb2NraW5nX3JlYWQoaW50IGZkLCBjaGFyICpidWYsIGludCBuYnl0ZXMpCi17Ci0JaW50IHJldDsKLQlpbnQgdHJpZWRfcmVzZXQgPSAwOwotCi0Jd2hpbGUgKChyZXQgPSByZWFkKGZkLCBidWYsIG5ieXRlcykpIDwgMCkgewotCQlpZiAoIXRyaWVkX3Jlc2V0ICYmIGVycm5vID09IEVBR0FJTikgewotCQkJaWYgKHJlc2V0X25vbmJsb2NrKGZkKSA+IDApIHsKLQkJCQl0cmllZF9yZXNldCA9IDE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllcnJubyA9IEVBR0FJTjsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBSZXNldCB0aGUgbm9uLWJsb2NraW5nIGZsYWcgb24gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCi0gKiBSZXR1cm5zIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgMCBpZiBub24tYmxvY2tpbmcgd2Fzbid0IHNldCwKLSAqIDEgaWYgaXQgd2FzLgotICovCi1pbnQKLXJlc2V0X25vbmJsb2NrKGludCBmZCkKLXsKLQlpbnQgZmxhZ3M7Ci0KLQlpZiAoKGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApKSA8IDApCi0JCXJldHVybiAoLTEpOwotCWlmICghKGZsYWdzICYgT19OT05CTE9DSykpCi0JCXJldHVybiAoMCk7Ci0JZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7Ci0JaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncykgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlyZXR1cm4gKDEpOwotfQotCi0KLS8qIExpa2UgZ2V0Y3dkKCksIGV4Y2VwdCBic2l6ZSBpcyBpZ25vcmVkIGlmIGJ1ZiBpcyAwIChQQVRIX01BWCBpcyB1c2VkKSAqLwotY2hhciAqCi1rc2hfZ2V0X3dkKHNpemVfdCAqZGxlbikKLXsKLQljaGFyICpyZXQsICpiOwotCXNpemVfdCBsZW4gPSAxOwotCi0jaWZkZWYgTk9fUEFUSF9NQVgKLQlpZiAoKGIgPSBnZXRfY3VycmVudF9kaXJfbmFtZSgpKSkgewotCQlsZW4gPSBzdHJsZW4oYikgKyAxOwotCQlzdHJuZHVweChyZXQsIGIsIGxlbiAtIDEsIEFURU1QKTsKLQkJZnJlZShiKTsKLQl9IGVsc2UKLQkJcmV0ID0gTlVMTDsKLSNlbHNlCi0JaWYgKChyZXQgPSBnZXRjd2QoKGIgPSBhbGxvYyhQQVRIX01BWCArIDEsIEFURU1QKSksIFBBVEhfTUFYKSkpCi0JCXJldCA9IGFyZXNpemUoYiwgbGVuID0gKHN0cmxlbihiKSArIDEpLCBBVEVNUCk7Ci0JZWxzZQotCQlhZnJlZShiLCBBVEVNUCk7Ci0jZW5kaWYKLQotCWlmIChkbGVuKQotCQkqZGxlbiA9IGxlbjsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qCi0gKglNYWtlcyBhIGZpbGVuYW1lIGludG8gcmVzdWx0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtLgotICoJLSBtYWtlIHJlc3VsdCBOVUxMCi0gKgktIGlmIGZpbGUgc3RhcnRzIHdpdGggJy8nLCBhcHBlbmQgZmlsZSB0byByZXN1bHQgJiBzZXQgY2RwYXRocCB0byBOVUxMCi0gKgktIGlmIGZpbGUgc3RhcnRzIHdpdGggLi8gb3IgLi4vIGFwcGVuZCBjd2QgYW5kIGZpbGUgdG8gcmVzdWx0Ci0gKgkgIGFuZCBzZXQgY2RwYXRocCB0byBOVUxMCi0gKgktIGlmIHRoZSBmaXJzdCBlbGVtZW50IG9mIGNkcGF0aHAgZG9lc250IHN0YXJ0IHdpdGggYSAnLycgeHggb3IgJy4nIHh4Ci0gKgkgIHRoZW4gY3dkIGlzIGFwcGVuZGVkIHRvIHJlc3VsdC4KLSAqCS0gdGhlIGZpcnN0IGVsZW1lbnQgb2YgY2RwYXRocCBpcyBhcHBlbmRlZCB0byByZXN1bHQKLSAqCS0gZmlsZSBpcyBhcHBlbmRlZCB0byByZXN1bHQKLSAqCS0gY2RwYXRocCBpcyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGVsZW1lbnQgaW4gY2RwYXRocCAob3IgTlVMTAotICoJICBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cy4KLSAqCVRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBub24tbnVsbCBlbGVtZW50IGZyb20gY2RwYXRocAotICoJd2FzIGFwcGVuZGVkIHRvIHJlc3VsdC4KLSAqLwotaW50Ci1tYWtlX3BhdGgoY29uc3QgY2hhciAqY3dkLCBjb25zdCBjaGFyICpmaWxlLAotICAgIGNoYXIgKipjZHBhdGhwLAkJLyogJiBvZiA6IHNlcGFyYXRlZCBsaXN0ICovCi0gICAgWFN0cmluZyAqeHNwLAotICAgIGludCAqcGh5c19wYXRocCkKLXsKLQlpbnQgcnZhbCA9IDA7Ci0JYm9vbCB1c2VfY2RwYXRoID0gdHJ1ZTsKLQljaGFyICpwbGlzdDsKLQlpbnQgbGVuLCBwbGVuID0gMDsKLQljaGFyICp4cCA9IFhzdHJpbmcoKnhzcCwgeHApOwotCi0JaWYgKCFmaWxlKQotCQlmaWxlID0gbnVsbDsKLQotCWlmIChmaWxlWzBdID09ICcvJykgewotCQkqcGh5c19wYXRocCA9IDA7Ci0JCXVzZV9jZHBhdGggPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoZmlsZVswXSA9PSAnLicpIHsKLQkJCWNoYXIgYyA9IGZpbGVbMV07Ci0KLQkJCWlmIChjID09ICcuJykKLQkJCQljID0gZmlsZVsyXTsKLQkJCWlmIChjID09ICcvJyB8fCBjID09ICdcMCcpCi0JCQkJdXNlX2NkcGF0aCA9IGZhbHNlOwotCQl9Ci0KLQkJcGxpc3QgPSAqY2RwYXRocDsKLQkJaWYgKCFwbGlzdCkKLQkJCXVzZV9jZHBhdGggPSBmYWxzZTsKLQkJZWxzZSBpZiAodXNlX2NkcGF0aCkgewotCQkJY2hhciAqcGVuZDsKLQotCQkJZm9yIChwZW5kID0gcGxpc3Q7ICpwZW5kICYmICpwZW5kICE9ICc6JzsgcGVuZCsrKQotCQkJCTsKLQkJCXBsZW4gPSBwZW5kIC0gcGxpc3Q7Ci0JCQkqY2RwYXRocCA9ICpwZW5kID8gcGVuZCArIDEgOiBOVUxMOwotCQl9Ci0KLQkJaWYgKCghdXNlX2NkcGF0aCB8fCAhcGxlbiB8fCBwbGlzdFswXSAhPSAnLycpICYmCi0JCSAgICAoY3dkICYmICpjd2QpKSB7Ci0JCQlsZW4gPSBzdHJsZW4oY3dkKTsKLQkJCVhjaGVja04oKnhzcCwgeHAsIGxlbik7Ci0JCQltZW1jcHkoeHAsIGN3ZCwgbGVuKTsKLQkJCXhwICs9IGxlbjsKLQkJCWlmIChjd2RbbGVuIC0gMV0gIT0gJy8nKQotCQkJCVhwdXQoKnhzcCwgeHAsICcvJyk7Ci0JCX0KLQkJKnBoeXNfcGF0aHAgPSBYbGVuZ3RoKCp4c3AsIHhwKTsKLQkJaWYgKHVzZV9jZHBhdGggJiYgcGxlbikgewotCQkJWGNoZWNrTigqeHNwLCB4cCwgcGxlbik7Ci0JCQltZW1jcHkoeHAsIHBsaXN0LCBwbGVuKTsKLQkJCXhwICs9IHBsZW47Ci0JCQlpZiAocGxpc3RbcGxlbiAtIDFdICE9ICcvJykKLQkJCQlYcHV0KCp4c3AsIHhwLCAnLycpOwotCQkJcnZhbCA9IDE7Ci0JCX0KLQl9Ci0KLQlsZW4gPSBzdHJsZW4oZmlsZSkgKyAxOwotCVhjaGVja04oKnhzcCwgeHAsIGxlbik7Ci0JbWVtY3B5KHhwLCBmaWxlLCBsZW4pOwotCi0JaWYgKCF1c2VfY2RwYXRoKQotCQkqY2RwYXRocCA9IE5VTEw7Ci0KLQlyZXR1cm4gKHJ2YWwpOwotfQotCi0vKgotICogU2ltcGxpZnkgcGF0aG5hbWVzIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMuCi0gKiBpZSwgc2ltcGxpZnlfcGF0aCgiL2EvYi9jLy4vLi4vZC8uLiIpIHJldHVybnMgIi9hL2IiCi0gKi8KLXZvaWQKLXNpbXBsaWZ5X3BhdGgoY2hhciAqcGF0aGwpCi17Ci0JY2hhciAqY3VyLCAqdDsKLQlib29sIGlzcm9vdGVkOwotCWNoYXIgKnZlcnlfc3RhcnQgPSBwYXRobCwgKnN0YXJ0OwotCi0JaWYgKCEqcGF0aGwpCi0JCXJldHVybjsKLQotCWlmICgoaXNyb290ZWQgPSBwYXRobFswXSA9PSAnLycpKQotCQl2ZXJ5X3N0YXJ0Kys7Ci0KLQkvKiBCZWZvcmUJCQlBZnRlcgotCSAqIC9mb28vCQkJL2ZvbwotCSAqIC9mb28vLi4vLi4vYmFyCQkvYmFyCi0JICogL2Zvby8uL2JsYWgvLi4JCS9mb28KLQkgKiAuCQkJCS4KLQkgKiAuLgkJCQkuLgotCSAqIC4vZm9vCQkJZm9vCi0JICogZm9vLy4uLy4uLy4uL2JhcgkJLi4vLi4vYmFyCi0JICovCi0KLQlmb3IgKGN1ciA9IHQgPSBzdGFydCA9IHZlcnlfc3RhcnQ7IDsgKSB7Ci0JCS8qIHRyZWF0IG11bHRpcGxlICcvJ3MgYXMgb25lICcvJyAqLwotCQl3aGlsZSAoKnQgPT0gJy8nKQotCQkJdCsrOwotCi0JCWlmICgqdCA9PSAnXDAnKSB7Ci0JCQlpZiAoY3VyID09IHBhdGhsKQotCQkJCS8qIGNvbnZlcnQgZW1wdHkgcGF0aCB0byBkb3QgKi8KLQkJCQkqY3VyKysgPSAnLic7Ci0JCQkqY3VyID0gJ1wwJzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHRbMF0gPT0gJy4nKSB7Ci0JCQlpZiAoIXRbMV0gfHwgdFsxXSA9PSAnLycpIHsKLQkJCQl0ICs9IDE7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKHRbMV0gPT0gJy4nICYmICghdFsyXSB8fCB0WzJdID09ICcvJykpIHsKLQkJCQlpZiAoIWlzcm9vdGVkICYmIGN1ciA9PSBzdGFydCkgewotCQkJCQlpZiAoY3VyICE9IHZlcnlfc3RhcnQpCi0JCQkJCQkqY3VyKysgPSAnLyc7Ci0JCQkJCSpjdXIrKyA9ICcuJzsKLQkJCQkJKmN1cisrID0gJy4nOwotCQkJCQlzdGFydCA9IGN1cjsKLQkJCQl9IGVsc2UgaWYgKGN1ciAhPSBzdGFydCkKLQkJCQkJd2hpbGUgKC0tY3VyID4gc3RhcnQgJiYgKmN1ciAhPSAnLycpCi0JCQkJCQk7Ci0JCQkJdCArPSAyOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGN1ciAhPSB2ZXJ5X3N0YXJ0KQotCQkJKmN1cisrID0gJy8nOwotCi0JCS8qIGZpbmQvY29weSBuZXh0IGNvbXBvbmVudCBvZiBwYXRobmFtZSAqLwotCQl3aGlsZSAoKnQgJiYgKnQgIT0gJy8nKQotCQkJKmN1cisrID0gKnQrKzsKLQl9Ci19Ci0KLQotdm9pZAotc2V0X2N1cnJlbnRfd2QoY2hhciAqcGF0aGwpCi17Ci0Jc2l6ZV90IGxlbiA9IDE7Ci0JY2hhciAqcCA9IHBhdGhsOwotCi0JaWYgKHAgPT0gTlVMTCkgewotCQlpZiAoKHAgPSBrc2hfZ2V0X3dkKCZsZW4pKSA9PSBOVUxMKQotCQkJcCA9IG51bGw7Ci0JfSBlbHNlCi0JCWxlbiA9IHN0cmxlbihwKSArIDE7Ci0KLQlpZiAobGVuID4gY3VycmVudF93ZF9zaXplKSB7Ci0JCWFmcmVlKGN1cnJlbnRfd2QsIEFQRVJNKTsKLQkJY3VycmVudF93ZCA9IGFsbG9jKGN1cnJlbnRfd2Rfc2l6ZSA9IGxlbiwgQVBFUk0pOwotCX0KLQltZW1jcHkoY3VycmVudF93ZCwgcCwgbGVuKTsKLQlpZiAocCAhPSBwYXRobCAmJiBwICE9IG51bGwpCi0JCWFmcmVlKHAsIEFURU1QKTsKLX0KLQotI2lmZGVmIFRJT0NTQ1RUWQotZXh0ZXJuIHZvaWQgY2h2dF9yZWluaXQodm9pZCk7Ci0KLXN0YXRpYyB2b2lkCi1jaHZ0KGNvbnN0IGNoYXIgKmZuKQotewotCWNoYXIgZHZbMjBdOwotCXN0cnVjdCBzdGF0IHNiOwotCWludCBmZDsKLQotCS8qIGZvciBlbnRyb3B5ICovCi0Ja3Noc3RhdGVfZi5oID0gZXZpbGhhc2goZm4pOwotCi0JaWYgKCpmbiA9PSAnLScpIHsKLQkJbWVtY3B5KGR2LCAiLS9kZXYvbnVsbCIsIHNpemVvZigiLS9kZXYvbnVsbCIpKTsKLQkJZm4gPSBkdiArIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKHN0YXQoZm4sICZzYikpIHsKLQkJCW1lbWNweShkdiwgIi9kZXYvdHR5QyIsIDkpOwotCQkJc3RybGNweShkdiArIDksIGZuLCBzaXplb2YoZHYpIC0gOSk7Ci0JCQlpZiAoc3RhdChkdiwgJnNiKSkgewotCQkJCXN0cmxjcHkoZHYgKyA4LCBmbiwgc2l6ZW9mKGR2KSAtIDgpOwotCQkJCWlmIChzdGF0KGR2LCAmc2IpKQotCQkJCQllcnJvcmYoImNodnQ6IGNhbid0IGZpbmQgdHR5ICVzIiwgZm4pOwotCQkJfQotCQkJZm4gPSBkdjsKLQkJfQotCQlpZiAoIShzYi5zdF9tb2RlICYgU19JRkNIUikpCi0JCQllcnJvcmYoImNodnQ6IG5vdCBhIGNoYXIgZGV2aWNlOiAlcyIsIGZuKTsKLQkJaWYgKChzYi5zdF91aWQgIT0gMCkgJiYgY2hvd24oZm4sIDAsIDApKQotCQkJd2FybmluZ2YoZmFsc2UsICJjaHZ0OiBjYW5ub3QgY2hvd24gcm9vdCAlcyIsIGZuKTsKLQkJaWYgKCgoc2Iuc3RfbW9kZSAmIDA3Nzc3KSAhPSAwNjAwKSAmJiBjaG1vZChmbiwgKG1vZGVfdCkwNjAwKSkKLQkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IGNobW9kIDA2MDAgJXMiLCBmbik7Ci0jaWYgSEFWRV9SRVZPS0UKLQkJaWYgKHJldm9rZShmbikpCi0jZW5kaWYKLQkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IHJldm9rZSAlcywgbmV3IHNoZWxsIGlzIgotCQkJICAgICIgcG90ZW50aWFsbHkgaW5zZWN1cmUiLCBmbik7Ci0JfQotCWlmICgoZmQgPSBvcGVuKGZuLCBPX1JEV1IpKSA9PSAtMSkgewotCQlzbGVlcCgxKTsKLQkJaWYgKChmZCA9IG9wZW4oZm4sIE9fUkRXUikpID09IC0xKQotCQkJZXJyb3JmKCJjaHZ0OiBjYW5ub3Qgb3BlbiAlcyIsIGZuKTsKLQl9Ci0Jc3dpdGNoIChmb3JrKCkpIHsKLQljYXNlIC0xOgotCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJmb3JrIik7Ci0JY2FzZSAwOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlleGl0KDApOwotCX0KLQlpZiAoc2V0c2lkKCkgPT0gLTEpCi0JCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgInNldHNpZCIpOwotCWlmIChmbiAhPSBkdiArIDEpIHsKLQkJaWYgKGlvY3RsKGZkLCBUSU9DU0NUVFksIE5VTEwpID09IC0xKQotCQkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiVElPQ1NDVFRZIik7Ci0JCWlmICh0Y2ZsdXNoKGZkLCBUQ0lPRkxVU0gpKQotCQkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiVENJT0ZMVVNIIik7Ci0JfQotCWtzaF9kdXAyKGZkLCAwLCBmYWxzZSk7Ci0Ja3NoX2R1cDIoZmQsIDEsIGZhbHNlKTsKLQlrc2hfZHVwMihmZCwgMiwgZmFsc2UpOwotCWlmIChmZCA+IDIpCi0JCWNsb3NlKGZkKTsKLQljaHZ0X3JlaW5pdCgpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotY2hhciBsb25nc2l6ZXNfYXJlX29rYXlbc2l6ZW9mKGxvbmcpID09IHNpemVvZih1bnNpZ25lZCBsb25nKSA/IDEgOiAtMV07Ci1jaGFyIGFyaXNpemVfaXNfb2theVtzaXplb2YobWtzaF9hcmlfdCkgPT0gNCA/IDEgOiAtMV07Ci1jaGFyIHVhcmlzaXplX2lzX29rYXlbc2l6ZW9mKG1rc2hfdWFyaV90KSA9PSA0ID8gMSA6IC0xXTsKLQotY2hhciAqCi1zdHJjaHIoY2hhciAqcCwgaW50IGNoKQotewotCWZvciAoOzsgKytwKSB7Ci0JCWlmICgqcCA9PSBjaCkKLQkJCXJldHVybiAocCk7Ci0JCWlmICghKnApCi0JCQlyZXR1cm4gKE5VTEwpOwotCX0KLQkvKiBOT1RSRUFDSEVEICovCi19Ci0KLWNoYXIgKgotc3Ryc3RyKGNoYXIgKmIsIGNvbnN0IGNoYXIgKmwpCi17Ci0JY2hhciBmaXJzdCwgYzsKLQlzaXplX3QgbjsKLQotCWlmICgoZmlyc3QgPSAqbCsrKSA9PSAnXDAnKQotCQlyZXR1cm4gKGIpOwotCW4gPSBzdHJsZW4obCk7Ci0gc3Ryc3RyX2xvb2s6Ci0Jd2hpbGUgKChjID0gKmIrKykgIT0gZmlyc3QpCi0JCWlmIChjID09ICdcMCcpCi0JCQlyZXR1cm4gKE5VTEwpOwotCWlmIChzdHJuY21wKGIsIGwsIG4pKQotCQlnb3RvIHN0cnN0cl9sb29rOwotCXJldHVybiAoYiAtIDEpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTUtTSF9BU1NVTUVfVVRGOAotI2lmICFIQVZFX1NUUkNBU0VTVFIKLWNvbnN0IGNoYXIgKgotc3RyaXN0cihjb25zdCBjaGFyICpiLCBjb25zdCBjaGFyICpsKQotewotCWNoYXIgZmlyc3QsIGM7Ci0Jc2l6ZV90IG47Ci0KLQlpZiAoKGZpcnN0ID0gKmwrKyksICgoZmlyc3QgPSBrc2hfdG9sb3dlcihmaXJzdCkpID09ICdcMCcpKQotCQlyZXR1cm4gKGIpOwotCW4gPSBzdHJsZW4obCk7Ci0gc3RyaXN0cl9sb29rOgotCXdoaWxlICgoYyA9ICpiKyspLCAoKGMgPSBrc2hfdG9sb3dlcihjKSkgIT0gZmlyc3QpKQotCQlpZiAoYyA9PSAnXDAnKQotCQkJcmV0dXJuIChOVUxMKTsKLQlpZiAoc3RybmNhc2VjbXAoYiwgbCwgbikpCi0JCWdvdG8gc3RyaXN0cl9sb29rOwotCXJldHVybiAoYiAtIDEpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE1LU0hfU01BTEwKLWNoYXIgKgotc3RybmR1cF8oY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuLCBBcmVhICphcCkKLXsKLQljaGFyICpkc3QgPSBOVUxMOwotCi0JaWYgKHNyYyAhPSBOVUxMKSB7Ci0JCWRzdCA9IGFsbG9jKGxlbiArIDEsIGFwKTsKLQkJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCQlkc3RbbGVuXSA9ICdcMCc7Ci0JfQotCXJldHVybiAoZHN0KTsKLX0KLQotY2hhciAqCi1zdHJkdXBfKGNvbnN0IGNoYXIgKnNyYywgQXJlYSAqYXApCi17Ci0JcmV0dXJuIChzcmMgPT0gTlVMTCA/IE5VTEwgOiBzdHJuZHVwXyhzcmMsIHN0cmxlbihzcmMpLCBhcCkpOwotfQotI2VuZGlmCi0KLSNpZiAhSEFWRV9HRVRSVVNBR0UKLSNkZWZpbmUgSU5WVENLKHIsdCkJZG8gewkJCQkJCVwKLQlyLnR2X3VzZWMgPSAoKHQpICUgKDEwMDAwMDAgLyBDTEtfVENLKSkgKiAoMTAwMDAwMCAvIENMS19UQ0spOwlcCi0Jci50dl9zZWMgPSAodCkgLyBDTEtfVENLOwkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0KLWludAotZ2V0cnVzYWdlKGludCB3aGF0LCBzdHJ1Y3QgcnVzYWdlICpydSkKLXsKLQlzdHJ1Y3QgdG1zIHRtczsKLQljbG9ja190IHUsIHM7Ci0KLQlpZiAoLyogcnUgPT0gTlVMTCB8fCAqLyB0aW1lcygmdG1zKSA9PSAoY2xvY2tfdCktMSkKLQkJcmV0dXJuICgtMSk7Ci0KLQlzd2l0Y2ggKHdoYXQpIHsKLQljYXNlIFJVU0FHRV9TRUxGOgotCQl1ID0gdG1zLnRtc191dGltZTsKLQkJcyA9IHRtcy50bXNfc3RpbWU7Ci0JCWJyZWFrOwotCWNhc2UgUlVTQUdFX0NISUxEUkVOOgotCQl1ID0gdG1zLnRtc19jdXRpbWU7Ci0JCXMgPSB0bXMudG1zX2NzdGltZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlJTlZUQ0socnUtPnJ1X3V0aW1lLCB1KTsKLQlJTlZUQ0socnUtPnJ1X3N0aW1lLCBzKTsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLS8qCi0gKiBwcm9jZXNzIHRoZSBzdHJpbmcgYXZhaWxhYmxlIHZpYSBmZyAoZ2V0IGEgY2hhcikKLSAqIGFuZCBmcCAocHV0IGJhY2sgYSBjaGFyKSBmb3IgYmFja3NsYXNoIGVzY2FwZXMsCi0gKiBhc3N1bWluZyB0aGUgZmlyc3QgY2FsbCB0byAqZmcgZ2V0cyB0aGUgY2hhciBkaS0KLSAqIHJlY3RseSBhZnRlciB0aGUgYmFja3NsYXNoOyByZXR1cm4gdGhlIGNoYXJhY3RlcgotICogKDAuLjB4RkYpLCBVbmljb2RlICh3YyArIDB4MTAwKSwgb3IgLTEgaWYgbm8ga25vd24KLSAqIGVzY2FwZSBzZXF1ZW5jZSB3YXMgZm91bmQKLSAqLwotaW50Ci11bmJrc2woYm9vbCBjc3R5bGUsIGludCAoKmZnKSh2b2lkKSwgdm9pZCAoKmZwKShpbnQpKQotewotCWludCB3YywgaSwgYywgZmM7Ci0KLQlmYyA9ICgqZmcpKCk7Ci0Jc3dpdGNoIChmYykgewotCWNhc2UgJ2EnOgotCQkvKgotCQkgKiBhY2NvcmRpbmcgdG8gdGhlIGNvbW1lbnRzIGluIHBka3NoLCBcMDA3IHNlZW1zCi0JCSAqIHRvIGJlIG1vcmUgcG9ydGFibGUgdGhhbiBcYSAoZHVlIHRvIEhQLVVYIGNjLAotCQkgKiBVbHRyaXggY2MsIG9sZCBwY2MsIGV0Yy4pIHNvIHdlIGF2b2lkIHRoZSBlc2NhcGUKLQkJICogc2VxdWVuY2UgYWx0b2dldGhlciBpbiBta3NoIGFuZCBhc3N1bWUgQVNDSUkKLQkJICovCi0JCXdjID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSAnYic6Ci0JCXdjID0gJ1xiJzsKLQkJYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JCWlmICghY3N0eWxlKQotCQkJZ290byB1bmtub3duX2VzY2FwZTsKLQkJYyA9ICgqZmcpKCk7Ci0JCXdjID0gQ1RSTChjKTsKLQkJYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JY2FzZSAnZSc6Ci0JCXdjID0gMDMzOwotCQlicmVhazsKLQljYXNlICdmJzoKLQkJd2MgPSAnXGYnOwotCQlicmVhazsKLQljYXNlICduJzoKLQkJd2MgPSAnXG4nOwotCQlicmVhazsKLQljYXNlICdyJzoKLQkJd2MgPSAnXHInOwotCQlicmVhazsKLQljYXNlICd0JzoKLQkJd2MgPSAnXHQnOwotCQlicmVhazsKLQljYXNlICd2JzoKLQkJLyogYXNzdW1lIEFTQ0lJIGhlcmUgYXMgd2VsbCAqLwotCQl3YyA9IDExOwotCQlicmVhazsKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQkJaWYgKCFjc3R5bGUpCi0JCQlnb3RvIHVua25vd25fZXNjYXBlOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgJzAnOgotCQlpZiAoY3N0eWxlKQotCQkJKCpmcCkoZmMpOwotCQkvKgotCQkgKiBsb29rIGZvciBhbiBvY3RhbCBudW1iZXIgd2l0aCB1cCB0byB0aHJlZQotCQkgKiBkaWdpdHMsIG5vdCBjb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvOwotCQkgKiBjb252ZXJ0IGl0IHRvIGEgcmF3IG9jdGV0Ci0JCSAqLwotCQl3YyA9IDA7Ci0JCWkgPSAzOwotCQl3aGlsZSAoaS0tKQotCQkJaWYgKChjID0gKCpmZykoKSkgPj0gJzAnICYmIGMgPD0gJzcnKQotCQkJCXdjID0gKHdjIDw8IDMpICsgKGMgLSAnMCcpOwotCQkJZWxzZSB7Ci0JCQkJKCpmcCkoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWJyZWFrOwotCWNhc2UgJ1UnOgotCQlpID0gODsKLQkJaWYgKDApCi0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSAndSc6Ci0JCWkgPSA0OwotCQlpZiAoMCkKLQkJLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlICd4JzoKLQkJaSA9IGNzdHlsZSA/IC0xIDogMjsKLQkJLyoKLQkJICogeDoJbG9vayBmb3IgYSBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCB1cCB0bwotCQkgKgl0d28gKEMgc3R5bGU6IGFyYml0cmFyeSkgZGlnaXRzOyBjb252ZXJ0Ci0JCSAqCXRvIHJhdyBvY3RldCAoQyBzdHlsZTogVW5pY29kZSBpZiA+MHhGRikKLQkJICogdS9VOglsb29rIGZvciBhIGhleGFkZWNpbWFsIG51bWJlciB3aXRoIHVwIHRvCi0JCSAqCWZvdXIgKFU6IGVpZ2h0KSBkaWdpdHM7IGNvbnZlcnQgdG8gVW5pY29kZQotCQkgKi8KLQkJd2MgPSAwOwotCQl3aGlsZSAoaS0tKSB7Ci0JCQl3YyA8PD0gNDsKLQkJCWlmICgoYyA9ICgqZmcpKCkpID49ICcwJyAmJiBjIDw9ICc5JykKLQkJCQl3YyArPSBjIC0gJzAnOwotCQkJZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCi0JCQkJd2MgKz0gYyAtICdBJyArIDEwOwotCQkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0JCQkJd2MgKz0gYyAtICdhJyArIDEwOwotCQkJZWxzZSB7Ci0JCQkJd2MgPj49IDQ7Ci0JCQkJKCpmcCkoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKChjc3R5bGUgJiYgd2MgPiAweEZGKSB8fCBmYyAhPSAneCcpCi0JCQkvKiBVbmljb2RlIG1hcmtlciAqLwotCQkJd2MgKz0gMHgxMDA7Ci0JCWJyZWFrOwotCWNhc2UgJ1wnJzoKLQkJaWYgKCFjc3R5bGUpCi0JCQlnb3RvIHVua25vd25fZXNjYXBlOwotCQl3YyA9ICdcJyc7Ci0JCWJyZWFrOwotCWNhc2UgJ1xcJzoKLQkJd2MgPSAnXFwnOwotCQlicmVhazsKLQlkZWZhdWx0OgotIHVua25vd25fZXNjYXBlOgotCQkoKmZwKShmYyk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCXJldHVybiAod2MpOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2guaCBiL21rc2gvc3JjL3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTg4YzkuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NTIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHNoLmgsdiAxLjMwIDIwMTAvMDEvMDQgMTg6MDc6MTEgZGVyYWFkdCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHNoZi5oLHYgMS42IDIwMDUvMTIvMTEgMTg6NTM6NTEgZGVyYWFkdCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHRhYmxlLmgsdiAxLjcgMjAwNS8xMi8xMSAyMDozMToyMSBvdHRvIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogdHJlZS5oLHYgMS4xMCAyMDA1LzAzLzI4IDIxOjI4OjIyIGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBleHBhbmQuaCx2IDEuNiAyMDA1LzAzLzMwIDE3OjE2OjM3IGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBsZXguaCx2IDEuMTEgMjAwNi8wNS8yOSAxODoyMjoyNCBvdHRvIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogcHJvdG8uaCx2IDEuMzMgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBjX3Rlc3QuaCx2IDEuNCAyMDA0LzEyLzIwIDExOjM0OjI2IG90dG8gRXhwICQJKi8KLS8qCSRPcGVuQlNEOiB0dHkuaCx2IDEuNSAyMDA0LzEyLzIwIDExOjM0OjI2IG90dG8gRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpZmRlZiBfX2RpZXRsaWJjX18KLS8qIFhYWCBpbWFrZSBzdHlsZSAqLwotI2RlZmluZSBfQlNEX1NPVVJDRQkvKiBsaXZlLCBCU0QsIGxpdmUhICovCi0jZW5kaWYKLQotI2lmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaWYgSEFWRV9TWVNfU1lTTUFDUk9TX0gKLSNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1NZU19NS0RFVl9ICi0jaW5jbHVkZSA8c3lzL21rZGV2Lmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1NZU19NTUFOX0gKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBIQVZFX0xJQkdFTl9ICi0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX0xJQlVUSUxfSAotI2luY2x1ZGUgPGxpYnV0aWwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2lmIEhBVkVfUEFUSFNfSAotI2luY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpZiBIQVZFX1NUREJPT0xfSAotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2lmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmIEhBVkVfVUxJTUlUX0gKLSNpbmNsdWRlIDx1bGltaXQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmIEhBVkVfVkFMVUVTX0gKLSNpbmNsdWRlIDx2YWx1ZXMuaD4KLSNlbmRpZgotCi0jdW5kZWYgX19hdHRyaWJ1dGVfXwotI2lmIEhBVkVfQVRUUklCVVRFX0JPVU5ERUQKLSNkZWZpbmUgTUtTSF9BX0JPVU5ERUQoeCx5LHopCV9fYXR0cmlidXRlX18oKGJvdW5kZWQgKHgsIHksIHopKSkKLSNlbHNlCi0jZGVmaW5lIE1LU0hfQV9CT1VOREVEKHgseSx6KQkvKiBub3RoaW5nICovCi0jZW5kaWYKLSNpZiBIQVZFX0FUVFJJQlVURV9GT1JNQVQKLSNkZWZpbmUgTUtTSF9BX0ZPUk1BVCh4LHkseikJX19hdHRyaWJ1dGVfXygoZm9ybWF0ICh4LCB5LCB6KSkpCi0jZWxzZQotI2RlZmluZSBNS1NIX0FfRk9STUFUKHgseSx6KQkvKiBub3RoaW5nICovCi0jZW5kaWYKLSNpZiBIQVZFX0FUVFJJQlVURV9OT05OVUxMCi0jZGVmaW5lIE1LU0hfQV9OT05OVUxMKGEpCV9fYXR0cmlidXRlX18oYSkKLSNlbHNlCi0jZGVmaW5lIE1LU0hfQV9OT05OVUxMKGEpCS8qIG5vdGhpbmcgKi8KLSNlbmRpZgotI2lmIEhBVkVfQVRUUklCVVRFX05PUkVUVVJOCi0jZGVmaW5lIE1LU0hfQV9OT1JFVFVSTgkJX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQotI2Vsc2UKLSNkZWZpbmUgTUtTSF9BX05PUkVUVVJOCQkvKiBub3RoaW5nICovCi0jZW5kaWYKLSNpZiBIQVZFX0FUVFJJQlVURV9VTlVTRUQKLSNkZWZpbmUgTUtTSF9BX1VOVVNFRAkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkKLSNlbHNlCi0jZGVmaW5lIE1LU0hfQV9VTlVTRUQJCS8qIG5vdGhpbmcgKi8KLSNlbmRpZgotI2lmIEhBVkVfQVRUUklCVVRFX1VTRUQKLSNkZWZpbmUgTUtTSF9BX1VTRUQJCV9fYXR0cmlidXRlX18oKHVzZWQpKQotI2Vsc2UKLSNkZWZpbmUgTUtTSF9BX1VTRUQJCS8qIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNaXJCU0QpICYmIChNaXJCU0QgPj0gMHgwOUExKSAmJiBcCi0gICAgZGVmaW5lZChfX0VMRl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCi0gICAgIWRlZmluZWQoX19sbHZtX18pICYmICFkZWZpbmVkKF9fTldDQ19fKQotLyoKLSAqIFdlIGdvdCB1c2FibGUgX19JRFNUUklORyBfX0NPUFlSSUdIVCBfX1JDU0lEIF9fU0NDU0lEIG1hY3JvcwotICogd2hpY2ggd29yayBmb3IgYWxsIGNhc2VzOyBubyBuZWVkIHRvIHJlZGVmaW5lIHRoZW0gdXNpbmcgdGhlCi0gKiAicG9ydGFibGUiIG1hY3JvcyBmcm9tIGJlbG93IHdoZW4gd2UgbWlnaHQgaGF2ZSB0aGUgImJldHRlciIKLSAqIGdjYytFTEYgc3BlY2lmaWMgbWFjcm9zIG9yIG90aGVyIHN5c3RlbSBkZXBlbmRlbnQgb25lcy4KLSAqLwotI2Vsc2UKLSN1bmRlZiBfX0lEU1RSSU5HCi0jdW5kZWYgX19JRFNUUklOR19DT05DQVQKLSN1bmRlZiBfX0lEU1RSSU5HX0VYUEFORAotI3VuZGVmIF9fQ09QWVJJR0hUCi0jdW5kZWYgX19SQ1NJRAotI3VuZGVmIF9fU0NDU0lECi0jZGVmaW5lIF9fSURTVFJJTkdfQ09OQ0FUKGwscCkJCV9fTElOVEVEX18gIyMgbCAjIyBfICMjIHAKLSNkZWZpbmUgX19JRFNUUklOR19FWFBBTkQobCxwKQkJX19JRFNUUklOR19DT05DQVQobCxwKQotI2RlZmluZSBfX0lEU1RSSU5HKHByZWZpeCwgc3RyaW5nKQkJCQlcCi0Jc3RhdGljIGNvbnN0IGNoYXIgX19JRFNUUklOR19FWFBBTkQoX19MSU5FX18scHJlZml4KSBbXQlcCi0JICAgIE1LU0hfQV9VU0VEID0gIkAoIiIjKSIgI3ByZWZpeCAiOiAiIHN0cmluZwotI2RlZmluZSBfX0NPUFlSSUdIVCh4KQkJX19JRFNUUklORyhjb3B5cmlnaHQseCkKLSNkZWZpbmUgX19SQ1NJRCh4KQkJX19JRFNUUklORyhyY3NpZCx4KQotI2RlZmluZSBfX1NDQ1NJRCh4KQkJX19JRFNUUklORyhzY2NzaWQseCkKLSNlbmRpZgotCi0jaWZkZWYgRVhURVJOCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zaC5oLHYgMS40MDUgMjAxMC8wOC8yNCAxNToxOTo1NCB0ZyBFeHAgJCIpOwotI2VuZGlmCi0jZGVmaW5lIE1LU0hfVkVSU0lPTiAiUjM5IDIwMTAvMDgvMjQiCi0KLSNpZm5kZWYgTUtTSF9JTkNMVURFU19PTkxZCi0KLS8qIGV4dHJhIHR5cGVzICovCi0KLSNpZiAhSEFWRV9HRVRSVVNBR0UKLSN1bmRlZiBydXNhZ2UKLSN1bmRlZiBSVVNBR0VfU0VMRgotI3VuZGVmIFJVU0FHRV9DSElMRFJFTgotI2RlZmluZSBydXNhZ2UgbWtzaF9ydXNhZ2UKLSNkZWZpbmUgUlVTQUdFX1NFTEYJMAotI2RlZmluZSBSVVNBR0VfQ0hJTERSRU4JLTEKLQotc3RydWN0IHJ1c2FnZSB7Ci0Jc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7Ci0Jc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7Ci19OwotI2VuZGlmCi0KLSNpZiAhSEFWRV9STElNX1QKLXR5cGVkZWYgbG9uZyBybGltX3Q7Ci0jZW5kaWYKLQotI2lmICFIQVZFX1NJR19UCi0jdW5kZWYgc2lnX3QKLXR5cGVkZWYgdm9pZCAoKnNpZ190KShpbnQpOwotI2VuZGlmCi0KLSNpZiAhSEFWRV9TVERCT09MX0gKLS8qIGtsdWRnZSwgYnV0IGVub3VnaCBmb3IgbWtzaCAqLwotdHlwZWRlZiBpbnQgYm9vbDsKLSNkZWZpbmUgZmFsc2UgMAotI2RlZmluZSB0cnVlIDEKLSNlbmRpZgotCi0jaWYgIUhBVkVfQ0FOX0lOVFRZUEVTCi0jaWYgIUhBVkVfQ0FOX1VDQklOVFMKLXR5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Ci0jZWxzZQotdHlwZWRlZiB1X2ludDMyX3QgdWludDMyX3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgIUhBVkVfQ0FOX0lOVDhUWVBFCi0jaWYgIUhBVkVfQ0FOX1VDQklOVDgKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwotI2Vsc2UKLXR5cGVkZWYgdV9pbnQ4X3QgdWludDhfdDsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGV4dHJhIG1hY3JvcyAqLwotCi0jaWZuZGVmIHRpbWVyY2xlYXIKLSNkZWZpbmUgdGltZXJjbGVhcih0dnApCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCSh0dnApLT50dl9zZWMgPSAodHZwKS0+dHZfdXNlYyA9IDA7CQkJXAotCX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2VuZGlmCi0jaWZuZGVmIHRpbWVyYWRkCi0jZGVmaW5lIHRpbWVyYWRkKHR2cCwgdXZwLCB2dnApCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJKHZ2cCktPnR2X3NlYyA9ICh0dnApLT50dl9zZWMgKyAodXZwKS0+dHZfc2VjOwkJXAotCQkodnZwKS0+dHZfdXNlYyA9ICh0dnApLT50dl91c2VjICsgKHV2cCktPnR2X3VzZWM7CVwKLQkJaWYgKCh2dnApLT50dl91c2VjID49IDEwMDAwMDApIHsJCQlcCi0JCQkodnZwKS0+dHZfc2VjKys7CQkJCVwKLQkJCSh2dnApLT50dl91c2VjIC09IDEwMDAwMDA7CQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLSNlbmRpZgotI2lmbmRlZiB0aW1lcnN1YgotI2RlZmluZSB0aW1lcnN1Yih0dnAsIHV2cCwgdnZwKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCSh2dnApLT50dl9zZWMgPSAodHZwKS0+dHZfc2VjIC0gKHV2cCktPnR2X3NlYzsJCVwKLQkJKHZ2cCktPnR2X3VzZWMgPSAodHZwKS0+dHZfdXNlYyAtICh1dnApLT50dl91c2VjOwlcCi0JCWlmICgodnZwKS0+dHZfdXNlYyA8IDApIHsJCQkJXAotCQkJKHZ2cCktPnR2X3NlYy0tOwkJCQlcCi0JCQkodnZwKS0+dHZfdXNlYyArPSAxMDAwMDAwOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZW5kaWYKLQotI2RlZmluZSBrc2hfaXNkaWdpdChjKQkoKChjKSA+PSAnMCcpICYmICgoYykgPD0gJzknKSkKLSNkZWZpbmUga3NoX2lzbG93ZXIoYykJKCgoYykgPj0gJ2EnKSAmJiAoKGMpIDw9ICd6JykpCi0jZGVmaW5lIGtzaF9pc3VwcGVyKGMpCSgoKGMpID49ICdBJykgJiYgKChjKSA8PSAnWicpKQotI2RlZmluZSBrc2hfdG9sb3dlcihjKQkoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSA/IChjKSAtICdBJyArICdhJyA6IChjKSkKLSNkZWZpbmUga3NoX3RvdXBwZXIoYykJKCgoYykgPj0gJ2EnKSAmJiAoKGMpIDw9ICd6JykgPyAoYykgLSAnYScgKyAnQScgOiAoYykpCi0jZGVmaW5lIGtzaF9pc2Rhc2gocykJKCgocykgIT0gTlVMTCkgJiYgKChzKVswXSA9PSAnLScpICYmICgocylbMV0gPT0gJ1wwJykpCi0jZGVmaW5lIGtzaF9pc3NwYWNlKGMpCSgoKChjKSA+PSAweDA5KSAmJiAoKGMpIDw9IDB4MEQpKSB8fCAoKGMpID09IDB4MjApKQotCi0jaWZkZWYgTk9fUEFUSF9NQVgKLSN1bmRlZiBQQVRIX01BWAotI2Vsc2UKLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVgJMTAyNAotI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgU0laRV9NQVgKLSNpZmRlZiBTSVpFX1RfTUFYCi0jZGVmaW5lIFNJWkVfTUFYCVNJWkVfVF9NQVgKLSNlbHNlCi0jZGVmaW5lIFNJWkVfTUFYCSgoc2l6ZV90KS0xKQotI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgU19JU0xOSwotI2RlZmluZSBTX0lTTE5LKG0pCSgobSAmIDAxNzAwMDApID09IDAxMjAwMDApCi0jZW5kaWYKLSNpZm5kZWYgU19JU1NPQ0sKLSNkZWZpbmUgU19JU1NPQ0sobSkJKChtICYgMDE3MDAwMCkgPT0gMDE0MDAwMCkKLSNlbmRpZgotI2lmbmRlZiBERUZGSUxFTU9ERQotI2RlZmluZSBERUZGSUxFTU9ERQkoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lST1RIfFNfSVdPVEgpCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE1BUF9GQUlMRUQpCi0vKiBYWFggaW1ha2Ugc3R5bGUgKi8KLSMgIGlmIGRlZmluZWQoX19saW51eCkKLSNkZWZpbmUgTUFQX0ZBSUxFRAkoKHZvaWQgKiktMSkKLSMgIGVsaWYgZGVmaW5lZChfX2JzZGlfXykgfHwgZGVmaW5lZChfX29zZl9fKSB8fCBkZWZpbmVkKF9fdWx0cml4KQotI2RlZmluZSBNQVBfRkFJTEVECSgoY2FkZHJfdCktMSkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOU0lHCi0jaWYgZGVmaW5lZChfTlNJRykKLSNkZWZpbmUgTlNJRwkJX05TSUcKLSNlbGlmIGRlZmluZWQoU0lHTUFYKQotI2RlZmluZSBOU0lHCQkoU0lHTUFYKzEpCi0jZW5kaWYKLSNlbmRpZgotCi0jdW5kZWYgQkFECQkvKiBBSVggZGVmaW5lcyB0aGF0IHNvbWV3aGVyZSAqLwotCi0vKiBPUy1kZXBlbmRlbnQgYWRkaXRpb25zIChmdW5jdGlvbnMsIHZhcmlhYmxlcywgYnkgT1MpICovCi0KLSNpZiAhSEFWRV9GTE9DS19ERUNMCi1leHRlcm4gaW50IGZsb2NrKGludCwgaW50KTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfR0VUUlVTQUdFCi1leHRlcm4gaW50IGdldHJ1c2FnZShpbnQsIHN0cnVjdCBydXNhZ2UgKik7Ci0jZW5kaWYKLQotI2lmICFIQVZFX1JFVk9LRV9ERUNMCi1leHRlcm4gaW50IHJldm9rZShjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSNpZiAhSEFWRV9TRVRNT0RFCi1tb2RlX3QgZ2V0bW9kZShjb25zdCB2b2lkICosIG1vZGVfdCk7Ci12b2lkICpzZXRtb2RlKGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmZGVmIF9fdWx0cml4Ci0vKiBYWFggaW1ha2Ugc3R5bGUgKi8KLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfU1RSQ0FTRVNUUgotY29uc3QgY2hhciAqc3RyaXN0cihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmICFIQVZFX1NUUkxDUFkKLXNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCi0KLSNpZiAhSEFWRV9TWVNfU0lHTElTVF9ERUNMCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2xpc3RbXTsKLSNlbmRpZgotCi0jaWZkZWYgX19JTlRFUklYCi0vKiBYWFggaW1ha2Ugc3R5bGUgKi8KLSNkZWZpbmUgbWFrZWRldiBta2RldgotZXh0ZXJuIGludCBfX2NkZWNsIHNldGV1aWQodWlkX3QpOwotZXh0ZXJuIGludCBfX2NkZWNsIHNldGVnaWQoZ2lkX3QpOwotI2VuZGlmCi0KLS8qIHJlbW92ZSByZWR1bmRhbmNlcyAqLwotCi0jaWYgZGVmaW5lZChNaXJCU0QpICYmIChNaXJCU0QgPj0gMHgwOEE4KQotI2RlZmluZSBNS1NIX21pcmJzZF93Y3dpZHRoCi0jZGVmaW5lIHV0Zl93Y3dpZHRoKGkpIHdjd2lkdGgoKF9fV0NIQVJfVFlQRV9fKWkpCi1leHRlcm4gaW50IHdjd2lkdGgoX19XQ0hBUl9UWVBFX18pOwotI2VuZGlmCi0KLQotLyogc29tZSB1c2VmdWwgI2RlZmluZXMgKi8KLSNpZmRlZiBFWFRFUk4KLSMgZGVmaW5lIElfXyhpKSA9IGkKLSNlbHNlCi0jIGRlZmluZSBJX18oaSkKLSMgZGVmaW5lIEVYVEVSTiBleHRlcm4KLSMgZGVmaW5lIEVYVEVSTl9ERUZJTkVECi0jZW5kaWYKLQotI2RlZmluZSBORUxFTShhKQkoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0jZGVmaW5lIEJJVChpKQkJKDEgPDwgKGkpKQkvKiBkZWZpbmUgYml0IGluIGZsYWcgKi8KLQotLyogVGFibGUgZmxhZyB0eXBlIC0gbmVlZHMgPiAxNiBhbmQgPCAzMiBiaXRzICovCi10eXBlZGVmIGludDMyX3QgVGZsYWc7Ci0KLS8qIGFyaXRobWV0aWNzIHR5cGVzICovCi10eXBlZGVmIGludDMyX3QgbWtzaF9hcmlfdDsKLXR5cGVkZWYgdWludDMyX3QgbWtzaF91YXJpX3Q7Ci0KLS8qIHRoZXNlIHNoYWxsIGJlIHNtYWxsZXIgdGhhbiAxMDAgKi8KLSNpZmRlZiBNS1NIX0NPTlNFUlZBVElWRV9GRFMKLSNkZWZpbmUgTlVGSUxFCQkzMgkvKiBOdW1iZXIgb2YgdXNlci1hY2Nlc3NpYmxlIGZpbGVzICovCi0jZGVmaW5lIEZEQkFTRQkJMTAJLyogRmlyc3QgZmlsZSB1c2FibGUgYnkgU2hlbGwgKi8KLSNlbHNlCi0jZGVmaW5lIE5VRklMRQkJNTYJLyogTnVtYmVyIG9mIHVzZXItYWNjZXNzaWJsZSBmaWxlcyAqLwotI2RlZmluZSBGREJBU0UJCTI0CS8qIEZpcnN0IGZpbGUgdXNhYmxlIGJ5IFNoZWxsICovCi0jZW5kaWYKLQotLyogTWFrZSBNQUdJQyBhIGNoYXIgdGhhdCBtaWdodCBiZSBwcmludGVkIHRvIG1ha2UgYnVncyBtb3JlIG9idmlvdXMsIGJ1dAotICogbm90IGEgY2hhciB0aGF0IGlzIHVzZWQgb2Z0ZW4uIEFsc28sIGNhbid0IHVzZSB0aGUgaGlnaCBiaXQgYXMgaXQgY2F1c2VzCi0gKiBwb3J0YWJpbGl0eSBwcm9ibGVtcyAoY2FsbGluZyBzdHJjaHIoeCwgMHg4MHwneCcpIGlzIGVycm9yIHByb25lKS4KLSAqLwotI2RlZmluZSBNQUdJQwkJKDcpCS8qIHByZWZpeCBmb3IgKj9bIXssfSBkdXJpbmcgZXhwYW5kICovCi0jZGVmaW5lIElTTUFHSUMoYykJKCh1bnNpZ25lZCBjaGFyKShjKSA9PSBNQUdJQykKLSNkZWZpbmUgTk9UCQknIScJLyogbWlnaHQgdXNlIF4gKGllLCBbIS4uLl0gdnMgW14uLl0pICovCi0KLSNkZWZpbmUgTElORQkJNDA5NgkvKiBpbnB1dCBsaW5lIHNpemUgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIgKnNhZmVfcHJvbXB0OyAvKiBzYWZlIHByb21wdCBpZiBQUzEgc3Vic3RpdHV0aW9uIGZhaWxzICovCi1FWFRFUk4gY29uc3QgY2hhciBpbml0dnNuW10gSV9fKCJLU0hfVkVSU0lPTj1AKCMpTUlSQlNEIEtTSCAiIE1LU0hfVkVSU0lPTik7Ci0jZGVmaW5lIEtTSF9WRVJTSU9OCShpbml0dnNuICsgLyogIktTSF9WRVJTSU9OPUAoIykiICovIDE2KQotCi1FWFRFUk4gY29uc3QgY2hhciBkaWdpdHNfdWNbXSBJX18oIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpOwotRVhURVJOIGNvbnN0IGNoYXIgZGlnaXRzX2xjW10gSV9fKCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKLQotLyoKLSAqIEV2aWwgaGFjayBmb3IgY29uc3QgY29ycmVjdG5lc3MgZHVlIHRvIEFQSSBicm9rZW5uZXNzCi0gKi8KLXVuaW9uIG1rc2hfY2NoYWNrIHsKLQljaGFyICpydzsKLQljb25zdCBjaGFyICpybzsKLX07Ci11bmlvbiBta3NoX2NjcGhhY2sgewotCWNoYXIgKipydzsKLQljb25zdCBjaGFyICoqcm87Ci19OwotCi0vKiBmb3IgY29uc3QgZGVidWdnaW5nICovCi0jaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JQ0MpICYmIFwKLSAgICAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX1NVTlBST19DKQotY2hhciAqdWNzdHJjaHIoY2hhciAqLCBpbnQpOwotY2hhciAqdWNzdHJzdHIoY2hhciAqLCBjb25zdCBjaGFyICopOwotI3VuZGVmIHN0cmNocgotI2RlZmluZSBzdHJjaHIgdWNzdHJjaHIKLSNkZWZpbmUgc3Ryc3RyIHVjc3Ryc3RyCi0jZGVmaW5lIGNzdHJjaHIocyxjKSAoewkJCVwKLQl1bmlvbiBta3NoX2NjaGFjayBpbiwgb3V0OwlcCi0JCQkJCVwKLQlpbi5ybyA9IChzKTsJCQlcCi0Jb3V0LnJ3ID0gdWNzdHJjaHIoaW4ucncsIChjKSk7CVwKLQkob3V0LnJvKTsJCQlcCi19KQotI2RlZmluZSBjc3Ryc3RyKGIsbCkgKHsJCQlcCi0JdW5pb24gbWtzaF9jY2hhY2sgaW4sIG91dDsJXAotCQkJCQlcCi0JaW4ucm8gPSAoYik7CQkJXAotCW91dC5ydyA9IHVjc3Ryc3RyKGluLnJ3LCAobCkpOwlcCi0JKG91dC5ybyk7CQkJXAotfSkKLSNkZWZpbmUgdnN0cmNocihzLGMpCShjc3RyY2hyKChzKSwgKGMpKSAhPSBOVUxMKQotI2RlZmluZSB2c3Ryc3RyKGIsbCkJKGNzdHJzdHIoKGIpLCAobCkpICE9IE5VTEwpCi0jZGVmaW5lIG1rc3NlcnQoZSkJKChlKSA/ICh2b2lkKTAgOiBleGl0KDI1NSkpCi0jZWxzZSAvKiAhREVCVUcsICFnY2MgKi8KLSNkZWZpbmUgY3N0cmNocihzLGMpCSgoY29uc3QgY2hhciAqKXN0cmNocigocyksIChjKSkpCi0jZGVmaW5lIGNzdHJzdHIocyxjKQkoKGNvbnN0IGNoYXIgKilzdHJzdHIoKHMpLCAoYykpKQotI2RlZmluZSB2c3RyY2hyKHMsYykJKHN0cmNocigocyksIChjKSkgIT0gTlVMTCkKLSNkZWZpbmUgdnN0cnN0cihiLGwpCShzdHJzdHIoKGIpLCAobCkpICE9IE5VTEwpCi0jZGVmaW5lIG1rc3NlcnQoZSkJKCh2b2lkKTApCi0jZW5kaWYKLQotLyogdXNlIHRoaXMgaXB2IHN0cmNocihzLCAwKSBidXQgbm8gc2lkZSBlZmZlY3RzIGluIHMhICovCi0jZGVmaW5lIHN0cm51bChzKQkoKHMpICsgc3RybGVuKHMpKQotCi0jZGVmaW5lIHV0Zl9wdHJhZGp4KHNyYywgZHN0KSBkbyB7CQkJCQlcCi0JKGRzdCkgPSAoc3JjKSArIHV0Zl9wdHJhZGooc3JjKTsJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0KLSNpZmRlZiBNS1NIX1NNQUxMCi0jZGVmaW5lIHN0cmR1cHgoZCwgcywgYXApIGRvIHsgXAotCShkKSA9IHN0cmR1cF8oKHMpLCAoYXApKTsgXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZGVmaW5lIHN0cm5kdXB4KGQsIHMsIG4sIGFwKSBkbyB7IFwKLQkoZCkgPSBzdHJuZHVwXygocyksIChuKSwgKGFwKSk7IFwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2Vsc2UKLS8qIGJlIGNhcmVmdWwgdG8gZXZhbHVhdGUgYXJndW1lbnRzIG9ubHkgb25jZSEgKi8KLSNkZWZpbmUgc3RyZHVweChkLCBzLCBhcCkgZG8gewkJCQkJCVwKLQljb25zdCBjaGFyICpzdHJkdXBfc3JjID0gKHMpOwkJCQkJXAotCWNoYXIgKnN0cmR1cF9kc3QgPSBOVUxMOwkJCQkJXAotCQkJCQkJCQkJXAotCWlmIChzdHJkdXBfc3JjICE9IE5VTEwpIHsJCQkJCVwKLQkJc2l6ZV90IHN0cmR1cF9sZW4gPSBzdHJsZW4oc3RyZHVwX3NyYykgKyAxOwkJXAotCQlzdHJkdXBfZHN0ID0gYWxsb2Moc3RyZHVwX2xlbiwgKGFwKSk7CQkJXAotCQltZW1jcHkoc3RyZHVwX2RzdCwgc3RyZHVwX3NyYywgc3RyZHVwX2xlbik7CQlcCi0JfQkJCQkJCQkJXAotCShkKSA9IHN0cmR1cF9kc3Q7CQkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZGVmaW5lIHN0cm5kdXB4KGQsIHMsIG4sIGFwKSBkbyB7CQkJCQlcCi0JY29uc3QgY2hhciAqc3RyZHVwX3NyYyA9IChzKTsJCQkJCVwKLQljaGFyICpzdHJkdXBfZHN0ID0gTlVMTDsJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoc3RyZHVwX3NyYyAhPSBOVUxMKSB7CQkJCQlcCi0JCXNpemVfdCBzdHJuZHVwX2xlbiA9IChuKTsJCQkJXAotCQlzdHJkdXBfZHN0ID0gYWxsb2Moc3RybmR1cF9sZW4gKyAxLCAoYXApKTsJCVwKLQkJbWVtY3B5KHN0cmR1cF9kc3QsIHN0cmR1cF9zcmMsIHN0cm5kdXBfbGVuKTsJCVwKLQkJc3RyZHVwX2RzdFtzdHJuZHVwX2xlbl0gPSAnXDAnOwkJCQlcCi0JfQkJCQkJCQkJXAotCShkKSA9IHN0cmR1cF9kc3Q7CQkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZW5kaWYKLQotI2lmIEhBVkVfU1RSQ0FTRVNUUgotI2RlZmluZSBzdHJpc3RyKGIsbCkJKChjb25zdCBjaGFyICopc3RyY2FzZXN0cigoYiksIChsKSkpCi0jZW5kaWYKLQotI2lmZGVmIE1LU0hfU01BTEwKLSNpZm5kZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTCi0jZGVmaW5lIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUwkvKiBkZWZpbmVkICovCi0jZW5kaWYKLSNpZm5kZWYgTUtTSF9OT1BXTkFNCi0jZGVmaW5lIE1LU0hfTk9QV05BTQkJLyogZGVmaW5lZCAqLwotI2VuZGlmCi0jaWZuZGVmIE1LU0hfU19OT1ZJCi0jZGVmaW5lIE1LU0hfU19OT1ZJCQkxCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE1LU0hfU19OT1ZJCi0jZGVmaW5lIE1LU0hfU19OT1ZJCQkwCi0jZW5kaWYKLQotLyoKLSAqIHNpbXBsZSBncm91cGluZyBhbGxvY2F0b3IKLSAqLwotCi0vKiAxLiBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBsYWxsb2MgewotCXN0cnVjdCBsYWxsb2MgKm5leHQ7Ci19OwotCi0vKiAyLiBzaXplcyAqLwotI2RlZmluZSBBTExPQ19JVEVNCXN0cnVjdCBsYWxsb2MKLSNkZWZpbmUgQUxMT0NfU0laRQkoc2l6ZW9mKEFMTE9DX0lURU0pKQotCi0vKiAzLiBncm91cCBzdHJ1Y3R1cmUgKG9ubHkgdGhlIHNhbWUgZm9yIGxhbGxvYy5jKSAqLwotdHlwZWRlZiBzdHJ1Y3QgbGFsbG9jIEFyZWE7Ci0KLQotRVhURVJOIEFyZWEgYXBlcm07CQkvKiBwZXJtYW5lbnQgb2JqZWN0IHNwYWNlICovCi0jZGVmaW5lIEFQRVJNCSZhcGVybQotI2RlZmluZSBBVEVNUAkmZS0+YXJlYQotCi0vKgotICogZmxhZ3MgKHRoZSBvcmRlciBvZiB0aGVzZSBlbnVtcyBNVVNUIG1hdGNoIHRoZSBvcmRlciBpbiBtaXNjLmMob3B0aW9uc1tdKSkKLSAqLwotZW51bSBzaF9mbGFnIHsKLSNkZWZpbmUgU0hGTEFHU19FTlVNUwotI2luY2x1ZGUgInNoX2ZsYWdzLmgiCi0JRk5GTEFHUwkJLyogKHBsYWNlIGhvbGRlcjogaG93IG1hbnkgZmxhZ3MgYXJlIHRoZXJlKSAqLwotfTsKLQotI2RlZmluZSBGbGFnKGYpCShrc2hzdGF0ZV92LnNoZWxsX2ZsYWdzX1soaW50KShmKV0pCi0jZGVmaW5lIFVURk1PREUJRmxhZyhGVU5JQ09ERSkKLQotLyoKLSAqIHBhcnNpbmcgJiBleGVjdXRpb24gZW52aXJvbm1lbnQKLSAqLwotZXh0ZXJuIHN0cnVjdCBlbnYgewotCUFMTE9DX0lURU0gX19hbGxvY19pOwkvKiBpbnRlcm5hbCwgZG8gbm90IHRvdWNoICovCi0JQXJlYSBhcmVhOwkJLyogdGVtcG9yYXJ5IGFsbG9jYXRpb24gYXJlYSAqLwotCXN0cnVjdCBlbnYgKm9lbnY7CS8qIGxpbmsgdG8gcHJldmlvdXMgZW52aXJvbm1lbnQgKi8KLQlzdHJ1Y3QgYmxvY2sgKmxvYzsJLyogbG9jYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgKi8KLQlzaG9ydCAqc2F2ZWZkOwkJLyogb3JpZ2luYWwgcmVkaXJlY3RlZCBmZHMgKi8KLQlzdHJ1Y3QgdGVtcCAqdGVtcHM7CS8qIHRlbXAgZmlsZXMgKi8KLQlzaWdqbXBfYnVmIGpidWY7CS8qIGxvbmcganVtcCBiYWNrIHRvIGVudiBjcmVhdG9yICovCi0Jc2hvcnQgdHlwZTsJCS8qIGVudmlyb25tZW50IHR5cGUgLSBzZWUgYmVsb3cgKi8KLQlzaG9ydCBmbGFnczsJCS8qIEVGXyogKi8KLX0gKmU7Ci0KLS8qIHN0cnVjdCBlbnYudHlwZSB2YWx1ZXMgKi8KLSNkZWZpbmUgRV9OT05FCTAJLyogZHVtbXkgZW52aXJvbm1lbnQgKi8KLSNkZWZpbmUgRV9QQVJTRQkxCS8qIHBhcnNpbmcgY29tbWFuZCAjICovCi0jZGVmaW5lIEVfRlVOQwkyCS8qIGV4ZWN1dGluZyBmdW5jdGlvbiAjICovCi0jZGVmaW5lIEVfSU5DTAkzCS8qIGluY2x1ZGluZyBhIGZpbGUgdmlhIC4gIyAqLwotI2RlZmluZSBFX0VYRUMJNAkvKiBleGVjdXRpbmcgY29tbWFuZCB0cmVlICovCi0jZGVmaW5lIEVfTE9PUAk1CS8qIGV4ZWN1dGluZyBmb3Ivd2hpbGUgIyAqLwotI2RlZmluZSBFX0VSUkgJNgkvKiBnZW5lcmFsIGVycm9yIGhhbmRsZXIgIyAqLwotLyogIyBpbmRpY2F0ZXMgZW52IGhhcyB2YWxpZCBqYnVmIChzZWUgdW53aW5kKCkpICovCi0KLS8qIHN0cnVjdCBlbnYuZmxhZyB2YWx1ZXMgKi8KLSNkZWZpbmUgRUZfRlVOQ19QQVJTRQlCSVQoMCkJLyogZnVuY3Rpb24gYmVpbmcgcGFyc2VkICovCi0jZGVmaW5lIEVGX0JSS0NPTlRfUEFTUwlCSVQoMSkJLyogc2V0IGlmIEVfTE9PUCBtdXN0IHBhc3MgYnJlYWsvY29udGludWUgb24gKi8KLSNkZWZpbmUgRUZfRkFLRV9TSUdESUUJQklUKDIpCS8qIGhhY2sgdG8gZ2V0IGluZm8gZnJvbSB1bndpbmQgdG8gcXVpdGVudiAqLwotCi0vKiBEbyBicmVha3MvY29udGludWVzIHN0b3AgYXQgZW52IHR5cGUgZT8gKi8KLSNkZWZpbmUgU1RPUF9CUktDT05UKHQpCSgodCkgPT0gRV9OT05FIHx8ICh0KSA9PSBFX1BBUlNFIFwKLQkJCSB8fCAodCkgPT0gRV9GVU5DIHx8ICh0KSA9PSBFX0lOQ0wpCi0vKiBEbyByZXR1cm5zIHN0b3AgYXQgZW52IHR5cGUgZT8gKi8KLSNkZWZpbmUgU1RPUF9SRVRVUk4odCkJKCh0KSA9PSBFX0ZVTkMgfHwgKHQpID09IEVfSU5DTCkKLQotLyogdmFsdWVzIGZvciBzaWdsb25nam1wKGUtPmpidWYsIDApICovCi0jZGVmaW5lIExSRVRVUk4JMQkvKiByZXR1cm4gc3RhdGVtZW50ICovCi0jZGVmaW5lIExFWElUCTIJLyogZXhpdCBzdGF0ZW1lbnQgKi8KLSNkZWZpbmUgTEVSUk9SCTMJLyogZXJyb3JmKCkgY2FsbGVkICovCi0jZGVmaW5lIExMRUFWRQk0CS8qIHVudHJhcHBhYmxlIGV4aXQvZXJyb3IgKi8KLSNkZWZpbmUgTElOVFIJNQkvKiBeQyBub3RpY2VkICovCi0jZGVmaW5lIExCUkVBSwk2CS8qIGJyZWFrIHN0YXRlbWVudCAqLwotI2RlZmluZSBMQ09OVElOCTcJLyogY29udGludWUgc3RhdGVtZW50ICovCi0jZGVmaW5lIExTSEVMTAk4CS8qIHJldHVybiB0byBpbnRlcmFjdGl2ZSBzaGVsbCgpICovCi0jZGVmaW5lIExBRVhQUgk5CS8qIGVycm9yIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAqLwotCi0vKgotICogc29tZSBraW5kIG9mIGdsb2JhbCBzaGVsbCBzdGF0ZSwgZm9yIGNoYW5nZV9yYW5kb20oKSBtb3N0bHkKLSAqLwotCi1FWFRFUk4gc3RydWN0IG1rc2hfa3Noc3RhdGVfdiB7Ci0JLyogZm9yIGNoYW5nZV9yYW5kb20gKi8KLQlzdHJ1Y3QgdGltZXZhbCBjcl90djsJLyogdGltZXN0YW1wICovCi0JY29uc3Qgdm9pZCAqY3JfZHA7CS8qIGFyZ3VtZW50IGFkZHJlc3MgKi8KLQlzaXplX3QgY3JfZHN6OwkJLyogYXJndW1lbnQgbGVuZ3RoICovCi0JdWludDMyX3QgbGNnX3N0YXRlXzsJLyogcHJldmlvdXMgTENHIHN0YXRlICovCi0JLyogZ2xvYmFsIHN0YXRlICovCi0JcGlkX3QgcHJvY3BpZF87CQkvKiBQSUQgb2YgZXhlY3V0aW5nIHByb2Nlc3MgKi8KLQlpbnQgZXhzdGF0XzsJCS8qIGV4aXQgc3RhdHVzICovCi0JaW50IHN1YnN0X2V4c3RhdF87CS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgJCguLikvYC4uYCAqLwotCXN0cnVjdCBlbnYgZW52XzsJLyogdG9wLWxldmVsIHBhcnNpbmcgJiBleGVjdXRpb24gZW52LiAqLwotCXVpbnQ4X3Qgc2hlbGxfZmxhZ3NfW0ZORkxBR1NdOwotfSBrc2hzdGF0ZV92OwotRVhURVJOIHN0cnVjdCBta3NoX2tzaHN0YXRlX2YgewotCWNvbnN0IGNoYXIgKmtzaG5hbWVfOwkvKiAkMCAqLwotCXBpZF90IGtzaHBpZF87CQkvKiAkJCwgc2hlbGwgUElEICovCi0JcGlkX3Qga3NocGdycF87CQkvKiBwcm9jZXNzIGdyb3VwIG9mIHNoZWxsICovCi0JdWlkX3Qga3NoZXVpZF87CQkvKiBlZmZlY3RpdmUgVUlEIG9mIHNoZWxsICovCi0JcGlkX3Qga3NocHBpZF87CQkvKiBQSUQgb2YgcGFyZW50IG9mIHNoZWxsICovCi0JdWludDMyX3QgaDsJCS8qIHNvbWUga2luZCBvZiBoYXNoICovCi19IGtzaHN0YXRlX2Y7Ci0jZGVmaW5lIGtzaG5hbWUJCWtzaHN0YXRlX2Yua3NobmFtZV8KLSNkZWZpbmUga3NocGlkCQlrc2hzdGF0ZV9mLmtzaHBpZF8KLSNkZWZpbmUgcHJvY3BpZAkJa3Noc3RhdGVfdi5wcm9jcGlkXwotI2RlZmluZSBrc2hwZ3JwCQlrc2hzdGF0ZV9mLmtzaHBncnBfCi0jZGVmaW5lIGtzaGV1aWQJCWtzaHN0YXRlX2Yua3NoZXVpZF8KLSNkZWZpbmUga3NocHBpZAkJa3Noc3RhdGVfZi5rc2hwcGlkXwotI2RlZmluZSBleHN0YXQJCWtzaHN0YXRlX3YuZXhzdGF0XwotI2RlZmluZSBzdWJzdF9leHN0YXQJa3Noc3RhdGVfdi5zdWJzdF9leHN0YXRfCi0KLS8qIGV2aWwgaGFjazogcmV0dXJuIGhhc2goa3Noc3RhdGVfZiBjb25jYXQgKGtzaHN0YXRlX2YnLmg6PWhhc2goYXJnKSkpICovCi11aW50MzJfdCBldmlsaGFzaChjb25zdCBjaGFyICopOwotCi0KLS8qIG9wdGlvbiBwcm9jZXNzaW5nICovCi0jZGVmaW5lIE9GX0NNRExJTkUJMHgwMQkvKiBjb21tYW5kIGxpbmUgKi8KLSNkZWZpbmUgT0ZfU0VUCQkweDAyCS8qIHNldCBidWlsdGluICovCi0jZGVmaW5lIE9GX1NQRUNJQUwJMHgwNAkvKiBhIHNwZWNpYWwgdmFyaWFibGUgY2hhbmdpbmcgKi8KLSNkZWZpbmUgT0ZfSU5URVJOQUwJMHgwOAkvKiBzZXQgaW50ZXJuYWxseSBieSBzaGVsbCAqLwotI2RlZmluZSBPRl9GSVJTVFRJTUUJMHgxMAkvKiBhcyBlYXJseSBhcyBwb3NzaWJsZSwgb25jZSAqLwotI2RlZmluZSBPRl9BTlkJCShPRl9DTURMSU5FIHwgT0ZfU0VUIHwgT0ZfU1BFQ0lBTCB8IE9GX0lOVEVSTkFMKQotCi1zdHJ1Y3Qgc2hvcHRpb24gewotCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGxvbmcgbmFtZSBvZiBvcHRpb24gKi8KLQljaGFyIGM7CQkJLyogY2hhcmFjdGVyIGZsYWcgKGlmIGFueSkgKi8KLQl1bnNpZ25lZCBjaGFyIGZsYWdzOwkvKiBPRl8qICovCi19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaG9wdGlvbiBvcHRpb25zW107Ci0KLS8qIG51bGwgdmFsdWUgZm9yIHZhcmlhYmxlOyBjb21wYXJpc2lvbiBwb2ludGVyIGZvciB1bnNldCAqLwotRVhURVJOIGNoYXIgbnVsbFtdIElfXygiIik7Ci0vKiBoZWxwZXJzIGZvciBzdHJpbmcgcG9vbGluZyAqLwotI2RlZmluZSBUX3N5bmVyciAic3ludGF4IGVycm9yIgotRVhURVJOIGNvbnN0IGNoYXIgcl9mY19lX1tdIElfXygicj1mYyAtZSAtIik7Ci0jZGVmaW5lIGZjX2VfCQkocl9mY19lXyArIDIpCQkvKiAiZmMgLWUgLSIgKi8KLSNkZWZpbmUgZmNfZV9uCQk3CQkJLyogc3RybGVuKGZjX2VfKSAqLwotRVhURVJOIGNvbnN0IGNoYXIgVF9sb2NhbF90eXBlc2V0W10gSV9fKCJsb2NhbD10eXBlc2V0Iik7Ci0jZGVmaW5lIFRfX3R5cGVzZXQJKFRfbG9jYWxfdHlwZXNldCArIDUpCS8qICI9dHlwZXNldCIgKi8KLSNkZWZpbmUgVF90eXBlc2V0CShUX2xvY2FsX3R5cGVzZXQgKyA2KQkvKiAidHlwZXNldCIgKi8KLQotZW51bSB0ZW1wX3R5cGUgewotCVRUX0hFUkVET0NfRVhQLAkvKiBleHBhbmRlZCBoZXJlZG9jICovCi0JVFRfSElTVF9FRElUCS8qIHRlbXAgZmlsZSB1c2VkIGZvciBoaXN0b3J5IGVkaXRpbmcgKGZjIC1lKSAqLwotfTsKLXR5cGVkZWYgZW51bSB0ZW1wX3R5cGUgVGVtcF90eXBlOwotLyogdGVtcC9oZXJlZG9jIGZpbGVzLiBUaGUgZmlsZSBpcyByZW1vdmVkIHdoZW4gdGhlIHN0cnVjdCBpcyBmcmVlZC4gKi8KLXN0cnVjdCB0ZW1wIHsKLQlzdHJ1Y3QgdGVtcCAqbmV4dDsKLQlzdHJ1Y3Qgc2hmICpzaGY7Ci0JY2hhciAqbmFtZTsKLQlpbnQgcGlkOwkvKiBwaWQgb2YgcHJvY2VzcyBwYXJzZWQgaGVyZS1kb2MgKi8KLQlUZW1wX3R5cGUgdHlwZTsKLX07Ci0KLS8qCi0gKiBzdGRpbyBhbmQgb3VyIElPIHJvdXRpbmVzCi0gKi8KLQotI2RlZmluZSBzaGxfc3BhcmUJKCZzaGZfaW9iWzBdKQkvKiBmb3IgY19yZWFkKCkvY19wcmludCgpICovCi0jZGVmaW5lIHNobF9zdGRvdXQJKCZzaGZfaW9iWzFdKQotI2RlZmluZSBzaGxfb3V0CQkoJnNoZl9pb2JbMl0pCi1FWFRFUk4gaW50IHNobF9zdGRvdXRfb2s7Ci0KLS8qCi0gKiB0cmFwIGhhbmRsZXJzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHRyYXAgewotCWNvbnN0IGNoYXIgKm5hbWU7CS8qIHNob3J0IG5hbWUgKi8KLQljb25zdCBjaGFyICptZXNzOwkvKiBkZXNjcmlwdGl2ZSBuYW1lICovCi0JY2hhciAqdHJhcDsJCS8qIHRyYXAgY29tbWFuZCAqLwotCXNpZ190IGN1cnNpZzsJCS8qIGN1cnJlbnQgaGFuZGxlciAodmFsaWQgaWYgVEZfT1JJR18qIHNldCkgKi8KLQlzaWdfdCBzaHRyYXA7CQkvKiBzaGVsbCBzaWduYWwgaGFuZGxlciAqLwotCWludCBzaWduYWw7CQkvKiBzaWduYWwgbnVtYmVyICovCi0JaW50IGZsYWdzOwkJLyogVEZfKiAqLwotCXZvbGF0aWxlIHNpZ19hdG9taWNfdCBzZXQ7IC8qIHRyYXAgcGVuZGluZyAqLwotfSBUcmFwOwotCi0vKiB2YWx1ZXMgZm9yIFRyYXAuZmxhZ3MgKi8KLSNkZWZpbmUgVEZfU0hFTExfVVNFUwlCSVQoMCkJLyogc2hlbGwgdXNlcyBzaWduYWwsIHVzZXIgY2FuJ3QgY2hhbmdlICovCi0jZGVmaW5lIFRGX1VTRVJfU0VUCUJJVCgxKQkvKiB1c2VyIGhhcyAodHJpZWQgdG8pIHNldCB0cmFwICovCi0jZGVmaW5lIFRGX09SSUdfSUdOCUJJVCgyKQkvKiBvcmlnaW5hbCBhY3Rpb24gd2FzIFNJR19JR04gKi8KLSNkZWZpbmUgVEZfT1JJR19ERkwJQklUKDMpCS8qIG9yaWdpbmFsIGFjdGlvbiB3YXMgU0lHX0RGTCAqLwotI2RlZmluZSBURl9FWEVDX0lHTglCSVQoNCkJLyogcmVzdG9yZSBTSUdfSUdOIGp1c3QgYmVmb3JlIGV4ZWMgKi8KLSNkZWZpbmUgVEZfRVhFQ19ERkwJQklUKDUpCS8qIHJlc3RvcmUgU0lHX0RGTCBqdXN0IGJlZm9yZSBleGVjICovCi0jZGVmaW5lIFRGX0RGTF9JTlRSCUJJVCg2KQkvKiB3aGVuIHJlY2VpdmVkLCBkZWZhdWx0IGFjdGlvbiBpcyBMSU5UUiAqLwotI2RlZmluZSBURl9UVFlfSU5UUglCSVQoNykJLyogdHR5IGdlbmVyYXRlZCBzaWduYWwgKHNlZSBqX3dhaXRqKSAqLwotI2RlZmluZSBURl9DSEFOR0VECUJJVCg4KQkvKiB1c2VkIGJ5IHJ1bnRyYXAoKSB0byBkZXRlY3QgdHJhcCBjaGFuZ2VzICovCi0jZGVmaW5lIFRGX0ZBVEFMCUJJVCg5KQkvKiBjYXVzZXMgdGVybWluYXRpb24gaWYgbm90IHRyYXBwZWQgKi8KLQotLyogdmFsdWVzIGZvciBzZXRzaWcoKS9zZXRleGVjc2lnKCkgZmxhZ3MgYXJndW1lbnQgKi8KLSNkZWZpbmUgU1NfUkVTVE9SRV9NQVNLCTB4MwkvKiBob3cgdG8gcmVzdG9yZSBhIHNpZ25hbCBiZWZvcmUgYW4gZXhlYygpICovCi0jZGVmaW5lIFNTX1JFU1RPUkVfQ1VSUgkwCS8qIGxlYXZlIGN1cnJlbnQgaGFuZGxlciBpbiBwbGFjZSAqLwotI2RlZmluZSBTU19SRVNUT1JFX09SSUcJMQkvKiByZXN0b3JlIG9yaWdpbmFsIGhhbmRsZXIgKi8KLSNkZWZpbmUgU1NfUkVTVE9SRV9ERkwJMgkvKiByZXN0b3JlIHRvIFNJR19ERkwgKi8KLSNkZWZpbmUgU1NfUkVTVE9SRV9JR04JMwkvKiByZXN0b3JlIHRvIFNJR19JR04gKi8KLSNkZWZpbmUgU1NfRk9SQ0UJQklUKDMpCS8qIHNldCBzaWduYWwgZXZlbiBpZiBvcmlnaW5hbCBzaWduYWwgaWdub3JlZCAqLwotI2RlZmluZSBTU19VU0VSCQlCSVQoNCkJLyogdXNlciBpcyBkb2luZyB0aGUgc2V0IChpZSwgdHJhcCBjb21tYW5kKSAqLwotI2RlZmluZSBTU19TSFRSQVAJQklUKDUpCS8qIHRyYXAgZm9yIGludGVybmFsIHVzZSAoQUxSTSwgQ0hMRCwgV0lOQ0gpICovCi0KLSNkZWZpbmUgU0lHRVhJVF8JMAkvKiBmb3IgdHJhcCBFWElUICovCi0jZGVmaW5lIFNJR0VSUl8JCU5TSUcJLyogZm9yIHRyYXAgRVJSICovCi0KLUVYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgdHJhcDsJLyogdHJhcHMgcGVuZGluZz8gKi8KLUVYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50cnNpZzsJLyogcGVuZGluZyB0cmFwIGludGVycnVwdHMgY29tbWFuZCAqLwotRVhURVJOIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBmYXRhbF90cmFwOy8qIHJlY2VpdmVkIGEgZmF0YWwgc2lnbmFsICovCi1leHRlcm4JVHJhcAlzaWd0cmFwc1tOU0lHKzFdOwotCi0vKiBnb3Rfd2luY2ggPSAxIHdoZW4gd2UgbmVlZCB0byByZS1hZGp1c3QgdGhlIHdpbmRvdyBzaXplICovCi0jaWZkZWYgU0lHV0lOQ0gKLUVYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZ290X3dpbmNoIElfXygxKTsKLSNlbHNlCi0jZGVmaW5lIGdvdF93aW5jaAl0cnVlCi0jZW5kaWYKLQotLyoKLSAqIFRNT1VUIHN1cHBvcnQKLSAqLwotLyogdmFsdWVzIGZvciBrc2hfdG1vdXRfc3RhdGUgKi8KLWVudW0gdG1vdXRfZW51bSB7Ci0JVE1PVVRfRVhFQ1VUSU5HID0gMCwJLyogZXhlY3V0aW5nIGNvbW1hbmRzICovCi0JVE1PVVRfUkVBRElORywJCS8qIHdhaXRpbmcgZm9yIGlucHV0ICovCi0JVE1PVVRfTEVBVklORwkJLyogaGF2ZSB0aW1lZCBvdXQgKi8KLX07Ci1FWFRFUk4gdW5zaWduZWQgaW50IGtzaF90bW91dDsKLUVYVEVSTiBlbnVtIHRtb3V0X2VudW0ga3NoX3Rtb3V0X3N0YXRlIElfXyhUTU9VVF9FWEVDVVRJTkcpOwotCi0vKiBGb3IgIllvdSBoYXZlIHN0b3BwZWQgam9icyIgbWVzc2FnZSAqLwotRVhURVJOIGludCByZWFsbHlfZXhpdDsKLQotLyoKLSAqIGZhc3QgY2hhcmFjdGVyIGNsYXNzZXMKLSAqLwotI2RlZmluZSBDX0FMUEhBCSBCSVQoMCkJCS8qIGEtel9BLVogKi8KLSNkZWZpbmUgQ19ESUdJVAkgQklUKDEpCQkvKiAwLTkgKi8KLSNkZWZpbmUgQ19MRVgxCSBCSVQoMikJCS8qIFx0IFxuXDB8Jjs8PigpICovCi0jZGVmaW5lIENfVkFSMQkgQklUKDMpCQkvKiAqQCMhJC0/ICovCi0jZGVmaW5lIENfSUZTV1MJIEJJVCg0KQkJLyogXHQgXG4gKElGUyB3aGl0ZSBzcGFjZSkgKi8KLSNkZWZpbmUgQ19TVUJPUDEgQklUKDUpCQkvKiAiPS0rPyIgKi8KLSNkZWZpbmUgQ19RVU9URQkgQklUKDYpCQkvKiBcdFxuICIjJCYnKCkqOzw9Pj9bXF1gfCAobmVlZGluZyBxdW90aW5nKSAqLwotI2RlZmluZSBDX0lGUwkgQklUKDcpCQkvKiAkSUZTICovCi0jZGVmaW5lIENfU1VCT1AyIEJJVCg4KQkJLyogIiMlIiAobWFnaWMsIHNlZSBiZWxvdykgKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2h0eXBlc1tdOwotCi0jZGVmaW5lIGN0eXBlKGMsIHQpCSEhKCAoKHQpID09IENfU1VCT1AyKSA/CQkJCVwKLQkJCSAgICAoKChjKSA9PSAnIycgfHwgKGMpID09ICclJykgPyAxIDogMCkgOglcCi0JCQkgICAgKGNodHlwZXNbKHVuc2lnbmVkIGNoYXIpKGMpXSYodCkpICkKLSNkZWZpbmUga3NoX2lzYWxwaHgoYykJY3R5cGUoKGMpLCBDX0FMUEhBKQotI2RlZmluZSBrc2hfaXNhbG51eChjKQljdHlwZSgoYyksIENfQUxQSEEgfCBDX0RJR0lUKQotCi1FWFRFUk4gaW50IGlmczAgSV9fKCcgJyk7CS8qIGZvciAiJCoiICovCi0KLS8qIEFyZ3VtZW50IHBhcnNpbmcgZm9yIGJ1aWx0LWluIGNvbW1hbmRzIGFuZCBnZXRvcHRzIGNvbW1hbmQgKi8KLQotLyogVmFsdWVzIGZvciBHZXRvcHQuZmxhZ3MgKi8KLSNkZWZpbmUgR0ZfRVJST1IJQklUKDApCS8qIGNhbGwgZXJyb3JmKCkgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKi8KLSNkZWZpbmUgR0ZfUExVU09QVAlCSVQoMSkJLyogYWxsb3cgK2MgYXMgYW4gb3B0aW9uICovCi0jZGVmaW5lIEdGX05PTkFNRQlCSVQoMikJLyogZG9uJ3QgcHJpbnQgYXJndlswXSBpbiBlcnJvcnMgKi8KLQotLyogVmFsdWVzIGZvciBHZXRvcHQuaW5mbyAqLwotI2RlZmluZSBHSV9NSU5VUwlCSVQoMCkJLyogYW4gb3B0aW9uIHN0YXJ0ZWQgd2l0aCAtLi4uICovCi0jZGVmaW5lIEdJX1BMVVMJCUJJVCgxKQkvKiBhbiBvcHRpb24gc3RhcnRlZCB3aXRoICsuLi4gKi8KLSNkZWZpbmUgR0lfTUlOVVNNSU5VUwlCSVQoMikJLyogYXJndW1lbnRzIHdlcmUgZW5kZWQgd2l0aCAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY29uc3QgY2hhcgkqb3B0YXJnOwotCWludAkJb3B0aW5kOwotCWludAkJdW9wdGluZDsvKiB3aGF0IHVzZXIgc2VlcyBpbiAkT1BUSU5EICovCi0JaW50CQlmbGFnczsJLyogc2VlIEdGXyogKi8KLQlpbnQJCWluZm87CS8qIHNlZSBHSV8qICovCi0JdW5zaWduZWQgaW50CXA7CS8qIDAgb3IgaW5kZXggaW50byBhcmd2W29wdGluZCAtIDFdICovCi0JY2hhcgkJYnVmWzJdOwkvKiBmb3IgYmFkIG9wdGlvbiBPUFRBUkcgdmFsdWUgKi8KLX0gR2V0b3B0OwotCi1FWFRFUk4gR2V0b3B0IGJ1aWx0aW5fb3B0OwkvKiBmb3Igc2hlbGwgYnVpbHRpbiBjb21tYW5kcyAqLwotRVhURVJOIEdldG9wdCB1c2VyX29wdDsJCS8qIHBhcnNpbmcgc3RhdGUgZm9yIGdldG9wdHMgYnVpbHRpbiBjb21tYW5kICovCi0KLS8qIFRoaXMgZm9yIGNvLXByb2Nlc3NlcyAqLwotCi10eXBlZGVmIGludDMyX3QgQ29wcm9jX2lkOyAvKiBzb21ldGhpbmcgdGhhdCB3b24ndCAocmVhbGlzdGljbHkpIHdyYXAgKi8KLXN0cnVjdCBjb3Byb2MgewotCXZvaWQgKmpvYjsJLyogMCBvciBqb2Igb2YgY28tcHJvY2VzcyB1c2luZyBpbnB1dCBwaXBlICovCi0JaW50IHJlYWQ7CS8qIHBpcGUgZnJvbSBjby1wcm9jZXNzJ3Mgc3Rkb3V0ICovCi0JaW50IHJlYWR3OwkvKiBvdGhlciBzaWRlIG9mIHJlYWQgKHNhdmVkIHRlbXBvcmFyaWx5KSAqLwotCWludCB3cml0ZTsJLyogcGlwZSB0byBjby1wcm9jZXNzJ3Mgc3RkaW4gKi8KLQlpbnQgbmpvYnM7CS8qIG51bWJlciBvZiBsaXZlIGpvYnMgdXNpbmcgb3V0cHV0IHBpcGUgKi8KLQlDb3Byb2NfaWQgaWQ7CS8qIGlkIG9mIGN1cnJlbnQgb3V0cHV0IHBpcGUgKi8KLX07Ci1FWFRFUk4gc3RydWN0IGNvcHJvYyBjb3Byb2M7Ci0KLS8qIFVzZWQgaW4gam9icy5jIGFuZCBieSBjb3Byb2Nlc3Mgc3R1ZmYgaW4gZXhlYy5jICovCi1FWFRFUk4gc2lnc2V0X3QJCXNtX2RlZmF1bHQsIHNtX3NpZ2NobGQ7Ci0KLS8qIG5hbWUgb2YgY2FsbGVkIGJ1aWx0aW4gZnVuY3Rpb24gKHVzZWQgYnkgZXJyb3IgZnVuY3Rpb25zKSAqLwotRVhURVJOIGNvbnN0IGNoYXIgKmJ1aWx0aW5fYXJndjA7Ci1FWFRFUk4gVGZsYWcgYnVpbHRpbl9mbGFnOwkvKiBmbGFncyBvZiBjYWxsZWQgYnVpbHRpbiAoU1BFQ19CSSwgZXRjLikgKi8KLQotLyogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2FtZSAqLwotRVhURVJOIGNoYXIJKmN1cnJlbnRfd2Q7Ci1FWFRFUk4gc2l6ZV90CWN1cnJlbnRfd2Rfc2l6ZTsKLQotLyogTWluaW11bSByZXF1aXJlZCBzcGFjZSB0byB3b3JrIHdpdGggb24gYSBsaW5lIC0gaWYgdGhlIHByb21wdCBsZWF2ZXMgbGVzcwotICogc3BhY2UgdGhhbiB0aGlzIG9uIGEgbGluZSwgdGhlIHByb21wdCBpcyB0cnVuY2F0ZWQuCi0gKi8KLSNkZWZpbmUgTUlOX0VESVRfU1BBQ0UJNwotLyogTWluaW11bSBhbGxvd2VkIHZhbHVlIGZvciB4X2NvbHM6IDIgZm9yIHByb21wdCwgMyBmb3IgIiA8ICIgYXQgZW5kIG9mIGxpbmUKLSAqLwotI2RlZmluZSBNSU5fQ09MUwkoMiArIE1JTl9FRElUX1NQQUNFICsgMykKLSNkZWZpbmUgTUlOX0xJTlMJMwotRVhURVJOIG1rc2hfYXJpX3QgeF9jb2xzIElfXyg4MCk7CS8qIHR0eSBjb2x1bW5zICovCi1FWFRFUk4gbWtzaF9hcmlfdCB4X2xpbnMgSV9fKC0xKTsJLyogdHR5IGxpbmVzICovCi0KLS8qIFRoZXNlIHRvIGF2b2lkIGJyYWNrZXQgbWF0Y2hpbmcgcHJvYmxlbXMgKi8KLSNkZWZpbmUgT1BBUkVOCScoJwotI2RlZmluZSBDUEFSRU4JJyknCi0jZGVmaW5lIE9CUkFDSwknWycKLSNkZWZpbmUgQ0JSQUNLCSddJwotI2RlZmluZSBPQlJBQ0UJJ3snCi0jZGVmaW5lIENCUkFDRQknfScKLQotLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3lzdGVtIChjb21tb24pIHByb2ZpbGUgKi8KLSNkZWZpbmUgS1NIX1NZU1RFTV9QUk9GSUxFICIvZXRjL3Byb2ZpbGUiCi0KLS8qIFVzZWQgYnkgdl9ldmFsdWF0ZSgpIGFuZCBzZXRzdHIoKSB0byBjb250cm9sIGFjdGlvbiB3aGVuIGVycm9yIG9jY3VycyAqLwotI2RlZmluZSBLU0hfVU5XSU5EX0VSUk9SCTAJLyogdW53aW5kIHRoZSBzdGFjayAobG9uZ2ptcCkgKi8KLSNkZWZpbmUgS1NIX1JFVFVSTl9FUlJPUgkxCS8qIHJldHVybiAxLzAgZm9yIHN1Y2Nlc3MvZmFpbHVyZSAqLwotCi0vKgotICogU2hlbGwgZmlsZSBJL08gcm91dGluZXMKLSAqLwotCi0jZGVmaW5lIFNIRl9CU0laRQk1MTIKLQotI2RlZmluZSBzaGZfZmlsZW5vKHNoZikJKChzaGYpLT5mZCkKLSNkZWZpbmUgc2hmX3NldGZpbGVubyhzaGYsbmZkKQkoKHNoZiktPmZkID0gKG5mZCkpCi0jaWZkZWYgTUtTSF9TTUFMTAotaW50IHNoZl9nZXRjKHN0cnVjdCBzaGYgKik7Ci1pbnQgc2hmX3B1dGMoaW50LCBzdHJ1Y3Qgc2hmICopOwotI2Vsc2UKLSNkZWZpbmUgc2hmX2dldGMoc2hmKQkJKChzaGYpLT5ybmxlZnQgPiAwID8gXAotCQkJCSAgICAoc2hmKS0+cm5sZWZ0LS0sICooc2hmKS0+cnArKyA6IFwKLQkJCQkgICAgc2hmX2dldGNoYXIoc2hmKSkKLSNkZWZpbmUgc2hmX3B1dGMoYywgc2hmKQkoKHNoZiktPndubGVmdCA9PSAwID8gXAotCQkJCSAgICBzaGZfcHV0Y2hhcigoYyksIChzaGYpKSA6IFwKLQkJCQkgICAgKChzaGYpLT53bmxlZnQtLSwgKihzaGYpLT53cCsrID0gKGMpKSkKLSNlbmRpZgotI2RlZmluZSBzaGZfZW9mKHNoZikJCSgoc2hmKS0+ZmxhZ3MgJiBTSEZfRU9GKQotI2RlZmluZSBzaGZfZXJyb3Ioc2hmKQkJKChzaGYpLT5mbGFncyAmIFNIRl9FUlJPUikKLSNkZWZpbmUgc2hmX2Vycm5vKHNoZikJCSgoc2hmKS0+ZXJybm9fKQotI2RlZmluZSBzaGZfY2xlYXJlcnIoc2hmKQkoKHNoZiktPmZsYWdzICY9IH4oU0hGX0VPRiB8IFNIRl9FUlJPUikpCi0KLS8qIEZsYWdzIHBhc3NlZCB0byBzaGZfKm9wZW4oKSAqLwotI2RlZmluZSBTSEZfUkQJCTB4MDAwMQotI2RlZmluZSBTSEZfV1IJCTB4MDAwMgotI2RlZmluZSBTSEZfUkRXUgkoU0hGX1JEfFNIRl9XUikKLSNkZWZpbmUgU0hGX0FDQ01PREUJMHgwMDAzCQkvKiBtYXNrICovCi0jZGVmaW5lIFNIRl9HRVRGTAkweDAwMDQJCS8qIHVzZSBmY250bCgpIHRvIGZpZ3VyZSBSRC9XUiBmbGFncyAqLwotI2RlZmluZSBTSEZfVU5CVUYJMHgwMDA4CQkvKiB1bmJ1ZmZlcmVkIEkvTyAqLwotI2RlZmluZSBTSEZfQ0xFWEVDCTB4MDAxMAkJLyogc2V0IGNsb3NlIG9uIGV4ZWMgZmxhZyAqLwotI2RlZmluZSBTSEZfTUFQSEkJMHgwMDIwCQkvKiBtYWtlIGZkID4gRkRCQVNFIChhbmQgY2xvc2Ugb3JpZykKLQkJCQkJICogKHNoZl9vcGVuKCkgb25seSkgKi8KLSNkZWZpbmUgU0hGX0RZTkFNSUMJMHgwMDQwCQkvKiBzdHJpbmc6IGluY3JlYXNlIGJ1ZmZlciBhcyBuZWVkZWQgKi8KLSNkZWZpbmUgU0hGX0lOVEVSUlVQVAkweDAwODAJCS8qIEVJTlRSIGluIHJlYWQvd3JpdGUgY2F1c2VzIGVycm9yICovCi0vKiBGbGFncyB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgU0hGX1NUUklORwkweDAxMDAJCS8qIGEgc3RyaW5nLCBub3QgYSBmaWxlICovCi0jZGVmaW5lIFNIRl9BTExPQ1MJMHgwMjAwCQkvKiBzaGYgYW5kIHNoZi0+YnVmIHdlcmUgYWxsb2MoKWVkICovCi0jZGVmaW5lIFNIRl9BTExPQ0IJMHgwNDAwCQkvKiBzaGYtPmJ1ZiB3YXMgYWxsb2MoKWVkICovCi0jZGVmaW5lIFNIRl9FUlJPUgkweDA4MDAJCS8qIHJlYWQoKS93cml0ZSgpIGVycm9yICovCi0jZGVmaW5lIFNIRl9FT0YJCTB4MTAwMAkJLyogcmVhZCBlb2YgKHN0aWNreSkgKi8KLSNkZWZpbmUgU0hGX1JFQURJTkcJMHgyMDAwCQkvKiBjdXJyZW50bHkgcmVhZGluZzogcm5sZWZ0LHJwIHZhbGlkICovCi0jZGVmaW5lIFNIRl9XUklUSU5HCTB4NDAwMAkJLyogY3VycmVudGx5IHdyaXRpbmc6IHdubGVmdCx3cCB2YWxpZCAqLwotCi0KLXN0cnVjdCBzaGYgewotCUFyZWEgKmFyZWFwOwkJLyogYXJlYSBzaGYvYnVmIHdlcmUgYWxsb2NhdGVkIGluICovCi0JdW5zaWduZWQgY2hhciAqcnA7CS8qIHJlYWQ6IGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCi0JdW5zaWduZWQgY2hhciAqd3A7CS8qIHdyaXRlOiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsJLyogYnVmZmVyICovCi0JaW50IGZsYWdzOwkJLyogc2VlIFNIRl8qICovCi0JaW50IHJic2l6ZTsJCS8qIHNpemUgb2YgYnVmZmVyICgxIGlmIFNIRl9VTkJVRikgKi8KLQlpbnQgcm5sZWZ0OwkJLyogcmVhZDogaG93IG11Y2ggZGF0YSBsZWZ0IGluIGJ1ZmZlciAqLwotCWludCB3YnNpemU7CQkvKiBzaXplIG9mIGJ1ZmZlciAoMCBpZiBTSEZfVU5CVUYpICovCi0JaW50IHdubGVmdDsJCS8qIHdyaXRlOiBob3cgbXVjaCBzcGFjZSBsZWZ0IGluIGJ1ZmZlciAqLwotCWludCBmZDsJCQkvKiBmaWxlIGRlc2NyaXB0b3IgKi8KLQlpbnQgZXJybm9fOwkJLyogc2F2ZWQgdmFsdWUgb2YgZXJybm8gYWZ0ZXIgZXJyb3IgKi8KLQlpbnQgYnNpemU7CQkvKiBhY3R1YWwgc2l6ZSBvZiBidWYgKi8KLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgc2hmIHNoZl9pb2JbXTsKLQotc3RydWN0IHRhYmxlIHsKLQlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgZW50cmllcyAqLwotCXN0cnVjdCB0YmwgKip0YmxzOwkvKiBoYXNoZWQgdGFibGUgaXRlbXMgKi8KLQlzaG9ydCBzaXplLCBuZnJlZTsJLyogaGFzaCBzaXplIChhbHdheXMgMl5ebiksIGZyZWUgZW50cmllcyAqLwotfTsKLQotc3RydWN0IHRibCB7CQkJLyogdGFibGUgaXRlbSAqLwotCUFyZWEgKmFyZWFwOwkJLyogYXJlYSB0byBhbGxvY2F0ZSBmcm9tICovCi0JdW5pb24gewotCQljaGFyICpzOwkJLyogc3RyaW5nICovCi0JCW1rc2hfYXJpX3QgaTsJCS8qIGludGVnZXIgKi8KLQkJbWtzaF91YXJpX3QgdTsJCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLQkJaW50ICgqZikoY29uc3QgY2hhciAqKik7LyogaW50IGZ1bmN0aW9uICovCi0JCXN0cnVjdCBvcCAqdDsJCS8qICJmdW5jdGlvbiIgdHJlZSAqLwotCX0gdmFsOwkJCS8qIHZhbHVlICovCi0JdW5pb24gewotCQlzdHJ1Y3QgdGJsICphcnJheTsJLyogYXJyYXkgdmFsdWVzICovCi0JCWNvbnN0IGNoYXIgKmZwYXRoOwkvKiB0ZW1wb3JhcnkgcGF0aCB0byB1bmRlZiBmdW5jdGlvbiAqLwotCX0gdTsKLQl1bmlvbiB7Ci0JCWludCBmaWVsZDsJLyogZmllbGQgd2l0aCBmb3IgLUwvLVIvLVogKi8KLQkJaW50IGVycm5vXzsJLyogQ0VYRUMvQ1RBTElBUyAqLwotCX0gdTI7Ci0JaW50IHR5cGU7CQkvKiBjb21tYW5kIHR5cGUgKHNlZSBiZWxvdyksIGJhc2UgKGlmIElOVEVHRVIpLAotCQkJCSAqIG9yIG9mZnNldCBmcm9tIHZhbC5zIG9mIHZhbHVlIChpZiBFWFBPUlQpICovCi0JVGZsYWcgZmxhZzsJCS8qIGZsYWdzICovCi0JdW5pb24gewotCQl1aW50MzJfdCBodmFsOwkJLyogaGFzaChuYW1lKSAqLwotCQl1aW50MzJfdCBpbmRleDsJCS8qIGluZGV4IGZvciBhbiBhcnJheSAqLwotCX0gdWE7Ci0JY2hhciBuYW1lWzRdOwkJLyogbmFtZSAtLSB2YXJpYWJsZSBsZW5ndGggKi8KLX07Ci0KLS8qIGNvbW1vbiBmbGFnIGJpdHMgKi8KLSNkZWZpbmUgQUxMT0MJCUJJVCgwKQkvKiB2YWwucyBoYXMgYmVlbiBhbGxvY2F0ZWQgKi8KLSNkZWZpbmUgREVGSU5FRAkJQklUKDEpCS8qIGlzIGRlZmluZWQgaW4gYmxvY2sgKi8KLSNkZWZpbmUgSVNTRVQJCUJJVCgyKQkvKiBoYXMgdmFsdWUsIHZwLT52YWwuW3NpXSAqLwotI2RlZmluZSBFWFBPUlQJCUJJVCgzKQkvKiBleHBvcnRlZCB2YXJpYWJsZS9mdW5jdGlvbiAqLwotI2RlZmluZSBUUkFDRQkJQklUKDQpCS8qIHZhcjogdXNlciBmbGFnZ2VkLCBmdW5jOiBleGVjdXRpb24gdHJhY2luZyAqLwotLyogKHN0YXJ0IG5vbi1jb21tb24gZmxhZ3MgYXQgOCkgKi8KLS8qIGZsYWcgYml0cyB1c2VkIGZvciB2YXJpYWJsZXMgKi8KLSNkZWZpbmUgU1BFQ0lBTAkJQklUKDgpCS8qIFBBVEgsIElGUywgU0VDT05EUywgZXRjICovCi0jZGVmaW5lIElOVEVHRVIJCUJJVCg5KQkvKiB2YWwuaSBjb250YWlucyBpbnRlZ2VyIHZhbHVlICovCi0jZGVmaW5lIFJET05MWQkJQklUKDEwKQkvKiByZWFkLW9ubHkgdmFyaWFibGUgKi8KLSNkZWZpbmUgTE9DQUwJCUJJVCgxMSkJLyogZm9yIGxvY2FsIHR5cGVzZXQoKSAqLwotI2RlZmluZSBBUlJBWQkJQklUKDEzKQkvKiBhcnJheSAqLwotI2RlZmluZSBMSlVTVAkJQklUKDE0KQkvKiBsZWZ0IGp1c3RpZnkgKi8KLSNkZWZpbmUgUkpVU1QJCUJJVCgxNSkJLyogcmlnaHQganVzdGlmeSAqLwotI2RlZmluZSBaRVJPRklMCQlCSVQoMTYpCS8qIDAgZmlsbGVkIGlmIFJKVVNUSUZZLCBzdHJpcCAwcyBpZiBMSlVTVElGWSAqLwotI2RlZmluZSBMQ0FTRVYJCUJJVCgxNykJLyogY29udmVydCB0byBsb3dlciBjYXNlICovCi0jZGVmaW5lIFVDQVNFVl9BTAlCSVQoMTgpIC8qIGNvbnZlcnQgdG8gdXBwZXIgY2FzZSAvIGF1dG9sb2FkIGZ1bmN0aW9uICovCi0jZGVmaW5lIElOVF9VCQlCSVQoMTkpCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLSNkZWZpbmUgSU5UX0wJCUJJVCgyMCkJLyogbG9uZyBpbnRlZ2VyIChuby1vcCkgKi8KLSNkZWZpbmUgSU1QT1JUCQlCSVQoMjEpCS8qIGZsYWcgdG8gdHlwZXNldCgpOiBubyBhcnJheXMsIG11c3QgaGF2ZSA9ICovCi0jZGVmaW5lIExPQ0FMX0NPUFkJQklUKDIyKQkvKiB3aXRoIExPQ0FMIC0gY29weSBhdHRycyBmcm9tIGV4aXN0aW5nIHZhciAqLwotI2RlZmluZSBFWFBSSU5FVkFMCUJJVCgyMykJLyogY29udGVudHMgY3VycmVudGx5IGJlaW5nIGV2YWx1YXRlZCAqLwotI2RlZmluZSBFWFBSTFZBTFVFCUJJVCgyNCkJLyogdXNlYWJsZSBhcyBsdmFsdWUgKHRlbXAgZmxhZykgKi8KLSNkZWZpbmUgQUlOREVYCQlCSVQoMjUpIC8qIGFycmF5IGluZGV4ID4wID0gdWEuaW5kZXggZmlsbGVkIGluICovCi0jZGVmaW5lIEFTU09DCQlCSVQoMjYpIC8qIEFSUkFZID8gYXNzb2NpYXRpdmUgOiByZWZlcmVuY2UgKi8KLS8qIGZsYWcgYml0cyB1c2VkIGZvciB0YWxpYXNlcy9idWlsdGlucy9hbGlhc2VzL2tleXdvcmRzL2Z1bmN0aW9ucyAqLwotI2RlZmluZSBLRUVQQVNOCQlCSVQoOCkJLyoga2VlcCBjb21tYW5kIGFzc2lnbm1lbnRzIChlZywgdmFyPXggY21kKSAqLwotI2RlZmluZSBGSU5VU0UJCUJJVCg5KQkvKiBmdW5jdGlvbiBiZWluZyBleGVjdXRlZCAqLwotI2RlZmluZSBGREVMRVRFCQlCSVQoMTApCS8qIGZ1bmN0aW9uIGRlbGV0ZWQgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZyAqLwotI2RlZmluZSBGS1NICQlCSVQoMTEpCS8qIGZ1bmN0aW9uIGRlZmluZWQgd2l0aCBmdW5jdGlvbiB4ICh2cyB4KCkpICovCi0jZGVmaW5lIFNQRUNfQkkJCUJJVCgxMikJLyogYSBQT1NJWCBzcGVjaWFsIGJ1aWx0aW4gKi8KLSNkZWZpbmUgUkVHX0JJCQlCSVQoMTMpCS8qIGEgUE9TSVggcmVndWxhciBidWlsdGluICovCi0vKiBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciAodXNlZCB0byBkZWNpZGUgaWYgYW4gdW5zZXQgcGFyYW0KLSAqIHNob3VsZCBiZSByZXBvdGVkIGJ5IHNldC90eXBlc2V0KS4gRG9lcyBub3QgaW5jbHVkZSBBUlJBWSBvciBMT0NBTC4KLSAqLwotI2RlZmluZSBVU0VSQVRUUklCCShFWFBPUlR8SU5URUdFUnxSRE9OTFl8TEpVU1R8UkpVU1R8WkVST0ZJTHxcCi0JCQkgICAgTENBU0VWfFVDQVNFVl9BTHxJTlRfVXxJTlRfTCkKLQotI2RlZmluZSBhcnJheWluZGV4KHZwKQkoKHVuc2lnbmVkIGxvbmcpKCh2cCktPmZsYWcgJiBBSU5ERVggPyBcCi0JCQkgICAgKHZwKS0+dWEuaW5kZXggOiAwKSkKLQotLyogY29tbWFuZCB0eXBlcyAqLwotI2RlZmluZSBDTk9ORQkJMAkvKiB1bmRlZmluZWQgKi8KLSNkZWZpbmUgQ1NIRUxMCQkxCS8qIGJ1aWx0LWluICovCi0jZGVmaW5lIENGVU5DCQkyCS8qIGZ1bmN0aW9uICovCi0jZGVmaW5lIENFWEVDCQk0CS8qIGV4ZWN1dGFibGUgY29tbWFuZCAqLwotI2RlZmluZSBDQUxJQVMJCTUJLyogYWxpYXMgKi8KLSNkZWZpbmUgQ0tFWVdECQk2CS8qIGtleXdvcmQgKi8KLSNkZWZpbmUgQ1RBTElBUwkJNwkvKiB0cmFja2VkIGFsaWFzICovCi0KLS8qIEZsYWdzIGZvciBmaW5kY29tKCkvY29tZXhlYygpICovCi0jZGVmaW5lIEZDX1NQRUNCSQlCSVQoMCkJLyogc3BlY2lhbCBidWlsdGluICovCi0jZGVmaW5lIEZDX0ZVTkMJCUJJVCgxKQkvKiBmdW5jdGlvbiBidWlsdGluICovCi0jZGVmaW5lIEZDX1JFR0JJCUJJVCgyKQkvKiByZWd1bGFyIGJ1aWx0aW4gKi8KLSNkZWZpbmUgRkNfVU5SRUdCSQlCSVQoMykJLyogdW4tcmVndWxhciBidWlsdGluICghc3BlY2lhbCwhcmVndWxhcikgKi8KLSNkZWZpbmUgRkNfQkkJCShGQ19TUEVDQkl8RkNfUkVHQkl8RkNfVU5SRUdCSSkKLSNkZWZpbmUgRkNfUEFUSAkJQklUKDQpCS8qIGRvIHBhdGggc2VhcmNoICovCi0jZGVmaW5lIEZDX0RFRlBBVEgJQklUKDUpCS8qIHVzZSBkZWZhdWx0IHBhdGggaW4gcGF0aCBzZWFyY2ggKi8KLQotCi0jZGVmaW5lIEFGX0FSR1ZfQUxMT0MJMHgxCS8qIGFyZ3ZbXSBhcnJheSBhbGxvY2F0ZWQgKi8KLSNkZWZpbmUgQUZfQVJHU19BTExPQ0VECTB4MgkvKiBhcmd1bWVudCBzdHJpbmdzIGFsbG9jYXRlZCAqLwotI2RlZmluZSBBSV9BUkdWKGEsIGkpCSgoaSkgPT0gMCA/IChhKS5hcmd2WzBdIDogKGEpLmFyZ3ZbKGkpIC0gKGEpLnNraXBdKQotI2RlZmluZSBBSV9BUkdDKGEpCSgoYSkuYXJnY18gLSAoYSkuc2tpcCkKLQotLyogQXJndW1lbnQgaW5mby4gVXNlZCBmb3IgJCMsICQqIGZvciBzaGVsbCwgZnVuY3Rpb25zLCBpbmNsdWRlcywgZXRjLiAqLwotc3RydWN0IGFyZ19pbmZvIHsKLQljb25zdCBjaGFyICoqYXJndjsKLQlpbnQgZmxhZ3M7CS8qIEFGXyogKi8KLQlpbnQgYXJnY187Ci0JaW50IHNraXA7CS8qIGZpcnN0IGFyZyBpcyBhcmd2WzBdLCBzZWNvbmQgaXMgYXJndlsxICsgc2tpcF0gKi8KLX07Ci0KLS8qCi0gKiBhY3RpdmF0aW9uIHJlY29yZCBmb3IgZnVuY3Rpb24gYmxvY2tzCi0gKi8KLXN0cnVjdCBibG9jayB7Ci0JQXJlYSBhcmVhOwkJLyogYXJlYSB0byBhbGxvY2F0ZSB0aGluZ3MgKi8KLQljb25zdCBjaGFyICoqYXJndjsKLQljaGFyICplcnJvcjsJCS8qIGVycm9yIGhhbmRsZXIgKi8KLQljaGFyICpleGl0OwkJLyogZXhpdCBoYW5kbGVyICovCi0Jc3RydWN0IGJsb2NrICpuZXh0OwkvKiBlbmNsb3NpbmcgYmxvY2sgKi8KLQlzdHJ1Y3QgdGFibGUgdmFyczsJLyogbG9jYWwgdmFyaWFibGVzICovCi0Jc3RydWN0IHRhYmxlIGZ1bnM7CS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotCUdldG9wdCBnZXRvcHRzX3N0YXRlOwotCWludCBhcmdjOwotCWludCBmbGFnczsJCS8qIHNlZSBCRl8qICovCi19OwotCi0vKiBWYWx1ZXMgZm9yIHN0cnVjdCBibG9jay5mbGFncyAqLwotI2RlZmluZSBCRl9ET0dFVE9QVFMJQklUKDApCS8qIHNhdmUvcmVzdG9yZSBnZXRvcHRzIHN0YXRlICovCi0KLS8qCi0gKiBVc2VkIGJ5IGt0d2FsaygpIGFuZCBrdG5leHQoKSByb3V0aW5lcy4KLSAqLwotc3RydWN0IHRzdGF0ZSB7Ci0Jc3RydWN0IHRibCAqKm5leHQ7Ci0Jc3NpemVfdCBsZWZ0OwotfTsKLQotRVhURVJOIHN0cnVjdCB0YWJsZSB0YWxpYXNlczsJLyogdHJhY2tlZCBhbGlhc2VzICovCi1FWFRFUk4gc3RydWN0IHRhYmxlIGJ1aWx0aW5zOwkvKiBidWlsdC1pbiBjb21tYW5kcyAqLwotRVhURVJOIHN0cnVjdCB0YWJsZSBhbGlhc2VzOwkvKiBhbGlhc2VzICovCi1FWFRFUk4gc3RydWN0IHRhYmxlIGtleXdvcmRzOwkvKiBrZXl3b3JkcyAqLwotI2lmbmRlZiBNS1NIX05PUFdOQU0KLUVYVEVSTiBzdHJ1Y3QgdGFibGUgaG9tZWRpcnM7CS8qIGhvbWVkaXIoKSBjYWNoZSAqLwotI2VuZGlmCi0KLXN0cnVjdCBidWlsdGluIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCAoKmZ1bmMpKGNvbnN0IGNoYXIgKiopOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBidWlsdGluIG1rc2hidWlsdGluc1tdOwotCi0vKiB2YWx1ZXMgZm9yIHNldF9wcm9tcHQoKSAqLwotI2RlZmluZSBQUzEJMAkvKiBjb21tYW5kICovCi0jZGVmaW5lIFBTMgkxCS8qIGNvbW1hbmQgY29udGludWF0aW9uICovCi0KLUVYVEVSTiBjaGFyICpwYXRoOwkJLyogY29weSBvZiBlaXRoZXIgUEFUSCBvciBkZWZfcGF0aCAqLwotRVhURVJOIGNvbnN0IGNoYXIgKmRlZl9wYXRoOwkvKiBwYXRoIHRvIHVzZSBpZiBQQVRIIG5vdCBzZXQgKi8KLUVYVEVSTiBjaGFyICp0bXBkaXI7CQkvKiBUTVBESVIgdmFsdWUgKi8KLUVYVEVSTiBjb25zdCBjaGFyICpwcm9tcHQ7Ci1FWFRFUk4gaW50IGN1cl9wcm9tcHQ7CQkvKiBQUzEgb3IgUFMyICovCi1FWFRFUk4gaW50IGN1cnJlbnRfbGluZW5vOwkvKiBMSU5FTk8gdmFsdWUgKi8KLQotI2RlZmluZSBOT0JMT0NLCSgoc3RydWN0IG9wICopTlVMTCkKLSNkZWZpbmUgTk9XT1JECSgoY2hhciAqKU5VTEwpCi0jZGVmaW5lIE5PV09SRFMJKChjaGFyICoqKU5VTEwpCi0KLS8qCi0gKiBEZXNjcmlwdGlvbiBvZiBhIGNvbW1hbmQgb3IgYW4gb3BlcmF0aW9uIG9uIGNvbW1hbmRzLgotICovCi1zdHJ1Y3Qgb3AgewotCWNvbnN0IGNoYXIgKiphcmdzOwkJLyogYXJndW1lbnRzIHRvIGEgY29tbWFuZCAqLwotCWNoYXIgKip2YXJzOwkJCS8qIHZhcmlhYmxlIGFzc2lnbm1lbnRzICovCi0Jc3RydWN0IGlvd29yZCAqKmlvYWN0OwkJLyogSU8gYWN0aW9ucyAoZWcsIDwgPiA+PikgKi8KLQlzdHJ1Y3Qgb3AgKmxlZnQsICpyaWdodDsJLyogZGVzY2VuZGVudHMgKi8KLQljaGFyICpzdHI7CQkJLyogd29yZCBmb3IgY2FzZTsgaWRlbnRpZmllciBmb3IgZm9yLAotCQkJCQkgKiBzZWxlY3QsIGFuZCBmdW5jdGlvbnM7Ci0JCQkJCSAqIHBhdGggdG8gZXhlY3V0ZSBmb3IgVEVYRUM7Ci0JCQkJCSAqIHRpbWUgaG9vayBmb3IgVENPTS4KLQkJCQkJICovCi0JaW50IGxpbmVubzsJCQkvKiBUQ09NL1RGVU5DOiBMSU5FTk8gZm9yIHRoaXMgKi8KLQlzaG9ydCB0eXBlOwkJCS8qIG9wZXJhdGlvbiB0eXBlLCBzZWUgYmVsb3cgKi8KLQl1bmlvbiB7IC8qIFdBUk5JTkc6IG5ld3RwKCksIHRjb3B5KCkgdXNlIGV2YWxmbGFncyA9IDAgdG8gY2xlYXIgdW5pb24gKi8KLQkJc2hvcnQgZXZhbGZsYWdzOwkvKiBUQ09NOiBhcmcgZXhwYW5zaW9uIGV2YWwoKSBmbGFncyAqLwotCQlzaG9ydCBrc2hfZnVuYzsJCS8qIFRGVU5DOiBmdW5jdGlvbiB4ICh2cyB4KCkpICovCi0JfSB1OwotfTsKLQotLyogVHJlZS50eXBlIHZhbHVlcyAqLwotI2RlZmluZSBURU9GCQkwCi0jZGVmaW5lIFRDT00JCTEJLyogY29tbWFuZCAqLwotI2RlZmluZSBUUEFSRU4JCTIJLyogKGMtbGlzdCkgKi8KLSNkZWZpbmUgVFBJUEUJCTMJLyogYSB8IGIgKi8KLSNkZWZpbmUgVExJU1QJCTQJLyogYSA7IGIgKi8KLSNkZWZpbmUgVE9SCQk1CS8qIHx8ICovCi0jZGVmaW5lIFRBTkQJCTYJLyogJiYgKi8KLSNkZWZpbmUgVEJBTkcJCTcJLyogISAqLwotI2RlZmluZSBUREJSQUNLRVQJOAkvKiBbWyAuLiBdXSAqLwotI2RlZmluZSBURk9SCQk5Ci0jZGVmaW5lIFRTRUxFQ1QJCTEwCi0jZGVmaW5lIFRDQVNFCQkxMQotI2RlZmluZSBUSUYJCTEyCi0jZGVmaW5lIFRXSElMRQkJMTMKLSNkZWZpbmUgVFVOVElMCQkxNAotI2RlZmluZSBURUxJRgkJMTUKLSNkZWZpbmUgVFBBVAkJMTYJLyogcGF0dGVybiBpbiBjYXNlICovCi0jZGVmaW5lIFRCUkFDRQkJMTcJLyoge2MtbGlzdH0gKi8KLSNkZWZpbmUgVEFTWU5DCQkxOAkvKiBjICYgKi8KLSNkZWZpbmUgVEZVTkNUCQkxOQkvKiBmdW5jdGlvbiBuYW1lIHsgY29tbWFuZDsgfSAqLwotI2RlZmluZSBUVElNRQkJMjAJLyogdGltZSBwaXBlbGluZSAqLwotI2RlZmluZSBURVhFQwkJMjEJLyogZm9yay9leGVjIGV2YWwnZCBUQ09NICovCi0jZGVmaW5lIFRDT1BST0MJCTIyCS8qIGNvcHJvY2VzcyB8JiAqLwotCi0vKgotICogcHJlZml4IGNvZGVzIGZvciB3b3JkcyBpbiBjb21tYW5kIHRyZWUKLSAqLwotI2RlZmluZSBFT1MJMAkvKiBlbmQgb2Ygc3RyaW5nICovCi0jZGVmaW5lIENIQVIJMQkvKiB1bnF1b3RlZCBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgUUNIQVIJMgkvKiBxdW90ZWQgY2hhcmFjdGVyICovCi0jZGVmaW5lIENPTVNVQgkzCS8qICQoKSBzdWJzdGl0dXRpb24gKDAgdGVybWluYXRlZCkgKi8KLSNkZWZpbmUgRVhQUlNVQgk0CS8qICQoKCkpIHN1YnN0aXR1dGlvbiAoMCB0ZXJtaW5hdGVkKSAqLwotI2RlZmluZSBPUVVPVEUJNQkvKiBvcGVuaW5nICIgb3IgJyAqLwotI2RlZmluZSBDUVVPVEUJNgkvKiBjbG9zaW5nICIgb3IgJyAqLwotI2RlZmluZSBPU1VCU1QJNwkvKiBvcGVuaW5nICR7IHN1YnN0IChmb2xsb3dlZCBieSB7IG9yIFgpICovCi0jZGVmaW5lIENTVUJTVAk4CS8qIGNsb3NpbmcgfSBvZiBhYm92ZSAoZm9sbG93ZWQgYnkgfSBvciBYKSAqLwotI2RlZmluZSBPUEFUCTkJLyogb3BlbiBwYXR0ZXJuOiAqKCwgQCgsIGV0Yy4gKi8KLSNkZWZpbmUgU1BBVAkxMAkvKiBzZXBhcmF0ZSBwYXR0ZXJuOiB8ICovCi0jZGVmaW5lIENQQVQJMTEJLyogY2xvc2UgcGF0dGVybjogKSAqLwotI2RlZmluZSBBREVMSU0JMTIJLyogYXJiaXRyYXJ5IGRlbGltaXRlcjogJHtmb286MjozfSAke2Zvby9iYXIvYmF6fSAqLwotCi0vKgotICogSU8gcmVkaXJlY3Rpb24KLSAqLwotc3RydWN0IGlvd29yZCB7Ci0JaW50CXVuaXQ7CS8qIHVuaXQgYWZmZWN0ZWQgKi8KLQlpbnQJZmxhZzsJLyogYWN0aW9uIChiZWxvdykgKi8KLQljaGFyCSpuYW1lOwkvKiBmaWxlIG5hbWUgKHVudXNlZCBpZiBoZXJlZG9jKSAqLwotCWNoYXIJKmRlbGltOwkvKiBkZWxpbWl0ZXIgZm9yIDw8LDw8LSAqLwotCWNoYXIJKmhlcmVkb2M7LyogY29udGVudCBvZiBoZXJlZG9jICovCi19OwotCi0vKiBpb3dvcmQuZmxhZyAtIHR5cGUgb2YgcmVkaXJlY3Rpb24gKi8KLSNkZWZpbmUgSU9UWVBFCTB4RgkvKiB0eXBlOiBiaXRzIDA6MyAqLwotI2RlZmluZSBJT1JFQUQJMHgxCS8qIDwgKi8KLSNkZWZpbmUgSU9XUklURQkweDIJLyogPiAqLwotI2RlZmluZSBJT1JEV1IJMHgzCS8qIDw+OiB0b2RvICovCi0jZGVmaW5lIElPSEVSRQkweDQJLyogPDwgKGhlcmUgZmlsZSkgKi8KLSNkZWZpbmUgSU9DQVQJMHg1CS8qID4+ICovCi0jZGVmaW5lIElPRFVQCTB4NgkvKiA8Ji8+JiAqLwotI2RlZmluZSBJT0VWQUwJQklUKDQpCS8qIGV4cGFuZCBpbiA8PCAqLwotI2RlZmluZSBJT1NLSVAJQklUKDUpCS8qIDw8LSwgc2tpcCBeXHQqICovCi0jZGVmaW5lIElPQ0xPQglCSVQoNikJLyogPnwsIG92ZXJyaWRlIC1vIG5vY2xvYmJlciAqLwotI2RlZmluZSBJT1JEVVAJQklUKDcpCS8qIHg8JnkgKGFzIG9wcG9zZWQgdG8geD4meSkgKi8KLSNkZWZpbmUgSU9OQU1FWFAgQklUKDgpCS8qIG5hbWUgaGFzIGJlZW4gZXhwYW5kZWQgKi8KLSNkZWZpbmUgSU9CQVNICUJJVCg5KQkvKiAmPiBldGMuICovCi0KLS8qIGV4ZWN1dGUvZXhjaGlsZCBmbGFncyAqLwotI2RlZmluZSBYRVhFQwlCSVQoMCkJCS8qIGV4ZWN1dGUgd2l0aG91dCBmb3JraW5nICovCi0jZGVmaW5lIFhGT1JLCUJJVCgxKQkJLyogZm9yayBiZWZvcmUgZXhlY3V0aW5nICovCi0jZGVmaW5lIFhCR05ECUJJVCgyKQkJLyogY29tbWFuZCAmICovCi0jZGVmaW5lIFhQSVBFSQlCSVQoMykJCS8qIGlucHV0IGlzIHBpcGUgKi8KLSNkZWZpbmUgWFBJUEVPCUJJVCg0KQkJLyogb3V0cHV0IGlzIHBpcGUgKi8KLSNkZWZpbmUgWFBJUEUJKFhQSVBFSXxYUElQRU8pCS8qIG1lbWJlciBvZiBwaXBlICovCi0jZGVmaW5lIFhYQ09NCUJJVCg1KQkJLyogYC4uLmAgY29tbWFuZCAqLwotI2RlZmluZSBYUENMT1NFCUJJVCg2KQkJLyogZXhjaGlsZDogY2xvc2UgY2xvc2VfZmQgaW4gcGFyZW50ICovCi0jZGVmaW5lIFhDQ0xPU0UJQklUKDcpCQkvKiBleGNoaWxkOiBjbG9zZSBjbG9zZV9mZCBpbiBjaGlsZCAqLwotI2RlZmluZSBYRVJST0sJQklUKDgpCQkvKiBub24temVybyBleGl0IG9rIChmb3Igc2V0IC1lKSAqLwotI2RlZmluZSBYQ09QUk9DIEJJVCg5KQkJLyogc3RhcnRpbmcgYSBjby1wcm9jZXNzICovCi0jZGVmaW5lIFhUSU1FCUJJVCgxMCkJCS8qIHRpbWluZyBUQ09NIGNvbW1hbmQgKi8KLQotLyoKLSAqIGZsYWdzIHRvIGNvbnRyb2wgZXhwYW5zaW9uIG9mIHdvcmRzIChhc3N1bWVkIGJ5IHQtPmV2YWxmbGFncyB0byBmaXQKLSAqIGluIGEgc2hvcnQpCi0gKi8KLSNkZWZpbmUgRE9CTEFOSwlCSVQoMCkJCS8qIHBlcmZvcm0gYmxhbmsgaW50ZXJwcmV0YXRpb24gKi8KLSNkZWZpbmUgRE9HTE9CCUJJVCgxKQkJLyogZXhwYW5kIFs/KiAqLwotI2RlZmluZSBET1BBVAlCSVQoMikJCS8qIHF1b3RlICo/WyAqLwotI2RlZmluZSBET1RJTERFCUJJVCgzKQkJLyogbm9ybWFsIH4gZXhwYW5zaW9uIChmaXJzdCBjaGFyKSAqLwotI2RlZmluZSBET05UUlVOQ09NTUFORCBCSVQoNCkJLyogZG8gbm90IHJ1biAkKGNvbW1hbmQpIHRoaW5ncyAqLwotI2RlZmluZSBET0FTTlRJTERFIEJJVCg1KQkvKiBhc3NpZ25tZW50IH4gZXhwYW5zaW9uIChhZnRlciA9LCA6KSAqLwotI2RlZmluZSBET0JSQUNFXyBCSVQoNikJCS8qIHVzZWQgYnkgZXhwYW5kKCk6IGRvIGJyYWNlIGV4cGFuc2lvbiAqLwotI2RlZmluZSBET01BR0lDXyBCSVQoNykJCS8qIHVzZWQgYnkgZXhwYW5kKCk6IHN0cmluZyBjb250YWlucyBNQUdJQyAqLwotI2RlZmluZSBET1RFTVBfCUJJVCg4KQkJLyogZGl0dG8gOiBpbiB3b3JkIHBhcnQgb2YgJHsuLlslIz0/XS4ufSAqLwotI2RlZmluZSBET1ZBQ0hFQ0sgQklUKDkpCS8qIHZhciBhc3NpZ24gY2hlY2sgKGZvciB0eXBlc2V0LCBzZXQsIGV0YykgKi8KLSNkZWZpbmUgRE9NQVJLRElSUyBCSVQoMTApCS8qIGZvcmNlIG1hcmtkaXJzIGJlaGF2aW91ciAqLwotCi0vKgotICogVGhlIGFyZ3VtZW50cyBvZiBbWyAuLiBdXSBleHByZXNzaW9ucyBhcmUga2VwdCBpbiB0LT5hcmdzW10gYW5kIGZsYWdzCi0gKiBpbmRpY2F0aW5nIGhvdyB0aGUgYXJndW1lbnRzIGhhdmUgYmVlbiBtdW5nZWQgYXJlIGtlcHQgaW4gdC0+dmFyc1tdLgotICogVGhlIGNvbnRlbnRzIG9mIHQtPnZhcnNbXSBhcmUgc3R1ZmZlZCBzdHJpbmdzIChzbyB0aGV5IGNhbiBiZSB0cmVhdGVkCi0gKiBsaWtlIGFsbCBvdGhlciB0LT52YXJzW10pIGluIHdoaWNoIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIHRoZSBvbmUgdGhhdAotICogaXMgZXhhbWluZWQuIFRoZSBEQl8qIGRlZmluZXMgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZXNlIHNlY29uZCBjaGFyYWN0ZXJzLgotICovCi0jZGVmaW5lIERCX05PUk0JMQkvKiBub3JtYWwgYXJndW1lbnQgKi8KLSNkZWZpbmUgREJfT1IJMgkvKiB8fCAtPiAtbyBjb252ZXJzaW9uICovCi0jZGVmaW5lIERCX0FORAkzCS8qICYmIC0+IC1hIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgREJfQkUJNAkvKiBhbiBpbnNlcnRlZCAtQkUgKi8KLSNkZWZpbmUgREJfUEFUCTUJLyogYSBwYXR0ZXJuIGFyZ3VtZW50ICovCi0KLSNkZWZpbmUgWF9FWFRSQQk4CS8qIHRoaXMgbWFueSBleHRyYSBieXRlcyBpbiBYIHN0cmluZyAqLwotCi10eXBlZGVmIHN0cnVjdCBYU3RyaW5nIHsKLQljaGFyICplbmQsICpiZWc7CS8qIGVuZCwgYmVnaW4gb2Ygc3RyaW5nICovCi0Jc2l6ZV90IGxlbjsJCS8qIGxlbmd0aCAqLwotCUFyZWEgKmFyZWFwOwkJLyogYXJlYSB0byBhbGxvY2F0ZS9mcmVlIGZyb20gKi8KLX0gWFN0cmluZzsKLQotdHlwZWRlZiBjaGFyICpYU3RyaW5nUDsKLQotLyogaW5pdGlhbGlzZSBleHBhbmRhYmxlIHN0cmluZyAqLwotI2RlZmluZSBYaW5pdE4oeHMsIGxlbmd0aCwgYXJlYSkgZG8gewkJCQlcCi0JKHhzKS5sZW4gPSAobGVuZ3RoKTsJCQkJCVwKLQkoeHMpLmFyZWFwID0gKGFyZWEpOwkJCQkJXAotCSh4cykuYmVnID0gYWxsb2MoKHhzKS5sZW4gKyBYX0VYVFJBLCAoeHMpLmFyZWFwKTsJXAotCSh4cykuZW5kID0gKHhzKS5iZWcgKyAoeHMpLmxlbjsJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZGVmaW5lIFhpbml0KHhzLCB4cCwgbGVuZ3RoLCBhcmVhKSBkbyB7CQkJXAotCVhpbml0TigoeHMpLCAobGVuZ3RoKSwgKGFyZWEpKTsJCQkJXAotCSh4cCkgPSAoeHMpLmJlZzsJCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotCi0vKiBzdHVmZiBjaGFyIGludG8gc3RyaW5nICovCi0jZGVmaW5lIFhwdXQoeHMsIHhwLCBjKQkoKnhwKysgPSAoYykpCi0KLS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJ5dGVzIGxlZnQgKi8KLSNkZWZpbmUgWGNoZWNrTih4cywgeHAsIG4pIGRvIHsJCQkJCVwKLQlpbnQgbW9yZSA9ICgoeHApICsgKG4pKSAtICh4cykuZW5kOwkJCVwKLQlpZiAobW9yZSA+IDApCQkJCQkJXAotCQkoeHApID0gWGNoZWNrX2dyb3dfKCYoeHMpLCAoeHApLCBtb3JlKTsJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotCi0vKiBjaGVjayBmb3Igb3ZlcmZsb3csIGV4cGFuZCBzdHJpbmcgKi8KLSNkZWZpbmUgWGNoZWNrKHhzLCB4cCkJWGNoZWNrTigoeHMpLCAoeHApLCAxKQotCi0vKiBmcmVlIHN0cmluZyAqLwotI2RlZmluZSBYZnJlZSh4cywgeHApCWFmcmVlKCh4cykuYmVnLCAoeHMpLmFyZWFwKQotCi0vKiBjbG9zZSwgcmV0dXJuIHN0cmluZyAqLwotI2RlZmluZSBYY2xvc2UoeHMsIHhwKQlhcmVzaXplKCh4cykuYmVnLCAoeHApIC0gKHhzKS5iZWcsICh4cykuYXJlYXApCi0KLS8qIGJlZ2luIG9mIHN0cmluZyAqLwotI2RlZmluZSBYc3RyaW5nKHhzLCB4cCkJKCh4cykuYmVnKQotCi0jZGVmaW5lIFhubGVmdCh4cywgeHApCSgoeHMpLmVuZCAtICh4cCkpCS8qIG1heSBiZSBsZXNzIHRoYW4gMCAqLwotI2RlZmluZSBYbGVuZ3RoKHhzLCB4cCkJKCh4cCkgLSAoeHMpLmJlZykKLSNkZWZpbmUgWHNpemUoeHMsIHhwKQkoKHhzKS5lbmQgLSAoeHMpLmJlZykKLSNkZWZpbmUgWHNhdmVwb3MoeHMsIHhwKQkoKHhwKSAtICh4cykuYmVnKQotI2RlZmluZSBYcmVzdHBvcyh4cywgeHAsIG4pCSgoeHMpLmJlZyArIChuKSkKLQotY2hhciAqWGNoZWNrX2dyb3dfKFhTdHJpbmcgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotCi0vKgotICogZXhwYW5kYWJsZSB2ZWN0b3Igb2YgZ2VuZXJpYyBwb2ludGVycwotICovCi0KLXR5cGVkZWYgc3RydWN0IFhQdHJWIHsKLQl2b2lkICoqY3VyOwkJLyogbmV4dCBhdmFpbCBwb2ludGVyICovCi0Jdm9pZCAqKmJlZywgKiplbmQ7CS8qIGJlZ2luLCBlbmQgb2YgdmVjdG9yICovCi19IFhQdHJWOwotCi0jZGVmaW5lIFhQaW5pdCh4LCBuKSBkbyB7CQkJCQlcCi0Jdm9pZCAqKnZwX187CQkJCQkJXAotCXZwX18gPSBhbGxvYygobikgKiBzaXplb2Yodm9pZCAqKSwgQVRFTVApOwkJXAotCSh4KS5jdXIgPSAoeCkuYmVnID0gdnBfXzsJCQkJXAotCSh4KS5lbmQgPSB2cF9fICsgKG4pOwkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0KLSNkZWZpbmUgWFBwdXQoeCwgcCkgZG8gewkJCQkJXAotCWlmICgoeCkuY3VyID49ICh4KS5lbmQpIHsJCQkJXAotCQlzaXplX3QgbiA9IFhQc2l6ZSh4KTsJCQkJXAotCQkoeCkuYmVnID0gYXJlc2l6ZSgoeCkuYmVnLAkJCVwKLQkJICAgIG4gKiAyICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKTsJCVwKLQkJKHgpLmN1ciA9ICh4KS5iZWcgKyBuOwkJCQlcCi0JCSh4KS5lbmQgPSAoeCkuY3VyICsgbjsJCQkJXAotCX0JCQkJCQkJXAotCSooeCkuY3VyKysgPSAocCk7CQkJCQlcCi19IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLQotI2RlZmluZSBYUHB0cnYoeCkJKCh4KS5iZWcpCi0jZGVmaW5lIFhQc2l6ZSh4KQkoKHgpLmN1ciAtICh4KS5iZWcpCi0jZGVmaW5lIFhQY2xvc2UoeCkJYXJlc2l6ZSgoeCkuYmVnLCBYUHNpemUoeCkgKiBzaXplb2Yodm9pZCAqKSwgQVRFTVApCi0jZGVmaW5lIFhQZnJlZSh4KQlhZnJlZSgoeCkuYmVnLCBBVEVNUCkKLQotI2RlZmluZSBJREVOVAk2NAotCi10eXBlZGVmIHN0cnVjdCBzb3VyY2UgU291cmNlOwotc3RydWN0IHNvdXJjZSB7Ci0JY29uc3QgY2hhciAqc3RyOwkvKiBpbnB1dCBwb2ludGVyICovCi0JY29uc3QgY2hhciAqc3RhcnQ7CS8qIHN0YXJ0IG9mIGN1cnJlbnQgYnVmZmVyICovCi0JdW5pb24gewotCQljb25zdCBjaGFyICoqc3RydjsJLyogc3RyaW5nIFtdICovCi0JCXN0cnVjdCBzaGYgKnNoZjsJLyogc2hlbGwgZmlsZSAqLwotCQlzdHJ1Y3QgdGJsICp0YmxwOwkvKiBhbGlhcyAoU0ZfSEFTQUxJQVMpICovCi0JCWNoYXIgKmZyZWVtZTsJCS8qIGFsc28gZm9yIFNSRVJFQUQgKi8KLQl9IHU7Ci0JY29uc3QgY2hhciAqZmlsZTsJLyogaW5wdXQgZmlsZSBuYW1lICovCi0JaW50CXR5cGU7CQkvKiBpbnB1dCB0eXBlICovCi0JaW50CWxpbmU7CQkvKiBsaW5lIG51bWJlciAqLwotCWludAllcnJsaW5lOwkvKiBsaW5lIHRoZSBlcnJvciBvY2N1cnJlZCBvbiAoMCBpZiBub3Qgc2V0KSAqLwotCWludAlmbGFnczsJCS8qIFNGXyogKi8KLQlBcmVhCSphcmVhcDsKLQlTb3VyY2UgKm5leHQ7CQkvKiBzdGFja2VkIHNvdXJjZSAqLwotCVhTdHJpbmcJeHM7CQkvKiBpbnB1dCBidWZmZXIgKi8KLQljaGFyCXVnYnVmWzJdOwkvKiBidWZmZXIgZm9yIHVuZ2V0c2MoKSAoU1JFUkVBRCkgYW5kCi0JCQkJICogYWxpYXMgKFNBTElBUykgKi8KLX07Ci0KLS8qIFNvdXJjZS50eXBlIHZhbHVlcyAqLwotI2RlZmluZSBTRU9GCQkwCS8qIGlucHV0IEVPRiAqLwotI2RlZmluZSBTRklMRQkJMQkvKiBmaWxlIGlucHV0ICovCi0jZGVmaW5lIFNTVERJTgkJMgkvKiByZWFkIHN0ZGluICovCi0jZGVmaW5lIFNTVFJJTkcJCTMJLyogc3RyaW5nICovCi0jZGVmaW5lIFNXU1RSCQk0CS8qIHN0cmluZyB3aXRob3V0IFxuICovCi0jZGVmaW5lIFNXT1JEUwkJNQkvKiBzdHJpbmdbXSAqLwotI2RlZmluZSBTV09SRFNFUAk2CS8qIHN0cmluZ1tdIHNlcGFyYXRvciAqLwotI2RlZmluZSBTQUxJQVMJCTcJLyogYWxpYXMgZXhwYW5zaW9uICovCi0jZGVmaW5lIFNSRVJFQUQJCTgJLyogcmVhZCBhaGVhZCB0byBiZSByZS1zY2FubmVkICovCi0KLS8qIFNvdXJjZS5mbGFncyB2YWx1ZXMgKi8KLSNkZWZpbmUgU0ZfRUNITwkJQklUKDApCS8qIGVjaG8gaW5wdXQgdG8gc2hsb3V0ICovCi0jZGVmaW5lIFNGX0FMSUFTCUJJVCgxKQkvKiBmYWtpbmcgc3BhY2UgYXQgZW5kIG9mIGFsaWFzICovCi0jZGVmaW5lIFNGX0FMSUFTRU5ECUJJVCgyKQkvKiBmYWtpbmcgc3BhY2UgYXQgZW5kIG9mIGFsaWFzICovCi0jZGVmaW5lIFNGX1RUWQkJQklUKDMpCS8qIHR5cGUgPT0gU1NURElOICYgaXQgaXMgYSB0dHkgKi8KLSNkZWZpbmUgU0ZfRklSU1QJQklUKDQpCS8qIGluaXRpYWwgc3RhdGUgKHRvIGlnbm9yZSBVVEYtOCBCT00pICovCi0jZGVmaW5lIFNGX0hBU0FMSUFTCUJJVCg1KQkvKiB1LnRibHAgdmFsaWQgKFNBTElBUywgU0VPRikgKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0JaW50IGk7Ci0JY2hhciAqY3A7Ci0JY2hhciAqKndwOwotCXN0cnVjdCBvcCAqbzsKLQlzdHJ1Y3QgaW93b3JkICppb3A7Ci19IFlZU1RZUEU7Ci0KLS8qIElmIHNvbWV0aGluZyBpcyBhZGRlZCBoZXJlLCBhZGQgaXQgdG8gdG9rZW50YWJbXSBpbiBzeW4uYyBhcyB3ZWxsICovCi0jZGVmaW5lIExXT1JECQkyNTYKLSNkZWZpbmUgTE9HQU5ECQkyNTcJLyogJiYgKi8KLSNkZWZpbmUgTE9HT1IJCTI1OAkvKiB8fCAqLwotI2RlZmluZSBCUkVBSwkJMjU5CS8qIDs7ICovCi0jZGVmaW5lIElGCQkyNjAKLSNkZWZpbmUgVEhFTgkJMjYxCi0jZGVmaW5lIEVMU0UJCTI2MgotI2RlZmluZSBFTElGCQkyNjMKLSNkZWZpbmUgRkkJCTI2NAotI2RlZmluZSBDQVNFCQkyNjUKLSNkZWZpbmUgRVNBQwkJMjY2Ci0jZGVmaW5lIEZPUgkJMjY3Ci0jZGVmaW5lIFNFTEVDVAkJMjY4Ci0jZGVmaW5lIFdISUxFCQkyNjkKLSNkZWZpbmUgVU5USUwJCTI3MAotI2RlZmluZSBETwkJMjcxCi0jZGVmaW5lIERPTkUJCTI3MgotI2RlZmluZSBJTgkJMjczCi0jZGVmaW5lIEZVTkNUSU9OCTI3NAotI2RlZmluZSBUSU1FCQkyNzUKLSNkZWZpbmUgUkVESVIJCTI3NgotI2RlZmluZSBNRFBBUkVOCQkyNzcJLyogKCggKSkgKi8KLSNkZWZpbmUgQkFORwkJMjc4CS8qICEgKi8KLSNkZWZpbmUgREJSQUNLRVQJMjc5CS8qIFtbIC4uIF1dICovCi0jZGVmaW5lIENPUFJPQwkJMjgwCS8qIHwmICovCi0jZGVmaW5lIFlZRVJSQ09ERQkzMDAKLQotLyogZmxhZ3MgdG8geXlsZXggKi8KLSNkZWZpbmUgQ09OVElOCQlCSVQoMCkJLyogc2tpcCBuZXcgbGluZXMgdG8gY29tcGxldGUgY29tbWFuZCAqLwotI2RlZmluZSBPTkVXT1JECQlCSVQoMSkJLyogc2luZ2xlIHdvcmQgZm9yIHN1YnN0aXR1dGUoKSAqLwotI2RlZmluZSBBTElBUwkJQklUKDIpCS8qIHJlY29nbmlzZSBhbGlhcyAqLwotI2RlZmluZSBLRVlXT1JECQlCSVQoMykJLyogcmVjb2duaXNlIGtleXdvcmRzICovCi0jZGVmaW5lIExFVEVYUFIJCUJJVCg0KQkvKiBnZXQgZXhwcmVzc2lvbiBpbnNpZGUgKCggKSkgKi8KLSNkZWZpbmUgVkFSQVNOCQlCSVQoNSkJLyogY2hlY2sgZm9yIHZhcj13b3JkICovCi0jZGVmaW5lIEFSUkFZVkFSCUJJVCg2KQkvKiBwYXJzZSB4WzEgJiAyXSBhcyBvbmUgd29yZCAqLwotI2RlZmluZSBFU0FDT05MWQlCSVQoNykJLyogb25seSBhY2NlcHQgZXNhYyBrZXl3b3JkICovCi0jZGVmaW5lIENNRFdPUkQJCUJJVCg4KQkvKiBwYXJzaW5nIHNpbXBsZSBjb21tYW5kIChhbGlhcyByZWxhdGVkKSAqLwotI2RlZmluZSBIRVJFREVMSU0JQklUKDkpCS8qIHBhcnNpbmcgPDwsPDwtIGRlbGltaXRlciAqLwotI2RlZmluZSBMUUNIQVIJCUJJVCgxMCkJLyogc291cmNlIHN0cmluZyBjb250YWlucyBRQ0hBUiAqLwotI2RlZmluZSBIRVJFRE9DCQlCSVQoMTEpCS8qIHBhcnNpbmcgYSBoZXJlIGRvY3VtZW50ICovCi0jZGVmaW5lIExFVEFSUkFZCUJJVCgxMikJLyogY29weSBleHByZXNzaW9uIGluc2lkZSA9KCApICovCi0KLSNkZWZpbmUgSEVSRVMJMTAJCS8qIG1heCA8PCBpbiBsaW5lICovCi0KLSN1bmRlZiBDVFJMCi0jZGVmaW5lCUNUUkwoeCkJCSgoeCkgPT0gJz8nID8gMHg3RiA6ICh4KSAmIDB4MUYpCS8qIEFTQ0lJICovCi0jZGVmaW5lCVVOQ1RSTCh4KQkoKHgpIF4gMHg0MCkJCQkJLyogQVNDSUkgKi8KLQotRVhURVJOIFNvdXJjZSAqc291cmNlOwkJLyogeXlwYXJzZS95eWxleCBzb3VyY2UgKi8KLUVYVEVSTiBZWVNUWVBFCXl5bHZhbDsJCS8qIHJlc3VsdCBmcm9tIHl5bGV4ICovCi1FWFRFUk4gc3RydWN0IGlvd29yZCAqaGVyZXMgW0hFUkVTXSwgKipoZXJlcDsKLUVYVEVSTiBjaGFyCWlkZW50IFtJREVOVCsxXTsKLQotI2RlZmluZSBISVNUT1JZU0laRQk1MDAJLyogc2l6ZSBvZiBzYXZlZCBoaXN0b3J5ICovCi0KLUVYVEVSTiBjaGFyICoqaGlzdG9yeTsJLyogc2F2ZWQgY29tbWFuZHMgKi8KLUVYVEVSTiBjaGFyICoqaGlzdHB0cjsJLyogbGFzdCBoaXN0b3J5IGl0ZW0gKi8KLUVYVEVSTiBpbnQgaGlzdHNpemU7CS8qIGhpc3Rvcnkgc2l6ZSAqLwotCi0vKiB1c2VyIGFuZCBzeXN0ZW0gdGltZSBvZiBsYXN0IGpfd2FpdGplZCBqb2IgKi8KLUVYVEVSTiBzdHJ1Y3QgdGltZXZhbCBqX3VzcnRpbWUsIGpfc3lzdGltZTsKLQotLyogbGFsbG9jLmMgKi8KLXZvaWQgYWluaXQoQXJlYSAqKTsKLXZvaWQgYWZyZWVhbGwoQXJlYSAqKTsKLS8qIHRoZXNlIGNhbm5vdCBmYWlsIGFuZCBjYW4gdGFrZSBOVUxMIChub3QgZm9yIGFwKSAqLwotI2RlZmluZSBhbGxvYyhuLCBhcCkJYXJlc2l6ZShOVUxMLCAobiksIChhcCkpCi12b2lkICphcmVzaXplKHZvaWQgKiwgc2l6ZV90LCBBcmVhICopOwotdm9pZCBhZnJlZSh2b2lkICosIEFyZWEgKik7CS8qIGNhbiB0YWtlIE5VTEwgKi8KLS8qIGVkaXQuYyAqLwotI2lmbmRlZiBNS1NIX1NNQUxMCi1pbnQgeF9iaW5kKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKLSNlbHNlCi1pbnQgeF9iaW5kKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKLSNlbmRpZgotdm9pZCB4X2luaXQodm9pZCk7Ci1pbnQgeF9yZWFkKGNoYXIgKiwgc2l6ZV90KTsKLS8qIGV2YWwuYyAqLwotY2hhciAqc3Vic3RpdHV0ZShjb25zdCBjaGFyICosIGludCk7Ci1jaGFyICoqZXZhbChjb25zdCBjaGFyICoqLCBpbnQpOwotY2hhciAqZXZhbHN0cihjb25zdCBjaGFyICpjcCwgaW50KTsKLWNoYXIgKmV2YWxvbmVzdHIoY29uc3QgY2hhciAqY3AsIGludCk7Ci1jaGFyICpkZWJ1bmsoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci12b2lkIGV4cGFuZChjb25zdCBjaGFyICosIFhQdHJWICosIGludCk7Ci1pbnQgZ2xvYl9zdHIoY2hhciAqLCBYUHRyViAqLCBpbnQpOwotLyogZXhlYy5jICovCi1pbnQgZXhlY3V0ZShzdHJ1Y3Qgb3AgKiB2b2xhdGlsZSwgdm9sYXRpbGUgaW50LCB2b2xhdGlsZSBpbnQgKiB2b2xhdGlsZSk7Ci1pbnQgc2hjb21leGVjKGNvbnN0IGNoYXIgKiopOwotc3RydWN0IHRibCAqZmluZGZ1bmMoY29uc3QgY2hhciAqLCB1aW50MzJfdCwgYm9vbCk7Ci1pbnQgZGVmaW5lKGNvbnN0IGNoYXIgKiwgc3RydWN0IG9wICopOwotdm9pZCBidWlsdGluKGNvbnN0IGNoYXIgKiwgaW50ICgqKShjb25zdCBjaGFyICoqKSk7Ci1zdHJ1Y3QgdGJsICpmaW5kY29tKGNvbnN0IGNoYXIgKiwgaW50KTsKLXZvaWQgZmx1c2hjb20oaW50KTsKLWNvbnN0IGNoYXIgKnNlYXJjaChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKik7Ci1pbnQgc2VhcmNoX2FjY2Vzcyhjb25zdCBjaGFyICosIGludCwgaW50ICopOwotaW50IHByX21lbnUoY29uc3QgY2hhciAqIGNvbnN0ICopOwotaW50IHByX2xpc3QoY2hhciAqIGNvbnN0ICopOwotLyogZXhwci5jICovCi1pbnQgZXZhbHVhdGUoY29uc3QgY2hhciAqLCBta3NoX2FyaV90ICosIGludCwgYm9vbCk7Ci1pbnQgdl9ldmFsdWF0ZShzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKiwgdm9sYXRpbGUgaW50LCBib29sKTsKLS8qIFVURi04IHN0dWZmICovCi1zaXplX3QgdXRmX21idG93Yyh1bnNpZ25lZCBpbnQgKiwgY29uc3QgY2hhciAqKTsKLXNpemVfdCB1dGZfd2N0b21iKGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLWludCB1dGZfd2lkdGhhZGooY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqKTsKLWludCB1dGZfbWJzd2lkdGgoY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKnV0Zl9za2lwY29scyhjb25zdCBjaGFyICosIGludCk7Ci1zaXplX3QgdXRmX3B0cmFkaihjb25zdCBjaGFyICopOwotI2lmbmRlZiBNS1NIX21pcmJzZF93Y3dpZHRoCi1pbnQgdXRmX3djd2lkdGgodW5zaWduZWQgaW50KTsKLSNlbmRpZgotLyogZnVuY3MuYyAqLwotaW50IGNfaGFzaChjb25zdCBjaGFyICoqKTsKLWludCBjX2NkKGNvbnN0IGNoYXIgKiopOwotaW50IGNfcHdkKGNvbnN0IGNoYXIgKiopOwotaW50IGNfcHJpbnQoY29uc3QgY2hhciAqKik7Ci0jaWZkZWYgTUtTSF9QUklOVEZfQlVJTFRJTgotaW50IGNfcHJpbnRmKGNvbnN0IGNoYXIgKiopOwotI2VuZGlmCi1pbnQgY193aGVuY2UoY29uc3QgY2hhciAqKik7Ci1pbnQgY19jb21tYW5kKGNvbnN0IGNoYXIgKiopOwotaW50IGNfdHlwZXNldChjb25zdCBjaGFyICoqKTsKLWludCBjX2FsaWFzKGNvbnN0IGNoYXIgKiopOwotaW50IGNfdW5hbGlhcyhjb25zdCBjaGFyICoqKTsKLWludCBjX2xldChjb25zdCBjaGFyICoqKTsKLWludCBjX2pvYnMoY29uc3QgY2hhciAqKik7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotaW50IGNfZmdiZyhjb25zdCBjaGFyICoqKTsKLSNlbmRpZgotaW50IGNfa2lsbChjb25zdCBjaGFyICoqKTsKLXZvaWQgZ2V0b3B0c19yZXNldChpbnQpOwotaW50IGNfZ2V0b3B0cyhjb25zdCBjaGFyICoqKTsKLWludCBjX2JpbmQoY29uc3QgY2hhciAqKik7Ci1pbnQgY19sYWJlbChjb25zdCBjaGFyICoqKTsKLWludCBjX3NoaWZ0KGNvbnN0IGNoYXIgKiopOwotaW50IGNfdW1hc2soY29uc3QgY2hhciAqKik7Ci1pbnQgY19kb3QoY29uc3QgY2hhciAqKik7Ci1pbnQgY193YWl0KGNvbnN0IGNoYXIgKiopOwotaW50IGNfcmVhZChjb25zdCBjaGFyICoqKTsKLWludCBjX2V2YWwoY29uc3QgY2hhciAqKik7Ci1pbnQgY190cmFwKGNvbnN0IGNoYXIgKiopOwotaW50IGNfYnJrY29udChjb25zdCBjaGFyICoqKTsKLWludCBjX2V4aXRyZXR1cm4oY29uc3QgY2hhciAqKik7Ci1pbnQgY19zZXQoY29uc3QgY2hhciAqKik7Ci1pbnQgY191bnNldChjb25zdCBjaGFyICoqKTsKLWludCBjX3VsaW1pdChjb25zdCBjaGFyICoqKTsKLWludCBjX3RpbWVzKGNvbnN0IGNoYXIgKiopOwotaW50IHRpbWV4KHN0cnVjdCBvcCAqLCBpbnQsIHZvbGF0aWxlIGludCAqKTsKLXZvaWQgdGltZXhfaG9vayhzdHJ1Y3Qgb3AgKiwgY2hhciAqKiB2b2xhdGlsZSAqKTsKLWludCBjX2V4ZWMoY29uc3QgY2hhciAqKik7Ci1pbnQgY19idWlsdGluKGNvbnN0IGNoYXIgKiopOwotaW50IGNfdGVzdChjb25zdCBjaGFyICoqKTsKLSNpZiBIQVZFX01LTk9ECi1pbnQgY19ta25vZChjb25zdCBjaGFyICoqKTsKLSNlbmRpZgotaW50IGNfcmVhbHBhdGgoY29uc3QgY2hhciAqKik7Ci1pbnQgY19yZW5hbWUoY29uc3QgY2hhciAqKik7Ci0vKiBoaXN0cmFwLmMgKi8KLXZvaWQgaW5pdF9oaXN0dmVjKHZvaWQpOwotdm9pZCBoaXN0X2luaXQoU291cmNlICopOwotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi12b2lkIGhpc3RfZmluaXNoKHZvaWQpOwotI2VuZGlmCi12b2lkIGhpc3RzYXZlKGludCAqLCBjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOwotI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpICYmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi1ib29sIGhpc3RzeW5jKHZvaWQpOwotI2VuZGlmCi1pbnQgY19mYyhjb25zdCBjaGFyICoqKTsKLXZvaWQgc2V0aGlzdHNpemUoaW50KTsKLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotdm9pZCBzZXRoaXN0ZmlsZShjb25zdCBjaGFyICopOwotI2VuZGlmCi1jaGFyICoqaGlzdHBvcyh2b2lkKTsKLWludCBoaXN0bnVtKGludCk7Ci1pbnQgZmluZGhpc3QoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBmaW5kaGlzdHJlbChjb25zdCBjaGFyICopOwotY2hhciAqKmhpc3RfZ2V0X25ld2VzdChib29sKTsKLXZvaWQgaW5pdHRyYXBzKHZvaWQpOwotdm9pZCBhbGFybV9pbml0KHZvaWQpOwotVHJhcCAqZ2V0dHJhcChjb25zdCBjaGFyICosIGludCk7Ci12b2lkIHRyYXBzaWcoaW50KTsKLXZvaWQgaW50cmNoZWNrKHZvaWQpOwotaW50IGZhdGFsX3RyYXBfY2hlY2sodm9pZCk7Ci1pbnQgdHJhcF9wZW5kaW5nKHZvaWQpOwotdm9pZCBydW50cmFwcyhpbnQgaW50cik7Ci12b2lkIHJ1bnRyYXAoVHJhcCAqKTsKLXZvaWQgY2xlYXJ0cmFwcyh2b2lkKTsKLXZvaWQgcmVzdG9yZXNpZ3Modm9pZCk7Ci12b2lkIHNldHRyYXAoVHJhcCAqLCBjb25zdCBjaGFyICopOwotaW50IGJsb2NrX3BpcGUodm9pZCk7Ci12b2lkIHJlc3RvcmVfcGlwZShpbnQpOwotaW50IHNldHNpZyhUcmFwICosIHNpZ190LCBpbnQpOwotdm9pZCBzZXRleGVjc2lnKFRyYXAgKiwgaW50KTsKLS8qIGpvYnMuYyAqLwotdm9pZCBqX2luaXQodm9pZCk7Ci12b2lkIGpfZXhpdCh2b2lkKTsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi12b2lkIGpfY2hhbmdlKHZvaWQpOwotI2VuZGlmCi1pbnQgZXhjaGlsZChzdHJ1Y3Qgb3AgKiwgaW50LCB2b2xhdGlsZSBpbnQgKiwgaW50KTsKLXZvaWQgc3RhcnRsYXN0KHZvaWQpOwotaW50IHdhaXRsYXN0KHZvaWQpOwotaW50IHdhaXRmb3IoY29uc3QgY2hhciAqLCBpbnQgKik7Ci1pbnQgal9raWxsKGNvbnN0IGNoYXIgKiwgaW50KTsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi1pbnQgal9yZXN1bWUoY29uc3QgY2hhciAqLCBpbnQpOwotI2VuZGlmCi1pbnQgal9qb2JzKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwotaW50IGpfbmpvYnModm9pZCk7Ci12b2lkIGpfbm90aWZ5KHZvaWQpOwotcGlkX3Qgal9hc3luYyh2b2lkKTsKLWludCBqX3N0b3BwZWRfcnVubmluZyh2b2lkKTsKLS8qIGxleC5jICovCi1pbnQgeXlsZXgoaW50KTsKLXZvaWQgeXllcnJvcihjb25zdCBjaGFyICosIC4uLikKLSAgICBNS1NIX0FfTk9SRVRVUk4KLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Ci1Tb3VyY2UgKnB1c2hzKGludCwgQXJlYSAqKTsKLXZvaWQgc2V0X3Byb21wdChpbnQsIFNvdXJjZSAqKTsKLXZvaWQgcHByb21wdChjb25zdCBjaGFyICosIGludCk7Ci1pbnQgcHJvbXB0bGVuKGNvbnN0IGNoYXIgKik7Ci0vKiBtYWluLmMgKi8KLWludCBpbmNsdWRlKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLCBpbnQpOwotaW50IGNvbW1hbmQoY29uc3QgY2hhciAqLCBpbnQpOwotaW50IHNoZWxsKFNvdXJjZSAqdm9sYXRpbGUsIGludCB2b2xhdGlsZSk7Ci12b2lkIHVud2luZChpbnQpIE1LU0hfQV9OT1JFVFVSTjsKLXZvaWQgbmV3ZW52KGludCk7Ci12b2lkIHF1aXRlbnYoc3RydWN0IHNoZiAqKTsKLXZvaWQgY2xlYW51cF9wYXJlbnRzX2Vudih2b2lkKTsKLXZvaWQgY2xlYW51cF9wcm9jX2Vudih2b2lkKTsKLXZvaWQgZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9OT1JFVFVSTgotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKLXZvaWQgd2FybmluZ2YoYm9vbCwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDIsIDMpOwotdm9pZCBiaV9lcnJvcmYoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotI2RlZmluZSBlcnJvcmZ6KCkJZXJyb3JmKCJcMSIpCi0jZGVmaW5lIGJpX2Vycm9yZnooKQliaV9lcnJvcmYoIlwxIikKLXZvaWQgaW50ZXJuYWxfdmVycm9yZihjb25zdCBjaGFyICosIHZhX2xpc3QpCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDApOwotdm9pZCBpbnRlcm5hbF9lcnJvcmYoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX05PUkVUVVJOCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotdm9pZCBpbnRlcm5hbF93YXJuaW5nZihjb25zdCBjaGFyICosIC4uLikKLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Ci12b2lkIGVycm9yX3ByZWZpeChib29sKTsKLXZvaWQgc2hlbGxmKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKLXZvaWQgc2hwcmludGYoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotaW50IGNhbl9zZWVrKGludCk7Ci12b2lkIGluaXRpbyh2b2lkKTsKLWludCBrc2hfZHVwMihpbnQsIGludCwgYm9vbCk7Ci1zaG9ydCBzYXZlZmQoaW50KTsKLXZvaWQgcmVzdGZkKGludCwgaW50KTsKLXZvaWQgb3BlbnBpcGUoaW50ICopOwotdm9pZCBjbG9zZXBpcGUoaW50ICopOwotaW50IGNoZWNrX2ZkKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqKTsKLXZvaWQgY29wcm9jX2luaXQodm9pZCk7Ci12b2lkIGNvcHJvY19yZWFkX2Nsb3NlKGludCk7Ci12b2lkIGNvcHJvY19yZWFkd19jbG9zZShpbnQpOwotdm9pZCBjb3Byb2Nfd3JpdGVfY2xvc2UoaW50KTsKLWludCBjb3Byb2NfZ2V0ZmQoaW50LCBjb25zdCBjaGFyICoqKTsKLXZvaWQgY29wcm9jX2NsZWFudXAoaW50KTsKLXN0cnVjdCB0ZW1wICptYWtldGVtcChBcmVhICosIFRlbXBfdHlwZSwgc3RydWN0IHRlbXAgKiopOwotI2RlZmluZSBoYXNoKHMpIG9hYXRoYXNoX2Z1bGwoKGNvbnN0IHVpbnQ4X3QgKikocykpCi11aW50MzJfdCBvYWF0aGFzaF9mdWxsKHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKik7Ci11aW50MzJfdCBoYXNobWVtKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKLXZvaWQga3Rpbml0KHN0cnVjdCB0YWJsZSAqLCBBcmVhICosIHNpemVfdCk7Ci1zdHJ1Y3QgdGJsICprdHNlYXJjaChzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCk7Ci1zdHJ1Y3QgdGJsICprdGVudGVyKHN0cnVjdCB0YWJsZSAqLCBjb25zdCBjaGFyICosIHVpbnQzMl90KTsKLSNkZWZpbmUga3RkZWxldGUocCkJZG8geyBwLT5mbGFnID0gMDsgfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi12b2lkIGt0d2FsayhzdHJ1Y3QgdHN0YXRlICosIHN0cnVjdCB0YWJsZSAqKTsKLXN0cnVjdCB0YmwgKmt0bmV4dChzdHJ1Y3QgdHN0YXRlICopOwotc3RydWN0IHRibCAqKmt0c29ydChzdHJ1Y3QgdGFibGUgKik7Ci0vKiBtaXNjLmMgKi8KLXZvaWQgc2V0Y3R5cGVzKGNvbnN0IGNoYXIgKiwgaW50KTsKLXZvaWQgaW5pdGN0eXBlcyh2b2lkKTsKLXNpemVfdCBvcHRpb24oY29uc3QgY2hhciAqKTsKLWNoYXIgKmdldG9wdGlvbnModm9pZCk7Ci12b2lkIGNoYW5nZV9mbGFnKGVudW0gc2hfZmxhZywgaW50LCB1bnNpZ25lZCBpbnQpOwotaW50IHBhcnNlX2FyZ3MoY29uc3QgY2hhciAqKiwgaW50LCBib29sICopOwotaW50IGdldG4oY29uc3QgY2hhciAqLCBpbnQgKik7Ci1pbnQgYmlfZ2V0bihjb25zdCBjaGFyICosIGludCAqKTsKLWludCBnbWF0Y2h4KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKLWludCBoYXNfZ2xvYmJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotY29uc3QgdW5zaWduZWQgY2hhciAqcGF0X3NjYW4oY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci1pbnQgeHN0cmNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Ci12b2lkIGtzaF9nZXRvcHRfcmVzZXQoR2V0b3B0ICosIGludCk7Ci1pbnQga3NoX2dldG9wdChjb25zdCBjaGFyICoqLCBHZXRvcHQgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQgcHJpbnRfdmFsdWVfcXVvdGVkKGNvbnN0IGNoYXIgKik7Ci12b2lkIHByaW50X2NvbHVtbnMoc3RydWN0IHNoZiAqLCBpbnQsCi0gICAgY2hhciAqKCopKGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKiksCi0gICAgY29uc3Qgdm9pZCAqLCBpbnQsIGludCwgYm9vbCk7Ci12b2lkIHN0cmlwX251bHMoY2hhciAqLCBpbnQpOwotaW50IGJsb2NraW5nX3JlYWQoaW50LCBjaGFyICosIGludCkKLSAgICBNS1NIX0FfQk9VTkRFRChidWZmZXIsIDIsIDMpOwotaW50IHJlc2V0X25vbmJsb2NrKGludCk7Ci1jaGFyICprc2hfZ2V0X3dkKHNpemVfdCAqKTsKLWludCBtYWtlX3BhdGgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiosIFhTdHJpbmcgKiwgaW50ICopOwotdm9pZCBzaW1wbGlmeV9wYXRoKGNoYXIgKik7Ci12b2lkIHNldF9jdXJyZW50X3dkKGNoYXIgKik7Ci0jaWZkZWYgTUtTSF9TTUFMTAotY2hhciAqc3RyZHVwXyhjb25zdCBjaGFyICosIEFyZWEgKik7Ci1jaGFyICpzdHJuZHVwXyhjb25zdCBjaGFyICosIHNpemVfdCwgQXJlYSAqKTsKLSNlbmRpZgotaW50IHVuYmtzbChib29sLCBpbnQgKCopKHZvaWQpLCB2b2lkICgqKShpbnQpKTsKLS8qIHNoZi5jICovCi1zdHJ1Y3Qgc2hmICpzaGZfb3Blbihjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpOwotc3RydWN0IHNoZiAqc2hmX2Zkb3BlbihpbnQsIGludCwgc3RydWN0IHNoZiAqKTsKLXN0cnVjdCBzaGYgKnNoZl9yZW9wZW4oaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7Ci1zdHJ1Y3Qgc2hmICpzaGZfc29wZW4oY2hhciAqLCBpbnQsIGludCwgc3RydWN0IHNoZiAqKTsKLWludCBzaGZfY2xvc2Uoc3RydWN0IHNoZiAqKTsKLWludCBzaGZfZmRjbG9zZShzdHJ1Y3Qgc2hmICopOwotY2hhciAqc2hmX3NjbG9zZShzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9mbHVzaChzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9yZWFkKGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOwotY2hhciAqc2hmX2dldHNlKGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9nZXRjaGFyKHN0cnVjdCBzaGYgKnMpOwotaW50IHNoZl91bmdldGMoaW50LCBzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9wdXRjaGFyKGludCwgc3RydWN0IHNoZiAqKTsKLWludCBzaGZfcHV0cyhjb25zdCBjaGFyICosIHN0cnVjdCBzaGYgKik7Ci1pbnQgc2hmX3dyaXRlKGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9mcHJpbnRmKHN0cnVjdCBzaGYgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDIsIDMpOwotaW50IHNoZl9zbnByaW50ZihjaGFyICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDMsIDQpCi0gICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAxLCAyKTsKLWNoYXIgKnNoZl9zbXByaW50Zihjb25zdCBjaGFyICosIC4uLikKLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Ci1pbnQgc2hmX3ZmcHJpbnRmKHN0cnVjdCBzaGYgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAwKTsKLS8qIHN5bi5jICovCi12b2lkIGluaXRrZXl3b3Jkcyh2b2lkKTsKLXN0cnVjdCBvcCAqY29tcGlsZShTb3VyY2UgKik7Ci0vKiB0cmVlLmMgKi8KLWludCBmcHRyZWVmKHN0cnVjdCBzaGYgKiwgaW50LCBjb25zdCBjaGFyICosIC4uLik7Ci1jaGFyICpzbnB0cmVlZihjaGFyICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOwotc3RydWN0IG9wICp0Y29weShzdHJ1Y3Qgb3AgKiwgQXJlYSAqKTsKLWNoYXIgKndkY29weShjb25zdCBjaGFyICosIEFyZWEgKik7Ci1jb25zdCBjaGFyICp3ZHNjYW4oY29uc3QgY2hhciAqLCBpbnQpOwotY2hhciAqd2RzdHJpcChjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOwotdm9pZCB0ZnJlZShzdHJ1Y3Qgb3AgKiwgQXJlYSAqKTsKLS8qIHZhci5jICovCi12b2lkIG5ld2Jsb2NrKHZvaWQpOwotdm9pZCBwb3BibG9jayh2b2lkKTsKLXZvaWQgaW5pdHZhcih2b2lkKTsKLXN0cnVjdCB0YmwgKmdsb2JhbChjb25zdCBjaGFyICopOwotc3RydWN0IHRibCAqbG9jYWwoY29uc3QgY2hhciAqLCBib29sKTsKLWNoYXIgKnN0cl92YWwoc3RydWN0IHRibCAqKTsKLWludCBzZXRzdHIoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICosIGludCk7Ci1zdHJ1Y3QgdGJsICpzZXRpbnRfdihzdHJ1Y3QgdGJsICosIHN0cnVjdCB0YmwgKiwgYm9vbCk7Ci12b2lkIHNldGludChzdHJ1Y3QgdGJsICosIG1rc2hfYXJpX3QpOwotc3RydWN0IHRibCAqdHlwZXNldChjb25zdCBjaGFyICosIFRmbGFnLCBUZmxhZywgaW50LCBpbnQpCi0gICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSk7Ci12b2lkIHVuc2V0KHN0cnVjdCB0YmwgKiwgaW50KTsKLWNvbnN0IGNoYXIgKnNraXBfdmFybmFtZShjb25zdCBjaGFyICosIGludCk7Ci1jb25zdCBjaGFyICpza2lwX3dkdmFybmFtZShjb25zdCBjaGFyICosIGludCk7Ci1pbnQgaXNfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBpc193ZHZhcmFzc2lnbihjb25zdCBjaGFyICopOwotY2hhciAqKm1ha2Vudih2b2lkKTsKLXZvaWQgY2hhbmdlX3JhbmRvbShjb25zdCB2b2lkICosIHNpemVfdCk7Ci12b2lkIGNoYW5nZV93aW5zeih2b2lkKTsKLWludCBhcnJheV9yZWZfbGVuKGNvbnN0IGNoYXIgKik7Ci1jaGFyICphcnJheW5hbWUoY29uc3QgY2hhciAqKTsKLW1rc2hfdWFyaV90IHNldF9hcnJheShjb25zdCBjaGFyICosIGJvb2wsIGNvbnN0IGNoYXIgKiopOwotCi1lbnVtIFRlc3Rfb3AgewotCVRPX05PTk9QID0gMCwJLyogbm9uLW9wZXJhdG9yICovCi0JLyogdW5hcnkgb3BlcmF0b3JzICovCi0JVE9fU1ROWkUsIFRPX1NUWkVSLCBUT19PUFRJT04sCi0JVE9fRklMQVhTVCwKLQlUT19GSUxFWFNULAotCVRPX0ZJTFJFRywgVE9fRklMQkRFViwgVE9fRklMQ0RFViwgVE9fRklMU1lNLCBUT19GSUxGSUZPLCBUT19GSUxTT0NLLAotCVRPX0ZJTENERiwgVE9fRklMSUQsIFRPX0ZJTEdJRCwgVE9fRklMU0VURywgVE9fRklMU1RDSywgVE9fRklMVUlELAotCVRPX0ZJTFJELCBUT19GSUxHWiwgVE9fRklMVFQsIFRPX0ZJTFNFVFUsIFRPX0ZJTFdSLCBUT19GSUxFWCwKLQkvKiBiaW5hcnkgb3BlcmF0b3JzICovCi0JVE9fU1RFUUwsIFRPX1NUTkVRLCBUT19TVExULCBUT19TVEdULCBUT19JTlRFUSwgVE9fSU5UTkUsIFRPX0lOVEdULAotCVRPX0lOVEdFLCBUT19JTlRMVCwgVE9fSU5UTEUsIFRPX0ZJTEVRLCBUT19GSUxOVCwgVE9fRklMT1QsCi0JLyogbm90IGFuIG9wZXJhdG9yICovCi0JVE9fTk9OTlVMTAkvKiAhVE9fTk9OT1AgKi8KLX07Ci10eXBlZGVmIGVudW0gVGVzdF9vcCBUZXN0X29wOwotCi0vKiBVc2VkIGJ5IFRlc3RfZW52LmlzYSgpIChvcmRlciBpbXBvcnRhbnQgLSB1c2VkIHRvIGluZGV4ICpfdG9rZW5zW10gYXJyYXlzKSAqLwotZW51bSBUZXN0X21ldGEgewotCVRNX09SLAkJLyogLW8gb3IgfHwgKi8KLQlUTV9BTkQsCQkvKiAtYSBvciAmJiAqLwotCVRNX05PVCwJCS8qICEgKi8KLQlUTV9PUEFSRU4sCS8qICggKi8KLQlUTV9DUEFSRU4sCS8qICkgKi8KLQlUTV9VTk9QLAkvKiB1bmFyeSBvcGVyYXRvciAqLwotCVRNX0JJTk9QLAkvKiBiaW5hcnkgb3BlcmF0b3IgKi8KLQlUTV9FTkQJCS8qIGVuZCBvZiBpbnB1dCAqLwotfTsKLXR5cGVkZWYgZW51bSBUZXN0X21ldGEgVGVzdF9tZXRhOwotCi0jZGVmaW5lIFRFRl9FUlJPUglCSVQoMCkJCS8qIHNldCBpZiB3ZSd2ZSBoaXQgYW4gZXJyb3IgKi8KLSNkZWZpbmUgVEVGX0RCUkFDS0VUCUJJVCgxKQkJLyogc2V0IGlmIFtbIC4uIF1dIHRlc3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdGVzdF9lbnYgewotCXVuaW9uIHsKLQkJY29uc3QgY2hhciAqKndwOy8qIHVzZWQgYnkgcHRlc3RfKiAqLwotCQlYUHRyViAqYXY7CS8qIHVzZWQgYnkgZGJ0ZXN0cF8qICovCi0JfSBwb3M7Ci0JY29uc3QgY2hhciAqKndwX2VuZDsJLyogdXNlZCBieSBwdGVzdF8qICovCi0JVGVzdF9vcCAoKmlzYSkoc3RydWN0IHRlc3RfZW52ICosIFRlc3RfbWV0YSk7Ci0JY29uc3QgY2hhciAqKCpnZXRvcG5kKSAoc3RydWN0IHRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOwotCWludCAoKmV2YWwpKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci0Jdm9pZCAoKmVycm9yKShzdHJ1Y3QgdGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopOwotCWludCBmbGFnczsJCS8qIFRFRl8qICovCi19IFRlc3RfZW52OwotCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgZGJ0ZXN0X3Rva2Vuc1tdOwotCi1UZXN0X29wCXRlc3RfaXNvcChUZXN0X21ldGEsIGNvbnN0IGNoYXIgKik7Ci1pbnQgdGVzdF9ldmFsKFRlc3RfZW52ICosIFRlc3Rfb3AsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKLWludCB0ZXN0X3BhcnNlKFRlc3RfZW52ICopOwotCi1FWFRFUk4gaW50IHR0eV9mZCBJX18oLTEpOwkvKiBkdXAnZCB0dHkgZmlsZSBkZXNjcmlwdG9yICovCi1FWFRFUk4gaW50IHR0eV9kZXZ0dHk7CQkvKiB0cnVlIGlmIHR0eV9mZCBpcyBmcm9tIC9kZXYvdHR5ICovCi1FWFRFUk4gc3RydWN0IHRlcm1pb3MgdHR5X3N0YXRlOwkvKiBzYXZlZCB0dHkgc3RhdGUgKi8KLQotZXh0ZXJuIHZvaWQgdHR5X2luaXQoYm9vbCwgYm9vbCk7Ci1leHRlcm4gdm9pZCB0dHlfY2xvc2Uodm9pZCk7Ci0KLS8qIGJlIHN1cmUgbm90IHRvIGludGVyZmVyZSB3aXRoIGFueW9uZSBlbHNlJ3MgaWRlYSBhYm91dCBFWFRFUk4gKi8KLSNpZmRlZiBFWFRFUk5fREVGSU5FRAotIyB1bmRlZiBFWFRFUk5fREVGSU5FRAotIyB1bmRlZiBFWFRFUk4KLSNlbmRpZgotI3VuZGVmIElfXwotCi0jZW5kaWYgLyogIU1LU0hfSU5DTFVERVNfT05MWSAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2hfZmxhZ3MuaCBiL21rc2gvc3JjL3NoX2ZsYWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTQ4MWUuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvc2hfZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jaWYgZGVmaW5lZChTSEZMQUdTX0RFRk5TKQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2hfZmxhZ3MuaCx2IDEuNyAyMDEwLzA3LzEzIDEzOjA3OjU4IHRnIEV4cCAkIik7Ci0jZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQkvKiBub3RoaW5nICovCi0jZWxpZiBkZWZpbmVkKFNIRkxBR1NfRU5VTVMpCi0jZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQljbmFtZSwKLSNkZWZpbmUgRjAoc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCWNuYW1lID0gMCwKLSNlbGlmIGRlZmluZWQoU0hGTEFHU19JVEVNUykKLSNkZWZpbmUgRk4oc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCXsgc25hbWUsIG9jaGFyLCBmbGFncyB9LAotI2VuZGlmCi0KLSNpZm5kZWYgRjAKLSNkZWZpbmUgRjAgRk4KLSNlbmRpZgotCi0vKgotICogc3BlY2lhbCBjYXNlcyAoc2VlIHBhcnNlX2FyZ3MoKSk6IC1BLCAtbywgLXMKLSAqCi0gKiBvcHRpb25zIGFyZSBzb3J0ZWQgYnkgdGhlaXIgbG9uZ25hbWVzCi0gKi8KLQotLyogLWEJYWxsIG5ldyBwYXJhbWV0ZXJzIGFyZSBjcmVhdGVkIHdpdGggdGhlIGV4cG9ydCBhdHRyaWJ1dGUgKi8KLUYwKCJhbGxleHBvcnQiLCBGRVhQT1JULCAnYScsIE9GX0FOWSkKLQotLyogLi8uCWJhY2t3YXJkcyBjb21wYXQ6IGR1bW15LCBlbWl0cyBhIHdhcm5pbmcgKi8KLUZOKCJhcmM0cmFuZG9tIiwgRkFSQzRSQU5ET00sIDAsIE9GX0FOWSkKLQotI2lmIEhBVkVfTklDRQotLyogLi8uCWJnbmljZSAqLwotRk4oImJnbmljZSIsIEZCR05JQ0UsIDAsIE9GX0FOWSkKLSNlbmRpZgotCi0vKiAuLy4JZW5hYmxlIHt9IGdsb2JiaW5nIChub24tc3RhbmRhcmQpICovCi1GTigiYnJhY2VleHBhbmQiLCBGQlJBQ0VFWFBBTkQsIDAsIE9GX0FOWSkKLQotLyogLi8uCUVtYWNzIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUgKi8KLUZOKCJlbWFjcyIsIEZFTUFDUywgMCwgT0ZfQU5ZKQotCi0vKiAtZQlxdWl0IG9uIGVycm9yICovCi1GTigiZXJyZXhpdCIsIEZFUlJFWElULCAnZScsIE9GX0FOWSkKLQotLyogLi8uCUVtYWNzIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUsIGdtYWNzIHZhcmlhbnQgKi8KLUZOKCJnbWFjcyIsIEZHTUFDUywgMCwgT0ZfQU5ZKQotCi0vKiAuLy4JcmVhZGluZyBFT0YgZG9lcyBub3QgZXhpdCAqLwotRk4oImlnbm9yZWVvZiIsIEZJR05PUkVFT0YsIDAsIE9GX0FOWSkKLQotLyogLWkJaW50ZXJhY3RpdmUgc2hlbGwgKi8KLUZOKCJpbnRlcmFjdGl2ZSIsIEZUQUxLSU5HLCAnaScsIE9GX0NNRExJTkUpCi0KLS8qIC1rCW5hbWU9dmFsdWUgYXJlIHJlY29nbmlzZWQgYW55d2hlcmUgKi8KLUZOKCJrZXl3b3JkIiwgRktFWVdPUkQsICdrJywgT0ZfQU5ZKQotCi0vKiAtbAlsb2dpbiBzaGVsbCAqLwotRk4oImxvZ2luIiwgRkxPR0lOLCAnbCcsIE9GX0NNRExJTkUpCi0KLS8qIC1YCW1hcmsgZGlycyB3aXRoIC8gaW4gZmlsZSBuYW1lIGNvbXBsZXRpb24gKi8KLUZOKCJtYXJrZGlycyIsIEZNQVJLRElSUywgJ1gnLCBPRl9BTlkpCi0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0vKiAtbQlqb2IgY29udHJvbCBtb25pdG9yaW5nICovCi1GTigibW9uaXRvciIsIEZNT05JVE9SLCAnbScsIE9GX0FOWSkKLSNlbmRpZgotCi0vKiAtQwlkb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi8KLUZOKCJub2Nsb2JiZXIiLCBGTk9DTE9CQkVSLCAnQycsIE9GX0FOWSkKLQotLyogLW4JZG9uJ3QgZXhlY3V0ZSBhbnkgY29tbWFuZHMgKi8KLUZOKCJub2V4ZWMiLCBGTk9FWEVDLCAnbicsIE9GX0FOWSkKLQotLyogLWYJZG9uJ3QgZG8gZmlsZSBnbG9iYmluZyAqLwotRk4oIm5vZ2xvYiIsIEZOT0dMT0IsICdmJywgT0ZfQU5ZKQotCi0vKiAuLy4JZG9uJ3Qga2lsbCBydW5uaW5nIGpvYnMgd2hlbiBsb2dpbiBzaGVsbCBleGl0cyAqLwotRk4oIm5vaHVwIiwgRk5PSFVQLCAwLCBPRl9BTlkpCi0KLS8qIC4vLglkb24ndCBzYXZlIGZ1bmN0aW9ucyBpbiBoaXN0b3J5IChubyBlZmZlY3QpICovCi1GTigibm9sb2ciLCBGTk9MT0csIDAsIE9GX0FOWSkKLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLS8qIC1iCWFzeW5jaHJvbm91cyBqb2IgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KLUZOKCJub3RpZnkiLCBGTk9USUZZLCAnYicsIE9GX0FOWSkKLSNlbmRpZgotCi0vKiAtdQl1c2luZyBhbiB1bnNldCB2YXJpYWJsZSBpcyBhbiBlcnJvciAqLwotRk4oIm5vdW5zZXQiLCBGTk9VTlNFVCwgJ3UnLCBPRl9BTlkpCi0KLS8qIC4vLglkb24ndCBkbyBsb2dpY2FsIGNkcy9wd2RzIChub24tc3RhbmRhcmQpICovCi1GTigicGh5c2ljYWwiLCBGUEhZU0lDQUwsIDAsIE9GX0FOWSkKLQotLyogLi8uCXBka3NoIGNvbXBhdDogc29tZXdoYXQgbW9yZSBQT1NJWGlzaCBtb2RlIChub24tc3RhbmRhcmQpICovCi1GTigicG9zaXgiLCBGUE9TSVgsIDAsIE9GX0FOWSkKLQotLyogLXAJdXNlIHN1aWRfcHJvZmlsZTsgcHJpdmlsZWdlZCBzaGVsbCAqLwotRk4oInByaXZpbGVnZWQiLCBGUFJJVklMRUdFRCwgJ3AnLCBPRl9BTlkpCi0KLS8qIC1yCXJlc3RyaWN0ZWQgc2hlbGwgKi8KLUZOKCJyZXN0cmljdGVkIiwgRlJFU1RSSUNURUQsICdyJywgT0ZfQ01ETElORSkKLQotLyogLi8uCXBka3NoIGNvbXBhdDogY2FsbGVkIGFzIHNoIG5vdCBta3NoOyBrbHVkZ2UgbW9kZSAobm9uLXN0YW5kYXJkKSAqLwotRk4oInNoIiwgRlNILCAwLCBPRl9BTlkpCi0KLS8qIC1zCShpbnZvY2F0aW9uKSBwYXJzZSBzdGRpbiAocHNldWRvIG5vbi1zdGFuZGFyZCkgKi8KLUZOKCJzdGRpbiIsIEZTVERJTiwgJ3MnLCBPRl9DTURMSU5FKQotCi0vKiAtaAljcmVhdGUgdHJhY2tlZCBhbGlhc2VzIGZvciBhbGwgY29tbWFuZHMgKi8KLUZOKCJ0cmFja2FsbCIsIEZUUkFDS0FMTCwgJ2gnLCBPRl9BTlkpCi0KLS8qIC1VCWVuYWJsZSBVVEYtOCBwcm9jZXNzaW5nIChub24tc3RhbmRhcmQpICovCi1GTigidXRmOC1tb2RlIiwgRlVOSUNPREUsICdVJywgT0ZfQU5ZKQotCi0vKiAtdgllY2hvIGlucHV0ICovCi1GTigidmVyYm9zZSIsIEZWRVJCT1NFLCAndicsIE9GX0FOWSkKLQotI2lmICFNS1NIX1NfTk9WSQotLyogLi8uCVZpIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUgKi8KLUZOKCJ2aSIsIEZWSSwgMCwgT0ZfQU5ZKQotCi0vKiAuLy4JZW5hYmxlIEVTQyBhcyBmaWxlIG5hbWUgY29tcGxldGlvbiBjaGFyYWN0ZXIgKG5vbi1zdGFuZGFyZCkgKi8KLUZOKCJ2aS1lc2Njb21wbGV0ZSIsIEZWSUVTQ0NPTVBMRVRFLCAwLCBPRl9BTlkpCi0KLS8qIC4vLgllbmFibGUgVGFiIGFzIGZpbGUgbmFtZSBjb21wbGV0aW9uIGNoYXJhY3RlciAobm9uLXN0YW5kYXJkKSAqLwotRk4oInZpLXRhYmNvbXBsZXRlIiwgRlZJVEFCQ09NUExFVEUsIDAsIE9GX0FOWSkKLQotLyogLi8uCWFsd2F5cyByZWFkIGluIHJhdyBtb2RlIChubyBlZmZlY3QpICovCi1GTigidmlyYXciLCBGVklSQVcsIDAsIE9GX0FOWSkKLSNlbmRpZgotCi0vKiAteAlleGVjdXRpb24gdHJhY2UgKGRpc3BsYXkgY29tbWFuZHMgYXMgdGhleSBhcmUgcnVuKSAqLwotRk4oInh0cmFjZSIsIEZYVFJBQ0UsICd4JywgT0ZfQU5ZKQotCi0vKiAtYwkoaW52b2NhdGlvbikgZXhlY3V0ZSBzcGVjaWZpZWQgY29tbWFuZCAqLwotRk4oTlVMTCwgRkNPTU1BTkQsICdjJywgT0ZfQ01ETElORSkKLQotLyoKLSAqIGFub255bW91cyBmbGFnczogdXNlZCBpbnRlcm5hbGx5IGJ5IHNoZWxsIG9ubHkgKG5vdCB2aXNpYmxlIHRvIHVzZXIpCi0gKi8KLQotLyogLi8uCShpbnRlcm5hbCkgaW5pdGlhbCBzaGVsbCB3YXMgaW50ZXJhY3RpdmUgKi8KLUZOKE5VTEwsIEZUQUxLSU5HX0ksIDAsIE9GX0lOVEVSTkFMKQotCi0jdW5kZWYgRk4KLSN1bmRlZiBGMAotI3VuZGVmIFNIRkxBR1NfREVGTlMKLSN1bmRlZiBTSEZMQUdTX0VOVU1TCi0jdW5kZWYgU0hGTEFHU19JVEVNUwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2hmLmMgYi9ta3NoL3NyYy9zaGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2Mjc1Mi4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9zaGYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHNoZi5jLHYgMS4xNSAyMDA2LzA0LzAyIDAwOjQ4OjMzIGRlcmFhZHQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zaGYuYyx2IDEuMzYgMjAxMC8wNy8xOSAyMjo0MTowNCB0ZyBFeHAgJCIpOwotCi0vKiBmbGFncyB0byBzaGZfZW1wdHlidWYoKSAqLwotI2RlZmluZSBFQl9SRUFEU1cJMHgwMQkvKiBhYm91dCB0byBzd2l0Y2ggdG8gcmVhZGluZyAqLwotI2RlZmluZSBFQl9HUk9XCQkweDAyCS8qIGdyb3cgYnVmZmVyIGlmIG5lY2Vzc2FyeSAoU1RSSU5HK0RZTkFNSUMpICovCi0KLS8qCi0gKiBSZXBsYWNlbWVudCBzdGRpbyByb3V0aW5lcy4gU3RkaW8gaXMgdG9vIGZsYWtleSBvbiB0b28gbWFueSBtYWNoaW5lcwotICogdG8gYmUgdXNlZnVsIHdoZW4geW91IGhhdmUgbXVsdGlwbGUgcHJvY2Vzc2VzIHVzaW5nIHRoZSBzYW1lIHVuZGVybHlpbmcKLSAqIGZpbGUgZGVzY3JpcHRvcnMuCi0gKi8KLQotc3RhdGljIGludCBzaGZfZmlsbGJ1ZihzdHJ1Y3Qgc2hmICopOwotc3RhdGljIGludCBzaGZfZW1wdHlidWYoc3RydWN0IHNoZiAqLCBpbnQpOwotCi0vKiBPcGVuIGEgZmlsZS4gRmlyc3QgdGhyZWUgYXJncyBhcmUgZm9yIG9wZW4oKSwgbGFzdCBhcmcgaXMgZmxhZ3MgZm9yCi0gKiB0aGlzIHBhY2thZ2UuIFJldHVybnMgTlVMTCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQsIG9yIGlmIGEgZHVwCi0gKiBmYWlscy4KLSAqLwotc3RydWN0IHNoZiAqCi1zaGZfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgb2ZsYWdzLCBpbnQgbW9kZSwgaW50IHNmbGFncykKLXsKLQlzdHJ1Y3Qgc2hmICpzaGY7Ci0JaW50IGJzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gKHNmbGFncyAmIFNIRl9SRCA/IDEgOiAwKSA6IFNIRl9CU0laRTsKLQlpbnQgZmQ7Ci0KLQkvKiBEb25lIGJlZm9yZSBvcGVuIHNvIGlmIGFsbG9jYSBmYWlscywgZmQgd29uJ3QgYmUgbG9zdC4gKi8KLQlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZikgKyBic2l6ZSwgQVRFTVApOwotCXNoZi0+YXJlYXAgPSBBVEVNUDsKLQlzaGYtPmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopJnNoZlsxXTsKLQlzaGYtPmJzaXplID0gYnNpemU7Ci0Jc2hmLT5mbGFncyA9IFNIRl9BTExPQ1M7Ci0JLyogUmVzdCBmaWxsZWQgaW4gYnkgcmVvcGVuLiAqLwotCi0JZmQgPSBvcGVuKG5hbWUsIG9mbGFncywgbW9kZSk7Ci0JaWYgKGZkIDwgMCkgewotCQlhZnJlZShzaGYsIHNoZi0+YXJlYXApOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlpZiAoKHNmbGFncyAmIFNIRl9NQVBISSkgJiYgZmQgPCBGREJBU0UpIHsKLQkJaW50IG5mZDsKLQotCQluZmQgPSBmY250bChmZCwgRl9EVVBGRCwgRkRCQVNFKTsKLQkJY2xvc2UoZmQpOwotCQlpZiAobmZkIDwgMCkgewotCQkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJZmQgPSBuZmQ7Ci0JfQotCXNmbGFncyAmPSB+U0hGX0FDQ01PREU7Ci0Jc2ZsYWdzIHw9IChvZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZID8gU0hGX1JEIDoKLQkgICAgKChvZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZID8gU0hGX1dSIDogU0hGX1JEV1IpOwotCi0JcmV0dXJuIChzaGZfcmVvcGVuKGZkLCBzZmxhZ3MsIHNoZikpOwotfQotCi0vKiBTZXQgdXAgdGhlIHNoZiBzdHJ1Y3R1cmUgZm9yIGEgZmlsZSBkZXNjcmlwdG9yLiBEb2Vzbid0IGZhaWwuICovCi1zdHJ1Y3Qgc2hmICoKLXNoZl9mZG9wZW4oaW50IGZkLCBpbnQgc2ZsYWdzLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaW50IGJzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gKHNmbGFncyAmIFNIRl9SRCA/IDEgOiAwKSA6IFNIRl9CU0laRTsKLQotCS8qIHVzZSBmY250bCgpIHRvIGZpZ3VyZSBvdXQgY29ycmVjdCByZWFkL3dyaXRlIGZsYWdzICovCi0JaWYgKHNmbGFncyAmIFNIRl9HRVRGTCkgewotCQlpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7Ci0KLQkJaWYgKGZsYWdzIDwgMCkKLQkJCS8qIHdpbGwgZ2V0IGFuIGVycm9yIG9uIGZpcnN0IHJlYWQvd3JpdGUgKi8KLQkJCXNmbGFncyB8PSBTSEZfUkRXUjsKLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGZsYWdzICYgT19BQ0NNT0RFKSB7Ci0JCQljYXNlIE9fUkRPTkxZOgotCQkJCXNmbGFncyB8PSBTSEZfUkQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9fV1JPTkxZOgotCQkJCXNmbGFncyB8PSBTSEZfV1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9fUkRXUjoKLQkJCQlzZmxhZ3MgfD0gU0hGX1JEV1I7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIShzZmxhZ3MgJiAoU0hGX1JEIHwgU0hGX1dSKSkpCi0JCWludGVybmFsX2Vycm9yZigic2hmX2Zkb3BlbjogbWlzc2luZyByZWFkL3dyaXRlIik7Ci0KLQlpZiAoc2hmKSB7Ci0JCWlmIChic2l6ZSkgewotCQkJc2hmLT5idWYgPSBhbGxvYyhic2l6ZSwgQVRFTVApOwotCQkJc2ZsYWdzIHw9IFNIRl9BTExPQ0I7Ci0JCX0gZWxzZQotCQkJc2hmLT5idWYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXNoZiA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hmKSArIGJzaXplLCBBVEVNUCk7Ci0JCXNoZi0+YnVmID0gKHVuc2lnbmVkIGNoYXIgKikmc2hmWzFdOwotCQlzZmxhZ3MgfD0gU0hGX0FMTE9DUzsKLQl9Ci0Jc2hmLT5hcmVhcCA9IEFURU1QOwotCXNoZi0+ZmQgPSBmZDsKLQlzaGYtPnJwID0gc2hmLT53cCA9IHNoZi0+YnVmOwotCXNoZi0+cm5sZWZ0ID0gMDsKLQlzaGYtPnJic2l6ZSA9IGJzaXplOwotCXNoZi0+d25sZWZ0ID0gMDsgLyogZm9yY2UgY2FsbCB0byBzaGZfZW1wdHlidWYoKSAqLwotCXNoZi0+d2JzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gMCA6IGJzaXplOwotCXNoZi0+ZmxhZ3MgPSBzZmxhZ3M7Ci0Jc2hmLT5lcnJub18gPSAwOwotCXNoZi0+YnNpemUgPSBic2l6ZTsKLQlpZiAoc2ZsYWdzICYgU0hGX0NMRVhFQykKLQkJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotCXJldHVybiAoc2hmKTsKLX0KLQotLyogU2V0IHVwIGFuIGV4aXN0aW5nIHNoZiAoYW5kIGJ1ZmZlcikgdG8gdXNlIHRoZSBnaXZlbiBmZCAqLwotc3RydWN0IHNoZiAqCi1zaGZfcmVvcGVuKGludCBmZCwgaW50IHNmbGFncywgc3RydWN0IHNoZiAqc2hmKQotewotCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7Ci0KLQkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgb3V0IGNvcnJlY3QgcmVhZC93cml0ZSBmbGFncyAqLwotCWlmIChzZmxhZ3MgJiBTSEZfR0VURkwpIHsKLQkJaW50IGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOwotCi0JCWlmIChmbGFncyA8IDApCi0JCQkvKiB3aWxsIGdldCBhbiBlcnJvciBvbiBmaXJzdCByZWFkL3dyaXRlICovCi0JCQlzZmxhZ3MgfD0gU0hGX1JEV1I7Ci0JCWVsc2UgewotCQkJc3dpdGNoIChmbGFncyAmIE9fQUNDTU9ERSkgewotCQkJY2FzZSBPX1JET05MWToKLQkJCQlzZmxhZ3MgfD0gU0hGX1JEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPX1dST05MWToKLQkJCQlzZmxhZ3MgfD0gU0hGX1dSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPX1JEV1I6Ci0JCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCEoc2ZsYWdzICYgKFNIRl9SRCB8IFNIRl9XUikpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZW9wZW46IG1pc3NpbmcgcmVhZC93cml0ZSIpOwotCWlmICghc2hmIHx8ICFzaGYtPmJ1ZiB8fCBzaGYtPmJzaXplIDwgYnNpemUpCi0JCWludGVybmFsX2Vycm9yZigic2hmX3Jlb3BlbjogYmFkIHNoZi9idWYvYnNpemUiKTsKLQotCS8qIGFzc3VtZXMgc2hmLT5idWYgYW5kIHNoZi0+YnNpemUgYWxyZWFkeSBzZXQgdXAgKi8KLQlzaGYtPmZkID0gZmQ7Ci0Jc2hmLT5ycCA9IHNoZi0+d3AgPSBzaGYtPmJ1ZjsKLQlzaGYtPnJubGVmdCA9IDA7Ci0Jc2hmLT5yYnNpemUgPSBic2l6ZTsKLQlzaGYtPndubGVmdCA9IDA7IC8qIGZvcmNlIGNhbGwgdG8gc2hmX2VtcHR5YnVmKCkgKi8KLQlzaGYtPndic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IDAgOiBic2l6ZTsKLQlzaGYtPmZsYWdzID0gKHNoZi0+ZmxhZ3MgJiAoU0hGX0FMTE9DUyB8IFNIRl9BTExPQ0IpKSB8IHNmbGFnczsKLQlzaGYtPmVycm5vXyA9IDA7Ci0JaWYgKHNmbGFncyAmIFNIRl9DTEVYRUMpCi0JCWZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQlyZXR1cm4gKHNoZik7Ci19Ci0KLS8qIE9wZW4gYSBzdHJpbmcgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gSWYgcmVhZGluZywgYnNpemUgaXMgdGhlIG51bWJlcgotICogb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZC4gSWYgd3JpdGluZywgYnNpemUgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gKiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuLiBJZiBzaGYgaXMgbm90IG51bGwsIGl0IGlzIGZpbGxlZCBpbiBhbmQKLSAqIHJldHVybmVkLCBpZiBpdCBpcyBudWxsLCBzaGYgaXMgYWxsb2NhdGVkLiBJZiB3cml0aW5nIGFuZCBidWYgaXMgbnVsbAotICogYW5kIFNIRl9EWU5BTUlDIGlzIHNldCwgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgKGlmIGJzaXplID4gMCwgaXQgaXMKLSAqIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNpemUpLiBEb2Vzbid0IGZhaWwuCi0gKiBXaGVuIHdyaXRpbmcsIGEgYnl0ZSBpcyByZXNlcnZlZCBmb3IgYSB0cmFpbGluZyBudWxsIC0gc2VlIHNoZl9zY2xvc2UoKS4KLSAqLwotc3RydWN0IHNoZiAqCi1zaGZfc29wZW4oY2hhciAqYnVmLCBpbnQgYnNpemUsIGludCBzZmxhZ3MsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQkvKiBjYW4ndCBoYXZlIGEgcmVhZCt3cml0ZSBzdHJpbmcgKi8KLQlpZiAoISghKHNmbGFncyAmIFNIRl9SRCkgXiAhKHNmbGFncyAmIFNIRl9XUikpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9zb3BlbjogZmxhZ3MgMHgleCIsIHNmbGFncyk7Ci0KLQlpZiAoIXNoZikgewotCQlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZiksIEFURU1QKTsKLQkJc2ZsYWdzIHw9IFNIRl9BTExPQ1M7Ci0JfQotCXNoZi0+YXJlYXAgPSBBVEVNUDsKLQlpZiAoIWJ1ZiAmJiAoc2ZsYWdzICYgU0hGX1dSKSAmJiAoc2ZsYWdzICYgU0hGX0RZTkFNSUMpKSB7Ci0JCWlmIChic2l6ZSA8PSAwKQotCQkJYnNpemUgPSA2NDsKLQkJc2ZsYWdzIHw9IFNIRl9BTExPQ0I7Ci0JCWJ1ZiA9IGFsbG9jKGJzaXplLCBzaGYtPmFyZWFwKTsKLQl9Ci0Jc2hmLT5mZCA9IC0xOwotCXNoZi0+YnVmID0gc2hmLT5ycCA9IHNoZi0+d3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKLQlzaGYtPnJubGVmdCA9IGJzaXplOwotCXNoZi0+cmJzaXplID0gYnNpemU7Ci0Jc2hmLT53bmxlZnQgPSBic2l6ZSAtIDE7CS8qIHNwYWNlIGZvciBhICdcMCcgKi8KLQlzaGYtPndic2l6ZSA9IGJzaXplOwotCXNoZi0+ZmxhZ3MgPSBzZmxhZ3MgfCBTSEZfU1RSSU5HOwotCXNoZi0+ZXJybm9fID0gMDsKLQlzaGYtPmJzaXplID0gYnNpemU7Ci0KLQlyZXR1cm4gKHNoZik7Ci19Ci0KLS8qIEZsdXNoIGFuZCBjbG9zZSBmaWxlIGRlc2NyaXB0b3IsIGZyZWUgdGhlIHNoZiBzdHJ1Y3R1cmUgKi8KLWludAotc2hmX2Nsb3NlKHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChzaGYtPmZkID49IDApIHsKLQkJcmV0ID0gc2hmX2ZsdXNoKHNoZik7Ci0JCWlmIChjbG9zZShzaGYtPmZkKSA8IDApCi0JCQlyZXQgPSBFT0Y7Ci0JfQotCWlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DUykKLQkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKLQllbHNlIGlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DQikKLQkJYWZyZWUoc2hmLT5idWYsIHNoZi0+YXJlYXApOwotCi0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBGbHVzaCBhbmQgY2xvc2UgZmlsZSBkZXNjcmlwdG9yLCBkb24ndCBmcmVlIGZpbGUgc3RydWN0dXJlICovCi1pbnQKLXNoZl9mZGNsb3NlKHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChzaGYtPmZkID49IDApIHsKLQkJcmV0ID0gc2hmX2ZsdXNoKHNoZik7Ci0JCWlmIChjbG9zZShzaGYtPmZkKSA8IDApCi0JCQlyZXQgPSBFT0Y7Ci0JCXNoZi0+cm5sZWZ0ID0gMDsKLQkJc2hmLT5ycCA9IHNoZi0+YnVmOwotCQlzaGYtPndubGVmdCA9IDA7Ci0JCXNoZi0+ZmQgPSAtMTsKLQl9Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIENsb3NlIGEgc3RyaW5nIC0gaWYgaXQgd2FzIG9wZW5lZCBmb3Igd3JpdGluZywgaXQgaXMgbnVsbCB0ZXJtaW5hdGVkOwotICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBhbmQgZnJlZXMgc2hmIGlmIGl0IHdhcyBhbGxvY2F0ZWQKLSAqIChkb2VzIG5vdCBmcmVlIHN0cmluZyBpZiBpdCB3YXMgYWxsb2NhdGVkKS4KLSAqLwotY2hhciAqCi1zaGZfc2Nsb3NlKHN0cnVjdCBzaGYgKnNoZikKLXsKLQl1bnNpZ25lZCBjaGFyICpzID0gc2hmLT5idWY7Ci0KLQkvKiBudWxsIHRlcm1pbmF0ZSAqLwotCWlmIChzaGYtPmZsYWdzICYgU0hGX1dSKSB7Ci0JCXNoZi0+d25sZWZ0Kys7Ci0JCXNoZl9wdXRjKCdcMCcsIHNoZik7Ci0JfQotCWlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DUykKLQkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKLQlyZXR1cm4gKChjaGFyICopcyk7Ci19Ci0KLS8qIFVuLXJlYWQgd2hhdCBoYXMgYmVlbiByZWFkIGJ1dCBub3QgZXhhbWluZWQsIG9yIHdyaXRlIHdoYXQgaGFzIGJlZW4KLSAqIGJ1ZmZlcmVkLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIEVPRiBmb3IgKHdyaXRlKSBlcnJvci4KLSAqLwotaW50Ci1zaGZfZmx1c2goc3RydWN0IHNoZiAqc2hmKQotewotCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykKLQkJcmV0dXJuICgoc2hmLT5mbGFncyAmIFNIRl9XUikgPyBFT0YgOiAwKTsKLQotCWlmIChzaGYtPmZkIDwgMCkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZmx1c2g6IG5vIGZkIik7Ci0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgewotCQllcnJubyA9IHNoZi0+ZXJybm9fOwotCQlyZXR1cm4gKEVPRik7Ci0JfQotCi0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfUkVBRElORykgewotCQlzaGYtPmZsYWdzICY9IH4oU0hGX0VPRiB8IFNIRl9SRUFESU5HKTsKLQkJaWYgKHNoZi0+cm5sZWZ0ID4gMCkgewotCQkJbHNlZWsoc2hmLT5mZCwgKG9mZl90KS1zaGYtPnJubGVmdCwgU0VFS19DVVIpOwotCQkJc2hmLT5ybmxlZnQgPSAwOwotCQkJc2hmLT5ycCA9IHNoZi0+YnVmOwotCQl9Ci0JCXJldHVybiAoMCk7Ci0JfSBlbHNlIGlmIChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpCi0JCXJldHVybiAoc2hmX2VtcHR5YnVmKHNoZiwgMCkpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyogV3JpdGUgb3V0IGFueSBidWZmZXJlZCBkYXRhLiBJZiBjdXJyZW50bHkgcmVhZGluZywgZmx1c2hlcyB0aGUgcmVhZAotICogYnVmZmVyLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIEVPRiBmb3IgKHdyaXRlKSBlcnJvci4KLSAqLwotc3RhdGljIGludAotc2hmX2VtcHR5YnVmKHN0cnVjdCBzaGYgKnNoZiwgaW50IGZsYWdzKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpICYmIHNoZi0+ZmQgPCAwKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9lbXB0eWJ1Zjogbm8gZmQiKTsKLQotCWlmIChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKSB7Ci0JCWVycm5vID0gc2hmLT5lcnJub187Ci0JCXJldHVybiAoRU9GKTsKLQl9Ci0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9SRUFESU5HKSB7Ci0JCWlmIChmbGFncyAmIEVCX1JFQURTVykgLyogZG9lc24ndCBoYXBwZW4gKi8KLQkJCXJldHVybiAoMCk7Ci0JCXJldCA9IHNoZl9mbHVzaChzaGYpOwotCQlzaGYtPmZsYWdzICY9IH5TSEZfUkVBRElORzsKLQl9Ci0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKm5idWY7Ci0KLQkJLyogTm90ZSB0aGF0IHdlIGFzc3VtZSBTSEZfQUxMT0NTIGlzIG5vdCBzZXQgaWYgU0hGX0FMTE9DQgotCQkgKiBpcyBzZXQuLi4gKGNoYW5naW5nIHRoZSBzaGYgcG9pbnRlciBjb3VsZCBjYXVzZSBwcm9ibGVtcykKLQkJICovCi0JCWlmICghKGZsYWdzICYgRUJfR1JPVykgfHwgIShzaGYtPmZsYWdzICYgU0hGX0RZTkFNSUMpIHx8Ci0JCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfQUxMT0NCKSkKLQkJCXJldHVybiAoRU9GKTsKLQkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBmb3IgYnVmZmVyICovCi0JCW5idWYgPSBhcmVzaXplKHNoZi0+YnVmLCAyICogc2hmLT53YnNpemUsIHNoZi0+YXJlYXApOwotCQlzaGYtPnJwID0gbmJ1ZiArIChzaGYtPnJwIC0gc2hmLT5idWYpOwotCQlzaGYtPndwID0gbmJ1ZiArIChzaGYtPndwIC0gc2hmLT5idWYpOwotCQlzaGYtPnJic2l6ZSArPSBzaGYtPndic2l6ZTsKLQkJc2hmLT53bmxlZnQgKz0gc2hmLT53YnNpemU7Ci0JCXNoZi0+d2JzaXplICo9IDI7Ci0JCXNoZi0+YnVmID0gbmJ1ZjsKLQl9IGVsc2UgewotCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKSB7Ci0JCQlpbnQgbnRvd3JpdGUgPSBzaGYtPndwIC0gc2hmLT5idWY7Ci0JCQl1bnNpZ25lZCBjaGFyICpidWYgPSBzaGYtPmJ1ZjsKLQkJCWludCBuOwotCi0JCQl3aGlsZSAobnRvd3JpdGUgPiAwKSB7Ci0JCQkJbiA9IHdyaXRlKHNoZi0+ZmQsIGJ1ZiwgbnRvd3JpdGUpOwotCQkJCWlmIChuIDwgMCkgewotCQkJCQlpZiAoZXJybm8gPT0gRUlOVFIgJiYKLQkJCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOwotCQkJCQlzaGYtPmVycm5vXyA9IGVycm5vOwotCQkJCQlzaGYtPndubGVmdCA9IDA7Ci0JCQkJCWlmIChidWYgIT0gc2hmLT5idWYpIHsKLQkJCQkJCS8qIGFsbG93IGEgc2Vjb25kIGZsdXNoCi0JCQkJCQkgKiB0byB3b3JrICovCi0JCQkJCQltZW1tb3ZlKHNoZi0+YnVmLCBidWYsCi0JCQkJCQkgICAgbnRvd3JpdGUpOwotCQkJCQkJc2hmLT53cCA9IHNoZi0+YnVmICsgbnRvd3JpdGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIChFT0YpOwotCQkJCX0KLQkJCQlidWYgKz0gbjsKLQkJCQludG93cml0ZSAtPSBuOwotCQkJfQotCQkJaWYgKGZsYWdzICYgRUJfUkVBRFNXKSB7Ci0JCQkJc2hmLT53cCA9IHNoZi0+YnVmOwotCQkJCXNoZi0+d25sZWZ0ID0gMDsKLQkJCQlzaGYtPmZsYWdzICY9IH5TSEZfV1JJVElORzsKLQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQl9Ci0JCXNoZi0+d3AgPSBzaGYtPmJ1ZjsKLQkJc2hmLT53bmxlZnQgPSBzaGYtPndic2l6ZTsKLQl9Ci0Jc2hmLT5mbGFncyB8PSBTSEZfV1JJVElORzsKLQotCXJldHVybiAocmV0KTsKLX0KLQotLyogRmlsbCB1cCBhIHJlYWQgYnVmZmVyLiBSZXR1cm5zIEVPRiBmb3IgYSByZWFkIGVycm9yLCAwIG90aGVyd2lzZS4gKi8KLXN0YXRpYyBpbnQKLXNoZl9maWxsYnVmKHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpCi0JCXJldHVybiAoMCk7Ci0KLQlpZiAoc2hmLT5mZCA8IDApCi0JCWludGVybmFsX2Vycm9yZigic2hmX2ZpbGxidWY6IG5vIGZkIik7Ci0KLQlpZiAoc2hmLT5mbGFncyAmIChTSEZfRU9GIHwgU0hGX0VSUk9SKSkgewotCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikKLQkJCWVycm5vID0gc2hmLT5lcnJub187Ci0JCXJldHVybiAoRU9GKTsKLQl9Ci0KLQlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfUkVBRFNXKSA9PSBFT0YpCi0JCXJldHVybiAoRU9GKTsKLQotCXNoZi0+ZmxhZ3MgfD0gU0hGX1JFQURJTkc7Ci0KLQlzaGYtPnJwID0gc2hmLT5idWY7Ci0Jd2hpbGUgKDEpIHsKLQkJc2hmLT5ybmxlZnQgPSBibG9ja2luZ19yZWFkKHNoZi0+ZmQsIChjaGFyICopIHNoZi0+YnVmLAotCQkgICAgc2hmLT5yYnNpemUpOwotCQlpZiAoc2hmLT5ybmxlZnQgPCAwICYmIGVycm5vID09IEVJTlRSICYmCi0JCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKLQkJCWNvbnRpbnVlOwotCQlicmVhazsKLQl9Ci0JaWYgKHNoZi0+cm5sZWZ0IDw9IDApIHsKLQkJaWYgKHNoZi0+cm5sZWZ0IDwgMCkgewotCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7Ci0JCQlzaGYtPmVycm5vXyA9IGVycm5vOwotCQkJc2hmLT5ybmxlZnQgPSAwOwotCQkJc2hmLT5ycCA9IHNoZi0+YnVmOwotCQkJcmV0dXJuIChFT0YpOwotCQl9Ci0JCXNoZi0+ZmxhZ3MgfD0gU0hGX0VPRjsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogUmVhZCBhIGJ1ZmZlciBmcm9tIHNoZi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byBidWYsCi0gKiBpZiBubyBieXRlcyB3ZXJlIHJlYWQsIHJldHVybnMgMCBpZiBlbmQgb2YgZmlsZSB3YXMgc2VlbiwgRU9GIGlmCi0gKiBhIHJlYWQgZXJyb3Igb2NjdXJyZWQuCi0gKi8KLWludAotc2hmX3JlYWQoY2hhciAqYnVmLCBpbnQgYnNpemUsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgb3JpZ19ic2l6ZSA9IGJzaXplOwotCWludCBuY29weTsKLQotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZWFkOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOwotCi0JaWYgKGJzaXplIDw9IDApCi0JCWludGVybmFsX2Vycm9yZigic2hmX3JlYWQ6IGJzaXplICVkIiwgYnNpemUpOwotCi0Jd2hpbGUgKGJzaXplID4gMCkgewotCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCAmJgotCQkgICAgKHNoZl9maWxsYnVmKHNoZikgPT0gRU9GIHx8IHNoZi0+cm5sZWZ0ID09IDApKQotCQkJYnJlYWs7Ci0JCW5jb3B5ID0gc2hmLT5ybmxlZnQ7Ci0JCWlmIChuY29weSA+IGJzaXplKQotCQkJbmNvcHkgPSBic2l6ZTsKLQkJbWVtY3B5KGJ1Ziwgc2hmLT5ycCwgbmNvcHkpOwotCQlidWYgKz0gbmNvcHk7Ci0JCWJzaXplIC09IG5jb3B5OwotCQlzaGYtPnJwICs9IG5jb3B5OwotCQlzaGYtPnJubGVmdCAtPSBuY29weTsKLQl9Ci0JLyogTm90ZTogZnJlYWQoM1MpIHJldHVybnMgMCBmb3IgZXJyb3JzIC0gdGhpcyBkb2Vzbid0ICovCi0JcmV0dXJuIChvcmlnX2JzaXplID09IGJzaXplID8gKHNoZl9lcnJvcihzaGYpID8gRU9GIDogMCkgOgotCSAgICBvcmlnX2JzaXplIC0gYnNpemUpOwotfQotCi0vKiBSZWFkIHVwIHRvIGEgbmV3bGluZSBvciBFT0YuIFRoZSBuZXdsaW5lIGlzIHB1dCBpbiBidWY7IGJ1ZiBpcyBhbHdheXMKLSAqIG51bGwgdGVybWluYXRlZC4gUmV0dXJucyBOVUxMIG9uIHJlYWQgZXJyb3Igb3IgaWYgbm90aGluZyB3YXMgcmVhZCBiZWZvcmUKLSAqIGVuZCBvZiBmaWxlLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbnVsbCBieXRlIGluIGJ1ZiBvdGhlcndpc2UuCi0gKi8KLWNoYXIgKgotc2hmX2dldHNlKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JdW5zaWduZWQgY2hhciAqZW5kOwotCWludCBuY29weTsKLQljaGFyICpvcmlnX2J1ZiA9IGJ1ZjsKLQotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9nZXRzZTogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKLQotCWlmIChic2l6ZSA8PSAwKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JLS1ic2l6ZTsJLyogc2F2ZSByb29tIGZvciBudWxsICovCi0JZG8gewotCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCkgewotCQkJaWYgKHNoZl9maWxsYnVmKHNoZikgPT0gRU9GKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCkgewotCQkJCSpidWYgPSAnXDAnOwotCQkJCXJldHVybiAoYnVmID09IG9yaWdfYnVmID8gTlVMTCA6IGJ1Zik7Ci0JCQl9Ci0JCX0KLQkJZW5kID0gKHVuc2lnbmVkIGNoYXIgKiltZW1jaHIoKGNoYXIgKikgc2hmLT5ycCwgJ1xuJywKLQkJICAgIHNoZi0+cm5sZWZ0KTsKLQkJbmNvcHkgPSBlbmQgPyBlbmQgLSBzaGYtPnJwICsgMSA6IHNoZi0+cm5sZWZ0OwotCQlpZiAobmNvcHkgPiBic2l6ZSkKLQkJCW5jb3B5ID0gYnNpemU7Ci0JCW1lbWNweShidWYsIChjaGFyICopIHNoZi0+cnAsIG5jb3B5KTsKLQkJc2hmLT5ycCArPSBuY29weTsKLQkJc2hmLT5ybmxlZnQgLT0gbmNvcHk7Ci0JCWJ1ZiArPSBuY29weTsKLQkJYnNpemUgLT0gbmNvcHk7Ci0JfSB3aGlsZSAoIWVuZCAmJiBic2l6ZSk7Ci0JKmJ1ZiA9ICdcMCc7Ci0JcmV0dXJuIChidWYpOwotfQotCi0vKiBSZXR1cm5zIHRoZSBjaGFyIHJlYWQuIFJldHVybnMgRU9GIGZvciBlcnJvciBhbmQgZW5kIG9mIGZpbGUuICovCi1pbnQKLXNoZl9nZXRjaGFyKHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZ2V0Y2hhcjogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKLQotCWlmIChzaGYtPnJubGVmdCA9PSAwICYmIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRiB8fCBzaGYtPnJubGVmdCA9PSAwKSkKLQkJcmV0dXJuIChFT0YpOwotCS0tc2hmLT5ybmxlZnQ7Ci0JcmV0dXJuICgqc2hmLT5ycCsrKTsKLX0KLQotLyogUHV0IGEgY2hhcmFjdGVyIGJhY2sgaW4gdGhlIGlucHV0IHN0cmVhbS4gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGlmCi0gKiBzdWNjZXNzZnVsLCBFT0YgaWYgdGhlcmUgaXMgbm8gcm9vbS4KLSAqLwotaW50Ci1zaGZfdW5nZXRjKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCi0JCWludGVybmFsX2Vycm9yZigic2hmX3VuZ2V0YzogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKLQotCWlmICgoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgfHwgYyA9PSBFT0YgfHwKLQkgICAgKHNoZi0+cnAgPT0gc2hmLT5idWYgJiYgc2hmLT5ybmxlZnQpKQotCQlyZXR1cm4gKEVPRik7Ci0KLQlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfUkVBRFNXKSA9PSBFT0YpCi0JCXJldHVybiAoRU9GKTsKLQotCWlmIChzaGYtPnJwID09IHNoZi0+YnVmKQotCQlzaGYtPnJwID0gc2hmLT5idWYgKyBzaGYtPnJic2l6ZTsKLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKLQkJLyogQ2FuIHVuZ2V0IHdoYXQgd2FzIHJlYWQsIGJ1dCBub3Qgc29tZXRoaW5nIGRpZmZlcmVudCAtIHdlCi0JCSAqIGRvbid0IHdhbnQgdG8gbW9kaWZ5IGEgc3RyaW5nLgotCQkgKi8KLQkJaWYgKHNoZi0+cnBbLTFdICE9IGMpCi0JCQlyZXR1cm4gKEVPRik7Ci0JCXNoZi0+ZmxhZ3MgJj0gflNIRl9FT0Y7Ci0JCXNoZi0+cnAtLTsKLQkJc2hmLT5ybmxlZnQrKzsKLQkJcmV0dXJuIChjKTsKLQl9Ci0Jc2hmLT5mbGFncyAmPSB+U0hGX0VPRjsKLQkqLS0oc2hmLT5ycCkgPSBjOwotCXNoZi0+cm5sZWZ0Kys7Ci0JcmV0dXJuIChjKTsKLX0KLQotLyogV3JpdGUgYSBjaGFyYWN0ZXIuIFJldHVybnMgdGhlIGNoYXJhY3RlciBpZiBzdWNjZXNzZnVsLCBFT0YgaWYKLSAqIHRoZSBjaGFyIGNvdWxkIG5vdCBiZSB3cml0dGVuLgotICovCi1pbnQKLXNoZl9wdXRjaGFyKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9XUikpCi0JCWludGVybmFsX2Vycm9yZigic2hmX3B1dGNoYXI6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7Ci0KLQlpZiAoYyA9PSBFT0YpCi0JCXJldHVybiAoRU9GKTsKLQotCWlmIChzaGYtPmZsYWdzICYgU0hGX1VOQlVGKSB7Ci0JCXVuc2lnbmVkIGNoYXIgY2MgPSAodW5zaWduZWQgY2hhciljOwotCQlpbnQgbjsKLQotCQlpZiAoc2hmLT5mZCA8IDApCi0JCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9wdXRjaGFyOiBubyBmZCIpOwotCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgewotCQkJZXJybm8gPSBzaGYtPmVycm5vXzsKLQkJCXJldHVybiAoRU9GKTsKLQkJfQotCQl3aGlsZSAoKG4gPSB3cml0ZShzaGYtPmZkLCAmY2MsIDEpKSAhPSAxKQotCQkJaWYgKG4gPCAwKSB7Ci0JCQkJaWYgKGVycm5vID09IEVJTlRSICYmCi0JCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQotCQkJCQljb250aW51ZTsKLQkJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKLQkJCQlzaGYtPmVycm5vXyA9IGVycm5vOwotCQkJCXJldHVybiAoRU9GKTsKLQkJCX0KLQl9IGVsc2UgewotCQkvKiBGbHVzaCBkZWFscyB3aXRoIHN0cmluZ3MgYW5kIHN0aWNreSBlcnJvcnMgKi8KLQkJaWYgKHNoZi0+d25sZWZ0ID09IDAgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfR1JPVykgPT0gRU9GKQotCQkJcmV0dXJuIChFT0YpOwotCQlzaGYtPndubGVmdC0tOwotCQkqc2hmLT53cCsrID0gYzsKLQl9Ci0KLQlyZXR1cm4gKGMpOwotfQotCi0vKiBXcml0ZSBhIHN0cmluZy4gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmCi0gKiB0aGUgc3RyaW5nIGNvdWxkIG5vdCBiZSB3cml0dGVuLgotICovCi1pbnQKLXNoZl9wdXRzKGNvbnN0IGNoYXIgKnMsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpZiAoIXMpCi0JCXJldHVybiAoRU9GKTsKLQotCXJldHVybiAoc2hmX3dyaXRlKHMsIHN0cmxlbihzKSwgc2hmKSk7Ci19Ci0KLS8qIFdyaXRlIGEgYnVmZmVyLiBSZXR1cm5zIG5ieXRlcyBpZiBzdWNjZXNzZnVsLCBFT0YgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICovCi1pbnQKLXNoZl93cml0ZShjb25zdCBjaGFyICpidWYsIGludCBuYnl0ZXMsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgbiwgbmNvcHksIG9yaWdfbmJ5dGVzID0gbmJ5dGVzOwotCi0JaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9XUikpCi0JCWludGVybmFsX2Vycm9yZigic2hmX3dyaXRlOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOwotCi0JaWYgKG5ieXRlcyA8IDApCi0JCWludGVybmFsX2Vycm9yZigic2hmX3dyaXRlOiBuYnl0ZXMgJWQiLCBuYnl0ZXMpOwotCi0JLyogRG9uJ3QgYnVmZmVyIGlmIGJ1ZmZlciBpcyBlbXB0eSBhbmQgd2UncmUgd3JpdHRpbmcgYSBsYXJnZSBhbW91bnQuICovCi0JaWYgKChuY29weSA9IHNoZi0+d25sZWZ0KSAmJgotCSAgICAoc2hmLT53cCAhPSBzaGYtPmJ1ZiB8fCBuYnl0ZXMgPCBzaGYtPndubGVmdCkpIHsKLQkJaWYgKG5jb3B5ID4gbmJ5dGVzKQotCQkJbmNvcHkgPSBuYnl0ZXM7Ci0JCW1lbWNweShzaGYtPndwLCBidWYsIG5jb3B5KTsKLQkJbmJ5dGVzIC09IG5jb3B5OwotCQlidWYgKz0gbmNvcHk7Ci0JCXNoZi0+d3AgKz0gbmNvcHk7Ci0JCXNoZi0+d25sZWZ0IC09IG5jb3B5OwotCX0KLQlpZiAobmJ5dGVzID4gMCkgewotCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKLQkJCS8qIHJlc2l6ZSBidWZmZXIgdW50aWwgdGhlcmUncyBlbm91Z2ggc3BhY2UgbGVmdCAqLwotCQkJd2hpbGUgKG5ieXRlcyA+IHNoZi0+d25sZWZ0KQotCQkJCWlmIChzaGZfZW1wdHlidWYoc2hmLCBFQl9HUk9XKSA9PSBFT0YpCi0JCQkJCXJldHVybiAoRU9GKTsKLQkJCS8qIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBpbnRvIHRoZSBidWZmZXIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIGZsdXNoIGRlYWxzIHdpdGggc3RpY2t5IGVycm9ycyAqLwotCQkJaWYgKHNoZl9lbXB0eWJ1ZihzaGYsIEVCX0dST1cpID09IEVPRikKLQkJCQlyZXR1cm4gKEVPRik7Ci0JCQkvKiB3cml0ZSBjaHVua3MgbGFyZ2VyIHRoYW4gd2luZG93IHNpemUgZGlyZWN0bHkgKi8KLQkJCWlmIChuYnl0ZXMgPiBzaGYtPndic2l6ZSkgewotCQkJCW5jb3B5ID0gbmJ5dGVzOwotCQkJCWlmIChzaGYtPndic2l6ZSkKLQkJCQkJbmNvcHkgLT0gbmJ5dGVzICUgc2hmLT53YnNpemU7Ci0JCQkJbmJ5dGVzIC09IG5jb3B5OwotCQkJCXdoaWxlIChuY29weSA+IDApIHsKLQkJCQkJbiA9IHdyaXRlKHNoZi0+ZmQsIGJ1ZiwgbmNvcHkpOwotCQkJCQlpZiAobiA8IDApIHsKLQkJCQkJCWlmIChlcnJubyA9PSBFSU5UUiAmJgotCQkJCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7Ci0JCQkJCQlzaGYtPmVycm5vXyA9IGVycm5vOwotCQkJCQkJc2hmLT53bmxlZnQgPSAwOwotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdGU6IGZ3cml0ZSgzKSByZXR1cm5zIDAKLQkJCQkJCSAqIGZvciBlcnJvcnMgLSB0aGlzIGRvZXNuJ3QKLQkJCQkJCSAqLwotCQkJCQkJcmV0dXJuIChFT0YpOwotCQkJCQl9Ci0JCQkJCWJ1ZiArPSBuOwotCQkJCQluY29weSAtPSBuOwotCQkJCX0KLQkJCX0KLQkJCS8qIC4uLiBhbmQgYnVmZmVyIHRoZSByZXN0ICovCi0JCX0KLQkJaWYgKG5ieXRlcyA+IDApIHsKLQkJCS8qIHdyaXRlIHJlbWFpbmluZyBieXRlcyB0byBidWZmZXIgKi8KLQkJCW1lbWNweShzaGYtPndwLCBidWYsIG5ieXRlcyk7Ci0JCQlzaGYtPndwICs9IG5ieXRlczsKLQkJCXNoZi0+d25sZWZ0IC09IG5ieXRlczsKLQkJfQotCX0KLQotCXJldHVybiAob3JpZ19uYnl0ZXMpOwotfQotCi1pbnQKLXNoZl9mcHJpbnRmKHN0cnVjdCBzaGYgKnNoZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQluID0gc2hmX3ZmcHJpbnRmKHNoZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0KLQlyZXR1cm4gKG4pOwotfQotCi1pbnQKLXNoZl9zbnByaW50ZihjaGFyICpidWYsIGludCBic2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0Jc3RydWN0IHNoZiBzaGY7Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCi0JaWYgKCFidWYgfHwgYnNpemUgPD0gMCkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfc25wcmludGY6IGJ1ZiAlcCwgYnNpemUgJWQiLCBidWYsIGJzaXplKTsKLQotCXNoZl9zb3BlbihidWYsIGJzaXplLCBTSEZfV1IsICZzaGYpOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbiA9IHNoZl92ZnByaW50Zigmc2hmLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlzaGZfc2Nsb3NlKCZzaGYpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KLQlyZXR1cm4gKG4pOwotfQotCi1jaGFyICoKLXNoZl9zbXByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlzdHJ1Y3Qgc2hmIHNoZjsKLQl2YV9saXN0IGFyZ3M7Ci0KLQlzaGZfc29wZW4oTlVMTCwgMCwgU0hGX1dSfFNIRl9EWU5BTUlDLCAmc2hmKTsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXNoZl92ZnByaW50Zigmc2hmLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlyZXR1cm4gKHNoZl9zY2xvc2UoJnNoZikpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KLX0KLQotI3VuZGVmIEZQCQkJLyogaWYgeW91IHdhbnQgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgKi8KLQotI2lmbmRlZiBETUFYRVhQCi0jIGRlZmluZSBETUFYRVhQCTEyOAkvKiBzaG91bGQgYmUgYmlnIGVub3VnaCAqLwotI2VuZGlmCi0KLSNkZWZpbmUgQlVGX1NJWkUJMTI4Ci0vKiBtdXN0IGJlID4gTUFYKERNQVhFWFAsIGxvZzEwKHBvdygyLCBEU0lHTklGKSkpICsgY2VpbChsb2cxMChETUFYRVhQKSkgKyA4Ci0gKiAoSSB0aGluayk7IHNpbmNlIGl0J3MgaGFyZCB0byBleHByZXNzIGFzIGEgY29uc3RhbnQsIGp1c3QgdXNlIGEgbGFyZ2UgYnVmZmVyCi0gKi8KLSNkZWZpbmUgRlBCVUZfU0laRQkoRE1BWEVYUCsxNikKLQotI2RlZmluZQlGTF9IQVNICQkweDAwMQkvKiAnIycgc2VlbiAqLwotI2RlZmluZSBGTF9QTFVTCQkweDAwMgkvKiAnKycgc2VlbiAqLwotI2RlZmluZSBGTF9SSUdIVAkweDAwNAkvKiAnLScgc2VlbiAqLwotI2RlZmluZSBGTF9CTEFOSwkweDAwOAkvKiAnICcgc2VlbiAqLwotI2RlZmluZSBGTF9TSE9SVAkweDAxMAkvKiAnaCcgc2VlbiAqLwotI2RlZmluZSBGTF9MT05HCQkweDAyMAkvKiAnbCcgc2VlbiAqLwotI2RlZmluZSBGTF9aRVJPCQkweDA0MAkvKiAnMCcgc2VlbiAqLwotI2RlZmluZSBGTF9ET1QJCTB4MDgwCS8qICcuJyBzZWVuICovCi0jZGVmaW5lIEZMX1VQUEVSCTB4MTAwCS8qIGZvcm1hdCBjaGFyYWN0ZXIgd2FzIHVwcGVyY2FzZSAqLwotI2RlZmluZSBGTF9OVU1CRVIJMHgyMDAJLyogYSBudW1iZXIgd2FzIGZvcm1hdGVkICVbZG91eGVmZ10gKi8KLQotCi1pbnQKLXNoZl92ZnByaW50ZihzdHJ1Y3Qgc2hmICpzaGYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotewotCWNvbnN0IGNoYXIgKnM7Ci0JY2hhciBjLCAqY3A7Ci0JaW50IHRtcCA9IDAsIGZpZWxkLCBwcmVjaXNpb24sIGxlbiwgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBsbnVtOwotCS8qICUjbyBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBvdXRwdXQgKi8KLQljaGFyIG51bWJ1ZlsoOCAqIHNpemVvZihsb25nKSArIDIpIC8gMyArIDFdOwotCS8qIHRoaXMgc3R1ZmYgZm9yIGRlYWxpbmcgd2l0aCB0aGUgYnVmZmVyICovCi0JaW50IG53cml0dGVuID0gMDsKLQotCWlmICghZm10KQotCQlyZXR1cm4gKDApOwotCi0Jd2hpbGUgKChjID0gKmZtdCsrKSkgewotCQlpZiAoYyAhPSAnJScpIHsKLQkJCXNoZl9wdXRjKGMsIHNoZik7Ci0JCQlud3JpdHRlbisrOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyoKLQkJICogVGhpcyB3aWxsIGFjY2VwdCBmbGFncy9maWVsZHMgaW4gYW55IG9yZGVyIC0gbm90Ci0JCSAqIGp1c3QgdGhlIG9yZGVyIHNwZWNpZmllZCBpbiBwcmludGYoMyksIGJ1dCB0aGlzIGlzCi0JCSAqIHRoZSB3YXkgX2RvcHJudCgpIHNlZW1zIHRvIHdvcmsgKG9uIGJzZCBhbmQgc3lzVikuCi0JCSAqIFRoZSBvbmx5IHJlc3RyaWN0aW9uIGlzIHRoYXQgdGhlIGZvcm1hdCBjaGFyYWN0ZXIgbXVzdAotCQkgKiBjb21lIGxhc3QgOi0pLgotCQkgKi8KLQkJZmxhZ3MgPSBmaWVsZCA9IHByZWNpc2lvbiA9IDA7Ci0JCWZvciAoIDsgKGMgPSAqZm10KyspIDsgKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJyMnOgotCQkJCWZsYWdzIHw9IEZMX0hBU0g7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJysnOgotCQkJCWZsYWdzIHw9IEZMX1BMVVM7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJy0nOgotCQkJCWZsYWdzIHw9IEZMX1JJR0hUOwotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICcgJzoKLQkJCQlmbGFncyB8PSBGTF9CTEFOSzsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnMCc6Ci0JCQkJaWYgKCEoZmxhZ3MgJiBGTF9ET1QpKQotCQkJCQlmbGFncyB8PSBGTF9aRVJPOwotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICcuJzoKLQkJCQlmbGFncyB8PSBGTF9ET1Q7Ci0JCQkJcHJlY2lzaW9uID0gMDsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnKic6Ci0JCQkJdG1wID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQkJaWYgKGZsYWdzICYgRkxfRE9UKQotCQkJCQlwcmVjaXNpb24gPSB0bXA7Ci0JCQkJZWxzZSBpZiAoKGZpZWxkID0gdG1wKSA8IDApIHsKLQkJCQkJZmllbGQgPSAtZmllbGQ7Ci0JCQkJCWZsYWdzIHw9IEZMX1JJR0hUOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnbCc6Ci0JCQkJZmxhZ3MgfD0gRkxfTE9ORzsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnaCc6Ci0JCQkJZmxhZ3MgfD0gRkxfU0hPUlQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoa3NoX2lzZGlnaXQoYykpIHsKLQkJCQl0bXAgPSBjIC0gJzAnOwotCQkJCXdoaWxlIChjID0gKmZtdCsrLCBrc2hfaXNkaWdpdChjKSkKLQkJCQkJdG1wID0gdG1wICogMTAgKyBjIC0gJzAnOwotCQkJCS0tZm10OwotCQkJCWlmICh0bXAgPCAwKQkJLyogb3ZlcmZsb3c/ICovCi0JCQkJCXRtcCA9IDA7Ci0JCQkJaWYgKGZsYWdzICYgRkxfRE9UKQotCQkJCQlwcmVjaXNpb24gPSB0bXA7Ci0JCQkJZWxzZQotCQkJCQlmaWVsZCA9IHRtcDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHByZWNpc2lvbiA8IDApCi0JCQlwcmVjaXNpb24gPSAwOwotCi0JCWlmICghYykJCS8qIG5hc3R5IGZvcm1hdCAqLwotCQkJYnJlYWs7Ci0KLQkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7Ci0JCQlmbGFncyB8PSBGTF9VUFBFUjsKLQkJCWMgPSBrc2hfdG9sb3dlcihjKTsKLQkJfQotCi0JCXN3aXRjaCAoYykgewotCQljYXNlICdwJzogLyogcG9pbnRlciAqLwotCQkJZmxhZ3MgJj0gfihGTF9MT05HIHwgRkxfU0hPUlQpOwotCQkJZmxhZ3MgfD0gKHNpemVvZihjaGFyICopID4gc2l6ZW9mKGludCkpID8KLQkJCSAgICAvKiBob3BlIGl0IGZpdHMuLiAqLyBGTF9MT05HIDogMDsKLQkJCS8qIGFhYWhoaC4uLiAqLwotCQljYXNlICdkJzoKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ28nOgotCQljYXNlICd1JzoKLQkJY2FzZSAneCc6Ci0JCQlmbGFncyB8PSBGTF9OVU1CRVI7Ci0JCQljcCA9IG51bWJ1ZiArIHNpemVvZihudW1idWYpOwotCQkJLyotCi0JCQkgKiBYWFggYW55IGJldHRlciB3YXkgdG8gZG8gdGhpcz8KLQkJCSAqIFhYWCBob3BlZnVsbHkgdGhlIGNvbXBpbGVyIG9wdGltaXNlcyB0aGlzIG91dAotCQkJICoKLQkJCSAqIEZvciBzaG9ydHMsIHdlIHdhbnQgc2lnbiBleHRlbmQgZm9yICVkIGJ1dCBub3QKLQkJCSAqIGZvciAlW294dV0gLSBvbiAxNiBiaXQgbWFjaGluZXMgaXQgZG9lc24ndCBtYXR0ZXIuCi0JCQkgKiBBc3N1bWVzIEMgY29tcGlsZXIgaGFzIGNvbnZlcnRlZCBzaG9ydHMgdG8gaW50cwotCQkJICogYmVmb3JlIHB1c2hpbmcgdGhlbS4gWFhYIG9wdGltaXNlIHRoaXMgLXRnCi0JCQkgKi8KLQkJCWlmIChmbGFncyAmIEZMX0xPTkcpCi0JCQkJbG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkJCWVsc2UgaWYgKChzaXplb2YoaW50KSA8IHNpemVvZihsb25nKSkgJiYgKGMgPT0gJ2QnKSkKLQkJCQlsbnVtID0gKGxvbmcpdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQllbHNlCi0JCQkJbG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdkJzoKLQkJCWNhc2UgJ2knOgotCQkJCWlmICgwID4gKGxvbmcpbG51bSkgewotCQkJCQlsbnVtID0gLShsb25nKWxudW07Ci0JCQkJCXRtcCA9IDE7Ci0JCQkJfSBlbHNlCi0JCQkJCXRtcCA9IDA7Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWNhc2UgJ3UnOgotCQkJCWRvIHsKLQkJCQkJKi0tY3AgPSBsbnVtICUgMTAgKyAnMCc7Ci0JCQkJCWxudW0gLz0gMTA7Ci0JCQkJfSB3aGlsZSAobG51bSk7Ci0KLQkJCQlpZiAoYyAhPSAndScpIHsKLQkJCQkJaWYgKHRtcCkKLQkJCQkJCSotLWNwID0gJy0nOwotCQkJCQllbHNlIGlmIChmbGFncyAmIEZMX1BMVVMpCi0JCQkJCQkqLS1jcCA9ICcrJzsKLQkJCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTF9CTEFOSykKLQkJCQkJCSotLWNwID0gJyAnOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSAnbyc6Ci0JCQkJZG8gewotCQkJCQkqLS1jcCA9IChsbnVtICYgMHg3KSArICcwJzsKLQkJCQkJbG51bSA+Pj0gMzsKLQkJCQl9IHdoaWxlIChsbnVtKTsKLQotCQkJCWlmICgoZmxhZ3MgJiBGTF9IQVNIKSAmJiAqY3AgIT0gJzAnKQotCQkJCQkqLS1jcCA9ICcwJzsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAncCc6Ci0JCQljYXNlICd4JzogewotCQkJCWNvbnN0IGNoYXIgKmRpZ2l0cyA9IChmbGFncyAmIEZMX1VQUEVSKSA/Ci0JCQkJICAgIGRpZ2l0c191YyA6IGRpZ2l0c19sYzsKLQkJCQlkbyB7Ci0JCQkJCSotLWNwID0gZGlnaXRzW2xudW0gJiAweGZdOwotCQkJCQlsbnVtID4+PSA0OwotCQkJCX0gd2hpbGUgKGxudW0pOwotCi0JCQkJaWYgKGZsYWdzICYgRkxfSEFTSCkgewotCQkJCQkqLS1jcCA9IChmbGFncyAmIEZMX1VQUEVSKSA/ICdYJyA6ICd4JzsKLQkJCQkJKi0tY3AgPSAnMCc7Ci0JCQkJfQotCQkJfQotCQkJfQotCQkJbGVuID0gbnVtYnVmICsgc2l6ZW9mKG51bWJ1ZikgLSAocyA9IGNwKTsKLQkJCWlmIChmbGFncyAmIEZMX0RPVCkgewotCQkJCWlmIChwcmVjaXNpb24gPiBsZW4pIHsKLQkJCQkJZmllbGQgPSBwcmVjaXNpb247Ci0JCQkJCWZsYWdzIHw9IEZMX1pFUk87Ci0JCQkJfSBlbHNlCi0JCQkJCXByZWNpc2lvbiA9IGxlbjsgLyogbm8gbG9zcyAqLwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncyc6Ci0JCQlpZiAoIShzID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKikpKQotCQkJCXMgPSAiKG51bGwpIjsKLQkJCWxlbiA9IHV0Zl9tYnN3aWR0aChzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2MnOgotCQkJZmxhZ3MgJj0gfkZMX0RPVDsKLQkJCW51bWJ1ZlswXSA9IChjaGFyKSh2YV9hcmcoYXJncywgaW50KSk7Ci0JCQlzID0gbnVtYnVmOwotCQkJbGVuID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJyUnOgotCQlkZWZhdWx0OgotCQkJbnVtYnVmWzBdID0gYzsKLQkJCXMgPSBudW1idWY7Ci0JCQlsZW4gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBBdCB0aGlzIHBvaW50IHMgc2hvdWxkIHBvaW50IHRvIGEgc3RyaW5nIHRoYXQgaXMgdG8gYmUKLQkJICogZm9ybWF0dGVkLCBhbmQgbGVuIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCi0JCSAqLwotCQlpZiAoIShmbGFncyAmIEZMX0RPVCkgfHwgbGVuIDwgcHJlY2lzaW9uKQotCQkJcHJlY2lzaW9uID0gbGVuOwotCQlpZiAoZmllbGQgPiBwcmVjaXNpb24pIHsKLQkJCWZpZWxkIC09IHByZWNpc2lvbjsKLQkJCWlmICghKGZsYWdzICYgRkxfUklHSFQpKSB7Ci0JCQkJZmllbGQgPSAtZmllbGQ7Ci0JCQkJLyogc2tpcCBwYXN0IHNpZ24gb3IgMHggd2hlbiBwYWRkaW5nIHdpdGggMCAqLwotCQkJCWlmICgoZmxhZ3MgJiBGTF9aRVJPKSAmJiAoZmxhZ3MgJiBGTF9OVU1CRVIpKSB7Ci0JCQkJCWlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nIHx8Ci0JCQkJCSAgICAqcyA9PSAnICcpIHsKLQkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOwotCQkJCQkJcysrOwotCQkJCQkJcHJlY2lzaW9uLS07Ci0JCQkJCQlud3JpdHRlbisrOwotCQkJCQl9IGVsc2UgaWYgKCpzID09ICcwJykgewotCQkJCQkJc2hmX3B1dGMoKnMsIHNoZik7Ci0JCQkJCQlzKys7Ci0JCQkJCQlud3JpdHRlbisrOwotCQkJCQkJaWYgKC0tcHJlY2lzaW9uID4gMCAmJgotCQkJCQkJICAgICgqcyB8IDB4MjApID09ICd4JykgewotCQkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOwotCQkJCQkJCXMrKzsKLQkJCQkJCQlwcmVjaXNpb24tLTsKLQkJCQkJCQlud3JpdHRlbisrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWMgPSAnMCc7Ci0JCQkJfSBlbHNlCi0JCQkJCWMgPSBmbGFncyAmIEZMX1pFUk8gPyAnMCcgOiAnICc7Ci0JCQkJaWYgKGZpZWxkIDwgMCkgewotCQkJCQlud3JpdHRlbiArPSAtZmllbGQ7Ci0JCQkJCWZvciAoIDsgZmllbGQgPCAwIDsgZmllbGQrKykKLQkJCQkJCXNoZl9wdXRjKGMsIHNoZik7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJYyA9ICcgJzsKLQkJfSBlbHNlCi0JCQlmaWVsZCA9IDA7Ci0KLQkJaWYgKHByZWNpc2lvbiA+IDApIHsKLQkJCWNvbnN0IGNoYXIgKnE7Ci0KLQkJCW53cml0dGVuICs9IHByZWNpc2lvbjsKLQkJCXEgPSB1dGZfc2tpcGNvbHMocywgcHJlY2lzaW9uKTsKLQkJCWRvIHsKLQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKLQkJCX0gd2hpbGUgKCsrcyA8IHEpOwotCQl9Ci0JCWlmIChmaWVsZCA+IDApIHsKLQkJCW53cml0dGVuICs9IGZpZWxkOwotCQkJZm9yICggOyBmaWVsZCA+IDAgOyAtLWZpZWxkKQotCQkJCXNoZl9wdXRjKGMsIHNoZik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKHNoZl9lcnJvcihzaGYpID8gRU9GIDogbndyaXR0ZW4pOwotfQotCi0jaWZkZWYgTUtTSF9TTUFMTAotaW50Ci1zaGZfZ2V0YyhzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JcmV0dXJuICgoc2hmKS0+cm5sZWZ0ID4gMCA/IChzaGYpLT5ybmxlZnQtLSwgKihzaGYpLT5ycCsrIDoKLQkgICAgc2hmX2dldGNoYXIoc2hmKSk7Ci19Ci0KLWludAotc2hmX3B1dGMoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlyZXR1cm4gKChzaGYpLT53bmxlZnQgPT0gMCA/IHNoZl9wdXRjaGFyKChjKSwgKHNoZikpIDoKLQkgICAgKChzaGYpLT53bmxlZnQtLSwgKihzaGYpLT53cCsrID0gKGMpKSk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL3N5bi5jIGIvbWtzaC9zcmMvc3luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YjI4NjcuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvc3luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA0ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBzeW4uYyx2IDEuMjggMjAwOC8wNy8yMyAxNjozNDozOCBqYXJlZHkgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zeW4uYyx2IDEuNDkgMjAxMC8wNy8xNyAyMjowOTozOSB0ZyBFeHAgJCIpOwotCi1zdHJ1Y3QgbmVzdGluZ19zdGF0ZSB7Ci0JaW50IHN0YXJ0X3Rva2VuOwkvKiB0b2tlbiB0aGFuIGJlZ2FuIG5lc3RpbmcgKGVnLCBGT1IpICovCi0JaW50IHN0YXJ0X2xpbmU7CQkvKiBsaW5lIG5lc3RpbmcgYmVnYW4gb24gKi8KLX07Ci0KLXN0YXRpYyB2b2lkIHl5cGFyc2Uodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICpwaXBlbGluZShpbnQpOwotc3RhdGljIHN0cnVjdCBvcCAqYW5kb3Iodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICpjX2xpc3QoaW50KTsKLXN0YXRpYyBzdHJ1Y3QgaW93b3JkICpzeW5pbyhpbnQpOwotc3RhdGljIHN0cnVjdCBvcCAqbmVzdGVkKGludCwgaW50LCBpbnQpOwotc3RhdGljIHN0cnVjdCBvcCAqZ2V0X2NvbW1hbmQoaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmRvZ3JvdXAodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICp0aGVucGFydCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmVsc2VwYXJ0KHZvaWQpOwotc3RhdGljIHN0cnVjdCBvcCAqY2FzZWxpc3Qodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICpjYXNlcGFydChpbnQpOwotc3RhdGljIHN0cnVjdCBvcCAqZnVuY3Rpb25fYm9keShjaGFyICosIGJvb2wpOwotc3RhdGljIGNoYXIgKip3b3JkbGlzdCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmJsb2NrKGludCwgc3RydWN0IG9wICosIHN0cnVjdCBvcCAqLCBjaGFyICoqKTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKm5ld3RwKGludCk7Ci1zdGF0aWMgdm9pZCBzeW50YXhlcnIoY29uc3QgY2hhciAqKSBNS1NIX0FfTk9SRVRVUk47Ci1zdGF0aWMgdm9pZCBuZXN0aW5nX3B1c2goc3RydWN0IG5lc3Rpbmdfc3RhdGUgKiwgaW50KTsKLXN0YXRpYyB2b2lkIG5lc3RpbmdfcG9wKHN0cnVjdCBuZXN0aW5nX3N0YXRlICopOwotc3RhdGljIGludCBhc3NpZ25fY29tbWFuZChjaGFyICopOwotc3RhdGljIGludCBpbmFsaWFzKHN0cnVjdCBzb3VyY2UgKik7Ci1zdGF0aWMgVGVzdF9vcCBkYnRlc3RwX2lzYShUZXN0X2VudiAqLCBUZXN0X21ldGEpOwotc3RhdGljIGNvbnN0IGNoYXIgKmRidGVzdHBfZ2V0b3BuZChUZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKLXN0YXRpYyBpbnQgZGJ0ZXN0cF9ldmFsKFRlc3RfZW52ICosIFRlc3Rfb3AsIGNvbnN0IGNoYXIgKiwKLSAgICBjb25zdCBjaGFyICosIGJvb2wpOwotc3RhdGljIHZvaWQgZGJ0ZXN0cF9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKikgTUtTSF9BX05PUkVUVVJOOwotCi1zdGF0aWMgc3RydWN0IG9wICpvdXR0cmVlOwkJLyogeXlwYXJzZSBvdXRwdXQgKi8KLXN0YXRpYyBzdHJ1Y3QgbmVzdGluZ19zdGF0ZSBuZXN0aW5nOwkvKiBcbiBjaGFuZ2VkIHRvIDsgKi8KLQotc3RhdGljIGludCByZWplY3Q7CQkvKiB0b2tlbihjZikgZ2V0cyBzeW1ib2wgYWdhaW4gKi8KLXN0YXRpYyBpbnQgc3ltYm9sOwkJLyogeXlsZXggdmFsdWUgKi8KLQotI2RlZmluZSBSRUpFQ1QJCShyZWplY3QgPSAxKQotI2RlZmluZSBBQ0NFUFQJCShyZWplY3QgPSAwKQotI2RlZmluZSB0b2tlbihjZikJKChyZWplY3QpID8gKEFDQ0VQVCwgc3ltYm9sKSA6IChzeW1ib2wgPSB5eWxleChjZikpKQotI2RlZmluZSB0cGVlayhjZikJKChyZWplY3QpID8gKHN5bWJvbCkgOiAoUkVKRUNULCBzeW1ib2wgPSB5eWxleChjZikpKQotI2RlZmluZSBtdXN0aGF2ZShjLGNmKQlkbyB7IGlmICh0b2tlbihjZikgIT0gKGMpKSBzeW50YXhlcnIoTlVMTCk7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkCi15eXBhcnNlKHZvaWQpCi17Ci0JaW50IGM7Ci0KLQlBQ0NFUFQ7Ci0KLQlvdXR0cmVlID0gY19saXN0KHNvdXJjZS0+dHlwZSA9PSBTU1RSSU5HKTsKLQljID0gdHBlZWsoMCk7Ci0JaWYgKGMgPT0gMCAmJiAhb3V0dHJlZSkKLQkJb3V0dHJlZSA9IG5ld3RwKFRFT0YpOwotCWVsc2UgaWYgKGMgIT0gJ1xuJyAmJiBjICE9IDApCi0JCXN5bnRheGVycihOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1waXBlbGluZShpbnQgY2YpCi17Ci0Jc3RydWN0IG9wICp0LCAqcCwgKnRsID0gTlVMTDsKLQotCXQgPSBnZXRfY29tbWFuZChjZik7Ci0JaWYgKHQgIT0gTlVMTCkgewotCQl3aGlsZSAodG9rZW4oMCkgPT0gJ3wnKSB7Ci0JCQlpZiAoKHAgPSBnZXRfY29tbWFuZChDT05USU4pKSA9PSBOVUxMKQotCQkJCXN5bnRheGVycihOVUxMKTsKLQkJCWlmICh0bCA9PSBOVUxMKQotCQkJCXQgPSB0bCA9IGJsb2NrKFRQSVBFLCB0LCBwLCBOT1dPUkRTKTsKLQkJCWVsc2UKLQkJCQl0bCA9IHRsLT5yaWdodCA9IGJsb2NrKFRQSVBFLCB0bC0+cmlnaHQsIHAsIE5PV09SRFMpOwotCQl9Ci0JCVJFSkVDVDsKLQl9Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1hbmRvcih2b2lkKQotewotCXN0cnVjdCBvcCAqdCwgKnA7Ci0JaW50IGM7Ci0KLQl0ID0gcGlwZWxpbmUoMCk7Ci0JaWYgKHQgIT0gTlVMTCkgewotCQl3aGlsZSAoKGMgPSB0b2tlbigwKSkgPT0gTE9HQU5EIHx8IGMgPT0gTE9HT1IpIHsKLQkJCWlmICgocCA9IHBpcGVsaW5lKENPTlRJTikpID09IE5VTEwpCi0JCQkJc3ludGF4ZXJyKE5VTEwpOwotCQkJdCA9IGJsb2NrKGMgPT0gTE9HQU5EPyBUQU5EOiBUT1IsIHQsIHAsIE5PV09SRFMpOwotCQl9Ci0JCVJFSkVDVDsKLQl9Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1jX2xpc3QoaW50IG11bHRpKQotewotCXN0cnVjdCBvcCAqdCA9IE5VTEwsICpwLCAqdGwgPSBOVUxMOwotCWludCBjLCBoYXZlX3NlcDsKLQotCXdoaWxlICgxKSB7Ci0JCXAgPSBhbmRvcigpOwotCQkvKiBUb2tlbiBoYXMgYWx3YXlzIGJlZW4gcmVhZC9yZWplY3RlZCBhdCB0aGlzIHBvaW50LCBzbwotCQkgKiB3ZSBkb24ndCB3b3JyeSBhYm91dCB3aGF0IGZsYWdzIHRvIHBhc3MgdG9rZW4oKQotCQkgKi8KLQkJYyA9IHRva2VuKDApOwotCQloYXZlX3NlcCA9IDE7Ci0JCWlmIChjID09ICdcbicgJiYgKG11bHRpIHx8IGluYWxpYXMoc291cmNlKSkpIHsKLQkJCWlmICghcCkgLyogaWdub3JlIGJsYW5rIGxpbmVzICovCi0JCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoIXApCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoYyA9PSAnJicgfHwgYyA9PSBDT1BST0MpCi0JCQlwID0gYmxvY2soYyA9PSAnJicgPyBUQVNZTkMgOiBUQ09QUk9DLAotCQkJICAgIHAsIE5PQkxPQ0ssIE5PV09SRFMpOwotCQllbHNlIGlmIChjICE9ICc7JykKLQkJCWhhdmVfc2VwID0gMDsKLQkJaWYgKCF0KQotCQkJdCA9IHA7Ci0JCWVsc2UgaWYgKCF0bCkKLQkJCXQgPSB0bCA9IGJsb2NrKFRMSVNULCB0LCBwLCBOT1dPUkRTKTsKLQkJZWxzZQotCQkJdGwgPSB0bC0+cmlnaHQgPSBibG9jayhUTElTVCwgdGwtPnJpZ2h0LCBwLCBOT1dPUkRTKTsKLQkJaWYgKCFoYXZlX3NlcCkKLQkJCWJyZWFrOwotCX0KLQlSRUpFQ1Q7Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBpb3dvcmQgKgotc3luaW8oaW50IGNmKQotewotCXN0cnVjdCBpb3dvcmQgKmlvcDsKLQlzdGF0aWMgc3RydWN0IGlvd29yZCAqbmV4dGlvcCA9IE5VTEw7Ci0JYm9vbCBpc2hlcmU7Ci0KLQlpZiAobmV4dGlvcCAhPSBOVUxMKSB7Ci0JCWlvcCA9IG5leHRpb3A7Ci0JCW5leHRpb3AgPSBOVUxMOwotCQlyZXR1cm4gKGlvcCk7Ci0JfQotCi0JaWYgKHRwZWVrKGNmKSAhPSBSRURJUikKLQkJcmV0dXJuIChOVUxMKTsKLQlBQ0NFUFQ7Ci0JaW9wID0geXlsdmFsLmlvcDsKLQlpc2hlcmUgPSAoaW9wLT5mbGFnJklPVFlQRSkgPT0gSU9IRVJFOwotCW11c3RoYXZlKExXT1JELCBpc2hlcmUgPyBIRVJFREVMSU0gOiAwKTsKLQlpZiAoaXNoZXJlKSB7Ci0JCWlvcC0+ZGVsaW0gPSB5eWx2YWwuY3A7Ci0JCWlmICgqaWRlbnQgIT0gMCkgLyogdW5xdW90ZWQgKi8KLQkJCWlvcC0+ZmxhZyB8PSBJT0VWQUw7Ci0JCWlmIChoZXJlcCA+ICZoZXJlc1tIRVJFUyAtIDFdKQotCQkJeXllcnJvcigidG9vIG1hbnkgPDxzXG4iKTsKLQkJKmhlcmVwKysgPSBpb3A7Ci0JfSBlbHNlCi0JCWlvcC0+bmFtZSA9IHl5bHZhbC5jcDsKLQotCWlmIChpb3AtPmZsYWcgJiBJT0JBU0gpIHsKLQkJY2hhciAqY3A7Ci0KLQkJbmV4dGlvcCA9IGFsbG9jKHNpemVvZigqaW9wKSwgQVRFTVApOwotCQluZXh0aW9wLT5uYW1lID0gY3AgPSBhbGxvYyg1LCBBVEVNUCk7Ci0KLQkJaWYgKGlvcC0+dW5pdCA+IDkpIHsKLQkJCSpjcCsrID0gQ0hBUjsKLQkJCSpjcCsrID0gJzAnICsgKGlvcC0+dW5pdCAvIDEwKTsKLQkJfQotCQkqY3ArKyA9IENIQVI7Ci0JCSpjcCsrID0gJzAnICsgKGlvcC0+dW5pdCAlIDEwKTsKLQkJKmNwID0gRU9TOwotCi0JCWlvcC0+ZmxhZyAmPSB+SU9CQVNIOwotCQluZXh0aW9wLT51bml0ID0gMjsKLQkJbmV4dGlvcC0+ZmxhZyA9IElPRFVQOwotCQluZXh0aW9wLT5kZWxpbSA9IE5VTEw7Ci0JCW5leHRpb3AtPmhlcmVkb2MgPSBOVUxMOwotCX0KLQlyZXR1cm4gKGlvcCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotbmVzdGVkKGludCB0eXBlLCBpbnQgc21hcmssIGludCBlbWFyaykKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0Jc3RydWN0IG5lc3Rpbmdfc3RhdGUgb2xkX25lc3Rpbmc7Ci0KLQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBzbWFyayk7Ci0JdCA9IGNfbGlzdCh0cnVlKTsKLQltdXN0aGF2ZShlbWFyaywgS0VZV09SRHxBTElBUyk7Ci0JbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKLQlyZXR1cm4gKGJsb2NrKHR5cGUsIHQsIE5PQkxPQ0ssIE5PV09SRFMpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1nZXRfY29tbWFuZChpbnQgY2YpCi17Ci0Jc3RydWN0IG9wICp0OwotCWludCBjLCBpb3BuID0gMCwgc3luaW9jZjsKLQlzdHJ1Y3QgaW93b3JkICppb3AsICoqaW9wczsKLQlYUHRyViBhcmdzLCB2YXJzOwotCXN0cnVjdCBuZXN0aW5nX3N0YXRlIG9sZF9uZXN0aW5nOwotCi0JaW9wcyA9IGFsbG9jKChOVUZJTEUgKyAxKSAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBBVEVNUCk7Ci0JWFBpbml0KGFyZ3MsIDE2KTsKLQlYUGluaXQodmFycywgMTYpOwotCi0Jc3luaW9jZiA9IEtFWVdPUkR8QUxJQVM7Ci0Jc3dpdGNoIChjID0gdG9rZW4oY2Z8S0VZV09SRHxBTElBU3xWQVJBU04pKSB7Ci0JZGVmYXVsdDoKLQkJUkVKRUNUOwotCQlhZnJlZShpb3BzLCBBVEVNUCk7Ci0JCVhQZnJlZShhcmdzKTsKLQkJWFBmcmVlKHZhcnMpOwotCQlyZXR1cm4gKE5VTEwpOyAvKiBlbXB0eSBsaW5lICovCi0KLQljYXNlIExXT1JEOgotCWNhc2UgUkVESVI6Ci0JCVJFSkVDVDsKLQkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOwotCQl0ID0gbmV3dHAoVENPTSk7Ci0JCXQtPmxpbmVubyA9IHNvdXJjZS0+bGluZTsKLQkJd2hpbGUgKDEpIHsKLQkJCWNmID0gKHQtPnUuZXZhbGZsYWdzID8gQVJSQVlWQVIgOiAwKSB8Ci0JCQkgICAgKFhQc2l6ZShhcmdzKSA9PSAwID8gQUxJQVN8VkFSQVNOIDogQ01EV09SRCk7Ci0JCQlzd2l0Y2ggKHRwZWVrKGNmKSkgewotCQkJY2FzZSBSRURJUjoKLQkJCQl3aGlsZSAoKGlvcCA9IHN5bmlvKGNmKSkgIT0gTlVMTCkgewotCQkJCQlpZiAoaW9wbiA+PSBOVUZJTEUpCi0JCQkJCQl5eWVycm9yKCJ0b28gbWFueSByZWRpcmVjdGlvbnNcbiIpOwotCQkJCQlpb3BzW2lvcG4rK10gPSBpb3A7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIExXT1JEOgotCQkJCUFDQ0VQVDsKLQkJCQkvKiB0aGUgaW9wbiA9PSAwIGFuZCBYUHNpemUodmFycykgPT0gMCBhcmUKLQkJCQkgKiBkdWJpb3VzIGJ1dCBBVCZUIGtzaCBhY3RzIHRoaXMgd2F5Ci0JCQkJICovCi0JCQkJaWYgKGlvcG4gPT0gMCAmJiBYUHNpemUodmFycykgPT0gMCAmJgotCQkJCSAgICBYUHNpemUoYXJncykgPT0gMCAmJgotCQkJCSAgICBhc3NpZ25fY29tbWFuZChpZGVudCkpCi0JCQkJCXQtPnUuZXZhbGZsYWdzID0gRE9WQUNIRUNLOwotCQkJCWlmICgoWFBzaXplKGFyZ3MpID09IDAgfHwgRmxhZyhGS0VZV09SRCkpICYmCi0JCQkJICAgIGlzX3dkdmFyYXNzaWduKHl5bHZhbC5jcCkpCi0JCQkJCVhQcHV0KHZhcnMsIHl5bHZhbC5jcCk7Ci0JCQkJZWxzZQotCQkJCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlICcoJzoKLQkJCQkvKiBDaGVjayBmb3IgIj4gZm9vIChlY2hvIGhpKSIgd2hpY2ggQVQmVCBrc2gKLQkJCQkgKiBhbGxvd3MgKG5vdCBQT1NJWCwgYnV0IG5vdCBkaXNhbGxvd2VkKQotCQkJCSAqLwotCQkJCWFmcmVlKHQsIEFURU1QKTsKLQkJCQlpZiAoWFBzaXplKGFyZ3MpID09IDAgJiYgWFBzaXplKHZhcnMpID09IDApIHsKLQkJCQkJQUNDRVBUOwotCQkJCQlnb3RvIFN1YnNoZWxsOwotCQkJCX0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCQkJCWlmICgoWFBzaXplKGFyZ3MpID09IDAgfHwgRmxhZyhGS0VZV09SRCkpICYmCi0JCQkJICAgIFhQc2l6ZSh2YXJzKSA9PSAxICYmIGlzX3dkdmFyYXNzaWduKHl5bHZhbC5jcCkpCi0JCQkJCWdvdG8gaXNfd2RhcnJhc3NpZ247Ci0jZW5kaWYKLQkJCQkvKiBNdXN0IGJlIGEgZnVuY3Rpb24gKi8KLQkJCQlpZiAoaW9wbiAhPSAwIHx8IFhQc2l6ZShhcmdzKSAhPSAxIHx8Ci0JCQkJICAgIFhQc2l6ZSh2YXJzKSAhPSAwKQotCQkJCQlzeW50YXhlcnIoTlVMTCk7Ci0JCQkJQUNDRVBUOwotCQkJCS8qKCovCi0JCQkJbXVzdGhhdmUoJyknLCAwKTsKLQkJCQl0ID0gZnVuY3Rpb25fYm9keShYUHB0cnYoYXJncylbMF0sIGZhbHNlKTsKLQkJCQlnb3RvIExlYXZlOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0gaXNfd2RhcnJhc3NpZ246Ci0JCQl7Ci0JCQkJc3RhdGljIGNvbnN0IGNoYXIgc2V0X2NtZDBbXSA9IHsKLQkJCQkJQ0hBUiwgJ2UnLCBDSEFSLCAndicsCi0JCQkJCUNIQVIsICdhJywgQ0hBUiwgJ2wnLCBFT1MKLQkJCQl9OwotCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQxW10gPSB7Ci0JCQkJCUNIQVIsICdzJywgQ0hBUiwgJ2UnLAotCQkJCQlDSEFSLCAndCcsIENIQVIsICcgJywKLQkJCQkJQ0hBUiwgJy0nLCBDSEFSLCAnQScsIEVPUwotCQkJCX07Ci0JCQkJc3RhdGljIGNvbnN0IGNoYXIgc2V0X2NtZDJbXSA9IHsKLQkJCQkJQ0hBUiwgJy0nLCBDSEFSLCAnLScsIEVPUwotCQkJCX07Ci0JCQkJY2hhciAqdGNwOwotCQkJCVhQZnJlZSh2YXJzKTsKLQkJCQlYUGluaXQodmFycywgMTYpOwotCQkJCS8qCi0JCQkJICogd2Uga25vdyAob3IgcmF0aGVyIGhvcGUpIHRoYXQgeXlsdmFsLmNwCi0JCQkJICogY29udGFpbnMgYSBzdHJpbmcgInZhcm5hbWU9IgotCQkJCSAqLwotCQkJCXRjcCA9IHdkY29weSh5eWx2YWwuY3AsIEFURU1QKTsKLQkJCQl0Y3Bbd2RzY2FuKHRjcCwgRU9TKSAtIHRjcCAtIDNdID0gRU9TOwotCQkJCS8qIG5vdyBtYWtlIGFuIGFycmF5IGFzc2lnbm1lbnQgY29tbWFuZCAqLwotCQkJCXQgPSBuZXd0cChUQ09NKTsKLQkJCQl0LT5saW5lbm8gPSBzb3VyY2UtPmxpbmU7Ci0JCQkJQUNDRVBUOwotCQkJCVhQcHV0KGFyZ3MsIHdkY29weShzZXRfY21kMCwgQVRFTVApKTsKLQkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDEsIEFURU1QKSk7Ci0JCQkJWFBwdXQoYXJncywgdGNwKTsKLQkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDIsIEFURU1QKSk7Ci0JCQkJbXVzdGhhdmUoTFdPUkQsTEVUQVJSQVkpOwotCQkJCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jZW5kaWYKLQotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIExlYXZlOwotCQkJfQotCQl9Ci0gTGVhdmU6Ci0JCWJyZWFrOwotCi0JY2FzZSAnKCc6Ci0gU3Vic2hlbGw6Ci0JCXQgPSBuZXN0ZWQoVFBBUkVOLCAnKCcsICcpJyk7Ci0JCWJyZWFrOwotCi0JY2FzZSAneyc6IC8qfSovCi0JCXQgPSBuZXN0ZWQoVEJSQUNFLCAneycsICd9Jyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNRFBBUkVOOiB7Ci0JCWludCBsbm87Ci0JCXN0YXRpYyBjb25zdCBjaGFyIGxldF9jbWRbXSA9IHsKLQkJCUNIQVIsICdsJywgQ0hBUiwgJ2UnLAotCQkJQ0hBUiwgJ3QnLCBFT1MKLQkJfTsKLQotCQkvKiBMZWF2ZSBLRVlXT1JEIGluIHN5bmlvY2YgKGFsbG93IGlmICgoIDEgKSkgdGhlbiAuLi4pICovCi0JCWxubyA9IHNvdXJjZS0+bGluZTsKLQkJQUNDRVBUOwotCQlzd2l0Y2ggKHRva2VuKExFVEVYUFIpKSB7Ci0JCWNhc2UgTFdPUkQ6Ci0JCQlicmVhazsKLQkJY2FzZSAnKCc6CS8qICkgKi8KLQkJCWdvdG8gU3Vic2hlbGw7Ci0JCWRlZmF1bHQ6Ci0JCQlzeW50YXhlcnIoTlVMTCk7Ci0JCX0KLQkJdCA9IG5ld3RwKFRDT00pOwotCQl0LT5saW5lbm8gPSBsbm87Ci0JCVhQcHV0KGFyZ3MsIHdkY29weShsZXRfY21kLCBBVEVNUCkpOwotCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIERCUkFDS0VUOiAvKiBbWyAuLiBdXSAqLwotCQkvKiBMZWF2ZSBLRVlXT1JEIGluIHN5bmlvY2YgKGFsbG93IGlmIFtbIC1uIDEgXV0gdGhlbiAuLi4pICovCi0JCXQgPSBuZXd0cChUREJSQUNLRVQpOwotCQlBQ0NFUFQ7Ci0JCXsKLQkJCVRlc3RfZW52IHRlOwotCi0JCQl0ZS5mbGFncyA9IFRFRl9EQlJBQ0tFVDsKLQkJCXRlLnBvcy5hdiA9ICZhcmdzOwotCQkJdGUuaXNhID0gZGJ0ZXN0cF9pc2E7Ci0JCQl0ZS5nZXRvcG5kID0gZGJ0ZXN0cF9nZXRvcG5kOwotCQkJdGUuZXZhbCA9IGRidGVzdHBfZXZhbDsKLQkJCXRlLmVycm9yID0gZGJ0ZXN0cF9lcnJvcjsKLQotCQkJdGVzdF9wYXJzZSgmdGUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBGT1I6Ci0JY2FzZSBTRUxFQ1Q6Ci0JCXQgPSBuZXd0cCgoYyA9PSBGT1IpID8gVEZPUiA6IFRTRUxFQ1QpOwotCQltdXN0aGF2ZShMV09SRCwgQVJSQVlWQVIpOwotCQlpZiAoIWlzX3dkdmFybmFtZSh5eWx2YWwuY3AsIHRydWUpKQotCQkJeXllcnJvcigiJXM6IGJhZCBpZGVudGlmaWVyXG4iLAotCQkJICAgIGMgPT0gRk9SID8gImZvciIgOiAic2VsZWN0Iik7Ci0JCXN0cmR1cHgodC0+c3RyLCBpZGVudCwgQVRFTVApOwotCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKLQkJdC0+dmFycyA9IHdvcmRsaXN0KCk7Ci0JCXQtPmxlZnQgPSBkb2dyb3VwKCk7Ci0JCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXSElMRToKLQljYXNlIFVOVElMOgotCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKLQkJdCA9IG5ld3RwKChjID09IFdISUxFKSA/IFRXSElMRSA6IFRVTlRJTCk7Ci0JCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7Ci0JCXQtPnJpZ2h0ID0gZG9ncm91cCgpOwotCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOwotCQlicmVhazsKLQotCWNhc2UgQ0FTRToKLQkJdCA9IG5ld3RwKFRDQVNFKTsKLQkJbXVzdGhhdmUoTFdPUkQsIDApOwotCQl0LT5zdHIgPSB5eWx2YWwuY3A7Ci0JCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIGMpOwotCQl0LT5sZWZ0ID0gY2FzZWxpc3QoKTsKLQkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElGOgotCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKLQkJdCA9IG5ld3RwKFRJRik7Ci0JCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7Ci0JCXQtPnJpZ2h0ID0gdGhlbnBhcnQoKTsKLQkJbXVzdGhhdmUoRkksIEtFWVdPUkR8QUxJQVMpOwotCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOwotCQlicmVhazsKLQotCWNhc2UgQkFORzoKLQkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOwotCQl0ID0gcGlwZWxpbmUoMCk7Ci0JCWlmICh0ID09IE5VTEwpCi0JCQlzeW50YXhlcnIoTlVMTCk7Ci0JCXQgPSBibG9jayhUQkFORywgTk9CTE9DSywgdCwgTk9XT1JEUyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUSU1FOgotCQlzeW5pb2NmICY9IH4oS0VZV09SRHxBTElBUyk7Ci0JCXQgPSBwaXBlbGluZSgwKTsKLQkJaWYgKHQpIHsKLQkJCXQtPnN0ciA9IGFsbG9jKDIsIEFURU1QKTsKLQkJCXQtPnN0clswXSA9ICdcMCc7CS8qIFRGXyogZmxhZ3MgKi8KLQkJCXQtPnN0clsxXSA9ICdcMCc7Ci0JCX0KLQkJdCA9IGJsb2NrKFRUSU1FLCB0LCBOT0JMT0NLLCBOT1dPUkRTKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZVTkNUSU9OOgotCQltdXN0aGF2ZShMV09SRCwgMCk7Ci0JCXQgPSBmdW5jdGlvbl9ib2R5KHl5bHZhbC5jcCwgdHJ1ZSk7Ci0JCWJyZWFrOwotCX0KLQotCXdoaWxlICgoaW9wID0gc3luaW8oc3luaW9jZikpICE9IE5VTEwpIHsKLQkJaWYgKGlvcG4gPj0gTlVGSUxFKQotCQkJeXllcnJvcigidG9vIG1hbnkgcmVkaXJlY3Rpb25zXG4iKTsKLQkJaW9wc1tpb3BuKytdID0gaW9wOwotCX0KLQotCWlmIChpb3BuID09IDApIHsKLQkJYWZyZWUoaW9wcywgQVRFTVApOwotCQl0LT5pb2FjdCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJaW9wc1tpb3BuKytdID0gTlVMTDsKLQkJaW9wcyA9IGFyZXNpemUoaW9wcywgaW9wbiAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBBVEVNUCk7Ci0JCXQtPmlvYWN0ID0gaW9wczsKLQl9Ci0KLQlpZiAodC0+dHlwZSA9PSBUQ09NIHx8IHQtPnR5cGUgPT0gVERCUkFDS0VUKSB7Ci0JCVhQcHV0KGFyZ3MsIE5VTEwpOwotCQl0LT5hcmdzID0gKGNvbnN0IGNoYXIgKiopWFBjbG9zZShhcmdzKTsKLQkJWFBwdXQodmFycywgTlVMTCk7Ci0JCXQtPnZhcnMgPSAoY2hhciAqKikgWFBjbG9zZSh2YXJzKTsKLQl9IGVsc2UgewotCQlYUGZyZWUoYXJncyk7Ci0JCVhQZnJlZSh2YXJzKTsKLQl9Ci0KLQlyZXR1cm4gKHQpOwotfQotCi1zdGF0aWMgc3RydWN0IG9wICoKLWRvZ3JvdXAodm9pZCkKLXsKLQlpbnQgYzsKLQlzdHJ1Y3Qgb3AgKmxpc3Q7Ci0KLQljID0gdG9rZW4oQ09OVElOfEtFWVdPUkR8QUxJQVMpOwotCS8qIEEgey4uLn0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBkby4uLmRvbmUgZm9yIGZvci9zZWxlY3QgbG9vcHMKLQkgKiBidXQgbm90IGZvciB3aGlsZS91bnRpbCBsb29wcyAtIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgaXQKLQkgKiBpcyBhIHdoaWxlIGxvb3AgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGJlZW4gcGFyc2VkIGFzIHBhcnQgb2YKLQkgKiB0aGUgY29uZGl0aW9uYWwgY29tbWFuZCBsaXN0Li4uCi0JICovCi0JaWYgKGMgPT0gRE8pCi0JCWMgPSBET05FOwotCWVsc2UgaWYgKGMgPT0gJ3snKQotCQljID0gJ30nOwotCWVsc2UKLQkJc3ludGF4ZXJyKE5VTEwpOwotCWxpc3QgPSBjX2xpc3QodHJ1ZSk7Ci0JbXVzdGhhdmUoYywgS0VZV09SRHxBTElBUyk7Ci0JcmV0dXJuIChsaXN0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi10aGVucGFydCh2b2lkKQotewotCXN0cnVjdCBvcCAqdDsKLQotCW11c3RoYXZlKFRIRU4sIEtFWVdPUkR8QUxJQVMpOwotCXQgPSBuZXd0cCgwKTsKLQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOwotCWlmICh0LT5sZWZ0ID09IE5VTEwpCi0JCXN5bnRheGVycihOVUxMKTsKLQl0LT5yaWdodCA9IGVsc2VwYXJ0KCk7Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1lbHNlcGFydCh2b2lkKQotewotCXN0cnVjdCBvcCAqdDsKLQotCXN3aXRjaCAodG9rZW4oS0VZV09SRHxBTElBU3xWQVJBU04pKSB7Ci0JY2FzZSBFTFNFOgotCQlpZiAoKHQgPSBjX2xpc3QodHJ1ZSkpID09IE5VTEwpCi0JCQlzeW50YXhlcnIoTlVMTCk7Ci0JCXJldHVybiAodCk7Ci0KLQljYXNlIEVMSUY6Ci0JCXQgPSBuZXd0cChURUxJRik7Ci0JCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7Ci0JCXQtPnJpZ2h0ID0gdGhlbnBhcnQoKTsKLQkJcmV0dXJuICh0KTsKLQotCWRlZmF1bHQ6Ci0JCVJFSkVDVDsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1jYXNlbGlzdCh2b2lkKQotewotCXN0cnVjdCBvcCAqdCwgKnRsOwotCWludCBjOwotCi0JYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKTsKLQkvKiBBIHsuLi59IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaW4uLi5lc2FjIGZvciBjYXNlIHN0YXRlbWVudHMgKi8KLQlpZiAoYyA9PSBJTikKLQkJYyA9IEVTQUM7Ci0JZWxzZSBpZiAoYyA9PSAneycpCi0JCWMgPSAnfSc7Ci0JZWxzZQotCQlzeW50YXhlcnIoTlVMTCk7Ci0JdCA9IHRsID0gTlVMTDsKLQl3aGlsZSAoKHRwZWVrKENPTlRJTnxLRVlXT1JEfEVTQUNPTkxZKSkgIT0gYykgeyAvKiBubyBBTElBUyBoZXJlICovCi0JCXN0cnVjdCBvcCAqdGMgPSBjYXNlcGFydChjKTsKLQkJaWYgKHRsID09IE5VTEwpCi0JCQl0ID0gdGwgPSB0YywgdGwtPnJpZ2h0ID0gTlVMTDsKLQkJZWxzZQotCQkJdGwtPnJpZ2h0ID0gdGMsIHRsID0gdGM7Ci0JfQotCW11c3RoYXZlKGMsIEtFWVdPUkR8QUxJQVMpOwotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotY2FzZXBhcnQoaW50IGVuZHRvaykKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0JWFB0clYgcHRuczsKLQotCVhQaW5pdChwdG5zLCAxNik7Ci0JdCA9IG5ld3RwKFRQQVQpOwotCS8qIG5vIEFMSUFTIGhlcmUgKi8KLQlpZiAodG9rZW4oQ09OVElOIHwgS0VZV09SRCkgIT0gJygnKQotCQlSRUpFQ1Q7Ci0JZG8gewotCQltdXN0aGF2ZShMV09SRCwgMCk7Ci0JCVhQcHV0KHB0bnMsIHl5bHZhbC5jcCk7Ci0JfSB3aGlsZSAodG9rZW4oMCkgPT0gJ3wnKTsKLQlSRUpFQ1Q7Ci0JWFBwdXQocHRucywgTlVMTCk7Ci0JdC0+dmFycyA9IChjaGFyICoqKSBYUGNsb3NlKHB0bnMpOwotCW11c3RoYXZlKCcpJywgMCk7Ci0KLQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOwotCS8qIE5vdGU6IFBPU0lYIHJlcXVpcmVzIHRoZSA7OyAqLwotCWlmICgodHBlZWsoQ09OVElOfEtFWVdPUkR8QUxJQVMpKSAhPSBlbmR0b2spCi0JCW11c3RoYXZlKEJSRUFLLCBDT05USU58S0VZV09SRHxBTElBUyk7Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1mdW5jdGlvbl9ib2R5KGNoYXIgKm5hbWUsCi0gICAgYm9vbCBrc2hfZnVuYykJCS8qIGZ1bmN0aW9uIGZvbyB7IC4uLiB9IHZzIGZvbygpIHsgLi4gfSAqLwotewotCWNoYXIgKnNuYW1lLCAqcDsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0JYm9vbCBvbGRfZnVuY19wYXJzZTsKLQotCXNuYW1lID0gd2RzdHJpcChuYW1lLCBmYWxzZSwgZmFsc2UpOwotCS8qIENoZWNrIGZvciB2YWxpZCBjaGFyYWN0ZXJzIGluIG5hbWUuIFBPU0lYIGFuZCBBVCZUIGtzaDkzIHNheSBvbmx5Ci0JICogYWxsb3cgW2EtekEtWl8wLTldIGJ1dCB0aGlzIGFsbG93cyBtb3JlIGFzIG9sZCBwZGtzaHMgaGF2ZQotCSAqIGFsbG93ZWQgbW9yZSAodGhlIGZvbGxvd2luZyB3ZXJlIG5ldmVyIGFsbG93ZWQ6Ci0JICoJTlVMIFRBQiBOTCBTUCAiICQgJiAnICggKSA7IDwgPSA+IFwgYCB8Ci0JICogQ19RVU9URSBjb3ZlcnMgYWxsIGJ1dCBhZGRzICMgKiA/IFsgXQotCSAqLwotCWZvciAocCA9IHNuYW1lOyAqcDsgcCsrKQotCQlpZiAoY3R5cGUoKnAsIENfUVVPVEUpKQotCQkJeXllcnJvcigiJXM6IGludmFsaWQgZnVuY3Rpb24gbmFtZVxuIiwgc25hbWUpOwotCi0JLyogTm90ZSB0aGF0IFBPU0lYIGFsbG93cyBvbmx5IGNvbXBvdW5kIHN0YXRlbWVudHMgYWZ0ZXIgZm9vKCksIHNoIGFuZAotCSAqIEFUJlQga3NoIGFsbG93IGFueSBjb21tYW5kLCBnbyB3aXRoIHRoZSBsYXRlciBzaW5jZSBpdCBzaG91bGRuJ3QKLQkgKiBicmVhayBhbnl0aGluZy4gSG93ZXZlciwgZm9yIGZ1bmN0aW9uIGZvbywgQVQmVCBrc2ggb25seSBhY2NlcHRzCi0JICogYW4gb3Blbi1icmFjZS4KLQkgKi8KLQlpZiAoa3NoX2Z1bmMpIHsKLQkJaWYgKHRwZWVrKENPTlRJTnxLRVlXT1JEfEFMSUFTKSA9PSAnKCcgLyogKSAqLykgewotCQkJc3RydWN0IHRibCAqdHA7Ci0KLQkJCS8qIGZ1bmN0aW9uIGZvbyAoKSB7ICovCi0JCQlBQ0NFUFQ7Ci0JCQltdXN0aGF2ZSgnKScsIDApOwotCQkJLyogZGVncmFkZSB0byBQT1NJWCBmdW5jdGlvbiAqLwotCQkJa3NoX2Z1bmMgPSBmYWxzZTsKLQkJCWlmICgodHAgPSBrdHNlYXJjaCgmYWxpYXNlcywgc25hbWUsIGhhc2goc25hbWUpKSkpCi0JCQkJa3RkZWxldGUodHApOwotCQl9Ci0JCW11c3RoYXZlKCd7JywgQ09OVElOfEtFWVdPUkR8QUxJQVMpOyAvKiB9ICovCi0JCVJFSkVDVDsKLQl9Ci0KLQl0ID0gbmV3dHAoVEZVTkNUKTsKLQl0LT5zdHIgPSBzbmFtZTsKLQl0LT51LmtzaF9mdW5jID0ga3NoX2Z1bmM7Ci0JdC0+bGluZW5vID0gc291cmNlLT5saW5lOwotCi0Jb2xkX2Z1bmNfcGFyc2UgPSBlLT5mbGFncyAmIEVGX0ZVTkNfUEFSU0U7Ci0JZS0+ZmxhZ3MgfD0gRUZfRlVOQ19QQVJTRTsKLQlpZiAoKHQtPmxlZnQgPSBnZXRfY29tbWFuZChDT05USU4pKSA9PSBOVUxMKSB7Ci0JCWNoYXIgKnR2OwotCQkvKgotCQkgKiBQcm9iYWJseSBzb21ldGhpbmcgbGlrZSBmb28oKSBmb2xsb3dlZCBieSBlb2Ygb3IgOy4KLQkJICogVGhpcyBpcyBhY2NlcHRlZCBieSBzaCBhbmQga3NoODguCi0JCSAqIFRvIG1ha2UgInR5cGVzZXQgLWYgZm9vIiB3b3JrIHJlbGlhYmx5IChzbyBpdHMgb3V0cHV0IGNhbgotCQkgKiBiZSB1c2VkIGFzIGlucHV0KSwgd2UgcHJldGVuZCB0aGVyZSBpcyBhIGNvbG9uIGhlcmUuCi0JCSAqLwotCQl0LT5sZWZ0ID0gbmV3dHAoVENPTSk7Ci0JCXQtPmxlZnQtPmFyZ3MgPSBhbGxvYygyICogc2l6ZW9mKGNoYXIgKiksIEFURU1QKTsKLQkJdC0+bGVmdC0+YXJnc1swXSA9IHR2ID0gYWxsb2MoMywgQVRFTVApOwotCQl0dlswXSA9IENIQVI7Ci0JCXR2WzFdID0gJzonOwotCQl0dlsyXSA9IEVPUzsKLQkJdC0+bGVmdC0+YXJnc1sxXSA9IE5VTEw7Ci0JCXQtPmxlZnQtPnZhcnMgPSBhbGxvYyhzaXplb2YoY2hhciAqKSwgQVRFTVApOwotCQl0LT5sZWZ0LT52YXJzWzBdID0gTlVMTDsKLQkJdC0+bGVmdC0+bGluZW5vID0gMTsKLQl9Ci0JaWYgKCFvbGRfZnVuY19wYXJzZSkKLQkJZS0+ZmxhZ3MgJj0gfkVGX0ZVTkNfUEFSU0U7Ci0KLQlyZXR1cm4gKHQpOwotfQotCi1zdGF0aWMgY2hhciAqKgotd29yZGxpc3Qodm9pZCkKLXsKLQlpbnQgYzsKLQlYUHRyViBhcmdzOwotCi0JWFBpbml0KGFyZ3MsIDE2KTsKLQkvKiBQT1NJWCBkb2VzIG5vdCBkbyBhbGlhcyBleHBhbnNpb24gaGVyZS4uLiAqLwotCWlmICgoYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKSkgIT0gSU4pIHsKLQkJaWYgKGMgIT0gJzsnKSAvKiBub24tUE9TSVgsIGJ1dCBBVCZUIGtzaCBhY2NlcHRzIGEgOyBoZXJlICovCi0JCQlSRUpFQ1Q7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCXdoaWxlICgoYyA9IHRva2VuKDApKSA9PSBMV09SRCkKLQkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKLQlpZiAoYyAhPSAnXG4nICYmIGMgIT0gJzsnKQotCQlzeW50YXhlcnIoTlVMTCk7Ci0JaWYgKFhQc2l6ZShhcmdzKSA9PSAwKSB7Ci0JCVhQZnJlZShhcmdzKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9IGVsc2UgewotCQlYUHB1dChhcmdzLCBOVUxMKTsKLQkJcmV0dXJuICgoY2hhciAqKilYUGNsb3NlKGFyZ3MpKTsKLQl9Ci19Ci0KLS8qCi0gKiBzdXBwb3J0aW5nIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotYmxvY2soaW50IHR5cGUsIHN0cnVjdCBvcCAqdDEsIHN0cnVjdCBvcCAqdDIsIGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0KLQl0ID0gbmV3dHAodHlwZSk7Ci0JdC0+bGVmdCA9IHQxOwotCXQtPnJpZ2h0ID0gdDI7Ci0JdC0+dmFycyA9IHdwOwotCXJldHVybiAodCk7Ci19Ci0KLWNvbnN0IHN0cnVjdCB0b2tlbmluZm8gewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc2hvcnQgdmFsOwotCXNob3J0IHJlc2VydmVkOwotfSB0b2tlbnRhYltdID0gewotCS8qIFJlc2VydmVkIHdvcmRzICovCi0JeyAiaWYiLAkJSUYsCXRydWUgfSwKLQl7ICJ0aGVuIiwJVEhFTiwJdHJ1ZSB9LAotCXsgImVsc2UiLAlFTFNFLAl0cnVlIH0sCi0JeyAiZWxpZiIsCUVMSUYsCXRydWUgfSwKLQl7ICJmaSIsCQlGSSwJdHJ1ZSB9LAotCXsgImNhc2UiLAlDQVNFLAl0cnVlIH0sCi0JeyAiZXNhYyIsCUVTQUMsCXRydWUgfSwKLQl7ICJmb3IiLAlGT1IsCXRydWUgfSwKLQl7ICJzZWxlY3QiLAlTRUxFQ1QsCXRydWUgfSwKLQl7ICJ3aGlsZSIsCVdISUxFLAl0cnVlIH0sCi0JeyAidW50aWwiLAlVTlRJTCwJdHJ1ZSB9LAotCXsgImRvIiwJCURPLAl0cnVlIH0sCi0JeyAiZG9uZSIsCURPTkUsCXRydWUgfSwKLQl7ICJpbiIsCQlJTiwJdHJ1ZSB9LAotCXsgImZ1bmN0aW9uIiwJRlVOQ1RJT04sIHRydWUgfSwKLQl7ICJ0aW1lIiwJVElNRSwJdHJ1ZSB9LAotCXsgInsiLAkJJ3snLAl0cnVlIH0sCi0JeyAifSIsCQknfScsCXRydWUgfSwKLQl7ICIhIiwJCUJBTkcsCXRydWUgfSwKLQl7ICJbWyIsCQlEQlJBQ0tFVCwgdHJ1ZSB9LAotCS8qIExleGljYWwgdG9rZW5zICgwW0VPRl0sIExXT1JEIGFuZCBSRURJUiBoYW5kbGVkIHNwZWNpYWxseSkgKi8KLQl7ICImJiIsCQlMT0dBTkQsCWZhbHNlIH0sCi0JeyAifHwiLAkJTE9HT1IsCWZhbHNlIH0sCi0JeyAiOzsiLAkJQlJFQUssCWZhbHNlIH0sCi0JeyAiKCgiLAkJTURQQVJFTiwgZmFsc2UgfSwKLQl7ICJ8JiIsCQlDT1BST0MsCWZhbHNlIH0sCi0JLyogYW5kIHNvbWUgc3BlY2lhbCBjYXNlcy4uLiAqLwotCXsgIm5ld2xpbmUiLAknXG4nLAlmYWxzZSB9LAotCXsgTlVMTCwJCTAsCWZhbHNlIH0KLX07Ci0KLXZvaWQKLWluaXRrZXl3b3Jkcyh2b2lkKQotewotCXN0cnVjdCB0b2tlbmluZm8gY29uc3QgKnR0OwotCXN0cnVjdCB0YmwgKnA7Ci0KLQlrdGluaXQoJmtleXdvcmRzLCBBUEVSTSwKLQkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgMjAga2V5d29yZHMpICovIDMyKTsKLQlmb3IgKHR0ID0gdG9rZW50YWI7IHR0LT5uYW1lOyB0dCsrKSB7Ci0JCWlmICh0dC0+cmVzZXJ2ZWQpIHsKLQkJCXAgPSBrdGVudGVyKCZrZXl3b3JkcywgdHQtPm5hbWUsIGhhc2godHQtPm5hbWUpKTsKLQkJCXAtPmZsYWcgfD0gREVGSU5FRHxJU1NFVDsKLQkJCXAtPnR5cGUgPSBDS0VZV0Q7Ci0JCQlwLT52YWwuaSA9IHR0LT52YWw7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zeW50YXhlcnIoY29uc3QgY2hhciAqd2hhdCkKLXsKLQljaGFyIHJlZGlyWzZdOwkvKiAyPDwtIGlzIHRoZSBsb25nZXN0IHJlZGlyZWN0aW9uLCBJIHRoaW5rICovCi0JY29uc3QgY2hhciAqczsKLQlzdHJ1Y3QgdG9rZW5pbmZvIGNvbnN0ICp0dDsKLQlpbnQgYzsKLQotCWlmICghd2hhdCkKLQkJd2hhdCA9ICJ1bmV4cGVjdGVkIjsKLQlSRUpFQ1Q7Ci0JYyA9IHRva2VuKDApOwotIEFnYWluOgotCXN3aXRjaCAoYykgewotCWNhc2UgMDoKLQkJaWYgKG5lc3Rpbmcuc3RhcnRfdG9rZW4pIHsKLQkJCWMgPSBuZXN0aW5nLnN0YXJ0X3Rva2VuOwotCQkJc291cmNlLT5lcnJsaW5lID0gbmVzdGluZy5zdGFydF9saW5lOwotCQkJd2hhdCA9ICJ1bm1hdGNoZWQiOwotCQkJZ290byBBZ2FpbjsKLQkJfQotCQkvKiBkb24ndCBxdW90ZSB0aGUgRU9GICovCi0JCXl5ZXJyb3IoIiVzOiB1bmV4cGVjdGVkIEVPRlxuIiwgVF9zeW5lcnIpOwotCQkvKiBOT1RSRUFDSEVEICovCi0KLQljYXNlIExXT1JEOgotCQlzID0gc25wdHJlZWYoTlVMTCwgMzIsICIlUyIsIHl5bHZhbC5jcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSRURJUjoKLQkJcyA9IHNucHRyZWVmKHJlZGlyLCBzaXplb2YocmVkaXIpLCAiJVIiLCB5eWx2YWwuaW9wKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlmb3IgKHR0ID0gdG9rZW50YWI7IHR0LT5uYW1lOyB0dCsrKQotCQkJaWYgKHR0LT52YWwgPT0gYykKLQkJCSAgICBicmVhazsKLQkJaWYgKHR0LT5uYW1lKQotCQkJcyA9IHR0LT5uYW1lOwotCQllbHNlIHsKLQkJCWlmIChjID4gMCAmJiBjIDwgMjU2KSB7Ci0JCQkJcmVkaXJbMF0gPSBjOwotCQkJCXJlZGlyWzFdID0gJ1wwJzsKLQkJCX0gZWxzZQotCQkJCXNoZl9zbnByaW50ZihyZWRpciwgc2l6ZW9mKHJlZGlyKSwKLQkJCQkJIj8lZCIsIGMpOwotCQkJcyA9IHJlZGlyOwotCQl9Ci0JfQotCXl5ZXJyb3IoIiVzOiAnJXMnICVzXG4iLCBUX3N5bmVyciwgcywgd2hhdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uZXN0aW5nX3B1c2goc3RydWN0IG5lc3Rpbmdfc3RhdGUgKnNhdmUsIGludCB0b2spCi17Ci0JKnNhdmUgPSBuZXN0aW5nOwotCW5lc3Rpbmcuc3RhcnRfdG9rZW4gPSB0b2s7Ci0JbmVzdGluZy5zdGFydF9saW5lID0gc291cmNlLT5saW5lOwotfQotCi1zdGF0aWMgdm9pZAotbmVzdGluZ19wb3Aoc3RydWN0IG5lc3Rpbmdfc3RhdGUgKnNhdmVkKQotewotCW5lc3RpbmcgPSAqc2F2ZWQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotbmV3dHAoaW50IHR5cGUpCi17Ci0Jc3RydWN0IG9wICp0OwotCi0JdCA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgb3ApLCBBVEVNUCk7Ci0JdC0+dHlwZSA9IHR5cGU7Ci0JdC0+dS5ldmFsZmxhZ3MgPSAwOwotCXQtPmFyZ3MgPSBOVUxMOwotCXQtPnZhcnMgPSBOVUxMOwotCXQtPmlvYWN0ID0gTlVMTDsKLQl0LT5sZWZ0ID0gdC0+cmlnaHQgPSBOVUxMOwotCXQtPnN0ciA9IE5VTEw7Ci0JcmV0dXJuICh0KTsKLX0KLQotc3RydWN0IG9wICoKLWNvbXBpbGUoU291cmNlICpzKQotewotCW5lc3Rpbmcuc3RhcnRfdG9rZW4gPSAwOwotCW5lc3Rpbmcuc3RhcnRfbGluZSA9IDA7Ci0JaGVyZXAgPSBoZXJlczsKLQlzb3VyY2UgPSBzOwotCXl5cGFyc2UoKTsKLQlyZXR1cm4gKG91dHRyZWUpOwotfQotCi0vKiBUaGlzIGtsdWRnZSBleGlzdHMgdG8gdGFrZSBjYXJlIG9mIHNoL0FUJlQga3NoIG9kZGl0eSBpbiB3aGljaAotICogdGhlIGFyZ3VtZW50cyBvZiBhbGlhcy9leHBvcnQvcmVhZG9ubHkvdHlwZXNldCBoYXZlIG5vIGZpZWxkCi0gKiBzcGxpdHRpbmcsIGZpbGUgZ2xvYmJpbmcsIG9yIChub3JtYWwpIHRpbGRlIGV4cGFuc2lvbiBkb25lLgotICogQVQmVCBrc2ggc2VlbXMgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhpcyBzaW5jZQotICoJJCB0b3VjaCBhPWE7IHR5cGVzZXQgYT1bYWJdOyBlY2hvICIkYSIKLSAqCWE9W2FiXQotICoJJCB4PXR5cGVzZXQ7ICR4IGE9W2FiXTsgZWNobyAiJGEiCi0gKglhPWEKLSAqCSQKLSAqLwotc3RhdGljIGludAotYXNzaWduX2NvbW1hbmQoY2hhciAqcykKLXsKLQlpZiAoISpzKQotCQlyZXR1cm4gKDApOwotCXJldHVybiAoKHN0cmNtcChzLCAiYWxpYXMiKSA9PSAwKSB8fAotCSAgICAoc3RyY21wKHMsICJleHBvcnQiKSA9PSAwKSB8fAotCSAgICAoc3RyY21wKHMsICJyZWFkb25seSIpID09IDApIHx8Ci0JICAgIChzdHJjbXAocywgVF90eXBlc2V0KSA9PSAwKSk7Ci19Ci0KLS8qIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHJlYWRpbmcgYW4gYWxpYXMgKi8KLXN0YXRpYyBpbnQKLWluYWxpYXMoc3RydWN0IHNvdXJjZSAqcykKLXsKLQlmb3IgKDsgcyAmJiBzLT50eXBlID09IFNBTElBUzsgcyA9IHMtPm5leHQpCi0JCWlmICghKHMtPmZsYWdzICYgU0ZfQUxJQVNFTkQpKQotCQkJcmV0dXJuICgxKTsKLQlyZXR1cm4gKDApOwotfQotCi0KLS8qIE9yZGVyIGltcG9ydGFudCAtIGluZGV4ZWQgYnkgVGVzdF9tZXRhIHZhbHVlcwotICogTm90ZSB0aGF0IHx8LCAmJiwgKCBhbmQgKSBjYW4ndCBhcHBlYXIgaW4gYXMgdW5xdW90ZWQgc3RyaW5ncwotICogaW4gbm9ybWFsIHNoZWxsIGlucHV0LCBzbyB0aGVzZSBjYW4gYmUgaW50ZXJwcmV0ZWQgdW5hbWJpZ3VvdXNseQotICogaW4gdGhlIGV2YWx1YXRpb24gcGFzcy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X29yW10gPSB7IENIQVIsICd8JywgQ0hBUiwgJ3wnLCBFT1MgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9hbmRbXSA9IHsgQ0hBUiwgJyYnLCBDSEFSLCAnJicsIEVPUyB9Owotc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X25vdFtdID0geyBDSEFSLCAnIScsIEVPUyB9Owotc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X29wYXJlbltdID0geyBDSEFSLCAnKCcsIEVPUyB9Owotc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X2NwYXJlbltdID0geyBDSEFSLCAnKScsIEVPUyB9OwotY29uc3QgY2hhciAqY29uc3QgZGJ0ZXN0X3Rva2Vuc1tdID0gewotCWRidGVzdF9vciwgZGJ0ZXN0X2FuZCwgZGJ0ZXN0X25vdCwKLQlkYnRlc3Rfb3BhcmVuLCBkYnRlc3RfY3BhcmVuCi19OwotY29uc3QgY2hhciBkYl9jbG9zZVtdID0geyBDSEFSLCAnXScsIENIQVIsICddJywgRU9TIH07Ci1jb25zdCBjaGFyIGRiX2x0aGFuW10gPSB7IENIQVIsICc8JywgRU9TIH07Ci1jb25zdCBjaGFyIGRiX2d0aGFuW10gPSB7IENIQVIsICc+JywgRU9TIH07Ci0KLS8qCi0gKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKLSAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKLSAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KLSAqLwotc3RhdGljIFRlc3Rfb3AKLWRidGVzdHBfaXNhKFRlc3RfZW52ICp0ZSwgVGVzdF9tZXRhIG1ldGEpCi17Ci0JaW50IGMgPSB0cGVlayhBUlJBWVZBUiB8IChtZXRhID09IFRNX0JJTk9QID8gMCA6IENPTlRJTikpOwotCWludCB1cXdvcmQ7Ci0JY2hhciAqc2F2ZSA9IE5VTEw7Ci0JVGVzdF9vcCByZXQgPSBUT19OT05PUDsKLQotCS8qIHVucXVvdGVkIHdvcmQ/ICovCi0JdXF3b3JkID0gYyA9PSBMV09SRCAmJiAqaWRlbnQ7Ci0KLQlpZiAobWV0YSA9PSBUTV9PUikKLQkJcmV0ID0gYyA9PSBMT0dPUiA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKLQllbHNlIGlmIChtZXRhID09IFRNX0FORCkKLQkJcmV0ID0gYyA9PSBMT0dBTkQgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0JZWxzZSBpZiAobWV0YSA9PSBUTV9OT1QpCi0JCXJldCA9ICh1cXdvcmQgJiYgIXN0cmNtcCh5eWx2YWwuY3AsCi0JCSAgICBkYnRlc3RfdG9rZW5zWyhpbnQpVE1fTk9UXSkpID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOwotCWVsc2UgaWYgKG1ldGEgPT0gVE1fT1BBUkVOKQotCQlyZXQgPSBjID09ICcoJyAvKikqLyA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKLQllbHNlIGlmIChtZXRhID09IFRNX0NQQVJFTikKLQkJcmV0ID0gYyA9PSAvKigqLyAnKScgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0JZWxzZSBpZiAobWV0YSA9PSBUTV9VTk9QIHx8IG1ldGEgPT0gVE1fQklOT1ApIHsKLQkJaWYgKG1ldGEgPT0gVE1fQklOT1AgJiYgYyA9PSBSRURJUiAmJgotCQkgICAgKHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9SRUFEIHx8IHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9XUklURSkpIHsKLQkJCXJldCA9IFRPX05PTk5VTEw7Ci0JCQlzYXZlID0gd2Rjb3B5KHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9SRUFEID8KLQkJCSAgICBkYl9sdGhhbiA6IGRiX2d0aGFuLCBBVEVNUCk7Ci0JCX0gZWxzZSBpZiAodXF3b3JkICYmIChyZXQgPSB0ZXN0X2lzb3AobWV0YSwgaWRlbnQpKSkKLQkJCXNhdmUgPSB5eWx2YWwuY3A7Ci0JfSBlbHNlIC8qIG1ldGEgPT0gVE1fRU5EICovCi0JCXJldCA9ICh1cXdvcmQgJiYgIXN0cmNtcCh5eWx2YWwuY3AsCi0JCSAgICBkYl9jbG9zZSkpID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOwotCWlmIChyZXQgIT0gVE9fTk9OT1ApIHsKLQkJQUNDRVBUOwotCQlpZiAobWV0YSA8IE5FTEVNKGRidGVzdF90b2tlbnMpKQotCQkJc2F2ZSA9IHdkY29weShkYnRlc3RfdG9rZW5zWyhpbnQpbWV0YV0sIEFURU1QKTsKLQkJaWYgKHNhdmUpCi0JCQlYUHB1dCgqdGUtPnBvcy5hdiwgc2F2ZSk7Ci0JfQotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGJ0ZXN0cF9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCBNS1NIX0FfVU5VU0VELAotICAgIGJvb2wgZG9fZXZhbCBNS1NIX0FfVU5VU0VEKQotewotCWludCBjID0gdHBlZWsoQVJSQVlWQVIpOwotCi0JaWYgKGMgIT0gTFdPUkQpCi0JCXJldHVybiAoTlVMTCk7Ci0KLQlBQ0NFUFQ7Ci0JWFBwdXQoKnRlLT5wb3MuYXYsIHl5bHZhbC5jcCk7Ci0KLQlyZXR1cm4gKG51bGwpOwotfQotCi1zdGF0aWMgaW50Ci1kYnRlc3RwX2V2YWwoVGVzdF9lbnYgKnRlIE1LU0hfQV9VTlVTRUQsIFRlc3Rfb3Agb3AgTUtTSF9BX1VOVVNFRCwKLSAgICBjb25zdCBjaGFyICpvcG5kMSBNS1NIX0FfVU5VU0VELCBjb25zdCBjaGFyICpvcG5kMiBNS1NIX0FfVU5VU0VELAotICAgIGJvb2wgZG9fZXZhbCBNS1NIX0FfVU5VU0VEKQotewotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kYnRlc3RwX2Vycm9yKFRlc3RfZW52ICp0ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQotewotCXRlLT5mbGFncyB8PSBURUZfRVJST1I7Ci0KLQlpZiAob2Zmc2V0IDwgMCkgewotCQlSRUpFQ1Q7Ci0JCS8qIEtsdWRneSB0byBzYXkgdGhlIGxlYXN0Li4uICovCi0JCXN5bWJvbCA9IExXT1JEOwotCQl5eWx2YWwuY3AgPSAqKFhQcHRydigqdGUtPnBvcy5hdikgKyBYUHNpemUoKnRlLT5wb3MuYXYpICsKLQkJICAgIG9mZnNldCk7Ci0JfQotCXN5bnRheGVycihtc2cpOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdHJlZS5jIGIvbWtzaC9zcmMvdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2MWRiLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL3RyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNiArMCwwIEBACi0vKgkkT3BlbkJTRDogdHJlZS5jLHYgMS4xOSAyMDA4LzA4LzExIDIxOjUwOjM1IGphcmVkeSBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3RyZWUuYyx2IDEuMzAgMjAxMC8wMi8yNSAyMDoxODoxOSB0ZyBFeHAgJCIpOwotCi0jZGVmaW5lIElOREVOVAk0Ci0KLSNkZWZpbmUgdHB1dGMoYywgc2hmKSBzaGZfcHV0Y2hhcihjLCBzaGYpOwotc3RhdGljIHZvaWQgcHRyZWUoc3RydWN0IG9wICosIGludCwgc3RydWN0IHNoZiAqKTsKLXN0YXRpYyB2b2lkIHBpb2FjdChzdHJ1Y3Qgc2hmICosIGludCwgc3RydWN0IGlvd29yZCAqKTsKLXN0YXRpYyB2b2lkIHRwdXRDKGludCwgc3RydWN0IHNoZiAqKTsKLXN0YXRpYyB2b2lkIHRwdXRTKGNoYXIgKiwgc3RydWN0IHNoZiAqKTsKLXN0YXRpYyB2b2lkIHZmcHRyZWVmKHN0cnVjdCBzaGYgKiwgaW50LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotc3RhdGljIHN0cnVjdCBpb3dvcmQgKippb2NvcHkoc3RydWN0IGlvd29yZCAqKiwgQXJlYSAqKTsKLXN0YXRpYyB2b2lkIGlvZnJlZShzdHJ1Y3QgaW93b3JkICoqLCBBcmVhICopOwotCi0vKgotICogcHJpbnQgYSBjb21tYW5kIHRyZWUKLSAqLwotc3RhdGljIHZvaWQKLXB0cmVlKHN0cnVjdCBvcCAqdCwgaW50IGluZGVudCwgc3RydWN0IHNoZiAqc2hmKQotewotCWNvbnN0IGNoYXIgKip3OwotCXN0cnVjdCBpb3dvcmQgKippb2FjdDsKLQlzdHJ1Y3Qgb3AgKnQxOwotCi0gQ2hhaW46Ci0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXN3aXRjaCAodC0+dHlwZSkgewotCWNhc2UgVENPTToKLQkJaWYgKHQtPnZhcnMpCi0JCQlmb3IgKHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdyAhPSBOVUxMOyApCi0JCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTICIsICp3KyspOwotCQllbHNlCi0JCQlzaGZfcHV0cygiI25vLXZhcnMjICIsIHNoZik7Ci0JCWlmICh0LT5hcmdzKQotCQkJZm9yICh3ID0gdC0+YXJnczsgKncgIT0gTlVMTDsgKQotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKLQkJZWxzZQotCQkJc2hmX3B1dHMoIiNuby1hcmdzIyAiLCBzaGYpOwotCQlicmVhazsKLQljYXNlIFRFWEVDOgotCQl0ID0gdC0+bGVmdDsKLQkJZ290byBDaGFpbjsKLQljYXNlIFRQQVJFTjoKLQkJZnB0cmVlZihzaGYsIGluZGVudCArIDIsICIoICVUKSAiLCB0LT5sZWZ0KTsKLQkJYnJlYWs7Ci0JY2FzZSBUUElQRToKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUfCAiLCB0LT5sZWZ0KTsKLQkJdCA9IHQtPnJpZ2h0OwotCQlnb3RvIENoYWluOwotCWNhc2UgVExJU1Q6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCU7IiwgdC0+bGVmdCk7Ci0JCXQgPSB0LT5yaWdodDsKLQkJZ290byBDaGFpbjsKLQljYXNlIFRPUjoKLQljYXNlIFRBTkQ6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCVzICVUIiwKLQkJICAgIHQtPmxlZnQsICh0LT50eXBlPT1UT1IpID8gInx8IiA6ICImJiIsIHQtPnJpZ2h0KTsKLQkJYnJlYWs7Ci0JY2FzZSBUQkFORzoKLQkJc2hmX3B1dHMoIiEgIiwgc2hmKTsKLQkJdCA9IHQtPnJpZ2h0OwotCQlnb3RvIENoYWluOwotCWNhc2UgVERCUkFDS0VUOiB7Ci0JCWludCBpOwotCi0JCXNoZl9wdXRzKCJbWyIsIHNoZik7Ci0JCWZvciAoaSA9IDA7IHQtPmFyZ3NbaV07IGkrKykKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIgJVMiLCB0LT5hcmdzW2ldKTsKLQkJc2hmX3B1dHMoIiBdXSAiLCBzaGYpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBUU0VMRUNUOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAic2VsZWN0ICVzICIsIHQtPnN0cik7Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBURk9SOgotCQlpZiAodC0+dHlwZSA9PSBURk9SKQotCQkJZnB0cmVlZihzaGYsIGluZGVudCwgImZvciAlcyAiLCB0LT5zdHIpOwotCQlpZiAodC0+dmFycyAhPSBOVUxMKSB7Ci0JCQlzaGZfcHV0cygiaW4gIiwgc2hmKTsKLQkJCWZvciAodyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp3OyApCi0JCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTICIsICp3KyspOwotCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7Ci0JCX0KLQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgImRvJU4lVCIsIHQtPmxlZnQpOwotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtkb25lICIpOwotCQlicmVhazsKLQljYXNlIFRDQVNFOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiY2FzZSAlUyBpbiIsIHQtPnN0cik7Ci0JCWZvciAodDEgPSB0LT5sZWZ0OyB0MSAhPSBOVUxMOyB0MSA9IHQxLT5yaWdodCkgewotCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVOKCIpOwotCQkJZm9yICh3ID0gKGNvbnN0IGNoYXIgKiopdDEtPnZhcnM7ICp3ICE9IE5VTEw7IHcrKykKLQkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMlYyIsICp3LAotCQkJCSAgICAod1sxXSAhPSBOVUxMKSA/ICd8JyA6ICcpJyk7Ci0JCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiJTslVCVOOzsiLCB0MS0+bGVmdCk7Ci0JCX0KLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVOZXNhYyAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBUSUY6Ci0JY2FzZSBURUxJRjoKLQkJLyogMyA9PSBzdHJsZW4oImlmICIpICovCi0JCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyAzLCAiaWYgJVQiLCB0LT5sZWZ0KTsKLQkJZm9yICg7OykgewotCQkJdCA9IHQtPnJpZ2h0OwotCQkJaWYgKHQtPmxlZnQgIT0gTlVMTCkgewotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOwotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJ0aGVuJU4lVCIsCi0JCQkJICAgIHQtPmxlZnQpOwotCQkJfQotCQkJaWYgKHQtPnJpZ2h0ID09IE5VTEwgfHwgdC0+cmlnaHQtPnR5cGUgIT0gVEVMSUYpCi0JCQkJYnJlYWs7Ci0JCQl0ID0gdC0+cmlnaHQ7Ci0JCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKLQkJCS8qIDUgPT0gc3RybGVuKCJlbGlmICIpICovCi0JCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgNSwgImVsaWYgJVQiLCB0LT5sZWZ0KTsKLQkJfQotCQlpZiAodC0+cmlnaHQgIT0gTlVMTCkgewotCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7Ci0JCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiZWxzZSU7JVQiLCB0LT5yaWdodCk7Ci0JCX0KLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZmkgIik7Ci0JCWJyZWFrOwotCWNhc2UgVFdISUxFOgotCWNhc2UgVFVOVElMOgotCQkvKiA2ID09IHN0cmxlbigid2hpbGUiLyJ1bnRpbCIpICovCi0JCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyA2LCAiJXMgJVQiLAotCQkgICAgKHQtPnR5cGU9PVRXSElMRSkgPyAid2hpbGUiIDogInVudGlsIiwKLQkJICAgIHQtPmxlZnQpOwotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtkbyIpOwotCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiJTslVCIsIHQtPnJpZ2h0KTsKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG9uZSAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBUQlJBQ0U6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJ7JTslVCIsIHQtPmxlZnQpOwotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTt9ICIpOwotCQlicmVhazsKLQljYXNlIFRDT1BST0M6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVHwmICIsIHQtPmxlZnQpOwotCQlicmVhazsKLQljYXNlIFRBU1lOQzoKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUJiAiLCB0LT5sZWZ0KTsKLQkJYnJlYWs7Ci0JY2FzZSBURlVOQ1Q6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsCi0JCSAgICB0LT51LmtzaF9mdW5jID8gImZ1bmN0aW9uICVzICVUIiA6ICIlcygpICVUIiwKLQkJICAgIHQtPnN0ciwgdC0+bGVmdCk7Ci0JCWJyZWFrOwotCWNhc2UgVFRJTUU6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJ0aW1lICVUIiwgdC0+bGVmdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNoZl9wdXRzKCI8Ym90Y2g+Iiwgc2hmKTsKLQkJYnJlYWs7Ci0JfQotCWlmICgoaW9hY3QgPSB0LT5pb2FjdCkgIT0gTlVMTCkgewotCQlpbnQJbmVlZF9ubCA9IDA7Ci0KLQkJd2hpbGUgKCppb2FjdCAhPSBOVUxMKQotCQkJcGlvYWN0KHNoZiwgaW5kZW50LCAqaW9hY3QrKyk7Ci0JCS8qIFByaW50IGhlcmUgZG9jdW1lbnRzIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLwotCQlmb3IgKGlvYWN0ID0gdC0+aW9hY3Q7ICppb2FjdCAhPSBOVUxMOyApIHsKLQkJCXN0cnVjdCBpb3dvcmQgKmlvcCA9ICppb2FjdCsrOwotCi0JCQkvKiBoZXJlZG9jIGlzIDAgd2hlbiB0cmFjaW5nIChzZXQgLXgpICovCi0JCQlpZiAoKGlvcC0+ZmxhZyAmIElPVFlQRSkgPT0gSU9IRVJFICYmIGlvcC0+aGVyZWRvYyAmJgotCQkJICAgIC8qIGlvcC0+ZGVsaW1bMV0gPT0gJzwnIG1lYW5zIGhlcmUgc3RyaW5nICovCi0JCQkgICAgKCFpb3AtPmRlbGltIHx8IGlvcC0+ZGVsaW1bMV0gIT0gJzwnKSkgewotCQkJCXRwdXRjKCdcbicsIHNoZik7Ci0JCQkJc2hmX3B1dHMoaW9wLT5oZXJlZG9jLCBzaGYpOwotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlcyIsCi0JCQkJICAgIGV2YWxzdHIoaW9wLT5kZWxpbSwgMCkpOwotCQkJCW5lZWRfbmwgPSAxOwotCQkJfQotCQl9Ci0JCS8qIExhc3QgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBuZXdsaW5lICh0aGlzIG9mdGVuCi0JCSAqIGxlYWRzIHRvIGFuIGV4dHJhIGJsYW5rIGxpbmUsIGJ1dCBpdHMgbm90IHdvcnRoIHdvcnJ5aW5nCi0JCSAqIGFib3V0KQotCQkgKi8KLQkJaWYgKG5lZWRfbmwpCi0JCQl0cHV0YygnXG4nLCBzaGYpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXBpb2FjdChzdHJ1Y3Qgc2hmICpzaGYsIGludCBpbmRlbnQsIHN0cnVjdCBpb3dvcmQgKmlvcCkKLXsKLQlpbnQgZmxhZyA9IGlvcC0+ZmxhZzsKLQlpbnQgdHlwZSA9IGZsYWcgJiBJT1RZUEU7Ci0JaW50IGV4cGVjdGVkOwotCi0JZXhwZWN0ZWQgPSAodHlwZSA9PSBJT1JFQUQgfHwgdHlwZSA9PSBJT1JEV1IgfHwgdHlwZSA9PSBJT0hFUkUpID8gMCA6Ci0JICAgICh0eXBlID09IElPQ0FUIHx8IHR5cGUgPT0gSU9XUklURSkgPyAxIDoKLQkgICAgKHR5cGUgPT0gSU9EVVAgJiYgKGlvcC0+dW5pdCA9PSAhKGZsYWcgJiBJT1JEVVApKSkgPyBpb3AtPnVuaXQgOgotCSAgICBpb3AtPnVuaXQgKyAxOwotCWlmIChpb3AtPnVuaXQgIT0gZXhwZWN0ZWQpCi0JCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwgaW9wLT51bml0KTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSU9SRUFEOgotCQlzaGZfcHV0cygiPCAiLCBzaGYpOwotCQlicmVhazsKLQljYXNlIElPSEVSRToKLQkJc2hmX3B1dHMoZmxhZyAmIElPU0tJUCA/ICI8PC0iIDogIjw8Iiwgc2hmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0NBVDoKLQkJc2hmX3B1dHMoIj4+ICIsIHNoZik7Ci0JCWJyZWFrOwotCWNhc2UgSU9XUklURToKLQkJc2hmX3B1dHMoZmxhZyAmIElPQ0xPQiA/ICI+fCAiIDogIj4gIiwgc2hmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT1JEV1I6Ci0JCXNoZl9wdXRzKCI8PiAiLCBzaGYpOwotCQlicmVhazsKLQljYXNlIElPRFVQOgotCQlzaGZfcHV0cyhmbGFnICYgSU9SRFVQID8gIjwmIiA6ICI+JiIsIHNoZik7Ci0JCWJyZWFrOwotCX0KLQkvKiBuYW1lL2RlbGltIGFyZSAwIHdoZW4gcHJpbnRpbmcgc3ludGF4IGVycm9ycyAqLwotCWlmICh0eXBlID09IElPSEVSRSkgewotCQlpZiAoaW9wLT5kZWxpbSkKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlcyVTICIsCi0JCQkgICAgLyogaGVyZSBzdHJpbmcgKi8gaW9wLT5kZWxpbVsxXSA9PSAnPCcgPyAiIiA6ICIgIiwKLQkJCSAgICBpb3AtPmRlbGltKTsKLQkJZWxzZQotCQkJdHB1dGMoJyAnLCBzaGYpOwotCX0gZWxzZSBpZiAoaW9wLT5uYW1lKQotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAoaW9wLT5mbGFnICYgSU9OQU1FWFApID8gIiVzICIgOiAiJVMgIiwKLQkJICAgIGlvcC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIHZhcmlhbnRzIG9mIGZwdXRjLCBmcHV0cyBmb3IgcHRyZWVmIGFuZCBzbnB0cmVlZgotICovCi1zdGF0aWMgdm9pZAotdHB1dEMoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpZiAoKGMmMHg2MCkgPT0gMCkgewkJLyogQzB8QzEgKi8KLQkJdHB1dGMoKGMmMHg4MCkgPyAnJCcgOiAnXicsIHNoZik7Ci0JCXRwdXRjKCgoYyYweDdGKXwweDQwKSwgc2hmKTsKLQl9IGVsc2UgaWYgKChjJjB4N0YpID09IDB4N0YpIHsJLyogREVMICovCi0JCXRwdXRjKChjJjB4ODApID8gJyQnIDogJ14nLCBzaGYpOwotCQl0cHV0YygnPycsIHNoZik7Ci0JfSBlbHNlCi0JCXRwdXRjKGMsIHNoZik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10cHV0UyhjaGFyICp3cCwgc3RydWN0IHNoZiAqc2hmKQotewotCWludCBjLCBxdW90ZWxldmVsID0gMDsKLQotCS8qIHByb2JsZW1zOgotCSAqCWAuLi5gIC0+ICQoLi4uKQotCSAqCSdmb28nIC0+ICJmb28iCi0JICogY291bGQgY2hhbmdlIGVuY29kaW5nIHRvOgotCSAqCU9RVU9URSBbIiddIC4uLiBDUVVPVEUgWyInXQotCSAqCUNPTVNVQiBbKGBdIC4uLlwwCShoYW5kbGUgJCBgIFwgYW5kIG1heWJlICIgaW4gYC4uLmAgY2FzZSkKLQkgKi8KLQl3aGlsZSAoMSkKLQkJc3dpdGNoICgqd3ArKykgewotCQljYXNlIEVPUzoKLQkJCXJldHVybjsKLQkJY2FzZSBBREVMSU06Ci0JCWNhc2UgQ0hBUjoKLQkJCXRwdXRDKCp3cCsrLCBzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUNIQVI6Ci0JCQljID0gKndwKys7Ci0JCQlpZiAoIXF1b3RlbGV2ZWwgfHwgKGMgPT0gJyInIHx8IGMgPT0gJ2AnIHx8IGMgPT0gJyQnKSkKLQkJCQl0cHV0YygnXFwnLCBzaGYpOwotCQkJdHB1dEMoYywgc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTVNVQjoKLQkJCXNoZl9wdXRzKCIkKCIsIHNoZik7Ci0JCQl3aGlsZSAoKndwICE9IDApCi0JCQkJdHB1dEMoKndwKyssIHNoZik7Ci0JCQl0cHV0YygnKScsIHNoZik7Ci0JCQl3cCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhQUlNVQjoKLQkJCXNoZl9wdXRzKCIkKCgiLCBzaGYpOwotCQkJd2hpbGUgKCp3cCAhPSAwKQotCQkJCXRwdXRDKCp3cCsrLCBzaGYpOwotCQkJc2hmX3B1dHMoIikpIiwgc2hmKTsKLQkJCXdwKys7Ci0JCQlicmVhazsKLQkJY2FzZSBPUVVPVEU6Ci0JCQlxdW90ZWxldmVsKys7Ci0JCQl0cHV0YygnIicsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDUVVPVEU6Ci0JCQlpZiAocXVvdGVsZXZlbCkKLQkJCQlxdW90ZWxldmVsLS07Ci0JCQl0cHV0YygnIicsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBPU1VCU1Q6Ci0JCQl0cHV0YygnJCcsIHNoZik7Ci0JCQlpZiAoKndwKysgPT0gJ3snKQotCQkJCXRwdXRjKCd7Jywgc2hmKTsKLQkJCXdoaWxlICgoYyA9ICp3cCsrKSAhPSAwKQotCQkJCXRwdXRDKGMsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDU1VCU1Q6Ci0JCQlpZiAoKndwKysgPT0gJ30nKQotCQkJCXRwdXRjKCd9Jywgc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQVQ6Ci0JCQl0cHV0Yygqd3ArKywgc2hmKTsKLQkJCXRwdXRjKCcoJywgc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIFNQQVQ6Ci0JCQl0cHV0YygnfCcsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDUEFUOgotCQkJdHB1dGMoJyknLCBzaGYpOwotCQkJYnJlYWs7Ci0JCX0KLX0KLQotLyoKLSAqIHRoaXMgaXMgdGhlIF9vbmx5XyB3YXkgdG8gcmVsaWFibHkgaGFuZGxlCi0gKiB2YXJpYWJsZSBhcmdzIHdpdGggYW4gQU5TSSBjb21waWxlcgotICovCi0vKiBWQVJBUkdTICovCi1pbnQKLWZwdHJlZWYoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0JdmFfc3RhcnQodmEsIGZtdCk7Ci0KLQl2ZnB0cmVlZihzaGYsIGluZGVudCwgZm10LCB2YSk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKiBWQVJBUkdTICovCi1jaGFyICoKLXNucHRyZWVmKGNoYXIgKnMsIGludCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCXN0cnVjdCBzaGYgc2hmOwotCi0Jc2hmX3NvcGVuKHMsIG4sIFNIRl9XUiB8IChzID8gMCA6IFNIRl9EWU5BTUlDKSwgJnNoZik7Ci0KLQl2YV9zdGFydCh2YSwgZm10KTsKLQl2ZnB0cmVlZigmc2hmLCAwLCBmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCi0JcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCi19Ci0KLXN0YXRpYyB2b2lkCi12ZnB0cmVlZihzdHJ1Y3Qgc2hmICpzaGYsIGludCBpbmRlbnQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSkKLXsKLQlpbnQgYzsKLQotCXdoaWxlICgoYyA9ICpmbXQrKykpIHsKLQkJaWYgKGMgPT0gJyUnKSB7Ci0JCQlzd2l0Y2ggKChjID0gKmZtdCsrKSkgewotCQkJY2FzZSAnYyc6Ci0JCQkJdHB1dGModmFfYXJnKHZhLCBpbnQpLCBzaGYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncyc6Ci0JCQkJc2hmX3B1dHModmFfYXJnKHZhLCBjaGFyICopLCBzaGYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnUyc6CS8qIHdvcmQgKi8KLQkJCQl0cHV0Uyh2YV9hcmcodmEsIGNoYXIgKiksIHNoZik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdkJzoJLyogZGVjaW1hbCAqLwotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwgdmFfYXJnKHZhLCBpbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3UnOgkvKiBkZWNpbWFsICovCi0JCQkJc2hmX2ZwcmludGYoc2hmLCAiJXUiLCB2YV9hcmcodmEsIHVuc2lnbmVkIGludCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnVCc6CS8qIGZvcm1hdCB0cmVlICovCi0JCQkJcHRyZWUodmFfYXJnKHZhLCBzdHJ1Y3Qgb3AgKiksIGluZGVudCwgc2hmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJzsnOgkvKiBuZXdsaW5lIG9yIDsgKi8KLQkJCWNhc2UgJ04nOgkvKiBuZXdsaW5lIG9yIHNwYWNlICovCi0JCQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7Ci0JCQkJCWlmIChjID09ICc7JykKLQkJCQkJCXRwdXRjKCc7Jywgc2hmKTsKLQkJCQkJdHB1dGMoJyAnLCBzaGYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBpOwotCi0JCQkJCXRwdXRjKCdcbicsIHNoZik7Ci0JCQkJCWZvciAoaSA9IGluZGVudDsgaSA+PSA4OyBpIC09IDgpCi0JCQkJCQl0cHV0YygnXHQnLCBzaGYpOwotCQkJCQlmb3IgKDsgaSA+IDA7IC0taSkKLQkJCQkJCXRwdXRjKCcgJywgc2hmKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdSJzoKLQkJCQlwaW9hY3Qoc2hmLCBpbmRlbnQsIHZhX2FyZyh2YSwgc3RydWN0IGlvd29yZCAqKSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRwdXRjKGMsIHNoZik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJdHB1dGMoYywgc2hmKTsKLQl9Ci19Ci0KLS8qCi0gKiBjb3B5IHRyZWUgKGZvciBmdW5jdGlvbiBkZWZpbml0aW9uKQotICovCi1zdHJ1Y3Qgb3AgKgotdGNvcHkoc3RydWN0IG9wICp0LCBBcmVhICphcCkKLXsKLQlzdHJ1Y3Qgb3AgKnI7Ci0JY29uc3QgY2hhciAqKnR3OwotCWNoYXIgKipydzsKLQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0KLQlyID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcCksIGFwKTsKLQotCXItPnR5cGUgPSB0LT50eXBlOwotCXItPnUuZXZhbGZsYWdzID0gdC0+dS5ldmFsZmxhZ3M7Ci0KLQlpZiAodC0+dHlwZSA9PSBUQ0FTRSkKLQkJci0+c3RyID0gd2Rjb3B5KHQtPnN0ciwgYXApOwotCWVsc2UKLQkJc3RyZHVweChyLT5zdHIsIHQtPnN0ciwgYXApOwotCi0JaWYgKHQtPnZhcnMgPT0gTlVMTCkKLQkJci0+dmFycyA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWZvciAodHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdHcrKyAhPSBOVUxMOyApCi0JCQk7Ci0JCXJ3ID0gci0+dmFycyA9IGFsbG9jKCh0dyAtIChjb25zdCBjaGFyICoqKXQtPnZhcnMgKyAxKSAqCi0JCSAgICBzaXplb2YoKnR3KSwgYXApOwotCQlmb3IgKHR3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKnR3ICE9IE5VTEw7ICkKLQkJCSpydysrID0gd2Rjb3B5KCp0dysrLCBhcCk7Ci0JCSpydyA9IE5VTEw7Ci0JfQotCi0JaWYgKHQtPmFyZ3MgPT0gTlVMTCkKLQkJci0+YXJncyA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWZvciAodHcgPSB0LT5hcmdzOyAqdHcrKyAhPSBOVUxMOyApCi0JCQk7Ci0JCXItPmFyZ3MgPSAoY29uc3QgY2hhciAqKikocncgPSBhbGxvYygodHcgLSB0LT5hcmdzICsgMSkgKgotCQkgICAgc2l6ZW9mKCp0dyksIGFwKSk7Ci0JCWZvciAodHcgPSB0LT5hcmdzOyAqdHcgIT0gTlVMTDsgKQotCQkJKnJ3KysgPSB3ZGNvcHkoKnR3KyssIGFwKTsKLQkJKnJ3ID0gTlVMTDsKLQl9Ci0KLQlyLT5pb2FjdCA9ICh0LT5pb2FjdCA9PSBOVUxMKSA/IE5VTEwgOiBpb2NvcHkodC0+aW9hY3QsIGFwKTsKLQotCXItPmxlZnQgPSB0Y29weSh0LT5sZWZ0LCBhcCk7Ci0Jci0+cmlnaHQgPSB0Y29weSh0LT5yaWdodCwgYXApOwotCXItPmxpbmVubyA9IHQtPmxpbmVubzsKLQotCXJldHVybiAocik7Ci19Ci0KLWNoYXIgKgotd2Rjb3B5KGNvbnN0IGNoYXIgKndwLCBBcmVhICphcCkKLXsKLQlzaXplX3QgbGVuID0gd2RzY2FuKHdwLCBFT1MpIC0gd3A7Ci0JcmV0dXJuIChtZW1jcHkoYWxsb2MobGVuLCBhcCksIHdwLCBsZW4pKTsKLX0KLQotLyogcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBwcmVmaXggYyBpbiB3cCBwbHVzIDEgKi8KLWNvbnN0IGNoYXIgKgotd2RzY2FuKGNvbnN0IGNoYXIgKndwLCBpbnQgYykKLXsKLQlpbnQgbmVzdCA9IDA7Ci0KLQl3aGlsZSAoMSkKLQkJc3dpdGNoICgqd3ArKykgewotCQljYXNlIEVPUzoKLQkJCXJldHVybiAod3ApOwotCQljYXNlIEFERUxJTToKLQkJCWlmIChjID09IEFERUxJTSkKLQkJCQlyZXR1cm4gKHdwICsgMSk7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIENIQVI6Ci0JCWNhc2UgUUNIQVI6Ci0JCQl3cCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09NU1VCOgotCQljYXNlIEVYUFJTVUI6Ci0JCQl3aGlsZSAoKndwKysgIT0gMCkKLQkJCQk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUVVPVEU6Ci0JCWNhc2UgQ1FVT1RFOgotCQkJYnJlYWs7Ci0JCWNhc2UgT1NVQlNUOgotCQkJbmVzdCsrOwotCQkJd2hpbGUgKCp3cCsrICE9ICdcMCcpCi0JCQkJOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1NVQlNUOgotCQkJd3ArKzsKLQkJCWlmIChjID09IENTVUJTVCAmJiBuZXN0ID09IDApCi0JCQkJcmV0dXJuICh3cCk7Ci0JCQluZXN0LS07Ci0JCQlicmVhazsKLQkJY2FzZSBPUEFUOgotCQkJbmVzdCsrOwotCQkJd3ArKzsKLQkJCWJyZWFrOwotCQljYXNlIFNQQVQ6Ci0JCWNhc2UgQ1BBVDoKLQkJCWlmIChjID09IHdwWy0xXSAmJiBuZXN0ID09IDApCi0JCQkJcmV0dXJuICh3cCk7Ci0JCQlpZiAod3BbLTFdID09IENQQVQpCi0JCQkJbmVzdC0tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpbnRlcm5hbF93YXJuaW5nZigKLQkJCSAgICAid2RzY2FuOiB1bmtub3duIGNoYXIgMHgleCAoY2Fycnlpbmcgb24pIiwKLQkJCSAgICB3cFstMV0pOwotCQl9Ci19Ci0KLS8qIHJldHVybiBhIGNvcHkgb2Ygd3Agd2l0aG91dCBhbnkgb2YgdGhlIG1hcmsgdXAgY2hhcmFjdGVycyBhbmQKLSAqIHdpdGggcXVvdGUgY2hhcmFjdGVycyAoIiAnIFwpIHN0cmlwcGVkLgotICogKHN0cmluZyBpcyBhbGxvY2F0ZWQgZnJvbSBBVEVNUCkKLSAqLwotY2hhciAqCi13ZHN0cmlwKGNvbnN0IGNoYXIgKndwLCBib29sIGtlZXBxLCBib29sIG1ha2VfbWFnaWMpCi17Ci0Jc3RydWN0IHNoZiBzaGY7Ci0JaW50IGM7Ci0KLQlzaGZfc29wZW4oTlVMTCwgMzIsIFNIRl9XUiB8IFNIRl9EWU5BTUlDLCAmc2hmKTsKLQotCS8qIHByb2JsZW1zOgotCSAqCWAuLi5gIC0+ICQoLi4uKQotCSAqCXgke2ZvbzotImhpIn0gLT4geCR7Zm9vOi1oaX0KLQkgKgl4JHtmb286LSdoaSd9IC0+IHgke2ZvbzotaGl9IHVubGVzcyBrZWVwcQotCSAqLwotCXdoaWxlICgxKQotCQlzd2l0Y2ggKCp3cCsrKSB7Ci0JCWNhc2UgRU9TOgotCQkJcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCi0JCWNhc2UgQURFTElNOgotCQljYXNlIENIQVI6Ci0JCQljID0gKndwKys7Ci0JCQlpZiAobWFrZV9tYWdpYyAmJiAoSVNNQUdJQyhjKSB8fCBjID09ICdbJyB8fCBjID09IE5PVCB8fAotCQkJICAgIGMgPT0gJy0nIHx8IGMgPT0gJ10nIHx8IGMgPT0gJyonIHx8IGMgPT0gJz8nKSkKLQkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7Ci0JCQlzaGZfcHV0Y2hhcihjLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIFFDSEFSOgotCQkJYyA9ICp3cCsrOwotCQkJaWYgKGtlZXBxICYmIChjID09ICciJyB8fCBjID09ICdgJyB8fCBjID09ICckJyB8fCBjID09ICdcXCcpKQotCQkJCXNoZl9wdXRjaGFyKCdcXCcsICZzaGYpOwotCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDT01TVUI6Ci0JCQlzaGZfcHV0cygiJCgiLCAmc2hmKTsKLQkJCXdoaWxlICgqd3AgIT0gMCkKLQkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7Ci0JCQlzaGZfcHV0Y2hhcignKScsICZzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhQUlNVQjoKLQkJCXNoZl9wdXRzKCIkKCgiLCAmc2hmKTsKLQkJCXdoaWxlICgqd3AgIT0gMCkKLQkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7Ci0JCQlzaGZfcHV0cygiKSkiLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIE9RVU9URToKLQkJCWJyZWFrOwotCQljYXNlIENRVU9URToKLQkJCWJyZWFrOwotCQljYXNlIE9TVUJTVDoKLQkJCXNoZl9wdXRjaGFyKCckJywgJnNoZik7Ci0JCQlpZiAoKndwKysgPT0gJ3snKQotCQkJICAgIHNoZl9wdXRjaGFyKCd7JywgJnNoZik7Ci0JCQl3aGlsZSAoKGMgPSAqd3ArKykgIT0gMCkKLQkJCQlzaGZfcHV0Y2hhcihjLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIENTVUJTVDoKLQkJCWlmICgqd3ArKyA9PSAnfScpCi0JCQkJc2hmX3B1dGNoYXIoJ30nLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQVQ6Ci0JCQlpZiAobWFrZV9tYWdpYykgewotCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKLQkJCQlzaGZfcHV0Y2hhcigqd3ArKyB8IDB4ODAsICZzaGYpOwotCQkJfSBlbHNlIHsKLQkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7Ci0JCQkJc2hmX3B1dGNoYXIoJygnLCAmc2hmKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNQQVQ6Ci0JCQlpZiAobWFrZV9tYWdpYykKLQkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7Ci0JCQlzaGZfcHV0Y2hhcignfCcsICZzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BBVDoKLQkJCWlmIChtYWtlX21hZ2ljKQotCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKLQkJCXNoZl9wdXRjaGFyKCcpJywgJnNoZik7Ci0JCQlicmVhazsKLQkJfQotfQotCi1zdGF0aWMgc3RydWN0IGlvd29yZCAqKgotaW9jb3B5KHN0cnVjdCBpb3dvcmQgKippb3csIEFyZWEgKmFwKQotewotCXN0cnVjdCBpb3dvcmQgKippb3I7Ci0JaW50IGk7Ci0KLQlmb3IgKGlvciA9IGlvdzsgKmlvcisrICE9IE5VTEw7ICkKLQkJOwotCWlvciA9IGFsbG9jKChpb3IgLSBpb3cgKyAxKSAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBhcCk7Ci0KLQlmb3IgKGkgPSAwOyBpb3dbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCXN0cnVjdCBpb3dvcmQgKnAsICpxOwotCi0JCXAgPSBpb3dbaV07Ci0JCXEgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGlvd29yZCksIGFwKTsKLQkJaW9yW2ldID0gcTsKLQkJKnEgPSAqcDsKLQkJaWYgKHAtPm5hbWUgIT0gTlVMTCkKLQkJCXEtPm5hbWUgPSB3ZGNvcHkocC0+bmFtZSwgYXApOwotCQlpZiAocC0+ZGVsaW0gIT0gTlVMTCkKLQkJCXEtPmRlbGltID0gd2Rjb3B5KHAtPmRlbGltLCBhcCk7Ci0JCWlmIChwLT5oZXJlZG9jICE9IE5VTEwpCi0JCQlzdHJkdXB4KHEtPmhlcmVkb2MsIHAtPmhlcmVkb2MsIGFwKTsKLQl9Ci0JaW9yW2ldID0gTlVMTDsKLQotCXJldHVybiAoaW9yKTsKLX0KLQotLyoKLSAqIGZyZWUgdHJlZSAoZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24pCi0gKi8KLXZvaWQKLXRmcmVlKHN0cnVjdCBvcCAqdCwgQXJlYSAqYXApCi17Ci0JY2hhciAqKnc7Ci0KLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAodC0+c3RyICE9IE5VTEwpCi0JCWFmcmVlKHQtPnN0ciwgYXApOwotCi0JaWYgKHQtPnZhcnMgIT0gTlVMTCkgewotCQlmb3IgKHcgPSB0LT52YXJzOyAqdyAhPSBOVUxMOyB3KyspCi0JCQlhZnJlZSgqdywgYXApOwotCQlhZnJlZSh0LT52YXJzLCBhcCk7Ci0JfQotCi0JaWYgKHQtPmFyZ3MgIT0gTlVMTCkgewotCQl1bmlvbiBta3NoX2NjcGhhY2sgY3c7Ci0JCS8qIFhYWCB3ZSBhc3N1bWUgdGhlIGNhbGxlciBpcyByaWdodCAqLwotCQljdy5ybyA9IHQtPmFyZ3M7Ci0JCWZvciAodyA9IGN3LnJ3OyAqdyAhPSBOVUxMOyB3KyspCi0JCQlhZnJlZSgqdywgYXApOwotCQlhZnJlZSh0LT5hcmdzLCBhcCk7Ci0JfQotCi0JaWYgKHQtPmlvYWN0ICE9IE5VTEwpCi0JCWlvZnJlZSh0LT5pb2FjdCwgYXApOwotCi0JdGZyZWUodC0+bGVmdCwgYXApOwotCXRmcmVlKHQtPnJpZ2h0LCBhcCk7Ci0KLQlhZnJlZSh0LCBhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pb2ZyZWUoc3RydWN0IGlvd29yZCAqKmlvdywgQXJlYSAqYXApCi17Ci0Jc3RydWN0IGlvd29yZCAqKmlvcDsKLQlzdHJ1Y3QgaW93b3JkICpwOwotCi0JZm9yIChpb3AgPSBpb3c7IChwID0gKmlvcCsrKSAhPSBOVUxMOyApIHsKLQkJaWYgKHAtPm5hbWUgIT0gTlVMTCkKLQkJCWFmcmVlKHAtPm5hbWUsIGFwKTsKLQkJaWYgKHAtPmRlbGltICE9IE5VTEwpCi0JCQlhZnJlZShwLT5kZWxpbSwgYXApOwotCQlpZiAocC0+aGVyZWRvYyAhPSBOVUxMKQotCQkJYWZyZWUocC0+aGVyZWRvYywgYXApOwotCQlhZnJlZShwLCBhcCk7Ci0JfQotCWFmcmVlKGlvdywgYXApOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdmFyLmMgYi9ta3NoL3NyYy92YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5NzI5ZS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy92YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OTAgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHZhci5jLHYgMS4zNCAyMDA3LzEwLzE1IDAyOjE2OjM1IGRlcmFhZHQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi0jaWYgZGVmaW5lZChfX09wZW5CU0RfXykKLSNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+Ci0jZW5kaWYKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvdmFyLmMsdiAxLjExMCAyMDEwLzA3LzI1IDExOjM1OjQzIHRnIEV4cCAkIik7Ci0KLS8qCi0gKiBWYXJpYWJsZXMKLSAqCi0gKiBXQVJOSU5HOiB1bnJlYWRhYmxlIGNvZGUsIG5lZWRzIGEgcmV3cml0ZQotICoKLSAqIGlmIChmbGFnJklOVEVHRVIpLCB2YWwuaSBjb250YWlucyBpbnRlZ2VyIHZhbHVlLCBhbmQgdHlwZSBjb250YWlucyBiYXNlLgotICogb3RoZXJ3aXNlLCAodmFsLnMgKyB0eXBlKSBjb250YWlucyBzdHJpbmcgdmFsdWUuCi0gKiBpZiAoZmxhZyZFWFBPUlQpLCB2YWwucyBjb250YWlucyAibmFtZT12YWx1ZSIgZm9yIEUtWiBleHBvcnRpbmcuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdGJsIHZ0ZW1wOwotc3RhdGljIHN0cnVjdCB0YWJsZSBzcGVjaWFsczsKLXN0YXRpYyBjaGFyICpmb3JtYXRzdHIoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgZXhwb3J0cHJlcChzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgaW50IHNwZWNpYWwoY29uc3QgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHVuc3BlY2lhbChjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgZ2V0c3BlYyhzdHJ1Y3QgdGJsICopOwotc3RhdGljIHZvaWQgc2V0c3BlYyhzdHJ1Y3QgdGJsICopOwotc3RhdGljIHZvaWQgdW5zZXRzcGVjKHN0cnVjdCB0YmwgKik7Ci1zdGF0aWMgaW50IGdldGludChzdHJ1Y3QgdGJsICosIG1rc2hfYXJpX3QgKiwgYm9vbCk7Ci1zdGF0aWMgbWtzaF9hcmlfdCBpbnR2YWwoc3RydWN0IHRibCAqKTsKLXN0YXRpYyBzdHJ1Y3QgdGJsICphcnJheXNlYXJjaChzdHJ1Y3QgdGJsICosIHVpbnQzMl90KTsKLXN0YXRpYyBjb25zdCBjaGFyICphcnJheV9pbmRleF9jYWxjKGNvbnN0IGNoYXIgKiwgYm9vbCAqLCB1aW50MzJfdCAqKTsKLXN0YXRpYyB1aW50MzJfdCBvYWF0aGFzaF91cGRhdGUocmVnaXN0ZXIgdWludDMyX3QsIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKiwKLSAgICByZWdpc3RlciBzaXplX3QpOwotc3RhdGljIHVpbnQzMl90IG9hYXRoYXNoX2ZpbmFsaXNlKHJlZ2lzdGVyIHVpbnQzMl90KTsKLQotdWludDhfdCBzZXRfcmVmZmxhZyA9IDA7Ci0KLS8qCi0gKiBjcmVhdGUgYSBuZXcgYmxvY2sgZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBzaW1wbGUgY29tbWFuZHMKLSAqIGFzc3VtZSBjYWxsZXIgaGFzIGFsbG9jYXRlZCBhbmQgc2V0IHVwIGUtPmxvYwotICovCi12b2lkCi1uZXdibG9jayh2b2lkKQotewotCXN0cnVjdCBibG9jayAqbDsKLQlzdGF0aWMgY29uc3QgY2hhciAqZW1wdHlbXSA9IHsgbnVsbCB9OwotCi0JbCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2spLCBBVEVNUCk7Ci0JbC0+ZmxhZ3MgPSAwOwotCWFpbml0KCZsLT5hcmVhKTsgLyogdG9kbzogY291bGQgdXNlIGUtPmFyZWEgKGwtPmFyZWEgPT4gbC0+YXJlYXApICovCi0JaWYgKCFlLT5sb2MpIHsKLQkJbC0+YXJnYyA9IDA7Ci0JCWwtPmFyZ3YgPSBlbXB0eTsKLQl9IGVsc2UgewotCQlsLT5hcmdjID0gZS0+bG9jLT5hcmdjOwotCQlsLT5hcmd2ID0gZS0+bG9jLT5hcmd2OwotCX0KLQlsLT5leGl0ID0gbC0+ZXJyb3IgPSBOVUxMOwotCWt0aW5pdCgmbC0+dmFycywgJmwtPmFyZWEsIDApOwotCWt0aW5pdCgmbC0+ZnVucywgJmwtPmFyZWEsIDApOwotCWwtPm5leHQgPSBlLT5sb2M7Ci0JZS0+bG9jID0gbDsKLX0KLQotLyoKLSAqIHBvcCBhIGJsb2NrIGhhbmRsaW5nIHNwZWNpYWwgdmFyaWFibGVzCi0gKi8KLXZvaWQKLXBvcGJsb2NrKHZvaWQpCi17Ci0Jc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOwotCXN0cnVjdCB0YmwgKnZwLCAqKnZwcCA9IGwtPnZhcnMudGJscywgKnZxOwotCWludCBpOwotCi0JZS0+bG9jID0gbC0+bmV4dDsJLyogcG9wIGJsb2NrICovCi0JZm9yIChpID0gbC0+dmFycy5zaXplOyAtLWkgPj0gMDsgKQotCQlpZiAoKHZwID0gKnZwcCsrKSAhPSBOVUxMICYmICh2cC0+ZmxhZyZTUEVDSUFMKSkgewotCQkJaWYgKCh2cSA9IGdsb2JhbCh2cC0+bmFtZSkpLT5mbGFnICYgSVNTRVQpCi0JCQkJc2V0c3BlYyh2cSk7Ci0JCQllbHNlCi0JCQkJdW5zZXRzcGVjKHZxKTsKLQkJfQotCWlmIChsLT5mbGFncyAmIEJGX0RPR0VUT1BUUykKLQkJdXNlcl9vcHQgPSBsLT5nZXRvcHRzX3N0YXRlOwotCWFmcmVlYWxsKCZsLT5hcmVhKTsKLQlhZnJlZShsLCBBVEVNUCk7Ci19Ci0KLS8qIGNhbGxlZCBieSBtYWluKCkgdG8gaW5pdGlhbGlzZSB2YXJpYWJsZSBkYXRhIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgVkFSU1BFQ19ERUZOUwotI2luY2x1ZGUgInZhcl9zcGVjLmgiCi0KLWVudW0gdmFyX3NwZWNzIHsKLSNkZWZpbmUgVkFSU1BFQ19FTlVNUwotI2luY2x1ZGUgInZhcl9zcGVjLmgiCi0JVl9NQVgKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5pdHZhcl9uYW1lc1tdID0gewotI2RlZmluZSBWQVJTUEVDX0lURU1TCi0jaW5jbHVkZSAidmFyX3NwZWMuaCIKLX07Ci0KLXZvaWQKLWluaXR2YXIodm9pZCkKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHRibCAqdHA7Ci0KLQlrdGluaXQoJnNwZWNpYWxzLCBBUEVSTSwKLQkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgMTIgc3BlY2lhbHMpICovIDE2KTsKLQl3aGlsZSAoaSA8IFZfTUFYIC0gMSkgewotCQl0cCA9IGt0ZW50ZXIoJnNwZWNpYWxzLCBpbml0dmFyX25hbWVzW2ldLAotCQkgICAgaGFzaChpbml0dmFyX25hbWVzW2ldKSk7Ci0JCXRwLT5mbGFnID0gREVGSU5FRHxJU1NFVDsKLQkJdHAtPnR5cGUgPSArK2k7Ci0JfQotfQotCi0vKiBVc2VkIHRvIGNhbGN1bGF0ZSBhbiBhcnJheSBpbmRleCBmb3IgZ2xvYmFsKCkvbG9jYWwoKS4gU2V0cyAqYXJyYXlwIHRvCi0gKiB0cnVlIGlmIHRoaXMgaXMgYW4gYXJyYXksIHNldHMgKnZhbHAgdG8gdGhlIGFycmF5IGluZGV4LCByZXR1cm5zCi0gKiB0aGUgYmFzZW5hbWUgb2YgdGhlIGFycmF5LgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1hcnJheV9pbmRleF9jYWxjKGNvbnN0IGNoYXIgKm4sIGJvb2wgKmFycmF5cCwgdWludDMyX3QgKnZhbHApCi17Ci0JY29uc3QgY2hhciAqcDsKLQlpbnQgbGVuOwotCWNoYXIgKmFwID0gTlVMTDsKLQotCSphcnJheXAgPSBmYWxzZTsKLSByZWRvX2Zyb21fcmVmOgotCXAgPSBza2lwX3Zhcm5hbWUobiwgZmFsc2UpOwotCWlmICghc2V0X3JlZmZsYWcgJiYgKHAgIT0gbikgJiYga3NoX2lzYWxwaHgoblswXSkpIHsKLQkJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOwotCQlzdHJ1Y3QgdGJsICp2cDsKLQkJY2hhciAqdm47Ci0JCXVpbnQzMl90IGg7Ci0KLQkJc3RybmR1cHgodm4sIG4sIHAgLSBuLCBBVEVNUCk7Ci0JCWggPSBoYXNoKHZuKTsKLQkJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHJlZmVyZW5jZSAqLwotCQlkbyB7Ci0JCQl2cCA9IGt0c2VhcmNoKCZsLT52YXJzLCB2biwgaCk7Ci0JCX0gd2hpbGUgKCF2cCAmJiAobCA9IGwtPm5leHQpKTsKLQkJYWZyZWUodm4sIEFURU1QKTsKLQkJaWYgKHZwICYmICh2cC0+ZmxhZyAmIChERUZJTkVEfEFTU09DfEFSUkFZKSkgPT0KLQkJICAgIChERUZJTkVEfEFTU09DKSkgewotCQkJY2hhciAqY3A7Ci0KLQkJCS8qIGdvdGNoYSEgKi8KLQkJCWNwID0gc2hmX3NtcHJpbnRmKCIlcyVzIiwgc3RyX3ZhbCh2cCksIHApOwotCQkJYWZyZWUoYXAsIEFURU1QKTsKLQkJCW4gPSBhcCA9IGNwOwotCQkJZ290byByZWRvX2Zyb21fcmVmOwotCQl9Ci0JfQotCi0JaWYgKHAgIT0gbiAmJiAqcCA9PSAnWycgJiYgKGxlbiA9IGFycmF5X3JlZl9sZW4ocCkpKSB7Ci0JCWNoYXIgKnN1YiwgKnRtcDsKLQkJbWtzaF9hcmlfdCBydmFsOwotCi0JCS8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHN1YnNjcmlwdCAqLwotCQkqYXJyYXlwID0gdHJ1ZTsKLQkJc3RybmR1cHgodG1wLCBwICsgMSwgbGVuIC0gMiwgQVRFTVApOwotCQlzdWIgPSBzdWJzdGl0dXRlKHRtcCwgMCk7Ci0JCWFmcmVlKHRtcCwgQVRFTVApOwotCQlzdHJuZHVweChuLCBuLCBwIC0gbiwgQVRFTVApOwotCQlldmFsdWF0ZShzdWIsICZydmFsLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKLQkJKnZhbHAgPSAodWludDMyX3QpcnZhbDsKLQkJYWZyZWUoc3ViLCBBVEVNUCk7Ci0JfQotCXJldHVybiAobik7Ci19Ci0KLS8qCi0gKiBTZWFyY2ggZm9yIHZhcmlhYmxlLCBpZiBub3QgZm91bmQgY3JlYXRlIGdsb2JhbGx5LgotICovCi1zdHJ1Y3QgdGJsICoKLWdsb2JhbChjb25zdCBjaGFyICpuKQotewotCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKLQlzdHJ1Y3QgdGJsICp2cDsKLQlpbnQgYzsKLQlib29sIGFycmF5OwotCXVpbnQzMl90IGgsIHZhbDsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGFycmF5ICovCi0JbiA9IGFycmF5X2luZGV4X2NhbGMobiwgJmFycmF5LCAmdmFsKTsKLQloID0gaGFzaChuKTsKLQljID0gblswXTsKLQlpZiAoIWtzaF9pc2FscGh4KGMpKSB7Ci0JCWlmIChhcnJheSkKLQkJCWVycm9yZigiYmFkIHN1YnN0aXR1dGlvbiIpOwotCQl2cCA9ICZ2dGVtcDsKLQkJdnAtPmZsYWcgPSBERUZJTkVEOwotCQl2cC0+dHlwZSA9IDA7Ci0JCXZwLT5hcmVhcCA9IEFURU1QOwotCQkqdnAtPm5hbWUgPSBjOwotCQlpZiAoa3NoX2lzZGlnaXQoYykpIHsKLQkJCWZvciAoYyA9IDA7IGtzaF9pc2RpZ2l0KCpuKTsgbisrKQotCQkJCWMgPSBjKjEwICsgKm4tJzAnOwotCQkJaWYgKGMgPD0gbC0+YXJnYykKLQkJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCi0JCQkJc2V0c3RyKHZwLCBsLT5hcmd2W2NdLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQkJCXZwLT5mbGFnIHw9IFJET05MWTsKLQkJCXJldHVybiAodnApOwotCQl9Ci0JCXZwLT5mbGFnIHw9IFJET05MWTsKLQkJaWYgKG5bMV0gIT0gJ1wwJykKLQkJCXJldHVybiAodnApOwotCQl2cC0+ZmxhZyB8PSBJU1NFVHxJTlRFR0VSOwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnJCc6Ci0JCQl2cC0+dmFsLmkgPSBrc2hwaWQ7Ci0JCQlicmVhazsKLQkJY2FzZSAnISc6Ci0JCQkvKiBJZiBubyBqb2IsIGV4cGFuZCB0byBub3RoaW5nICovCi0JCQlpZiAoKHZwLT52YWwuaSA9IGpfYXN5bmMoKSkgPT0gMCkKLQkJCQl2cC0+ZmxhZyAmPSB+KElTU0VUfElOVEVHRVIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJdnAtPnZhbC5pID0gZXhzdGF0OwotCQkJYnJlYWs7Ci0JCWNhc2UgJyMnOgotCQkJdnAtPnZhbC5pID0gbC0+YXJnYzsKLQkJCWJyZWFrOwotCQljYXNlICctJzoKLQkJCXZwLT5mbGFnICY9IH5JTlRFR0VSOwotCQkJdnAtPnZhbC5zID0gZ2V0b3B0aW9ucygpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl2cC0+ZmxhZyAmPSB+KElTU0VUfElOVEVHRVIpOwotCQl9Ci0JCXJldHVybiAodnApOwotCX0KLQlmb3IgKGwgPSBlLT5sb2M7IDsgbCA9IGwtPm5leHQpIHsKLQkJdnAgPSBrdHNlYXJjaCgmbC0+dmFycywgbiwgaCk7Ci0JCWlmICh2cCAhPSBOVUxMKSB7Ci0JCQlpZiAoYXJyYXkpCi0JCQkJcmV0dXJuIChhcnJheXNlYXJjaCh2cCwgdmFsKSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICh2cCk7Ci0JCX0KLQkJaWYgKGwtPm5leHQgPT0gTlVMTCkKLQkJCWJyZWFrOwotCX0KLQl2cCA9IGt0ZW50ZXIoJmwtPnZhcnMsIG4sIGgpOwotCWlmIChhcnJheSkKLQkJdnAgPSBhcnJheXNlYXJjaCh2cCwgdmFsKTsKLQl2cC0+ZmxhZyB8PSBERUZJTkVEOwotCWlmIChzcGVjaWFsKG4pKQotCQl2cC0+ZmxhZyB8PSBTUEVDSUFMOwotCXJldHVybiAodnApOwotfQotCi0vKgotICogU2VhcmNoIGZvciBsb2NhbCB2YXJpYWJsZSwgaWYgbm90IGZvdW5kIGNyZWF0ZSBsb2NhbGx5LgotICovCi1zdHJ1Y3QgdGJsICoKLWxvY2FsKGNvbnN0IGNoYXIgKm4sIGJvb2wgY29weSkKLXsKLQlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7Ci0Jc3RydWN0IHRibCAqdnA7Ci0JYm9vbCBhcnJheTsKLQl1aW50MzJfdCBoLCB2YWw7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhcnJheSAqLwotCW4gPSBhcnJheV9pbmRleF9jYWxjKG4sICZhcnJheSwgJnZhbCk7Ci0JaCA9IGhhc2gobik7Ci0JaWYgKCFrc2hfaXNhbHBoeCgqbikpIHsKLQkJdnAgPSAmdnRlbXA7Ci0JCXZwLT5mbGFnID0gREVGSU5FRHxSRE9OTFk7Ci0JCXZwLT50eXBlID0gMDsKLQkJdnAtPmFyZWFwID0gQVRFTVA7Ci0JCXJldHVybiAodnApOwotCX0KLQl2cCA9IGt0ZW50ZXIoJmwtPnZhcnMsIG4sIGgpOwotCWlmIChjb3B5ICYmICEodnAtPmZsYWcgJiBERUZJTkVEKSkgewotCQlzdHJ1Y3QgYmxvY2sgKmxsID0gbDsKLQkJc3RydWN0IHRibCAqdnEgPSBOVUxMOwotCi0JCXdoaWxlICgobGwgPSBsbC0+bmV4dCkgJiYgISh2cSA9IGt0c2VhcmNoKCZsbC0+dmFycywgbiwgaCkpKQotCQkJOwotCQlpZiAodnEpIHsKLQkJCXZwLT5mbGFnIHw9IHZxLT5mbGFnICYKLQkJCSAgICAoRVhQT1JUIHwgSU5URUdFUiB8IFJET05MWSB8IExKVVNUIHwgUkpVU1QgfAotCQkJICAgIFpFUk9GSUwgfCBMQ0FTRVYgfCBVQ0FTRVZfQUwgfCBJTlRfVSB8IElOVF9MKTsKLQkJCWlmICh2cS0+ZmxhZyAmIElOVEVHRVIpCi0JCQkJdnAtPnR5cGUgPSB2cS0+dHlwZTsKLQkJCXZwLT51Mi5maWVsZCA9IHZxLT51Mi5maWVsZDsKLQkJfQotCX0KLQlpZiAoYXJyYXkpCi0JCXZwID0gYXJyYXlzZWFyY2godnAsIHZhbCk7Ci0JdnAtPmZsYWcgfD0gREVGSU5FRDsKLQlpZiAoc3BlY2lhbChuKSkKLQkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKLQlyZXR1cm4gKHZwKTsKLX0KLQotLyogZ2V0IHZhcmlhYmxlIHN0cmluZyB2YWx1ZSAqLwotY2hhciAqCi1zdHJfdmFsKHN0cnVjdCB0YmwgKnZwKQotewotCWNoYXIgKnM7Ci0KLQlpZiAoKHZwLT5mbGFnJlNQRUNJQUwpKQotCQlnZXRzcGVjKHZwKTsKLQlpZiAoISh2cC0+ZmxhZyZJU1NFVCkpCi0JCXMgPSBudWxsOwkJLyogc3BlY2lhbCB0byBkb2xsYXIoKSAqLwotCWVsc2UgaWYgKCEodnAtPmZsYWcmSU5URUdFUikpCS8qIHN0cmluZyBzb3VyY2UgKi8KLQkJcyA9IHZwLT52YWwucyArIHZwLT50eXBlOwotCWVsc2UgewkJCQkvKiBpbnRlZ2VyIHNvdXJjZSAqLwotCQkvKiB3b3JzdCBjYXNlIG51bWJlciBsZW5ndGggaXMgd2hlbiBiYXNlPTIgKi8KLQkJLyogMSAobWludXMpICsgMiAoYmFzZSwgdXAgdG8gMzYpICsgMSAoJyMnKSArIG51bWJlciBvZiBiaXRzCi0JCSAqIGluIHRoZSBta3NoX3VhcmlfdCArIDEgKE5VTCkgKi8KLQkJY2hhciBzdHJidWZbMSArIDIgKyAxICsgOCAqIHNpemVvZihta3NoX3VhcmlfdCkgKyAxXTsKLQkJY29uc3QgY2hhciAqZGlnaXRzID0gKHZwLT5mbGFnICYgVUNBU0VWX0FMKSA/Ci0JCSAgICBkaWdpdHNfdWMgOiBkaWdpdHNfbGM7Ci0JCW1rc2hfdWFyaV90IG47Ci0JCWludCBiYXNlOwotCi0JCXMgPSBzdHJidWYgKyBzaXplb2Yoc3RyYnVmKTsKLQkJaWYgKHZwLT5mbGFnICYgSU5UX1UpCi0JCQluID0gdnAtPnZhbC51OwotCQllbHNlCi0JCQluID0gKHZwLT52YWwuaSA8IDApID8gLXZwLT52YWwuaSA6IHZwLT52YWwuaTsKLQkJYmFzZSA9ICh2cC0+dHlwZSA9PSAwKSA/IDEwIDogdnAtPnR5cGU7Ci0KLQkJaWYgKGJhc2UgPT0gMSkgewotCQkJc2l6ZV90IHN6ID0gMTsKLQotCQkJKihzID0gc3RyYnVmKSA9ICcxJzsKLQkJCXNbMV0gPSAnIyc7Ci0JCQlpZiAoIVVURk1PREUgfHwgKChuICYgMHhGRjgwKSA9PSAweEVGODApKQotCQkJCS8qIE9QVFUtMTYgLT4gcmF3IG9jdGV0ICovCi0JCQkJc1syXSA9IG4gJiAweEZGOwotCQkJZWxzZQotCQkJCXN6ID0gdXRmX3djdG9tYihzICsgMiwgbik7Ci0JCQlzWzIgKyBzel0gPSAnXDAnOwotCQl9IGVsc2UgewotCQkJKi0tcyA9ICdcMCc7Ci0JCQlkbyB7Ci0JCQkJKi0tcyA9IGRpZ2l0c1tuICUgYmFzZV07Ci0JCQkJbiAvPSBiYXNlOwotCQkJfSB3aGlsZSAobiAhPSAwKTsKLQkJCWlmIChiYXNlICE9IDEwKSB7Ci0JCQkJKi0tcyA9ICcjJzsKLQkJCQkqLS1zID0gZGlnaXRzW2Jhc2UgJSAxMF07Ci0JCQkJaWYgKGJhc2UgPj0gMTApCi0JCQkJCSotLXMgPSBkaWdpdHNbYmFzZSAvIDEwXTsKLQkJCX0KLQkJCWlmICghKHZwLT5mbGFnICYgSU5UX1UpICYmIHZwLT52YWwuaSA8IDApCi0JCQkJKi0tcyA9ICctJzsKLQkJfQotCQlpZiAodnAtPmZsYWcgJiAoUkpVU1R8TEpVU1QpKSAvKiBjYXNlIGFscmVhZHkgZGVhbHQgd2l0aCAqLwotCQkJcyA9IGZvcm1hdHN0cih2cCwgcyk7Ci0JCWVsc2UKLQkJCXN0cmR1cHgocywgcywgQVRFTVApOwotCX0KLQlyZXR1cm4gKHMpOwotfQotCi0vKiBnZXQgdmFyaWFibGUgaW50ZWdlciB2YWx1ZSwgd2l0aCBlcnJvciBjaGVja2luZyAqLwotc3RhdGljIG1rc2hfYXJpX3QKLWludHZhbChzdHJ1Y3QgdGJsICp2cCkKLXsKLQlta3NoX2FyaV90IG51bTsKLQlpbnQgYmFzZTsKLQotCWJhc2UgPSBnZXRpbnQodnAsICZudW0sIGZhbHNlKTsKLQlpZiAoYmFzZSA9PSAtMSkKLQkJLyogWFhYIGNoZWNrIGNhbGxzIC0gaXMgZXJyb3IgaGVyZSBvayBieSBQT1NJWD8gKi8KLQkJZXJyb3JmKCIlczogYmFkIG51bWJlciIsIHN0cl92YWwodnApKTsKLQlyZXR1cm4gKG51bSk7Ci19Ci0KLS8qIHNldCB2YXJpYWJsZSB0byBzdHJpbmcgdmFsdWUgKi8KLWludAotc2V0c3RyKHN0cnVjdCB0YmwgKnZxLCBjb25zdCBjaGFyICpzLCBpbnQgZXJyb3Jfb2spCi17Ci0JY2hhciAqc2FsbG9jID0gTlVMTDsKLQlpbnQgbm9fcm9fY2hlY2sgPSBlcnJvcl9vayAmIDB4NDsKLQotCWVycm9yX29rICY9IH4weDQ7Ci0JaWYgKCh2cS0+ZmxhZyAmIFJET05MWSkgJiYgIW5vX3JvX2NoZWNrKSB7Ci0JCXdhcm5pbmdmKHRydWUsICIlczogaXMgcmVhZCBvbmx5IiwgdnEtPm5hbWUpOwotCQlpZiAoIWVycm9yX29rKQotCQkJZXJyb3JmeigpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoISh2cS0+ZmxhZyZJTlRFR0VSKSkgeyAvKiBzdHJpbmcgZGVzdCAqLwotCQlpZiAoKHZxLT5mbGFnJkFMTE9DKSkgewotCQkJLyogZGVidWdnaW5nICovCi0JCQlpZiAocyA+PSB2cS0+dmFsLnMgJiYKLQkJCSAgICBzIDw9IHZxLT52YWwucyArIHN0cmxlbih2cS0+dmFsLnMpKQotCQkJCWludGVybmFsX2Vycm9yZigKLQkJCQkgICAgInNldHN0cjogJXM9JXM6IGFzc2lnbmluZyB0byBzZWxmIiwKLQkJCQkgICAgdnEtPm5hbWUsIHMpOwotCQkJYWZyZWUodnEtPnZhbC5zLCB2cS0+YXJlYXApOwotCQl9Ci0JCXZxLT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOwotCQl2cS0+dHlwZSA9IDA7Ci0JCWlmIChzICYmICh2cS0+ZmxhZyAmIChVQ0FTRVZfQUx8TENBU0VWfExKVVNUfFJKVVNUKSkpCi0JCQlzID0gc2FsbG9jID0gZm9ybWF0c3RyKHZxLCBzKTsKLQkJaWYgKCh2cS0+ZmxhZyZFWFBPUlQpKQotCQkJZXhwb3J0cHJlcCh2cSwgcyk7Ci0JCWVsc2UgewotCQkJc3RyZHVweCh2cS0+dmFsLnMsIHMsIHZxLT5hcmVhcCk7Ci0JCQl2cS0+ZmxhZyB8PSBBTExPQzsKLQkJfQotCX0gZWxzZSB7CQkvKiBpbnRlZ2VyIGRlc3QgKi8KLQkJaWYgKCF2X2V2YWx1YXRlKHZxLCBzLCBlcnJvcl9vaywgdHJ1ZSkpCi0JCQlyZXR1cm4gKDApOwotCX0KLQl2cS0+ZmxhZyB8PSBJU1NFVDsKLQlpZiAoKHZxLT5mbGFnJlNQRUNJQUwpKQotCQlzZXRzcGVjKHZxKTsKLQlhZnJlZShzYWxsb2MsIEFURU1QKTsKLQlyZXR1cm4gKDEpOwotfQotCi0vKiBzZXQgdmFyaWFibGUgdG8gaW50ZWdlciAqLwotdm9pZAotc2V0aW50KHN0cnVjdCB0YmwgKnZxLCBta3NoX2FyaV90IG4pCi17Ci0JaWYgKCEodnEtPmZsYWcmSU5URUdFUikpIHsKLQkJc3RydWN0IHRibCAqdnAgPSAmdnRlbXA7Ci0JCXZwLT5mbGFnID0gKElTU0VUfElOVEVHRVIpOwotCQl2cC0+dHlwZSA9IDA7Ci0JCXZwLT5hcmVhcCA9IEFURU1QOwotCQl2cC0+dmFsLmkgPSBuOwotCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCi0JCXNldHN0cih2cSwgc3RyX3ZhbCh2cCksIEtTSF9SRVRVUk5fRVJST1IpOwotCX0gZWxzZQotCQl2cS0+dmFsLmkgPSBuOwotCXZxLT5mbGFnIHw9IElTU0VUOwotCWlmICgodnEtPmZsYWcmU1BFQ0lBTCkpCi0JCXNldHNwZWModnEpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRpbnQoc3RydWN0IHRibCAqdnAsIG1rc2hfYXJpX3QgKm51bXAsIGJvb2wgYXJpdGgpCi17Ci0JY2hhciAqczsKLQlpbnQgYywgYmFzZSwgbmVnOwotCWJvb2wgaGF2ZV9iYXNlID0gZmFsc2U7Ci0JbWtzaF9hcmlfdCBudW07Ci0KLQlpZiAodnAtPmZsYWcmU1BFQ0lBTCkKLQkJZ2V0c3BlYyh2cCk7Ci0JLyogWFhYIGlzIGl0IHBvc3NpYmxlIGZvciBJU1NFVCB0byBiZSBzZXQgYW5kIHZhbC5zIHRvIGJlIDA/ICovCi0JaWYgKCEodnAtPmZsYWcmSVNTRVQpIHx8ICghKHZwLT5mbGFnJklOVEVHRVIpICYmIHZwLT52YWwucyA9PSBOVUxMKSkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKHZwLT5mbGFnJklOVEVHRVIpIHsKLQkJKm51bXAgPSB2cC0+dmFsLmk7Ci0JCXJldHVybiAodnAtPnR5cGUpOwotCX0KLQlzID0gdnAtPnZhbC5zICsgdnAtPnR5cGU7Ci0JaWYgKHMgPT0gTlVMTCkJLyogcmVkdW5kYW50IGdpdmVuIGluaXRpYWwgdGVzdCAqLwotCQlzID0gbnVsbDsKLQliYXNlID0gMTA7Ci0JbnVtID0gMDsKLQluZWcgPSAwOwotCWlmIChhcml0aCAmJiAqcyA9PSAnMCcgJiYgKihzKzEpKSB7Ci0JCXMrKzsKLQkJaWYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpIHsKLQkJCXMrKzsKLQkJCWJhc2UgPSAxNjsKLQkJfSBlbHNlIGlmICh2cC0+ZmxhZyAmIFpFUk9GSUwpIHsKLQkJCXdoaWxlICgqcyA9PSAnMCcpCi0JCQkJcysrOwotCQl9IGVsc2UKLQkJCWJhc2UgPSA4OwotCQloYXZlX2Jhc2UgPSB0cnVlOwotCX0KLQlmb3IgKGMgPSAqcysrOyBjIDsgYyA9ICpzKyspIHsKLQkJaWYgKGMgPT0gJy0nKSB7Ci0JCQluZWcrKzsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGMgPT0gJyMnKSB7Ci0JCQliYXNlID0gKGludCludW07Ci0JCQlpZiAoaGF2ZV9iYXNlIHx8IGJhc2UgPCAxIHx8IGJhc2UgPiAzNikKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWlmIChiYXNlID09IDEpIHsKLQkJCQl1bnNpZ25lZCBpbnQgd2M7Ci0KLQkJCQlpZiAoIVVURk1PREUpCi0JCQkJCXdjID0gKih1bnNpZ25lZCBjaGFyICopczsKLQkJCQllbHNlIGlmICh1dGZfbWJ0b3djKCZ3YywgcykgPT0gKHNpemVfdCktMSkKLQkJCQkJLyogT1BUVS04IC0+IE9QVFUtMTYgKi8KLQkJCQkJLyoKLQkJCQkJICogKHdpdGggYSB0d2lzdDogMSNcdUVGODAgY29udmVydHMKLQkJCQkJICogdGhlIHNhbWUgYXMgMSNceDgwIGRvZXMsIHRodXMgaXMKLQkJCQkJICogbm90IHJvdW5kLXRyaXBwaW5nIGNvcnJlY3RseSBYWFgpCi0JCQkJCSAqLwotCQkJCQl3YyA9IDB4RUYwMCArICoodW5zaWduZWQgY2hhciAqKXM7Ci0JCQkJKm51bXAgPSAobWtzaF9hcmlfdCl3YzsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJbnVtID0gMDsKLQkJCWhhdmVfYmFzZSA9IHRydWU7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChrc2hfaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChrc2hfaXNsb3dlcihjKSkKLQkJCWMgLT0gJ2EnIC0gMTA7Ci0JCWVsc2UgaWYgKGtzaF9pc3VwcGVyKGMpKQotCQkJYyAtPSAnQScgLSAxMDsKLQkJZWxzZQotCQkJcmV0dXJuICgtMSk7Ci0JCWlmIChjIDwgMCB8fCBjID49IGJhc2UpCi0JCQlyZXR1cm4gKC0xKTsKLQkJbnVtID0gbnVtICogYmFzZSArIGM7Ci0JfQotCWlmIChuZWcpCi0JCW51bSA9IC1udW07Ci0JKm51bXAgPSBudW07Ci0JcmV0dXJuIChiYXNlKTsKLX0KLQotLyogY29udmVydCB2YXJpYWJsZSB2cSB0byBpbnRlZ2VyIHZhcmlhYmxlLCBzZXR0aW5nIGl0cyB2YWx1ZSBmcm9tIHZwCi0gKiAodnEgYW5kIHZwIG1heSBiZSB0aGUgc2FtZSkKLSAqLwotc3RydWN0IHRibCAqCi1zZXRpbnRfdihzdHJ1Y3QgdGJsICp2cSwgc3RydWN0IHRibCAqdnAsIGJvb2wgYXJpdGgpCi17Ci0JaW50IGJhc2U7Ci0JbWtzaF9hcmlfdCBudW07Ci0KLQlpZiAoKGJhc2UgPSBnZXRpbnQodnAsICZudW0sIGFyaXRoKSkgPT0gLTEpCi0JCXJldHVybiAoTlVMTCk7Ci0JaWYgKCEodnEtPmZsYWcgJiBJTlRFR0VSKSAmJiAodnEtPmZsYWcgJiBBTExPQykpIHsKLQkJdnEtPmZsYWcgJj0gfkFMTE9DOwotCQlhZnJlZSh2cS0+dmFsLnMsIHZxLT5hcmVhcCk7Ci0JfQotCXZxLT52YWwuaSA9IG51bTsKLQlpZiAodnEtPnR5cGUgPT0gMCkgLyogZGVmYXVsdCBiYXNlICovCi0JCXZxLT50eXBlID0gYmFzZTsKLQl2cS0+ZmxhZyB8PSBJU1NFVHxJTlRFR0VSOwotCWlmICh2cS0+ZmxhZyZTUEVDSUFMKQotCQlzZXRzcGVjKHZxKTsKLQlyZXR1cm4gKHZxKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZm9ybWF0c3RyKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICpzKQotewotCWludCBvbGVuLCBubGVuOwotCWNoYXIgKnAsICpxOwotCXNpemVfdCBwc2l6OwotCi0Jb2xlbiA9IHV0Zl9tYnN3aWR0aChzKTsKLQotCWlmICh2cC0+ZmxhZyAmIChSSlVTVHxMSlVTVCkpIHsKLQkJaWYgKCF2cC0+dTIuZmllbGQpCS8qIGRlZmF1bHQgZmllbGQgd2lkdGggKi8KLQkJCXZwLT51Mi5maWVsZCA9IG9sZW47Ci0JCW5sZW4gPSB2cC0+dTIuZmllbGQ7Ci0JfSBlbHNlCi0JCW5sZW4gPSBvbGVuOwotCi0JcCA9IGFsbG9jKChwc2l6ID0gbmxlbiAqIC8qIE1CX0xFTl9NQVggKi8gMyArIDEpLCBBVEVNUCk7Ci0JaWYgKHZwLT5mbGFnICYgKFJKVVNUfExKVVNUKSkgewotCQlpbnQgc2xlbiA9IG9sZW4sIGkgPSAwOwotCi0JCWlmICh2cC0+ZmxhZyAmIFJKVVNUKSB7Ci0JCQljb25zdCBjaGFyICpxcSA9IHM7Ci0JCQlpbnQgbiA9IDA7Ci0KLQkJCXdoaWxlIChpIDwgc2xlbikKLQkJCQlpICs9IHV0Zl93aWR0aGFkaihxcSwgJnFxKTsKLQkJCS8qIHN0cmlwIHRyYWlsaW5nIHNwYWNlcyAoQVQmVCB1c2VzIHFxWy0xXSA9PSAnICcpICovCi0JCQl3aGlsZSAocXEgPiBzICYmIGtzaF9pc3NwYWNlKHFxWy0xXSkpIHsKLQkJCQktLXFxOwotCQkJCS0tc2xlbjsKLQkJCX0KLQkJCWlmICh2cC0+ZmxhZyAmIFpFUk9GSUwgJiYgdnAtPmZsYWcgJiBJTlRFR0VSKSB7Ci0JCQkJaWYgKHNbMV0gPT0gJyMnKQotCQkJCQluID0gMjsKLQkJCQllbHNlIGlmIChzWzJdID09ICcjJykKLQkJCQkJbiA9IDM7Ci0JCQkJaWYgKHZwLT51Mi5maWVsZCA8PSBuKQotCQkJCQluID0gMDsKLQkJCX0KLQkJCWlmIChuKSB7Ci0JCQkJbWVtY3B5KHAsIHMsIG4pOwotCQkJCXMgKz0gbjsKLQkJCX0KLQkJCXdoaWxlIChzbGVuID4gdnAtPnUyLmZpZWxkKQotCQkJCXNsZW4gLT0gdXRmX3dpZHRoYWRqKHMsICZzKTsKLQkJCWlmICh2cC0+dTIuZmllbGQgLSBzbGVuKQotCQkJCW1lbXNldChwICsgbiwgKHZwLT5mbGFnICYgWkVST0ZJTCkgPyAnMCcgOiAnICcsCi0JCQkJICAgIHZwLT51Mi5maWVsZCAtIHNsZW4pOwotCQkJc2xlbiAtPSBuOwotCQkJc2hmX3NucHJpbnRmKHAgKyB2cC0+dTIuZmllbGQgLSBzbGVuLAotCQkJICAgIHBzaXogLSAodnAtPnUyLmZpZWxkIC0gc2xlbiksCi0JCQkgICAgIiUuKnMiLCBzbGVuLCBzKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHN0cmlwIGxlYWRpbmcgc3BhY2VzL3plcm9zICovCi0JCQl3aGlsZSAoa3NoX2lzc3BhY2UoKnMpKQotCQkJCXMrKzsKLQkJCWlmICh2cC0+ZmxhZyAmIFpFUk9GSUwpCi0JCQkJd2hpbGUgKCpzID09ICcwJykKLQkJCQkJcysrOwotCQkJc2hmX3NucHJpbnRmKHAsIG5sZW4gKyAxLCAiJS0qLipzIiwKLQkJCQl2cC0+dTIuZmllbGQsIHZwLT51Mi5maWVsZCwgcyk7Ci0JCX0KLQl9IGVsc2UKLQkJbWVtY3B5KHAsIHMsIHN0cmxlbihzKSArIDEpOwotCi0JaWYgKHZwLT5mbGFnICYgVUNBU0VWX0FMKSB7Ci0JCWZvciAocSA9IHA7ICpxOyBxKyspCi0JCQkqcSA9IGtzaF90b3VwcGVyKCpxKTsKLQl9IGVsc2UgaWYgKHZwLT5mbGFnICYgTENBU0VWKSB7Ci0JCWZvciAocSA9IHA7ICpxOyBxKyspCi0JCQkqcSA9IGtzaF90b2xvd2VyKCpxKTsKLQl9Ci0KLQlyZXR1cm4gKHApOwotfQotCi0vKgotICogbWFrZSB2cC0+dmFsLnMgYmUgIm5hbWU9dmFsdWUiIGZvciBxdWljayBleHBvcnRpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1leHBvcnRwcmVwKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICp2YWwpCi17Ci0JY2hhciAqeHA7Ci0JY2hhciAqb3AgPSAodnAtPmZsYWcmQUxMT0MpID8gdnAtPnZhbC5zIDogTlVMTDsKLQlpbnQgbmFtZWxlbiA9IHN0cmxlbih2cC0+bmFtZSk7Ci0JaW50IHZhbGxlbiA9IHN0cmxlbih2YWwpICsgMTsKLQotCXZwLT5mbGFnIHw9IEFMTE9DOwotCXhwID0gYWxsb2MobmFtZWxlbiArIDEgKyB2YWxsZW4sIHZwLT5hcmVhcCk7Ci0JbWVtY3B5KHZwLT52YWwucyA9IHhwLCB2cC0+bmFtZSwgbmFtZWxlbik7Ci0JeHAgKz0gbmFtZWxlbjsKLQkqeHArKyA9ICc9JzsKLQl2cC0+dHlwZSA9IHhwIC0gdnAtPnZhbC5zOyAvKiBvZmZzZXQgdG8gdmFsdWUgKi8KLQltZW1jcHkoeHAsIHZhbCwgdmFsbGVuKTsKLQlpZiAob3AgIT0gTlVMTCkKLQkJYWZyZWUob3AsIHZwLT5hcmVhcCk7Ci19Ci0KLS8qCi0gKiBsb29rdXAgdmFyaWFibGUgKGFjY29yZGluZyB0byAoc2V0JkxPQ0FMKSksCi0gKiBzZXQgaXRzIGF0dHJpYnV0ZXMgKElOVEVHRVIsIFJET05MWSwgRVhQT1JULCBUUkFDRSwgTEpVU1QsIFJKVVNULCBaRVJPRklMLAotICogTENBU0VWLCBVQ0FTRVZfQUwpLCBhbmQgb3B0aW9uYWxseSBzZXQgaXRzIHZhbHVlIGlmIGFuIGFzc2lnbm1lbnQuCi0gKi8KLXN0cnVjdCB0YmwgKgotdHlwZXNldChjb25zdCBjaGFyICp2YXIsIFRmbGFnIHNldCwgVGZsYWcgY2xyLCBpbnQgZmllbGQsIGludCBiYXNlKQotewotCXN0cnVjdCB0YmwgKnZwOwotCXN0cnVjdCB0YmwgKnZwYmFzZSwgKnQ7Ci0JY2hhciAqdHZhcjsKLQljb25zdCBjaGFyICp2YWw7Ci0JaW50IGxlbjsKLQotCS8qIGNoZWNrIGZvciB2YWxpZCB2YXJpYWJsZSBuYW1lLCBzZWFyY2ggZm9yIHZhbHVlICovCi0JdmFsID0gc2tpcF92YXJuYW1lKHZhciwgZmFsc2UpOwotCWlmICh2YWwgPT0gdmFyKQotCQlyZXR1cm4gKE5VTEwpOwotCW1rc3NlcnQodmFyICE9IE5VTEwpOwotCW1rc3NlcnQoKnZhciAhPSAwKTsKLQlpZiAoKnZhbCA9PSAnWycpIHsKLQkJaWYgKHNldF9yZWZmbGFnKQotCQkJZXJyb3JmKCIlczogcmVmZXJlbmNlIHZhcmlhYmxlIGNhbm5vdCBiZSBhbiBhcnJheSIsCi0JCQkgICAgdmFyKTsKLQkJbGVuID0gYXJyYXlfcmVmX2xlbih2YWwpOwotCQlpZiAobGVuID09IDApCi0JCQlyZXR1cm4gKE5VTEwpOwotCQkvKiBJTVBPUlQgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNoZWxsIHN0YXJ0cyB1cCBhbmQgaXMKLQkJICogc2V0dGluZyB1cCBpdHMgZW52aXJvbm1lbnQuIEFsbG93IG9ubHkgc2ltcGxlIGFycmF5Ci0JCSAqIHJlZmVyZW5jZXMgYXQgdGhpcyB0aW1lIHNpbmNlIHBhcmFtZXRlci9jb21tYW5kIHN1YnN0aXR1dGlvbgotCQkgKiBpcyBwcmVmb3JtZWQgb24gdGhlIFtleHByZXNzaW9uXSB3aGljaCB3b3VsZCBiZSBhIG1ham9yCi0JCSAqIHNlY3VyaXR5IGhvbGUuCi0JCSAqLwotCQlpZiAoc2V0ICYgSU1QT1JUKSB7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDE7IGkgPCBsZW4gLSAxOyBpKyspCi0JCQkJaWYgKCFrc2hfaXNkaWdpdCh2YWxbaV0pKQotCQkJCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCXZhbCArPSBsZW47Ci0JfQotCWlmICgqdmFsID09ICc9JykKLQkJc3RybmR1cHgodHZhciwgdmFyLCB2YWwrKyAtIHZhciwgQVRFTVApOwotCWVsc2UgewotCQkvKiBJbXBvcnRpbmcgZnJvbSBvcmlnaW5hbCBlbnZpcm9ubWVudDogbXVzdCBoYXZlIGFuID0gKi8KLQkJaWYgKHNldCAmIElNUE9SVCkKLQkJCXJldHVybiAoTlVMTCk7Ci0JCXN0cmR1cHgodHZhciwgdmFyLCBBVEVNUCk7Ci0JCXZhbCA9IE5VTEw7Ci0JCS8qIGhhbmRsZSBmb29bKl0g4oeSIGZvbyAod2hvbGUgYXJyYXkpIG1hcHBpbmcgZm9yIFIzOWIgKi8KLQkJbGVuID0gc3RybGVuKHR2YXIpOwotCQlpZiAobGVuID4gMyAmJiB0dmFyW2xlbi0zXSA9PSAnWycgJiYgdHZhcltsZW4tMl0gPT0gJyonICYmCi0JCSAgICB0dmFyW2xlbi0xXSA9PSAnXScpCi0JCQl0dmFyW2xlbi0zXSA9ICdcMCc7Ci0JfQotCi0JLyogUHJldmVudCB0eXBlc2V0IGZyb20gY3JlYXRpbmcgYSBsb2NhbCBQQVRIL0VOVi9TSEVMTCAqLwotCWlmIChGbGFnKEZSRVNUUklDVEVEKSAmJiAoc3RyY21wKHR2YXIsICJQQVRIIikgPT0gMCB8fAotCSAgICBzdHJjbXAodHZhciwgIkVOViIpID09IDAgfHwgc3RyY21wKHR2YXIsICJTSEVMTCIpID09IDApKQotCQllcnJvcmYoIiVzOiByZXN0cmljdGVkIiwgdHZhcik7Ci0KLQl2cCA9IChzZXQmTE9DQUwpID8gbG9jYWwodHZhciwgKHNldCAmIExPQ0FMX0NPUFkpID8gdHJ1ZSA6IGZhbHNlKSA6Ci0JICAgIGdsb2JhbCh0dmFyKTsKLQlpZiAoc2V0X3JlZmZsYWcgPT0gMiAmJiAodnAtPmZsYWcgJiAoQVJSQVl8QVNTT0MpKSA9PSBBU1NPQykKLQkJdnAtPmZsYWcgJj0gfkFTU09DOwotCWVsc2UgaWYgKHNldF9yZWZmbGFnID09IDEpIHsKLQkJaWYgKHZwLT5mbGFnICYgQVJSQVkpIHsKLQkJCXN0cnVjdCB0YmwgKmEsICp0bXA7Ci0KLQkJCS8qIEZyZWUgdXAgZW50aXJlIGFycmF5ICovCi0JCQlmb3IgKGEgPSB2cC0+dS5hcnJheTsgYTsgKSB7Ci0JCQkJdG1wID0gYTsKLQkJCQlhID0gYS0+dS5hcnJheTsKLQkJCQlpZiAodG1wLT5mbGFnICYgQUxMT0MpCi0JCQkJCWFmcmVlKHRtcC0+dmFsLnMsIHRtcC0+YXJlYXApOwotCQkJCWFmcmVlKHRtcCwgdG1wLT5hcmVhcCk7Ci0JCQl9Ci0JCQl2cC0+dS5hcnJheSA9IE5VTEw7Ci0JCQl2cC0+ZmxhZyAmPSB+QVJSQVk7Ci0JCX0KLQkJdnAtPmZsYWcgfD0gQVNTT0M7Ci0JfQotCi0Jc2V0ICY9IH4oTE9DQUx8TE9DQUxfQ09QWSk7Ci0KLQl2cGJhc2UgPSAodnAtPmZsYWcgJiBBUlJBWSkgPyBnbG9iYWwoYXJyYXluYW1lKHZhcikpIDogdnA7Ci0KLQkvKiBvbmx5IGFsbG93IGV4cG9ydCBmbGFnIHRvIGJlIHNldC4gQVQmVCBrc2ggYWxsb3dzIGFueSBhdHRyaWJ1dGUgdG8KLQkgKiBiZSBjaGFuZ2VkIHdoaWNoIG1lYW5zIGl0IGNhbiBiZSB0cnVuY2F0ZWQgb3IgbW9kaWZpZWQgKC1MLy1SLy1aLy1pKQotCSAqLwotCWlmICgodnBiYXNlLT5mbGFnJlJET05MWSkgJiYKLQkgICAgKHZhbCB8fCBjbHIgfHwgKHNldCAmIH5FWFBPUlQpKSkKLQkJLyogWFhYIGNoZWNrIGNhbGxzIC0gaXMgZXJyb3IgaGVyZSBvayBieSBQT1NJWD8gKi8KLQkJZXJyb3JmKCIlczogaXMgcmVhZCBvbmx5IiwgdHZhcik7Ci0JYWZyZWUodHZhciwgQVRFTVApOwotCi0JLyogbW9zdCBjYWxscyBhcmUgd2l0aCBzZXQvY2xyID09IDAgKi8KLQlpZiAoc2V0IHwgY2xyKSB7Ci0JCWJvb2wgb2sgPSB0cnVlOwotCi0JCS8qIFhYWCBpZiB4WzBdIGlzbid0IHNldCwgdGhlcmUgd2lsbCBiZSBwcm9ibGVtczogbmVlZCB0byBoYXZlCi0JCSAqIG9uZSBjb3B5IG9mIGF0dHJpYnV0ZXMgZm9yIGFycmF5cy4uLgotCQkgKi8KLQkJZm9yICh0ID0gdnBiYXNlOyB0OyB0ID0gdC0+dS5hcnJheSkgewotCQkJYm9vbCBmYWtlX2Fzc2lnbjsKLQkJCWNoYXIgKnMgPSBOVUxMOwotCQkJY2hhciAqZnJlZV9tZSA9IE5VTEw7Ci0KLQkJCWZha2VfYXNzaWduID0gKHQtPmZsYWcgJiBJU1NFVCkgJiYgKCF2YWwgfHwgdCAhPSB2cCkgJiYKLQkJCSAgICAoKHNldCAmIChVQ0FTRVZfQUx8TENBU0VWfExKVVNUfFJKVVNUfFpFUk9GSUwpKSB8fAotCQkJICAgICgodC0+ZmxhZyAmIElOVEVHRVIpICYmIChjbHIgJiBJTlRFR0VSKSkgfHwKLQkJCSAgICAoISh0LT5mbGFnICYgSU5URUdFUikgJiYgKHNldCAmIElOVEVHRVIpKSk7Ci0JCQlpZiAoZmFrZV9hc3NpZ24pIHsKLQkJCQlpZiAodC0+ZmxhZyAmIElOVEVHRVIpIHsKLQkJCQkJcyA9IHN0cl92YWwodCk7Ci0JCQkJCWZyZWVfbWUgPSBOVUxMOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXMgPSB0LT52YWwucyArIHQtPnR5cGU7Ci0JCQkJCWZyZWVfbWUgPSAodC0+ZmxhZyAmIEFMTE9DKSA/IHQtPnZhbC5zIDoKLQkJCQkJICAgIE5VTEw7Ci0JCQkJfQotCQkJCXQtPmZsYWcgJj0gfkFMTE9DOwotCQkJfQotCQkJaWYgKCEodC0+ZmxhZyAmIElOVEVHRVIpICYmIChzZXQgJiBJTlRFR0VSKSkgewotCQkJCXQtPnR5cGUgPSAwOwotCQkJCXQtPmZsYWcgJj0gfkFMTE9DOwotCQkJfQotCQkJdC0+ZmxhZyA9ICh0LT5mbGFnIHwgc2V0KSAmIH5jbHI7Ci0JCQkvKiBEb24ndCBjaGFuZ2UgYmFzZSBpZiBhc3NpZ25tZW50IGlzIHRvIGJlIGRvbmUsCi0JCQkgKiBpbiBjYXNlIGFzc2lnbm1lbnQgZmFpbHMuCi0JCQkgKi8KLQkJCWlmICgoc2V0ICYgSU5URUdFUikgJiYgYmFzZSA+IDAgJiYgKCF2YWwgfHwgdCAhPSB2cCkpCi0JCQkJdC0+dHlwZSA9IGJhc2U7Ci0JCQlpZiAoc2V0ICYgKExKVVNUfFJKVVNUfFpFUk9GSUwpKQotCQkJCXQtPnUyLmZpZWxkID0gZmllbGQ7Ci0JCQlpZiAoZmFrZV9hc3NpZ24pIHsKLQkJCQlpZiAoIXNldHN0cih0LCBzLCBLU0hfUkVUVVJOX0VSUk9SKSkgewotCQkJCQkvKiBTb21ld2hhdCBhcmJpdHJhcnkgYWN0aW9uIGhlcmU6Ci0JCQkJCSAqIHphcCBjb250ZW50cyBvZiB2YXJpYWJsZSwgYnV0IGtlZXAKLQkJCQkJICogdGhlIGZsYWcgc2V0dGluZ3MuCi0JCQkJCSAqLwotCQkJCQlvayA9IGZhbHNlOwotCQkJCQlpZiAodC0+ZmxhZyAmIElOVEVHRVIpCi0JCQkJCQl0LT5mbGFnICY9IH5JU1NFVDsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAodC0+ZmxhZyAmIEFMTE9DKQotCQkJCQkJCWFmcmVlKHQtPnZhbC5zLCB0LT5hcmVhcCk7Ci0JCQkJCQl0LT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOwotCQkJCQkJdC0+dHlwZSA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZyZWVfbWUpCi0JCQkJCWFmcmVlKGZyZWVfbWUsIHQtPmFyZWFwKTsKLQkJCX0KLQkJfQotCQlpZiAoIW9rKQotCQkJZXJyb3JmeigpOwotCX0KLQotCWlmICh2YWwgIT0gTlVMTCkgewotCQlpZiAodnAtPmZsYWcmSU5URUdFUikgewotCQkJLyogZG8gbm90IHplcm8gYmFzZSBiZWZvcmUgYXNzaWdubWVudCAqLwotCQkJc2V0c3RyKHZwLCB2YWwsIEtTSF9VTldJTkRfRVJST1IgfCAweDQpOwotCQkJLyogRG9uZSBhZnRlciBhc3NpZ25tZW50IHRvIG92ZXJyaWRlIGRlZmF1bHQgKi8KLQkJCWlmIChiYXNlID4gMCkKLQkJCQl2cC0+dHlwZSA9IGJhc2U7Ci0JCX0gZWxzZQotCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgKHJlYWRvbmx5IGNoZWNrIGFscmVhZHkgZG9uZSkgKi8KLQkJCXNldHN0cih2cCwgdmFsLCBLU0hfUkVUVVJOX0VSUk9SIHwgMHg0KTsKLQl9Ci0KLQkvKiBvbmx5IHhbMF0gaXMgZXZlciBleHBvcnRlZCwgc28gdXNlIHZwYmFzZSAqLwotCWlmICgodnBiYXNlLT5mbGFnJkVYUE9SVCkgJiYgISh2cGJhc2UtPmZsYWcmSU5URUdFUikgJiYKLQkgICAgdnBiYXNlLT50eXBlID09IDApCi0JCWV4cG9ydHByZXAodnBiYXNlLCAodnBiYXNlLT5mbGFnJklTU0VUKSA/IHZwYmFzZS0+dmFsLnMgOiBudWxsKTsKLQotCXJldHVybiAodnApOwotfQotCi0vKioKLSAqIFVuc2V0IGEgdmFyaWFibGUuIFRoZSBmbGFncyBjYW4gYmU6Ci0gKiB8MQk9IHRlYXIgZG93biBlbnRpcmUgYXJyYXkKLSAqIHwyCT0ga2VlcCBhdHRyaWJ1dGVzLCBvbmx5IHVuc2V0IGNvbnRlbnQKLSAqLwotdm9pZAotdW5zZXQoc3RydWN0IHRibCAqdnAsIGludCBmbGFncykKLXsKLQlpZiAodnAtPmZsYWcgJiBBTExPQykKLQkJYWZyZWUodnAtPnZhbC5zLCB2cC0+YXJlYXApOwotCWlmICgodnAtPmZsYWcgJiBBUlJBWSkgJiYgKGZsYWdzICYgMSkpIHsKLQkJc3RydWN0IHRibCAqYSwgKnRtcDsKLQotCQkvKiBGcmVlIHVwIGVudGlyZSBhcnJheSAqLwotCQlmb3IgKGEgPSB2cC0+dS5hcnJheTsgYTsgKSB7Ci0JCQl0bXAgPSBhOwotCQkJYSA9IGEtPnUuYXJyYXk7Ci0JCQlpZiAodG1wLT5mbGFnICYgQUxMT0MpCi0JCQkJYWZyZWUodG1wLT52YWwucywgdG1wLT5hcmVhcCk7Ci0JCQlhZnJlZSh0bXAsIHRtcC0+YXJlYXApOwotCQl9Ci0JCXZwLT51LmFycmF5ID0gTlVMTDsKLQl9Ci0JaWYgKGZsYWdzICYgMikgewotCQl2cC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBJZiBmb29bMF0gaXMgYmVpbmcgdW5zZXQsIHRoZSByZW1haW5kZXIgb2YgdGhlIGFycmF5IGlzIGtlcHQuLi4gKi8KLQl2cC0+ZmxhZyAmPSBTUEVDSUFMIHwgKChmbGFncyAmIDEpID8gMCA6IEFSUkFZfERFRklORUQpOwotCWlmICh2cC0+ZmxhZyAmIFNQRUNJQUwpCi0JCXVuc2V0c3BlYyh2cCk7CS8qIHJlc3BvbnNpYmxlIGZvciAndW5zcGVjaWFsJ2luZyB2YXIgKi8KLX0KLQotLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhciBwYXN0IGEgbGVnYWwgdmFyaWFibGUgbmFtZSAocmV0dXJucyB0aGUKLSAqIGFyZ3VtZW50IGlmIHRoZXJlIGlzIG5vIGxlZ2FsIG5hbWUsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB0ZXJtaW5hdGluZwotICogTlVMIGlmIHdob2xlIHN0cmluZyBpcyBsZWdhbCkuCi0gKi8KLWNvbnN0IGNoYXIgKgotc2tpcF92YXJuYW1lKGNvbnN0IGNoYXIgKnMsIGludCBhb2spCi17Ci0JaW50IGFsZW47Ci0KLQlpZiAocyAmJiBrc2hfaXNhbHBoeCgqcykpIHsKLQkJd2hpbGUgKCorK3MgJiYga3NoX2lzYWxudXgoKnMpKQotCQkJOwotCQlpZiAoYW9rICYmICpzID09ICdbJyAmJiAoYWxlbiA9IGFycmF5X3JlZl9sZW4ocykpKQotCQkJcyArPSBhbGVuOwotCX0KLQlyZXR1cm4gKHMpOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcGFzdCBhbnkgbGVnYWwgdmFyaWFibGUgbmFtZSAqLwotY29uc3QgY2hhciAqCi1za2lwX3dkdmFybmFtZShjb25zdCBjaGFyICpzLAotICAgIGludCBhb2spCQkJCS8qIHNraXAgYXJyYXkgZGUtcmVmZXJlbmNlPyAqLwotewotCWlmIChzWzBdID09IENIQVIgJiYga3NoX2lzYWxwaHgoc1sxXSkpIHsKLQkJZG8gewotCQkJcyArPSAyOwotCQl9IHdoaWxlIChzWzBdID09IENIQVIgJiYga3NoX2lzYWxudXgoc1sxXSkpOwotCQlpZiAoYW9rICYmIHNbMF0gPT0gQ0hBUiAmJiBzWzFdID09ICdbJykgewotCQkJLyogc2tpcCBwb3NzaWJsZSBhcnJheSBkZS1yZWZlcmVuY2UgKi8KLQkJCWNvbnN0IGNoYXIgKnAgPSBzOwotCQkJY2hhciBjOwotCQkJaW50IGRlcHRoID0gMDsKLQotCQkJd2hpbGUgKDEpIHsKLQkJCQlpZiAocFswXSAhPSBDSEFSKQotCQkJCQlicmVhazsKLQkJCQljID0gcFsxXTsKLQkJCQlwICs9IDI7Ci0JCQkJaWYgKGMgPT0gJ1snKQotCQkJCQlkZXB0aCsrOwotCQkJCWVsc2UgaWYgKGMgPT0gJ10nICYmIC0tZGVwdGggPT0gMCkgewotCQkJCQlzID0gcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiAocyk7Ci19Ci0KLS8qIENoZWNrIGlmIGNvZGVkIHN0cmluZyBzIGlzIGEgdmFyaWFibGUgbmFtZSAqLwotaW50Ci1pc193ZHZhcm5hbWUoY29uc3QgY2hhciAqcywgaW50IGFvaykKLXsKLQljb25zdCBjaGFyICpwID0gc2tpcF93ZHZhcm5hbWUocywgYW9rKTsKLQotCXJldHVybiAocCAhPSBzICYmIHBbMF0gPT0gRU9TKTsKLX0KLQotLyogQ2hlY2sgaWYgY29kZWQgc3RyaW5nIHMgaXMgYSB2YXJpYWJsZSBhc3NpZ25tZW50ICovCi1pbnQKLWlzX3dkdmFyYXNzaWduKGNvbnN0IGNoYXIgKnMpCi17Ci0JY29uc3QgY2hhciAqcCA9IHNraXBfd2R2YXJuYW1lKHMsIHRydWUpOwotCi0JcmV0dXJuIChwICE9IHMgJiYgcFswXSA9PSBDSEFSICYmIHBbMV0gPT0gJz0nKTsKLX0KLQotLyoKLSAqIE1ha2UgdGhlIGV4cG9ydGVkIGVudmlyb25tZW50IGZyb20gdGhlIGV4cG9ydGVkIG5hbWVzIGluIHRoZSBkaWN0aW9uYXJ5LgotICovCi1jaGFyICoqCi1tYWtlbnYodm9pZCkKLXsKLQlzdHJ1Y3QgYmxvY2sgKmw7Ci0JWFB0clYgZGVudjsKLQlzdHJ1Y3QgdGJsICp2cCwgKip2cHA7Ci0JaW50IGk7Ci0KLQlYUGluaXQoZGVudiwgNjQpOwotCWZvciAobCA9IGUtPmxvYzsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkJZm9yICh2cHAgPSBsLT52YXJzLnRibHMsIGkgPSBsLT52YXJzLnNpemU7IC0taSA+PSAwOyApCi0JCQlpZiAoKHZwID0gKnZwcCsrKSAhPSBOVUxMICYmCi0JCQkgICAgKHZwLT5mbGFnJihJU1NFVHxFWFBPUlQpKSA9PSAoSVNTRVR8RVhQT1JUKSkgewotCQkJCXN0cnVjdCBibG9jayAqbDI7Ci0JCQkJc3RydWN0IHRibCAqdnAyOwotCQkJCXVpbnQzMl90IGggPSBoYXNoKHZwLT5uYW1lKTsKLQotCQkJCS8qIHVuZXhwb3J0IGFueSByZWRlZmluZWQgaW5zdGFuY2VzICovCi0JCQkJZm9yIChsMiA9IGwtPm5leHQ7IGwyICE9IE5VTEw7IGwyID0gbDItPm5leHQpIHsKLQkJCQkJdnAyID0ga3RzZWFyY2goJmwyLT52YXJzLCB2cC0+bmFtZSwgaCk7Ci0JCQkJCWlmICh2cDIgIT0gTlVMTCkKLQkJCQkJCXZwMi0+ZmxhZyAmPSB+RVhQT1JUOwotCQkJCX0KLQkJCQlpZiAoKHZwLT5mbGFnJklOVEVHRVIpKSB7Ci0JCQkJCS8qIGludGVnZXIgdG8gc3RyaW5nICovCi0JCQkJCWNoYXIgKnZhbDsKLQkJCQkJdmFsID0gc3RyX3ZhbCh2cCk7Ci0JCQkJCXZwLT5mbGFnICY9IH4oSU5URUdFUnxSRE9OTFl8U1BFQ0lBTCk7Ci0JCQkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KLQkJCQkJc2V0c3RyKHZwLCB2YWwsIEtTSF9SRVRVUk5fRVJST1IpOwotCQkJCX0KLQkJCQlYUHB1dChkZW52LCB2cC0+dmFsLnMpOwotCQkJfQotCVhQcHV0KGRlbnYsIE5VTEwpOwotCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZShkZW52KSk7Ci19Ci0KLS8qIEJvYiBKZW5raW5zJyBvbmUtYXQtYS10aW1lIGhhc2ggKi8KLXN0YXRpYyB1aW50MzJfdAotb2FhdGhhc2hfdXBkYXRlKHJlZ2lzdGVyIHVpbnQzMl90IGgsIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKmNwLAotICAgIHJlZ2lzdGVyIHNpemVfdCBuKQotewotCXdoaWxlIChuLS0pIHsKLQkJaCArPSAqY3ArKzsKLQkJaCArPSBoIDw8IDEwOwotCQloIF49IGggPj4gNjsKLQl9Ci0KLQlyZXR1cm4gKGgpOwotfQotCi1zdGF0aWMgdWludDMyX3QKLW9hYXRoYXNoX2ZpbmFsaXNlKHJlZ2lzdGVyIHVpbnQzMl90IGgpCi17Ci0JaCArPSBoIDw8IDM7Ci0JaCBePSBoID4+IDExOwotCWggKz0gaCA8PCAxNTsKLQotCXJldHVybiAoaCk7Ci19Ci0KLXVpbnQzMl90Ci1vYWF0aGFzaF9mdWxsKHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKmJwKQotewotCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAwOwotCXJlZ2lzdGVyIHVpbnQ4X3QgYzsKLQotCXdoaWxlICgoYyA9ICpicCsrKSkgewotCQloICs9IGM7Ci0JCWggKz0gaCA8PCAxMDsKLQkJaCBePSBoID4+IDY7Ci0JfQotCi0JcmV0dXJuIChvYWF0aGFzaF9maW5hbGlzZShoKSk7Ci19Ci0KLXZvaWQKLWNoYW5nZV9yYW5kb20oY29uc3Qgdm9pZCAqdnAsIHNpemVfdCBuKQotewotCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAweDEwMDsKLSNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQotCWludCBtaWJbMl07Ci0JdWludDhfdCBrWzNdOwotCXNpemVfdCBrbGVuOwotI2VuZGlmCi0KLQlrc2hzdGF0ZV92LmNyX2RwID0gdnA7Ci0Ja3Noc3RhdGVfdi5jcl9kc3ogPSBuOwotCWdldHRpbWVvZmRheSgma3Noc3RhdGVfdi5jcl90diwgTlVMTCk7Ci0JaCA9IG9hYXRoYXNoX3VwZGF0ZShvYWF0aGFzaF91cGRhdGUoaCwgKHZvaWQgKikma3Noc3RhdGVfdiwKLQkgICAgc2l6ZW9mKGtzaHN0YXRlX3YpKSwgdnAsIG4pOwotCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOwotCi0jaWYgZGVmaW5lZChfX09wZW5CU0RfXykKLQkvKiBPcGVuQlNELCBNaXJCU0Q6IHByb3BlciBrZXJuZWwgZW50cm9weSBjb21lcyBhdCB6ZXJvIGNvc3QgKi8KLQotCW1pYlswXSA9IENUTF9LRVJOOwotCW1pYlsxXSA9IEtFUk5fQVJORDsKLQlrbGVuID0gc2l6ZW9mKGspOwotCXN5c2N0bChtaWIsIDIsIGssICZrbGVuLCAma3Noc3RhdGVfdi5sY2dfc3RhdGVfLAotCSAgICBzaXplb2Yoa3Noc3RhdGVfdi5sY2dfc3RhdGVfKSk7Ci0JLyogd2UgaWdub3JlIGZhaWx1cmVzIGFuZCB0YWtlIGluIGsgYW55d2F5ICovCi0JaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCBrLCBzaXplb2YoaykpOwotCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOwotI2VsaWYgZGVmaW5lZChNS1NIX0E0UEIpCi0JLyogZm9yY2VkIGJ5IHRoZSB1c2VyIHRvIHVzZSBhcmM0cmFuZG9tX3B1c2hiKDMpIOKAoiBDeWd3aW4/ICovCi0JewotCQl1aW50MzJfdCBwcnY7Ci0KLQkJcHJ2ID0gYXJjNHJhbmRvbV9wdXNoYigma3Noc3RhdGVfdi5sY2dfc3RhdGVfLAotCQkgICAgc2l6ZW9mKGtzaHN0YXRlX3YubGNnX3N0YXRlXykpOwotCQloID0gb2FhdGhhc2hfdXBkYXRlKGgsICZwcnYsIHNpemVvZihwcnYpKTsKLQl9Ci0Ja3Noc3RhdGVfdi5sY2dfc3RhdGVfID0gb2FhdGhhc2hfZmluYWxpc2UoaCk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIGhhbmRsZSBzcGVjaWFsIHZhcmlhYmxlcyB3aXRoIHNpZGUgZWZmZWN0cyAtIFBBVEgsIFNFQ09ORFMuCi0gKi8KLQotLyogVGVzdCBpZiBuYW1lIGlzIGEgc3BlY2lhbCBwYXJhbWV0ZXIgKi8KLXN0YXRpYyBpbnQKLXNwZWNpYWwoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgdGJsICp0cDsKLQotCXRwID0ga3RzZWFyY2goJnNwZWNpYWxzLCBuYW1lLCBoYXNoKG5hbWUpKTsKLQlyZXR1cm4gKHRwICYmICh0cC0+ZmxhZyAmIElTU0VUKSA/IHRwLT50eXBlIDogVl9OT05FKTsKLX0KLQotLyogTWFrZSBhIHZhcmlhYmxlIG5vbi1zcGVjaWFsICovCi1zdGF0aWMgdm9pZAotdW5zcGVjaWFsKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0KLQl0cCA9IGt0c2VhcmNoKCZzcGVjaWFscywgbmFtZSwgaGFzaChuYW1lKSk7Ci0JaWYgKHRwKQotCQlrdGRlbGV0ZSh0cCk7Ci19Ci0KLXN0YXRpYyB0aW1lX3Qgc2Vjb25kczsJCS8qIHRpbWUgU0VDT05EUyBsYXN0IHNldCAqLwotc3RhdGljIGludCB1c2VyX2xpbmVubzsJCS8qIHdoYXQgdXNlciBzZXQgJExJTkVOTyB0byAqLwotCi1zdGF0aWMgdm9pZAotZ2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKLXsKLQlyZWdpc3RlciBta3NoX2FyaV90IGk7Ci0JaW50IHN0OwotCi0Jc3dpdGNoICgoc3QgPSBzcGVjaWFsKHZwLT5uYW1lKSkpIHsKLQljYXNlIFZfU0VDT05EUzoKLQkJLyoKLQkJICogT24gc3RhcnQgdXAgdGhlIHZhbHVlIG9mIFNFQ09ORFMgaXMgdXNlZCBiZWZvcmUKLQkJICogaXQgaGFzIGJlZW4gc2V0IC0gZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBjYXNlCi0JCSAqIChzZWUgaW5pdGNvbXNbXSBpbiBtYWluLmMpLgotCQkgKi8KLQkJaWYgKHZwLT5mbGFnICYgSVNTRVQpIHsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2OwotCi0JCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQkJCWkgPSB0di50dl9zZWMgLSBzZWNvbmRzOwotCQl9IGVsc2UKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0JY2FzZSBWX1JBTkRPTToKLQkJLyoKLQkJICogdGhpcyBpcyB0aGUgc2FtZSBMaW5lYXIgQ29uZ3J1ZW50aWFsIFBSTkcgYXMgQm9ybGFuZAotCQkgKiBDL0MrKyBhbGxlZ2VkbHkgdXNlcyBpbiBpdHMgYnVpbHQtaW4gcmFuZCgpIGZ1bmN0aW9uCi0JCSAqLwotCQlpID0gKChrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPQotCQkgICAgMjI2OTU0NzcgKiBrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gKyAxKSA+PiAxNikgJiAweDdGRkY7Ci0JCWJyZWFrOwotCWNhc2UgVl9ISVNUU0laRToKLQkJaSA9IGhpc3RzaXplOwotCQlicmVhazsKLQljYXNlIFZfT1BUSU5EOgotCQlpID0gdXNlcl9vcHQudW9wdGluZDsKLQkJYnJlYWs7Ci0JY2FzZSBWX0xJTkVOTzoKLQkJaSA9IGN1cnJlbnRfbGluZW5vICsgdXNlcl9saW5lbm87Ci0JCWJyZWFrOwotCWNhc2UgVl9DT0xVTU5TOgotCWNhc2UgVl9MSU5FUzoKLQkJLyoKLQkJICogRG8gTk9UIGV4cG9ydCBDT0xVTU5TL0xJTkVTLiBNYW55IGFwcGxpY2F0aW9ucwotCQkgKiBjaGVjayBDT0xVTU5TL0xJTkVTIGJlZm9yZSBjaGVja2luZyB3cy53c19jb2wvcm93LAotCQkgKiBzbyBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCBDL0wgaW4gdGhlIGVudmlyb24KLQkJICogYW5kIHRoZSB3aW5kb3cgaXMgdGhlbiByZXNpemVkLCB0aGUgYXBwIHdvbid0Ci0JCSAqIHNlZSB0aGUgY2hhbmdlIGNhdXNlIHRoZSBlbnZpcm9uIGRvZXNuJ3QgY2hhbmdlLgotCQkgKi8KLQkJY2hhbmdlX3dpbnN6KCk7Ci0JCWkgPSBzdCA9PSBWX0NPTFVNTlMgPyB4X2NvbHMgOiB4X2xpbnM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcsIGRvIG5vdCB0b3VjaCB2cCBhdCBhbGwgKi8KLQkJcmV0dXJuOwotCX0KLQl2cC0+ZmxhZyAmPSB+U1BFQ0lBTDsKLQlzZXRpbnQodnAsIGkpOwotCXZwLT5mbGFnIHw9IFNQRUNJQUw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRzcGVjKHN0cnVjdCB0YmwgKnZwKQotewotCW1rc2hfYXJpX3QgaTsKLQljaGFyICpzOwotCWludCBzdDsKLQotCXN3aXRjaCAoKHN0ID0gc3BlY2lhbCh2cC0+bmFtZSkpKSB7Ci0JY2FzZSBWX1BBVEg6Ci0JCWlmIChwYXRoKQotCQkJYWZyZWUocGF0aCwgQVBFUk0pOwotCQlzID0gc3RyX3ZhbCh2cCk7Ci0JCXN0cmR1cHgocGF0aCwgcywgQVBFUk0pOwotCQlmbHVzaGNvbSgxKTsJLyogY2xlYXIgdHJhY2tlZCBhbGlhc2VzICovCi0JCXJldHVybjsKLQljYXNlIFZfSUZTOgotCQlzZXRjdHlwZXMocyA9IHN0cl92YWwodnApLCBDX0lGUyk7Ci0JCWlmczAgPSAqczsKLQkJcmV0dXJuOwotCWNhc2UgVl9UTVBESVI6Ci0JCWlmICh0bXBkaXIpIHsKLQkJCWFmcmVlKHRtcGRpciwgQVBFUk0pOwotCQkJdG1wZGlyID0gTlVMTDsKLQkJfQotCQkvKiBVc2UgdG1wZGlyIGlmZiBpdCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpcyB3cml0YWJsZSBhbmQKLQkJICogc2VhcmNoYWJsZSBhbmQgaXMgYSBkaXJlY3RvcnkuLi4KLQkJICovCi0JCXsKLQkJCXN0cnVjdCBzdGF0IHN0YXRiOwotCi0JCQlzID0gc3RyX3ZhbCh2cCk7Ci0JCQlpZiAoc1swXSA9PSAnLycgJiYgYWNjZXNzKHMsIFdfT0t8WF9PSykgPT0gMCAmJgotCQkJICAgIHN0YXQocywgJnN0YXRiKSA9PSAwICYmIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpCi0JCQkJc3RyZHVweCh0bXBkaXIsIHMsIEFQRVJNKTsKLQkJfQotCQlicmVhazsKLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCWNhc2UgVl9ISVNURklMRToKLQkJc2V0aGlzdGZpbGUoc3RyX3ZhbCh2cCkpOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgVl9UTU9VVDoKLQkJLyogQVQmVCBrc2ggc2VlbXMgdG8gZG8gdGhpcyAob25seSBsaXN0ZW4gaWYgaW50ZWdlcikgKi8KLQkJaWYgKHZwLT5mbGFnICYgSU5URUdFUikKLQkJCWtzaF90bW91dCA9IHZwLT52YWwuaSA+PSAwID8gdnAtPnZhbC5pIDogMDsKLQkJYnJlYWs7Ci0KLQkvKiBjb21tb24gc3ViLWNhc2VzICovCi0JY2FzZSBWX09QVElORDoKLQljYXNlIFZfSElTVFNJWkU6Ci0JY2FzZSBWX0NPTFVNTlM6Ci0JY2FzZSBWX0xJTkVTOgotCWNhc2UgVl9SQU5ET006Ci0JY2FzZSBWX1NFQ09ORFM6Ci0JY2FzZSBWX0xJTkVOTzoKLQkJdnAtPmZsYWcgJj0gflNQRUNJQUw7Ci0JCWkgPSBpbnR2YWwodnApOwotCQl2cC0+ZmxhZyB8PSBTUEVDSUFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nLCBkbyBub3QgdG91Y2ggdnAgYXQgYWxsICovCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBwcm9jZXNzIHRoZSBzaW5ndWxhciBwYXJ0cyBvZiB0aGUgY29tbW9uIGNhc2VzICovCi0KLQlzd2l0Y2ggKHN0KSB7Ci0JY2FzZSBWX09QVElORDoKLQkJZ2V0b3B0c19yZXNldCgoaW50KWkpOwotCQlicmVhazsKLQljYXNlIFZfSElTVFNJWkU6Ci0JCXNldGhpc3RzaXplKChpbnQpaSk7Ci0JCWJyZWFrOwotCWNhc2UgVl9DT0xVTU5TOgotCQlpZiAoaSA+PSBNSU5fQ09MUykKLQkJCXhfY29scyA9IGk7Ci0JCWJyZWFrOwotCWNhc2UgVl9MSU5FUzoKLQkJaWYgKGkgPj0gTUlOX0xJTlMpCi0JCQl4X2xpbnMgPSBpOwotCQlicmVhazsKLQljYXNlIFZfUkFORE9NOgotCQkvKgotCQkgKiBta3NoIFIzOWQrIG5vIGxvbmdlciBoYXMgdGhlIHRyYWRpdGlvbmFsIHJlcGVhdGFiaWxpdHkKLQkJICogb2YgJFJBTkRPTSBzZXF1ZW5jZXMsIGJ1dCBhbHdheXMgcmV0YWlucyBzdGF0ZQotCQkgKi8KLQkJY2hhbmdlX3JhbmRvbSgmaSwgc2l6ZW9mKGkpKTsKLQkJYnJlYWs7Ci0JY2FzZSBWX1NFQ09ORFM6Ci0JCXsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2OwotCi0JCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQkJCXNlY29uZHMgPSB0di50dl9zZWMgLSBpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVl9MSU5FTk86Ci0JCS8qIFRoZSAtMSBpcyBiZWNhdXNlIGxpbmUgbnVtYmVyaW5nIHN0YXJ0cyBhdCAxLiAqLwotCQl1c2VyX2xpbmVubyA9ICh1bnNpZ25lZCBpbnQpaSAtIGN1cnJlbnRfbGluZW5vIC0gMTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotdW5zZXRzcGVjKHN0cnVjdCB0YmwgKnZwKQotewotCXN3aXRjaCAoc3BlY2lhbCh2cC0+bmFtZSkpIHsKLQljYXNlIFZfUEFUSDoKLQkJaWYgKHBhdGgpCi0JCQlhZnJlZShwYXRoLCBBUEVSTSk7Ci0JCXN0cmR1cHgocGF0aCwgZGVmX3BhdGgsIEFQRVJNKTsKLQkJZmx1c2hjb20oMSk7CS8qIGNsZWFyIHRyYWNrZWQgYWxpYXNlcyAqLwotCQlicmVhazsKLQljYXNlIFZfSUZTOgotCQlzZXRjdHlwZXMoIiBcdFxuIiwgQ19JRlMpOwotCQlpZnMwID0gJyAnOwotCQlicmVhazsKLQljYXNlIFZfVE1QRElSOgotCQkvKiBzaG91bGQgbm90IGJlY29tZSB1bnNwZWNpYWwgKi8KLQkJaWYgKHRtcGRpcikgewotCQkJYWZyZWUodG1wZGlyLCBBUEVSTSk7Ci0JCQl0bXBkaXIgPSBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVl9MSU5FTk86Ci0JY2FzZSBWX1JBTkRPTToKLQljYXNlIFZfU0VDT05EUzoKLQljYXNlIFZfVE1PVVQ6CQkvKiBBVCZUIGtzaCBsZWF2ZXMgcHJldmlvdXMgdmFsdWUgaW4gcGxhY2UgKi8KLQkJdW5zcGVjaWFsKHZwLT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQkvKgotCSAqIEFUJlQga3NoIG1hbiBwYWdlIHNheXMgT1BUSU5ELCBPUFRBUkcgYW5kIF8gbG9zZSBzcGVjaWFsCi0JICogbWVhbmluZywgYnV0IE9QVEFSRyBkb2VzIG5vdCAoc3RpbGwgc2V0IGJ5IGdldG9wdHMpIGFuZCBfIGlzCi0JICogYWxzbyBzdGlsbCBzZXQgaW4gdmFyaW91cyBwbGFjZXMuIERvbid0IGtub3cgd2hhdCBBVCZUIGRvZXMKLQkgKiBmb3IgSElTVFNJWkUsIEhJU1RGSUxFLiBVbnNldHRpbmcgdGhlc2UgaW4gQVQmVCBrc2ggZG9lcyBub3QKLQkgKiBsb29zZSB0aGUgJ3NwZWNpYWxuZXNzJzogSUZTLCBDT0xVTU5TLCBQQVRILCBUTVBESVIKLQkgKi8KLQl9Ci19Ci0KLS8qCi0gKiBTZWFyY2ggZm9yIChhbmQgcG9zc2libHkgY3JlYXRlKSBhIHRhYmxlIGVudHJ5IHN0YXJ0aW5nIHdpdGgKLSAqIHZwLCBpbmRleGVkIGJ5IHZhbC4KLSAqLwotc3RhdGljIHN0cnVjdCB0YmwgKgotYXJyYXlzZWFyY2goc3RydWN0IHRibCAqdnAsIHVpbnQzMl90IHZhbCkKLXsKLQlzdHJ1Y3QgdGJsICpwcmV2LCAqY3VyciwgKm5ld3M7Ci0Jc2l6ZV90IGxlbjsKLQotCXZwLT5mbGFnID0gKHZwLT5mbGFnIHwgKEFSUkFZfERFRklORUQpKSAmIH5BU1NPQzsKLQkvKiBUaGUgdGFibGUgZW50cnkgaXMgYWx3YXlzIFswXSAqLwotCWlmICh2YWwgPT0gMCkKLQkJcmV0dXJuICh2cCk7Ci0JcHJldiA9IHZwOwotCWN1cnIgPSB2cC0+dS5hcnJheTsKLQl3aGlsZSAoY3VyciAmJiBjdXJyLT51YS5pbmRleCA8IHZhbCkgewotCQlwcmV2ID0gY3VycjsKLQkJY3VyciA9IGN1cnItPnUuYXJyYXk7Ci0JfQotCWlmIChjdXJyICYmIGN1cnItPnVhLmluZGV4ID09IHZhbCkgewotCQlpZiAoY3Vyci0+ZmxhZyZJU1NFVCkKLQkJCXJldHVybiAoY3Vycik7Ci0JCW5ld3MgPSBjdXJyOwotCX0gZWxzZQotCQluZXdzID0gTlVMTDsKLQlsZW4gPSBzdHJsZW4odnAtPm5hbWUpICsgMTsKLQlpZiAoIW5ld3MpIHsKLQkJbmV3cyA9IGFsbG9jKG9mZnNldG9mKHN0cnVjdCB0YmwsIG5hbWVbMF0pICsgbGVuLCB2cC0+YXJlYXApOwotCQltZW1jcHkobmV3cy0+bmFtZSwgdnAtPm5hbWUsIGxlbik7Ci0JfQotCW5ld3MtPmZsYWcgPSAodnAtPmZsYWcgJiB+KEFMTE9DfERFRklORUR8SVNTRVR8U1BFQ0lBTCkpIHwgQUlOREVYOwotCW5ld3MtPnR5cGUgPSB2cC0+dHlwZTsKLQluZXdzLT5hcmVhcCA9IHZwLT5hcmVhcDsKLQluZXdzLT51Mi5maWVsZCA9IHZwLT51Mi5maWVsZDsKLQluZXdzLT51YS5pbmRleCA9IHZhbDsKLQotCWlmIChjdXJyICE9IG5ld3MpIHsJCS8qIG5vdCByZXVzaW5nIG9sZCBhcnJheSBlbnRyeSAqLwotCQlwcmV2LT51LmFycmF5ID0gbmV3czsKLQkJbmV3cy0+dS5hcnJheSA9IGN1cnI7Ci0JfQotCXJldHVybiAobmV3cyk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5IHJlZmVyZW5jZSAoZWcsIFsxKzJdKSAtIGNwIGlzIGFzc3VtZWQKLSAqIHRvIHBvaW50IHRvIHRoZSBvcGVuIGJyYWNrZXQuIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjbG9zaW5nCi0gKiBicmFja2V0LgotICovCi1pbnQKLWFycmF5X3JlZl9sZW4oY29uc3QgY2hhciAqY3ApCi17Ci0JY29uc3QgY2hhciAqcyA9IGNwOwotCWludCBjOwotCWludCBkZXB0aCA9IDA7Ci0KLQl3aGlsZSAoKGMgPSAqcysrKSAmJiAoYyAhPSAnXScgfHwgLS1kZXB0aCkpCi0JCWlmIChjID09ICdbJykKLQkJCWRlcHRoKys7Ci0JaWYgKCFjKQotCQlyZXR1cm4gKDApOwotCXJldHVybiAocyAtIGNwKTsKLX0KLQotLyoKLSAqIE1ha2UgYSBjb3B5IG9mIHRoZSBiYXNlIG9mIGFuIGFycmF5IG5hbWUKLSAqLwotY2hhciAqCi1hcnJheW5hbWUoY29uc3QgY2hhciAqc3RyKQotewotCWNvbnN0IGNoYXIgKnA7Ci0JY2hhciAqcnY7Ci0KLQlpZiAoKHAgPSBjc3RyY2hyKHN0ciwgJ1snKSkgPT0gMCkKLQkJLyogU2hvdWxkbid0IGhhcHBlbiwgYnV0IHdoeSB3b3JyeT8gKi8KLQkJc3RyZHVweChydiwgc3RyLCBBVEVNUCk7Ci0JZWxzZQotCQlzdHJuZHVweChydiwgc3RyLCBwIC0gc3RyLCBBVEVNUCk7Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyogc2V0IChvciBvdmVyd3JpdGUsIGlmIHJlc2V0KSB0aGUgYXJyYXkgdmFyaWFibGUgdmFyIHRvIHRoZSB2YWx1ZXMgaW4gdmFscyAqLwotbWtzaF91YXJpX3QKLXNldF9hcnJheShjb25zdCBjaGFyICp2YXIsIGJvb2wgcmVzZXQsIGNvbnN0IGNoYXIgKip2YWxzKQotewotCXN0cnVjdCB0YmwgKnZwLCAqdnE7Ci0JbWtzaF91YXJpX3QgaTsKLQljb25zdCBjaGFyICpjY3A7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQljaGFyICpjcDsKLQlta3NoX3VhcmlfdCBqOwotI2VuZGlmCi0KLQkvKiB0byBnZXQgbG9jYWwgYXJyYXksIHVzZSAidHlwZXNldCBmb287IHNldCAtQSBmb28iICovCi0JdnAgPSBnbG9iYWwodmFyKTsKLQotCS8qIE5vdGU6IEFUJlQga3NoIGFsbG93cyBzZXQgLUEgYnV0IG5vdCBzZXQgK0Egb2YgYSByZWFkLW9ubHkgdmFyICovCi0JaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKQotCQllcnJvcmYoIiVzOiBpcyByZWFkIG9ubHkiLCB2YXIpOwotCS8qIFRoaXMgY29kZSBpcyBxdWl0ZSBub24tb3B0aW1hbCAqLwotCWlmIChyZXNldCkKLQkJLyogdHJhc2ggZXhpc3RpbmcgdmFsdWVzIGFuZCBhdHRyaWJ1dGVzICovCi0JCXVuc2V0KHZwLCAxKTsKLQkvKiB0b2RvOiB3b3VsZCBiZSBuaWNlIGZvciBhc3NpZ25tZW50IHRvIGNvbXBsZXRlbHkgc3VjY2VlZCBvcgotCSAqIGNvbXBsZXRlbHkgZmFpbC4gT25seSByZWFsbHkgZWZmZWN0cyBpbnRlZ2VyIGFycmF5czoKLQkgKiBldmFsdWF0aW9uIG9mIHNvbWUgb2YgdmFsc1tdIG1heSBmYWlsLi4uCi0JICovCi0JaSA9IDA7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQlqID0gMDsKLSNlbHNlCi0jZGVmaW5lIGogaQotI2VuZGlmCi0Jd2hpbGUgKChjY3AgPSB2YWxzW2ldKSkgewotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWlmICgqY2NwID09ICdbJykgewotCQkJaW50IGxldmVsID0gMDsKLQotCQkJd2hpbGUgKCpjY3ApIHsKLQkJCQlpZiAoKmNjcCA9PSAnXScgJiYgLS1sZXZlbCA9PSAwKQotCQkJCQlicmVhazsKLQkJCQlpZiAoKmNjcCA9PSAnWycpCi0JCQkJCSsrbGV2ZWw7Ci0JCQkJKytjY3A7Ci0JCQl9Ci0JCQlpZiAoKmNjcCA9PSAnXScgJiYgbGV2ZWwgPT0gMCAmJiBjY3BbMV0gPT0gJz0nKSB7Ci0JCQkJc3RybmR1cHgoY3AsIHZhbHNbaV0gKyAxLCBjY3AgLSAodmFsc1tpXSArIDEpLAotCQkJCSAgICBBVEVNUCk7Ci0JCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShjcCwgMCksIChta3NoX2FyaV90ICopJmosCi0JCQkJICAgIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOwotCQkJCWFmcmVlKGNwLCBBVEVNUCk7Ci0JCQkJY2NwICs9IDI7Ci0JCQl9IGVsc2UKLQkJCQljY3AgPSB2YWxzW2ldOwotCQl9Ci0jZW5kaWYKLQotCQl2cSA9IGFycmF5c2VhcmNoKHZwLCBqKTsKLQkJLyogd291bGQgYmUgbmljZSB0byBkZWFsIHdpdGggZXJyb3JzIGhlcmUuLi4gKHNlZSBhYm92ZSkgKi8KLQkJc2V0c3RyKHZxLCBjY3AsIEtTSF9SRVRVUk5fRVJST1IpOwotCQlpKys7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJaisrOwotI2VuZGlmCi0JfQotCi0JcmV0dXJuIChpKTsKLX0KLQotdm9pZAotY2hhbmdlX3dpbnN6KHZvaWQpCi17Ci0JaWYgKHhfbGlucyA8IDApIHsKLQkJLyogZmlyc3QgdGltZSBpbml0aWFsaXNhdGlvbiAqLwotI2lmZGVmIFRJT0NHV0lOU1oKLQkJaWYgKHR0eV9mZCA8IDApCi0JCQkvKiBub24tRlRBTEtJTkcsIHRyeSB0byBnZXQgYW4gZmQgYW55d2F5ICovCi0JCQl0dHlfaW5pdChmYWxzZSwgZmFsc2UpOwotI2VuZGlmCi0JCXhfY29scyA9IC0xOwotCX0KLQotI2lmZGVmIFRJT0NHV0lOU1oKLQkvKiBjaGVjayBpZiB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCAqLwotCWlmICh0dHlfZmQgPj0gMCkgewotCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQotCQlpZiAoaW9jdGwodHR5X2ZkLCBUSU9DR1dJTlNaLCAmd3MpID49IDApIHsKLQkJCWlmICh3cy53c19jb2wpCi0JCQkJeF9jb2xzID0gd3Mud3NfY29sOwotCQkJaWYgKHdzLndzX3JvdykKLQkJCQl4X2xpbnMgPSB3cy53c19yb3c7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIGJvdW5kcyBjaGVjayBmb3Igc2FuZSB2YWx1ZXMsIHVzZSBkZWZhdWx0cyBvdGhlcndpc2UgKi8KLQlpZiAoeF9jb2xzIDwgTUlOX0NPTFMpCi0JCXhfY29scyA9IDgwOwotCWlmICh4X2xpbnMgPCBNSU5fTElOUykKLQkJeF9saW5zID0gMjQ7Ci0KLSNpZmRlZiBTSUdXSU5DSAotCWdvdF93aW5jaCA9IDA7Ci0jZW5kaWYKLX0KLQotdWludDMyX3QKLWV2aWxoYXNoKGNvbnN0IGNoYXIgKnMpCi17Ci0JcmVnaXN0ZXIgdWludDMyX3QgaCA9IDB4MTAwOwotCi0JaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCAodm9pZCAqKSZrc2hzdGF0ZV9mLCBzaXplb2Yoa3Noc3RhdGVfZikpOwotCWtzaHN0YXRlX2YuaCA9IG9hYXRoYXNoX2Z1bGwoKGNvbnN0IHVpbnQ4X3QgKilzKTsKLQlyZXR1cm4gKG9hYXRoYXNoX2ZpbmFsaXNlKG9hYXRoYXNoX3VwZGF0ZShoLAotCSAgICAodm9pZCAqKSZrc2hzdGF0ZV9mLmgsIHNpemVvZihrc2hzdGF0ZV9mLmgpKSkpOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdmFyX3NwZWMuaCBiL21rc2gvc3JjL3Zhcl9zcGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzVjYzkuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvdmFyX3NwZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpZiBkZWZpbmVkKFZBUlNQRUNfREVGTlMpCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC92YXJfc3BlYy5oLHYgMS4xIDIwMDkvMDkvMjYgMDM6NDA6MDMgdGcgRXhwICQiKTsKLSNkZWZpbmUgRk4obmFtZSkJCQkvKiBub3RoaW5nICovCi0jZWxpZiBkZWZpbmVkKFZBUlNQRUNfRU5VTVMpCi0jZGVmaW5lIEZOKG5hbWUpCQkJVl8jI25hbWUsCi0jZGVmaW5lIEYwKG5hbWUpCQkJVl8jI25hbWUgPSAwLAotI2VsaWYgZGVmaW5lZChWQVJTUEVDX0lURU1TKQotI2RlZmluZSBGMChuYW1lKQkJCS8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgRk4obmFtZSkJCQkjbmFtZSwKLSNlbmRpZgotCi0jaWZuZGVmIEYwCi0jZGVmaW5lIEYwIEZOCi0jZW5kaWYKLQotLyogMCBpcyBhbHdheXMgVl9OT05FICovCi1GMChOT05FKQotCi0vKiAxIGFuZCB1cCBhcmUgc3BlY2lhbCB2YXJpYWJsZXMgKi8KLUZOKENPTFVNTlMpCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLUZOKEhJU1RGSUxFKQotI2VuZGlmCi1GTihISVNUU0laRSkKLUZOKElGUykKLUZOKExJTkVOTykKLUZOKExJTkVTKQotRk4oT1BUSU5EKQotRk4oUEFUSCkKLUZOKFJBTkRPTSkKLUZOKFNFQ09ORFMpCi1GTihUTU9VVCkKLUZOKFRNUERJUikKLQotI3VuZGVmIEZOCi0jdW5kZWYgRjAKLSN1bmRlZiBWQVJTUEVDX0RFRk5TCi0jdW5kZWYgVkFSU1BFQ19FTlVNUwotI3VuZGVmIFZBUlNQRUNfSVRFTVMKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5yYyBiL3Jvb3RkaXIvaW5pdC5yYwppbmRleCA1NDg3M2UwLi4wZDQ3NmQ0IDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQucmMKKysrIGIvcm9vdGRpci9pbml0LnJjCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgZXhwb3J0IEFORFJPSURfREFUQSAvZGF0YQogICAgIGV4cG9ydCBBU0VDX01PVU5UUE9JTlQgL21udC9hc2VjCiAgICAgZXhwb3J0IExPT1BfTU9VTlRQT0lOVCAvbW50L29iYgotICAgIGV4cG9ydCBCT09UQ0xBU1NQQVRIIC9zeXN0ZW0vZnJhbWV3b3JrL2NvcmUuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2FwYWNoZS14bWwuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2JvdW5jeWNhc3RsZS5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvZXh0Lmphcjovc3lzdGVtL2ZyYW1ld29yay9mcmFtZXdvcmsuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2FuZHJvaWQucG9saWN5Lmphcjovc3lzdGVtL2ZyYW1ld29yay9zZXJ2aWNlcy5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvY29yZS1qdW5pdC5qYXIKKyAgICBleHBvcnQgQk9PVENMQVNTUEFUSCAvc3lzdGVtL2ZyYW1ld29yay9jb3JlLmphcjovc3lzdGVtL2ZyYW1ld29yay9jb3JlLWp1bml0Lmphcjovc3lzdGVtL2ZyYW1ld29yay9ib3VuY3ljYXN0bGUuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2V4dC5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvZnJhbWV3b3JrLmphcjovc3lzdGVtL2ZyYW1ld29yay9hbmRyb2lkLnBvbGljeS5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvc2VydmljZXMuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2FwYWNoZS14bWwuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2ZpbHRlcmZ3LmphcgogCiAjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICBzeW1saW5rIC9zeXN0ZW0vZXRjIC9ldGMKQEAgLTExNSwxMSArMTE1LDcgQEAKICAgICBjaG1vZCAwMjIwIC9wcm9jL3N5c3JxLXRyaWdnZXIKIAogICAgICMgY3JlYXRlIHRoZSBsb3N0K2ZvdW5kIGRpcmVjdG9yaWVzLCBzbyBhcyB0byBlbmZvcmNlIG91ciBwZXJtaXNzaW9ucwotICAgIG1rZGlyIC9jYWNoZS9sb3N0K2ZvdW5kIDA3NzAKLQotICAgICMgZG91YmxlIGNoZWNrIHRoZSBwZXJtcywgaW4gY2FzZSBsb3N0K2ZvdW5kIGFscmVhZHkgZXhpc3RzLCBhbmQgc2V0IG93bmVyCi0gICAgY2hvd24gcm9vdCByb290IC9jYWNoZS9sb3N0K2ZvdW5kCi0gICAgY2htb2QgMDc3MCAvY2FjaGUvbG9zdCtmb3VuZAorICAgIG1rZGlyIC9jYWNoZS9sb3N0K2ZvdW5kIDA3NzAgcm9vdCByb290CiAKIG9uIHBvc3QtZnMtZGF0YQogICAgICMgV2UgY2hvd24vY2htb2QgL2RhdGEgYWdhaW4gc28gYmVjYXVzZSBtb3VudCBpcyBydW4gYXMgcm9vdCArIGRlZmF1bHRzCkBAIC0xMjksMTAgKzEyNSw3IEBACiAgICAgIyBDcmVhdGUgZHVtcCBkaXIgYW5kIGNvbGxlY3QgZHVtcHMuCiAgICAgIyBEbyB0aGlzIGJlZm9yZSB3ZSBtb3VudCBjYWNoZSBzbyBldmVudHVhbGx5IHdlIGNhbiB1c2UgY2FjaGUgZm9yCiAgICAgIyBzdG9yaW5nIGR1bXBzIG9uIHBsYXRmb3JtcyB3aGljaCBkbyBub3QgaGF2ZSBhIGRlZGljYXRlZCBkdW1wIHBhcnRpdGlvbi4KLSAgIAotICAgIG1rZGlyIC9kYXRhL2RvbnRwYW5pYwotICAgIGNob3duIHJvb3QgbG9nIC9kYXRhL2RvbnRwYW5pYwotICAgIGNobW9kIDA3NTAgL2RhdGEvZG9udHBhbmljCisgICAgbWtkaXIgL2RhdGEvZG9udHBhbmljIDA3NTAgcm9vdCBsb2cKIAogICAgICMgQ29sbGVjdCBhcGFuaWMgZGF0YSwgZnJlZSByZXNvdXJjZXMgYW5kIHJlLWFybSB0cmlnZ2VyCiAgICAgY29weSAvcHJvYy9hcGFuaWNfY29uc29sZSAvZGF0YS9kb250cGFuaWMvYXBhbmljX2NvbnNvbGUKQEAgLTE1MCwxMyArMTQzLDExIEBACiAgICAgbWtkaXIgL2RhdGEvbWlzYy9ibHVldG9vdGhkIDA3NzAgYmx1ZXRvb3RoIGJsdWV0b290aAogICAgIG1rZGlyIC9kYXRhL21pc2MvYmx1ZXRvb3RoIDA3NzAgc3lzdGVtIHN5c3RlbQogICAgIG1rZGlyIC9kYXRhL21pc2Mva2V5c3RvcmUgMDcwMCBrZXlzdG9yZSBrZXlzdG9yZQotICAgIG1rZGlyIC9kYXRhL21pc2Mva2V5Y2hhaW4gMDc3MSBrZXljaGFpbiBrZXljaGFpbgotICAgIG1rZGlyIC9kYXRhL21pc2MvdnBuIDA3NzAgc3lzdGVtIHN5c3RlbQorICAgIG1rZGlyIC9kYXRhL21pc2Mva2V5Y2hhaW4gMDc3MSBzeXN0ZW0gc3lzdGVtCisgICAgbWtkaXIgL2RhdGEvbWlzYy92cG4gMDc3MCBzeXN0ZW0gdnBuCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9zeXN0ZW1rZXlzIDA3MDAgc3lzdGVtIHN5c3RlbQotICAgIG1rZGlyIC9kYXRhL21pc2MvdnBuL3Byb2ZpbGVzIDA3NzAgc3lzdGVtIHN5c3RlbQogICAgICMgZ2l2ZSBzeXN0ZW0gYWNjZXNzIHRvIHdwYV9zdXBwbGljYW50LmNvbmYgZm9yIGJhY2t1cCBhbmQgcmVzdG9yZQogICAgIG1rZGlyIC9kYXRhL21pc2Mvd2lmaSAwNzcwIHdpZmkgd2lmaQotICAgIGNobW9kIDA3NzAgL2RhdGEvbWlzYy93aWZpCiAgICAgY2htb2QgMDY2MCAvZGF0YS9taXNjL3dpZmkvd3BhX3N1cHBsaWNhbnQuY29uZgogICAgIG1rZGlyIC9kYXRhL2xvY2FsIDA3NzEgc2hlbGwgc2hlbGwKICAgICBta2RpciAvZGF0YS9sb2NhbC90bXAgMDc3MSBzaGVsbCBzaGVsbApAQCAtMTY1LDE3ICsxNTYsMTYgQEAKICAgICBta2RpciAvZGF0YS9hcHAgMDc3MSBzeXN0ZW0gc3lzdGVtCiAgICAgbWtkaXIgL2RhdGEvcHJvcGVydHkgMDcwMCByb290IHJvb3QKIAotICAgICMgY3JlYXRlIGRhbHZpay1jYWNoZSBhbmQgZG91YmxlLWNoZWNrIHRoZSBwZXJtcworICAgICMgY3JlYXRlIGRhbHZpay1jYWNoZSwgc28gYXMgdG8gZW5mb3JjZSBvdXIgcGVybWlzc2lvbnMKICAgICBta2RpciAvZGF0YS9kYWx2aWstY2FjaGUgMDc3MSBzeXN0ZW0gc3lzdGVtCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGF0YS9kYWx2aWstY2FjaGUKLSAgICBjaG1vZCAwNzcxIC9kYXRhL2RhbHZpay1jYWNoZQorCisgICAgIyBjcmVhdGUgcmVzb3VyY2UtY2FjaGUgYW5kIGRvdWJsZS1jaGVjayB0aGUgcGVybXMKKyAgICBta2RpciAvZGF0YS9yZXNvdXJjZS1jYWNoZSAwNzcxIHN5c3RlbSBzeXN0ZW0KKyAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kYXRhL3Jlc291cmNlLWNhY2hlCisgICAgY2htb2QgMDc3MSAvZGF0YS9yZXNvdXJjZS1jYWNoZQogCiAgICAgIyBjcmVhdGUgdGhlIGxvc3QrZm91bmQgZGlyZWN0b3JpZXMsIHNvIGFzIHRvIGVuZm9yY2Ugb3VyIHBlcm1pc3Npb25zCi0gICAgbWtkaXIgL2RhdGEvbG9zdCtmb3VuZCAwNzcwCi0KLSAgICAjIGRvdWJsZSBjaGVjayB0aGUgcGVybXMsIGluIGNhc2UgbG9zdCtmb3VuZCBhbHJlYWR5IGV4aXN0cywgYW5kIHNldCBvd25lcgotICAgIGNob3duIHJvb3Qgcm9vdCAvZGF0YS9sb3N0K2ZvdW5kCi0gICAgY2htb2QgMDc3MCAvZGF0YS9sb3N0K2ZvdW5kCisgICAgbWtkaXIgL2RhdGEvbG9zdCtmb3VuZCAwNzcwIHJvb3Qgcm9vdAogCiAgICAgIyBjcmVhdGUgZGlyZWN0b3J5IGZvciBEUk0gcGx1Zy1pbnMKICAgICBta2RpciAvZGF0YS9kcm0gMDc3NCBkcm0gZHJtCkBAIC0xODYsNiArMTc2LDExIEBACiAgICAgIyBTZXQgaW5kaWNhdGlvbiAoY2hlY2tlZCBieSB2b2xkKSB0aGF0IHdlIGhhdmUgZmluaXNoZWQgdGhpcyBhY3Rpb24KICAgICAjc2V0cHJvcCB2b2xkLnBvc3RfZnNfZGF0YV9kb25lIDEKIAorICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9mX21hc3Nfc3RvcmFnZS9sdW4vZmlsZQorICAgIGNobW9kIDA2NjAgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9mX21hc3Nfc3RvcmFnZS9sdW4vZmlsZQorICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9mX3JuZGlzL2V0aGFkZHIKKyAgICBjaG1vZCAwNjYwIC9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZl9ybmRpcy9ldGhhZGRyCisKIG9uIGJvb3QKICMgYmFzaWMgbmV0d29yayBpbml0CiAgICAgaWZ1cCBsbwpAQCAtMzI1LDYgKzMyMCwyOCBAQAogICAgIGNsYXNzX3Jlc2V0IGxhdGVfc3RhcnQKICAgICBjbGFzc19yZXNldCBtYWluCiAKKyMgVVNCIGFjY2Vzc29yeSBjb25maWd1cmF0aW9uCitvbiBwcm9wZXJ0eTpzeXMudXNiLmNvbmZpZz1hY2Nlc3NvcnkKKyAgICB3cml0ZSAvc3lzL2NsYXNzL2FuZHJvaWRfdXNiL2FuZHJvaWQwL2VuYWJsZSAwCisgICAgd3JpdGUgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9pZFZlbmRvciAxOGQxCisgICAgd3JpdGUgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9pZFByb2R1Y3QgMmQwMAorICAgIHdyaXRlIC9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZnVuY3Rpb25zICRzeXMudXNiLmNvbmZpZworICAgIHdyaXRlIC9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZW5hYmxlIDEKKyAgICBzZXRwcm9wIHN5cy51c2Iuc3RhdGUgJHN5cy51c2IuY29uZmlnCisKKyMgVVNCIGFjY2Vzc29yeSBjb25maWd1cmF0aW9uLCB3aXRoIGFkYgorb24gcHJvcGVydHk6c3lzLnVzYi5jb25maWc9YWNjZXNzb3J5LGFkYgorICAgIHdyaXRlIC9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZW5hYmxlIDAKKyAgICB3cml0ZSAvc3lzL2NsYXNzL2FuZHJvaWRfdXNiL2FuZHJvaWQwL2lkVmVuZG9yIDE4ZDEKKyAgICB3cml0ZSAvc3lzL2NsYXNzL2FuZHJvaWRfdXNiL2FuZHJvaWQwL2lkUHJvZHVjdCAyZDAxCisgICAgd3JpdGUgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9mdW5jdGlvbnMgJHN5cy51c2IuY29uZmlnCisgICAgd3JpdGUgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9lbmFibGUgMQorICAgIHN0YXJ0IGFkYmQKKyAgICBzZXRwcm9wIHN5cy51c2Iuc3RhdGUgJHN5cy51c2IuY29uZmlnCisKK29uIHByb3BlcnR5OnBlcnNpc3Quc3lzLnVzYi5jb25maWc9KgorICAgIHNldHByb3Agc3lzLnVzYi5jb25maWcgJHBlcnNpc3Quc3lzLnVzYi5jb25maWcKKwogIyMgRGFlbW9uIHByb2Nlc3NlcyB0byBiZSBydW4gYnkgaW5pdC4KICMjCiBzZXJ2aWNlIHVldmVudGQgL3NiaW4vdWV2ZW50ZApAQCAtMzQxLDcgKzM1OCw3IEBACiBvbiBwcm9wZXJ0eTpyby5kZWJ1Z2dhYmxlPTEKICAgICBzdGFydCBjb25zb2xlCiAKLSMgYWRiZCBpcyBjb250cm9sbGVkIGJ5IHRoZSBwZXJzaXN0LnNlcnZpY2UuYWRiLmVuYWJsZSBzeXN0ZW0gcHJvcGVydHkKKyMgYWRiZCBpcyBjb250cm9sbGVkIHZpYSBwcm9wZXJ0eSB0cmlnZ2VycyBpbiBpbml0LjxwbGF0Zm9ybT4udXNiLnJjCiBzZXJ2aWNlIGFkYmQgL3NiaW4vYWRiZAogICAgIGNsYXNzIGNvcmUKICAgICBkaXNhYmxlZApAQCAtMzUwLDExICszNjcsMTcgQEAKIG9uIHByb3BlcnR5OnJvLmtlcm5lbC5xZW11PTEKICAgICBzdGFydCBhZGJkCiAKLW9uIHByb3BlcnR5OnBlcnNpc3Quc2VydmljZS5hZGIuZW5hYmxlPTEKLSAgICBzdGFydCBhZGJkCi0KLW9uIHByb3BlcnR5OnBlcnNpc3Quc2VydmljZS5hZGIuZW5hYmxlPTAKLSAgICBzdG9wIGFkYmQKKyMgVGhpcyBwcm9wZXJ0eSB0cmlnZ2VyIGhhcyBhZGRlZCB0byBpbWl0aWF0ZSB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YgImFkYiByb290Ii4KKyMgVGhlIGFkYiBnYWRnZXQgZHJpdmVyIHVzZWQgdG8gcmVzZXQgdGhlIFVTQiBidXMgd2hlbiB0aGUgYWRiZCBkYWVtb24gZXhpdGVkLAorIyBhbmQgdGhlIGhvc3Qgc2lkZSBhZGIgcmVsaWVkIG9uIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgaXQgdG8gcmVjb25uZWN0IHdpdGggdGhlCisjIG5ldyBhZGJkIGluc3RhbmNlIGFmdGVyIGluaXQgcmVsYXVuY2hlcyBpdC4gU28gbm93IHdlIGZvcmNlIHRoZSBVU0IgYnVzIHRvIHJlc2V0CisjIGhlcmUgd2hlbiBhZGJkIHNldHMgdGhlIHNlcnZpY2UuYWRiLnJvb3QgcHJvcGVydHkgdG8gMS4gIFdlIGFsc28gcmVzdGFydCBhZGJkIGhlcmUKKyMgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgaW5pdCB0byBub3RpY2UgaXRzIGRlYXRoIGFuZCByZXN0YXJ0aW5nIGl0IHNvIHRoZSB0aW1pbmcKKyMgb2YgVVNCIHJlc2V0dGluZyBhbmQgYWRiIHJlc3RhcnRpbmcgbW9yZSBjbG9zZWx5IG1hdGNoZXMgdGhlIHByZXZpb3VzIGJlaGF2aW9yLgorb24gcHJvcGVydHk6c2VydmljZS5hZGIucm9vdD0xCisgICAgd3JpdGUgL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9lbmFibGUgMAorICAgIHJlc3RhcnQgYWRiZAorICAgIHdyaXRlIC9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZW5hYmxlIDEKIAogc2VydmljZSBzZXJ2aWNlbWFuYWdlciAvc3lzdGVtL2Jpbi9zZXJ2aWNlbWFuYWdlcgogICAgIGNsYXNzIGNvcmUKQEAgLTM3OCw3ICs0MDEsNyBAQAogICAgIGNsYXNzIG1haW4KIAogc2VydmljZSByaWwtZGFlbW9uIC9zeXN0ZW0vYmluL3JpbGQKLSAgICBjbGFzcyBsYXRlX3N0YXJ0CisgICAgY2xhc3MgbWFpbgogICAgIHNvY2tldCByaWxkIHN0cmVhbSA2NjAgcm9vdCByYWRpbwogICAgIHNvY2tldCByaWxkLWRlYnVnIHN0cmVhbSA2NjAgcmFkaW8gc3lzdGVtCiAgICAgdXNlciByb290CkBAIC0zOTUsNyArNDE4LDYgQEAKICAgICBzb2NrZXQgenlnb3RlIHN0cmVhbSA2NjYKICAgICBvbnJlc3RhcnQgd3JpdGUgL3N5cy9hbmRyb2lkX3Bvd2VyL3JlcXVlc3Rfc3RhdGUgd2FrZQogICAgIG9ucmVzdGFydCB3cml0ZSAvc3lzL3Bvd2VyL3N0YXRlIG9uCi0gICAgb25yZXN0YXJ0IHJlc3RhcnQgc3VyZmFjZWZsaW5nZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBtZWRpYQogICAgIG9ucmVzdGFydCByZXN0YXJ0IG5ldGQKIApAQCAtNDA3LDcgKzQyOSw4IEBACiBzZXJ2aWNlIG1lZGlhIC9zeXN0ZW0vYmluL21lZGlhc2VydmVyCiAgICAgY2xhc3MgbWFpbgogICAgIHVzZXIgbWVkaWEKLSAgICBncm91cCBhdWRpbyBjYW1lcmEgaW5ldCBuZXRfYnQgbmV0X2J0X2FkbWluCisgICAgIyBTVE9QU0hJUDogcmVtb3ZlIHN5c3RlbSBmcm9tIG1lZGlhc2VydmVyIGdyb3VwcworICAgIGdyb3VwIGF1ZGlvIGNhbWVyYSBpbmV0IG5ldF9idCBuZXRfYnRfYWRtaW4gc3lzdGVtCiAgICAgaW9wcmlvIHJ0IDQKIAogc2VydmljZSBib290YW5pbSAvc3lzdGVtL2Jpbi9ib290YW5pbWF0aW9uCkBAIC00NDMsOCArNDY2LDggQEAKIHNlcnZpY2UgcmFjb29uIC9zeXN0ZW0vYmluL3JhY29vbgogICAgIGNsYXNzIG1haW4KICAgICBzb2NrZXQgcmFjb29uIHN0cmVhbSA2MDAgc3lzdGVtIHN5c3RlbQotICAgICMgcmFjb29uIHdpbGwgc2V0dWlkIHRvIHZwbiBhZnRlciBnZXR0aW5nIG5lY2Vzc2FyeSByZXNvdXJjZXMuCi0gICAgZ3JvdXAgbmV0X2FkbWluCisgICAgIyBJS0UgdXNlcyBVRFAgcG9ydCA1MDAuIFJhY29vbiB3aWxsIHNldHVpZCB0byB2cG4gYWZ0ZXIgYmluZGluZyB0aGUgcG9ydC4KKyAgICBncm91cCB2cG4gbmV0X2FkbWluCiAgICAgZGlzYWJsZWQKICAgICBvbmVzaG90CiAKZGlmZiAtLWdpdCBhL3J1bi1hcy9wYWNrYWdlLmMgYi9ydW4tYXMvcGFja2FnZS5jCmluZGV4IDQ2ZjgyMzkuLmNhMDg0MzYgMTAwNjQ0Ci0tLSBhL3J1bi1hcy9wYWNrYWdlLmMKKysrIGIvcnVuLWFzL3BhY2thZ2UuYwpAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBQQUNLQUdFU19MSVNUX0ZJTEUgICIvZGF0YS9zeXN0ZW0vcGFja2FnZXMubGlzdCIKIAogLyogVGhpcyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhY2thZ2UgZGF0YWJhc2UgZmlsZSAqLwotI2RlZmluZSBQQUNLQUdFU19MSVNUX0JVRkZFUl9TSVpFICA4MTkyCisjZGVmaW5lIFBBQ0tBR0VTX0xJU1RfQlVGRkVSX1NJWkUgIDY1NTM2CiAKIC8qIENvcHkgJ3NyY2xlbicgc3RyaW5nIGJ5dGVzIGZyb20gJ3NyYycgaW50byBidWZmZXIgJ2RzdCcgb2Ygc2l6ZSAnZHN0bGVuJwogICogVGhpcyBmdW5jdGlvbiBhbHdheXMgemVyby10ZXJtaW5hdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB1bmxlc3MKZGlmZiAtLWdpdCBhL3Rvb2xib3gvZ2V0ZXZlbnQuYyBiL3Rvb2xib3gvZ2V0ZXZlbnQuYwppbmRleCAyNTY3MjBkLi5jMGFjOTRhIDEwMDY0NAotLS0gYS90b29sYm94L2dldGV2ZW50LmMKKysrIGIvdG9vbGJveC9nZXRldmVudC5jCkBAIC04LDkgKzgsMTEgQEAKICNpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgogI2luY2x1ZGUgPHN5cy9saW1pdHMuaD4KICNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+IC8vIHRoaXMgZG9lcyBub3QgY29tcGlsZQorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAorI2luY2x1ZGUgImdldGV2ZW50LmgiCisKIHN0YXRpYyBzdHJ1Y3QgcG9sbGZkICp1ZmRzOwogc3RhdGljIGNoYXIgKipkZXZpY2VfbmFtZXM7CiBzdGF0aWMgaW50IG5mZHM7CkBAIC0yMiwxOCArMjQsNjUgQEAKICAgICBQUklOVF9ERVZJQ0VfSU5GTyAgICAgICA9IDFVIDw8IDMsCiAgICAgUFJJTlRfVkVSU0lPTiAgICAgICAgICAgPSAxVSA8PCA0LAogICAgIFBSSU5UX1BPU1NJQkxFX0VWRU5UUyAgID0gMVUgPDwgNSwKKyAgICBQUklOVF9JTlBVVF9QUk9QUyAgICAgICA9IDFVIDw8IDYsCisKKyAgICBQUklOVF9BTExfSU5GTyAgICAgICAgICA9ICgxVSA8PCA3KSAtIDEsCisKKyAgICBQUklOVF9MQUJFTFMgICAgICAgICAgICA9IDFVIDw8IDE2LAogfTsKIAotc3RhdGljIGludCBwcmludF9wb3NzaWJsZV9ldmVudHMoaW50IGZkKQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9sYWJlbChjb25zdCBzdHJ1Y3QgbGFiZWwgKmxhYmVscywgaW50IHZhbHVlKQoreworICAgIHdoaWxlKGxhYmVscy0+bmFtZSAmJiB2YWx1ZSAhPSBsYWJlbHMtPnZhbHVlKSB7CisgICAgICAgIGxhYmVscysrOworICAgIH0KKyAgICByZXR1cm4gbGFiZWxzLT5uYW1lOworfQorCitzdGF0aWMgaW50IHByaW50X2lucHV0X3Byb3BzKGludCBmZCkKK3sKKyAgICB1aW50OF90IGJpdHNbSU5QVVRfUFJPUF9DTlQgLyA4XTsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcmVzOworICAgIGludCBjb3VudDsKKyAgICBjb25zdCBjaGFyICpiaXRfbGFiZWw7CisKKyAgICBwcmludGYoIiAgaW5wdXQgcHJvcHM6XG4iKTsKKyAgICByZXMgPSBpb2N0bChmZCwgRVZJT0NHUFJPUChzaXplb2YoYml0cykpLCBiaXRzKTsKKyAgICBpZihyZXMgPCAwKSB7CisgICAgICAgIHByaW50ZigiICAgIDxub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGNvdW50ID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCByZXM7IGkrKykgeworICAgICAgICBmb3IoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRzW2ldICYgMSA8PCBqKSB7CisgICAgICAgICAgICAgICAgYml0X2xhYmVsID0gZ2V0X2xhYmVsKGlucHV0X3Byb3BfbGFiZWxzLCBpICogOCArIGopOworICAgICAgICAgICAgICAgIGlmKGJpdF9sYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgJXNcbiIsIGJpdF9sYWJlbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlMDR4XG4iLCBpICogOCArIGopOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgcHJpbnRmKCIgICAgPG5vbmU+XG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9wb3NzaWJsZV9ldmVudHMoaW50IGZkLCBpbnQgcHJpbnRfZmxhZ3MpCiB7CiAgICAgdWludDhfdCAqYml0cyA9IE5VTEw7CiAgICAgc3NpemVfdCBiaXRzX3NpemUgPSAwOwogICAgIGNvbnN0IGNoYXIqIGxhYmVsOwogICAgIGludCBpLCBqLCBrOwogICAgIGludCByZXMsIHJlczI7Ci0gICAgCisgICAgc3RydWN0IGxhYmVsKiBiaXRfbGFiZWxzOworICAgIGNvbnN0IGNoYXIgKmJpdF9sYWJlbDsKKwogICAgIHByaW50ZigiICBldmVudHM6XG4iKTsKLSAgICBmb3IoaSA9IDA7IGkgPD0gRVZfTUFYOyBpKyspIHsKKyAgICBmb3IoaSA9IEVWX0tFWTsgaSA8PSBFVl9NQVg7IGkrKykgeyAvLyBza2lwIEVWX1NZTiBzaW5jZSB3ZSBjYW5ub3QgcXVlcnkgaXRzIGF2YWlsYWJsZSBjb2RlcwogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICB3aGlsZSgxKSB7CiAgICAgICAgICAgICByZXMgPSBpb2N0bChmZCwgRVZJT0NHQklUKGksIGJpdHNfc2l6ZSksIGJpdHMpOwpAQCAtNDIsNTIgKzkxLDY0IEBACiAgICAgICAgICAgICBiaXRzX3NpemUgPSByZXMgKyAxNjsKICAgICAgICAgICAgIGJpdHMgPSByZWFsbG9jKGJpdHMsIGJpdHNfc2l6ZSAqIDIpOwogICAgICAgICAgICAgaWYoYml0cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgJWRcbiIsIGJpdHNfc2l6ZSk7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgJWRcbiIsIChpbnQpYml0c19zaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXMyID0gMDsKICAgICAgICAgc3dpdGNoKGkpIHsKLSAgICAgICAgICAgIGNhc2UgRVZfU1lOOgotICAgICAgICAgICAgICAgIGxhYmVsID0gIlNZTiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVWX0tFWToKICAgICAgICAgICAgICAgICByZXMyID0gaW9jdGwoZmQsIEVWSU9DR0tFWShyZXMpLCBiaXRzICsgYml0c19zaXplKTsKICAgICAgICAgICAgICAgICBsYWJlbCA9ICJLRVkiOworICAgICAgICAgICAgICAgIGJpdF9sYWJlbHMgPSBrZXlfbGFiZWxzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVl9SRUw6CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiUkVMIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gcmVsX2xhYmVsczsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVZfQUJTOgogICAgICAgICAgICAgICAgIGxhYmVsID0gIkFCUyI7CisgICAgICAgICAgICAgICAgYml0X2xhYmVscyA9IGFic19sYWJlbHM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVWX01TQzoKICAgICAgICAgICAgICAgICBsYWJlbCA9ICJNU0MiOworICAgICAgICAgICAgICAgIGJpdF9sYWJlbHMgPSBtc2NfbGFiZWxzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVl9MRUQ6CiAgICAgICAgICAgICAgICAgcmVzMiA9IGlvY3RsKGZkLCBFVklPQ0dMRUQocmVzKSwgYml0cyArIGJpdHNfc2l6ZSk7CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiTEVEIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gbGVkX2xhYmVsczsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVZfU05EOgogICAgICAgICAgICAgICAgIHJlczIgPSBpb2N0bChmZCwgRVZJT0NHU05EKHJlcyksIGJpdHMgKyBiaXRzX3NpemUpOwogICAgICAgICAgICAgICAgIGxhYmVsID0gIlNORCI7CisgICAgICAgICAgICAgICAgYml0X2xhYmVscyA9IHNuZF9sYWJlbHM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVWX1NXOgogICAgICAgICAgICAgICAgIHJlczIgPSBpb2N0bChmZCwgRVZJT0NHU1coYml0c19zaXplKSwgYml0cyArIGJpdHNfc2l6ZSk7CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiU1cgIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gc3dfbGFiZWxzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVl9SRVA6CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiUkVQIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gcmVwX2xhYmVsczsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVZfRkY6CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiRkYgIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gZmZfbGFiZWxzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVl9QV1I6CiAgICAgICAgICAgICAgICAgbGFiZWwgPSAiUFdSIjsKKyAgICAgICAgICAgICAgICBiaXRfbGFiZWxzID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZfRkZfU1RBVFVTOgorICAgICAgICAgICAgICAgIGxhYmVsID0gIkZGUyI7CisgICAgICAgICAgICAgICAgYml0X2xhYmVscyA9IGZmX3N0YXR1c19sYWJlbHM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJlczIgPSAwOwogICAgICAgICAgICAgICAgIGxhYmVsID0gIj8/PyI7CisgICAgICAgICAgICAgICAgYml0X2xhYmVscyA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgZm9yKGogPSAwOyBqIDwgcmVzOyBqKyspIHsKICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDg7IGsrKykKQEAgLTk5LDEzICsxNjAsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSAnICc7CiAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlcyAoJTA0eCk6IiwgbGFiZWwsIGkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKChjb3VudCAmIDB4NykgPT0gMCB8fCBpID09IEVWX0FCUykKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigoY291bnQgJiAocHJpbnRfZmxhZ3MgJiBQUklOVF9MQUJFTFMgPyAweDMgOiAweDcpKSA9PSAwIHx8IGkgPT0gRVZfQUJTKQogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICIpOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlMDR4JWMiLCBqICogOCArIGssIGRvd24pOworICAgICAgICAgICAgICAgICAgICBpZihiaXRfbGFiZWxzICYmIChwcmludF9mbGFncyAmIFBSSU5UX0xBQkVMUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9sYWJlbCA9IGdldF9sYWJlbChiaXRfbGFiZWxzLCBqICogOCArIGspOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYml0X2xhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICUuMjBzJWMlKnMiLCBiaXRfbGFiZWwsIGRvd24sIDIwIC0gc3RybGVuKGJpdF9sYWJlbCksICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlMDR4JWMgICAgICAgICAgICAgICAgIiwgaiAqIDggKyBrLCBkb3duKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICUwNHglYyIsIGogKiA4ICsgaywgZG93bik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBFVl9BQlMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnB1dF9hYnNpbmZvIGFiczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlvY3RsKGZkLCBFVklPQ0dBQlMoaiAqIDggKyBrKSwgJmFicykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIHZhbHVlICVkLCBtaW4gJWQsIG1heCAlZCwgZnV6eiAlZCBmbGF0ICVkIiwgYWJzLnZhbHVlLCBhYnMubWluaW11bSwgYWJzLm1heGltdW0sIGFicy5mdXp6LCBhYnMuZmxhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgOiB2YWx1ZSAlZCwgbWluICVkLCBtYXggJWQsIGZ1enogJWQgZmxhdCAlZCIsIGFicy52YWx1ZSwgYWJzLm1pbmltdW0sIGFicy5tYXhpbXVtLCBhYnMuZnV6eiwgYWJzLmZsYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CkBAIC0xMTgsNiArMTg3LDczIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHByaW50X2V2ZW50KGludCB0eXBlLCBpbnQgY29kZSwgaW50IHZhbHVlLCBpbnQgcHJpbnRfZmxhZ3MpCit7CisgICAgY29uc3QgY2hhciAqdHlwZV9sYWJlbCwgKmNvZGVfbGFiZWwsICp2YWx1ZV9sYWJlbDsKKworICAgIGlmIChwcmludF9mbGFncyAmIFBSSU5UX0xBQkVMUykgeworICAgICAgICB0eXBlX2xhYmVsID0gZ2V0X2xhYmVsKGV2X2xhYmVscywgdHlwZSk7CisgICAgICAgIGNvZGVfbGFiZWwgPSBOVUxMOworICAgICAgICB2YWx1ZV9sYWJlbCA9IE5VTEw7CisKKyAgICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRVZfU1lOOgorICAgICAgICAgICAgICAgIGNvZGVfbGFiZWwgPSBnZXRfbGFiZWwoc3luX2xhYmVscywgY29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVWX0tFWToKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKGtleV9sYWJlbHMsIGNvZGUpOworICAgICAgICAgICAgICAgIHZhbHVlX2xhYmVsID0gZ2V0X2xhYmVsKGtleV92YWx1ZV9sYWJlbHMsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZfUkVMOgorICAgICAgICAgICAgICAgIGNvZGVfbGFiZWwgPSBnZXRfbGFiZWwocmVsX2xhYmVscywgY29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVWX0FCUzoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKGFic19sYWJlbHMsIGNvZGUpOworICAgICAgICAgICAgICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUJTX01UX1RPT0xfVFlQRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2xhYmVsID0gZ2V0X2xhYmVsKG10X3Rvb2xfbGFiZWxzLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVl9NU0M6CisgICAgICAgICAgICAgICAgY29kZV9sYWJlbCA9IGdldF9sYWJlbChtc2NfbGFiZWxzLCBjb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZfTEVEOgorICAgICAgICAgICAgICAgIGNvZGVfbGFiZWwgPSBnZXRfbGFiZWwobGVkX2xhYmVscywgY29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVWX1NORDoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKHNuZF9sYWJlbHMsIGNvZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVl9TVzoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKHN3X2xhYmVscywgY29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVWX1JFUDoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKHJlcF9sYWJlbHMsIGNvZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVl9GRjoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKGZmX2xhYmVscywgY29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVWX0ZGX1NUQVRVUzoKKyAgICAgICAgICAgICAgICBjb2RlX2xhYmVsID0gZ2V0X2xhYmVsKGZmX3N0YXR1c19sYWJlbHMsIGNvZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVfbGFiZWwpCisgICAgICAgICAgICBwcmludGYoIiUtMTIuMTJzIiwgdHlwZV9sYWJlbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJTA0eCAgICAgICAgIiwgdHlwZSk7CisgICAgICAgIGlmIChjb2RlX2xhYmVsKQorICAgICAgICAgICAgcHJpbnRmKCIgJS0yMC4yMHMiLCBjb2RlX2xhYmVsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIgJTA0eCAgICAgICAgICAgICAgICAiLCBjb2RlKTsKKyAgICAgICAgaWYgKHZhbHVlX2xhYmVsKQorICAgICAgICAgICAgcHJpbnRmKCIgJS0yMC4yMHMiLCB2YWx1ZV9sYWJlbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiICUwOHggICAgICAgICAgICAiLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlMDR4ICUwNHggJTA4eCIsIHR5cGUsIGNvZGUsIHZhbHVlKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgb3Blbl9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgcHJpbnRfZmxhZ3MpCiB7CiAgICAgaW50IHZlcnNpb247CkBAIC0xOTMsNyArMzI5LDExIEBACiAgICAgICAgICAgICAgICB2ZXJzaW9uID4+IDE2LCAodmVyc2lvbiA+PiA4KSAmIDB4ZmYsIHZlcnNpb24gJiAweGZmKTsKIAogICAgIGlmKHByaW50X2ZsYWdzICYgUFJJTlRfUE9TU0lCTEVfRVZFTlRTKSB7Ci0gICAgICAgIHByaW50X3Bvc3NpYmxlX2V2ZW50cyhmZCk7CisgICAgICAgIHByaW50X3Bvc3NpYmxlX2V2ZW50cyhmZCwgcHJpbnRfZmxhZ3MpOworICAgIH0KKworICAgIGlmKHByaW50X2ZsYWdzICYgUFJJTlRfSU5QVVRfUFJPUFMpIHsKKyAgICAgICAgcHJpbnRfaW5wdXRfcHJvcHMoZmQpOwogICAgIH0KIAogICAgIHVmZHNbbmZkc10uZmQgPSBmZDsKQEAgLTI5MiwxMyArNDMyLDE1IEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy10XSBbLW5dIFstcyBzd2l0Y2htYXNrXSBbLVNdIFstdiBbbWFza11dIFstcF0gWy1xXSBbLWMgY291bnRdIFstcl0gW2RldmljZV1cbiIsIGFyZ3ZbMF0pOworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstdF0gWy1uXSBbLXMgc3dpdGNobWFza10gWy1TXSBbLXYgW21hc2tdXSBbLXBdIFstaV0gWy1sXSBbLXFdIFstYyBjb3VudF0gWy1yXSBbZGV2aWNlXVxuIiwgYXJndlswXSk7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLXQ6IHNob3cgdGltZSBzdGFtcHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1uOiBkb24ndCBwcmludCBuZXdsaW5lc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLXM6IHByaW50IHN3aXRjaCBzdGF0ZXMgZm9yIGdpdmVuIGJpdHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1TOiBwcmludCBhbGwgc3dpdGNoIHN0YXRlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLXY6IHZlcmJvc2l0eSBtYXNrIChlcnJzPTEsIGRldj0yLCBuYW1lPTQsIGluZm89OCwgdmVycz0xNiwgcG9zLiBldmVudHM9MzIpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdjogdmVyYm9zaXR5IG1hc2sgKGVycnM9MSwgZGV2PTIsIG5hbWU9NCwgaW5mbz04LCB2ZXJzPTE2LCBwb3MuIGV2ZW50cz0zMiwgcHJvcHM9NjQpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcDogc2hvdyBwb3NzaWJsZSBldmVudHMgKGVycnMsIGRldiwgbmFtZSwgcG9zLiBldmVudHMpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtaTogc2hvdyBhbGwgZGV2aWNlIGluZm8gYW5kIHBvc3NpYmxlIGV2ZW50c1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWw6IGxhYmVsIGV2ZW50IHR5cGVzIGFuZCBuYW1lcyBpbiBwbGFpbiB0ZXh0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcTogcXVpZXQgKGNsZWFyIHZlcmJvc2l0eSBtYXNrKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWM6IHByaW50IGdpdmVuIG51bWJlciBvZiBldmVudHMgdGhlbiBleGl0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcjogcHJpbnQgcmF0ZSBldmVudHMgYXJlIHJlY2VpdmVkXG4iKTsKQEAgLTMxNiw3ICs0NTgsNyBAQAogICAgIHVpbnQxNl90IGdldF9zd2l0Y2ggPSAwOwogICAgIHN0cnVjdCBpbnB1dF9ldmVudCBldmVudDsKICAgICBpbnQgdmVyc2lvbjsKLSAgICBpbnQgcHJpbnRfZmxhZ3MgPSBQUklOVF9ERVZJQ0VfRVJST1JTIHwgUFJJTlRfREVWSUNFIHwgUFJJTlRfREVWSUNFX05BTUU7CisgICAgaW50IHByaW50X2ZsYWdzID0gMDsKICAgICBpbnQgcHJpbnRfZmxhZ3Nfc2V0ID0gMDsKICAgICBpbnQgZG9udF9ibG9jayA9IC0xOwogICAgIGludCBldmVudF9jb3VudCA9IDA7CkBAIC0zMjcsNyArNDY5LDcgQEAKIAogICAgIG9wdGVyciA9IDA7CiAgICAgZG8gewotICAgICAgICBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ0bnM6U3Y6OnBxYzpyaCIpOworICAgICAgICBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ0bnM6U3Y6OnBpbHFjOnJoIik7CiAgICAgICAgIGlmIChjID09IEVPRikKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBzd2l0Y2ggKGMpIHsKQEAgLTM0OSwxOSArNDkxLDI3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAndic6CiAgICAgICAgICAgICBpZihvcHRhcmcpCi0gICAgICAgICAgICAgICAgcHJpbnRfZmxhZ3MgPSAgc3RydG91bChvcHRhcmcsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHByaW50X2ZsYWdzIHw9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBwcmludF9mbGFncyB8PSBQUklOVF9ERVZJQ0UgfCBQUklOVF9ERVZJQ0VfTkFNRSB8IFBSSU5UX0RFVklDRV9JTkZPIHwgUFJJTlRfVkVSU0lPTjsKICAgICAgICAgICAgIHByaW50X2ZsYWdzX3NldCA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICBwcmludF9mbGFncyA9IFBSSU5UX0RFVklDRV9FUlJPUlMgfCBQUklOVF9ERVZJQ0UgfCBQUklOVF9ERVZJQ0VfTkFNRSB8IFBSSU5UX1BPU1NJQkxFX0VWRU5UUzsKKyAgICAgICAgICAgIHByaW50X2ZsYWdzIHw9IFBSSU5UX0RFVklDRV9FUlJPUlMgfCBQUklOVF9ERVZJQ0UgfCBQUklOVF9ERVZJQ0VfTkFNRSB8IFBSSU5UX1BPU1NJQkxFX0VWRU5UUzsKICAgICAgICAgICAgIHByaW50X2ZsYWdzX3NldCA9IDE7CiAgICAgICAgICAgICBpZihkb250X2Jsb2NrID09IC0xKQogICAgICAgICAgICAgICAgIGRvbnRfYmxvY2sgPSAxOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgcHJpbnRfZmxhZ3MgfD0gUFJJTlRfQUxMX0lORk87CisgICAgICAgICAgICBwcmludF9mbGFnc19zZXQgPSAxOworICAgICAgICAgICAgaWYoZG9udF9ibG9jayA9PSAtMSkKKyAgICAgICAgICAgICAgICBkb250X2Jsb2NrID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgIHByaW50X2ZsYWdzIHw9IFBSSU5UX0xBQkVMUzsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdxJzoKLSAgICAgICAgICAgIHByaW50X2ZsYWdzID0gMDsKICAgICAgICAgICAgIHByaW50X2ZsYWdzX3NldCA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnYyc6CkBAIC0zOTYsMTMgKzU0NiwxNCBAQAogICAgIHVmZHNbMF0uZXZlbnRzID0gUE9MTElOOwogICAgIGlmKGRldmljZSkgewogICAgICAgICBpZighcHJpbnRfZmxhZ3Nfc2V0KQotICAgICAgICAgICAgcHJpbnRfZmxhZ3MgPSBQUklOVF9ERVZJQ0VfRVJST1JTOworICAgICAgICAgICAgcHJpbnRfZmxhZ3MgfD0gUFJJTlRfREVWSUNFX0VSUk9SUzsKICAgICAgICAgcmVzID0gb3Blbl9kZXZpY2UoZGV2aWNlLCBwcmludF9mbGFncyk7CiAgICAgICAgIGlmKHJlcyA8IDApIHsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCFwcmludF9mbGFnc19zZXQpCisgICAgICAgICAgICBwcmludF9mbGFncyB8PSBQUklOVF9ERVZJQ0VfRVJST1JTIHwgUFJJTlRfREVWSUNFIHwgUFJJTlRfREVWSUNFX05BTUU7CiAgICAgICAgIHByaW50X2RldmljZSA9IDE7CiAJCXJlcyA9IGlub3RpZnlfYWRkX3dhdGNoKHVmZHNbMF0uZmQsIGRldmljZV9wYXRoLCBJTl9ERUxFVEUgfCBJTl9DUkVBVEUpOwogICAgICAgICBpZihyZXMgPCAwKSB7CkBAIC00NTEsNyArNjAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZihwcmludF9kZXZpY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAiLCBkZXZpY2VfbmFtZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUwNHggJTA0eCAlMDh4IiwgZXZlbnQudHlwZSwgZXZlbnQuY29kZSwgZXZlbnQudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBwcmludF9ldmVudChldmVudC50eXBlLCBldmVudC5jb2RlLCBldmVudC52YWx1ZSwgcHJpbnRfZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICBpZihzeW5jX3JhdGUgJiYgZXZlbnQudHlwZSA9PSAwICYmIGV2ZW50LmNvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBub3cgPSBldmVudC50aW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIGV2ZW50LnRpbWUudHZfdXNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxhc3Rfc3luY190aW1lKQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9nZXRldmVudC5oIGIvdG9vbGJveC9nZXRldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzYyMDkKLS0tIC9kZXYvbnVsbAorKysgYi90b29sYm94L2dldGV2ZW50LmgKQEAgLTAsMCArMSw3MjUgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCitzdHJ1Y3QgbGFiZWwgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHZhbHVlOworfTsKKworI2RlZmluZSBMQUJFTChjb25zdGFudCkgeyAjY29uc3RhbnQsIGNvbnN0YW50IH0KKyNkZWZpbmUgTEFCRUxfRU5EIHsgTlVMTCwgLTEgfQorCitzdGF0aWMgc3RydWN0IGxhYmVsIGlucHV0X3Byb3BfbGFiZWxzW10gPSB7CisgICAgICAgIExBQkVMKElOUFVUX1BST1BfUE9JTlRFUiksCisgICAgICAgIExBQkVMKElOUFVUX1BST1BfRElSRUNUKSwKKyAgICAgICAgTEFCRUwoSU5QVVRfUFJPUF9CVVRUT05QQUQpLAorICAgICAgICBMQUJFTChJTlBVVF9QUk9QX1NFTUlfTVQpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGV2X2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChFVl9TWU4pLAorICAgICAgICBMQUJFTChFVl9LRVkpLAorICAgICAgICBMQUJFTChFVl9SRUwpLAorICAgICAgICBMQUJFTChFVl9BQlMpLAorICAgICAgICBMQUJFTChFVl9NU0MpLAorICAgICAgICBMQUJFTChFVl9TVyksCisgICAgICAgIExBQkVMKEVWX0xFRCksCisgICAgICAgIExBQkVMKEVWX1NORCksCisgICAgICAgIExBQkVMKEVWX1JFUCksCisgICAgICAgIExBQkVMKEVWX0ZGKSwKKyAgICAgICAgTEFCRUwoRVZfUFdSKSwKKyAgICAgICAgTEFCRUwoRVZfRkZfU1RBVFVTKSwKKyAgICAgICAgTEFCRUxfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCBsYWJlbCBzeW5fbGFiZWxzW10gPSB7CisgICAgICAgIExBQkVMKFNZTl9SRVBPUlQpLAorICAgICAgICBMQUJFTChTWU5fQ09ORklHKSwKKyAgICAgICAgTEFCRUwoU1lOX01UX1JFUE9SVCksCisgICAgICAgIExBQkVMKFNZTl9EUk9QUEVEKSwKKyAgICAgICAgTEFCRUxfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCBsYWJlbCBrZXlfbGFiZWxzW10gPSB7CisgICAgICAgIExBQkVMKEtFWV9SRVNFUlZFRCksCisgICAgICAgIExBQkVMKEtFWV9FU0MpLAorICAgICAgICBMQUJFTChLRVlfMSksCisgICAgICAgIExBQkVMKEtFWV8yKSwKKyAgICAgICAgTEFCRUwoS0VZXzMpLAorICAgICAgICBMQUJFTChLRVlfNCksCisgICAgICAgIExBQkVMKEtFWV81KSwKKyAgICAgICAgTEFCRUwoS0VZXzYpLAorICAgICAgICBMQUJFTChLRVlfNyksCisgICAgICAgIExBQkVMKEtFWV84KSwKKyAgICAgICAgTEFCRUwoS0VZXzkpLAorICAgICAgICBMQUJFTChLRVlfMCksCisgICAgICAgIExBQkVMKEtFWV9NSU5VUyksCisgICAgICAgIExBQkVMKEtFWV9FUVVBTCksCisgICAgICAgIExBQkVMKEtFWV9CQUNLU1BBQ0UpLAorICAgICAgICBMQUJFTChLRVlfVEFCKSwKKyAgICAgICAgTEFCRUwoS0VZX1EpLAorICAgICAgICBMQUJFTChLRVlfVyksCisgICAgICAgIExBQkVMKEtFWV9FKSwKKyAgICAgICAgTEFCRUwoS0VZX1IpLAorICAgICAgICBMQUJFTChLRVlfVCksCisgICAgICAgIExBQkVMKEtFWV9ZKSwKKyAgICAgICAgTEFCRUwoS0VZX1UpLAorICAgICAgICBMQUJFTChLRVlfSSksCisgICAgICAgIExBQkVMKEtFWV9PKSwKKyAgICAgICAgTEFCRUwoS0VZX1ApLAorICAgICAgICBMQUJFTChLRVlfTEVGVEJSQUNFKSwKKyAgICAgICAgTEFCRUwoS0VZX1JJR0hUQlJBQ0UpLAorICAgICAgICBMQUJFTChLRVlfRU5URVIpLAorICAgICAgICBMQUJFTChLRVlfTEVGVENUUkwpLAorICAgICAgICBMQUJFTChLRVlfQSksCisgICAgICAgIExBQkVMKEtFWV9TKSwKKyAgICAgICAgTEFCRUwoS0VZX0QpLAorICAgICAgICBMQUJFTChLRVlfRiksCisgICAgICAgIExBQkVMKEtFWV9HKSwKKyAgICAgICAgTEFCRUwoS0VZX0gpLAorICAgICAgICBMQUJFTChLRVlfSiksCisgICAgICAgIExBQkVMKEtFWV9LKSwKKyAgICAgICAgTEFCRUwoS0VZX0wpLAorICAgICAgICBMQUJFTChLRVlfU0VNSUNPTE9OKSwKKyAgICAgICAgTEFCRUwoS0VZX0FQT1NUUk9QSEUpLAorICAgICAgICBMQUJFTChLRVlfR1JBVkUpLAorICAgICAgICBMQUJFTChLRVlfTEVGVFNISUZUKSwKKyAgICAgICAgTEFCRUwoS0VZX0JBQ0tTTEFTSCksCisgICAgICAgIExBQkVMKEtFWV9aKSwKKyAgICAgICAgTEFCRUwoS0VZX1gpLAorICAgICAgICBMQUJFTChLRVlfQyksCisgICAgICAgIExBQkVMKEtFWV9WKSwKKyAgICAgICAgTEFCRUwoS0VZX0IpLAorICAgICAgICBMQUJFTChLRVlfTiksCisgICAgICAgIExBQkVMKEtFWV9NKSwKKyAgICAgICAgTEFCRUwoS0VZX0NPTU1BKSwKKyAgICAgICAgTEFCRUwoS0VZX0RPVCksCisgICAgICAgIExBQkVMKEtFWV9TTEFTSCksCisgICAgICAgIExBQkVMKEtFWV9SSUdIVFNISUZUKSwKKyAgICAgICAgTEFCRUwoS0VZX0tQQVNURVJJU0spLAorICAgICAgICBMQUJFTChLRVlfTEVGVEFMVCksCisgICAgICAgIExBQkVMKEtFWV9TUEFDRSksCisgICAgICAgIExBQkVMKEtFWV9DQVBTTE9DSyksCisgICAgICAgIExBQkVMKEtFWV9GMSksCisgICAgICAgIExBQkVMKEtFWV9GMiksCisgICAgICAgIExBQkVMKEtFWV9GMyksCisgICAgICAgIExBQkVMKEtFWV9GNCksCisgICAgICAgIExBQkVMKEtFWV9GNSksCisgICAgICAgIExBQkVMKEtFWV9GNiksCisgICAgICAgIExBQkVMKEtFWV9GNyksCisgICAgICAgIExBQkVMKEtFWV9GOCksCisgICAgICAgIExBQkVMKEtFWV9GOSksCisgICAgICAgIExBQkVMKEtFWV9GMTApLAorICAgICAgICBMQUJFTChLRVlfTlVNTE9DSyksCisgICAgICAgIExBQkVMKEtFWV9TQ1JPTExMT0NLKSwKKyAgICAgICAgTEFCRUwoS0VZX0tQNyksCisgICAgICAgIExBQkVMKEtFWV9LUDgpLAorICAgICAgICBMQUJFTChLRVlfS1A5KSwKKyAgICAgICAgTEFCRUwoS0VZX0tQTUlOVVMpLAorICAgICAgICBMQUJFTChLRVlfS1A0KSwKKyAgICAgICAgTEFCRUwoS0VZX0tQNSksCisgICAgICAgIExBQkVMKEtFWV9LUDYpLAorICAgICAgICBMQUJFTChLRVlfS1BQTFVTKSwKKyAgICAgICAgTEFCRUwoS0VZX0tQMSksCisgICAgICAgIExBQkVMKEtFWV9LUDIpLAorICAgICAgICBMQUJFTChLRVlfS1AzKSwKKyAgICAgICAgTEFCRUwoS0VZX0tQMCksCisgICAgICAgIExBQkVMKEtFWV9LUERPVCksCisgICAgICAgIExBQkVMKEtFWV9aRU5LQUtVSEFOS0FLVSksCisgICAgICAgIExBQkVMKEtFWV8xMDJORCksCisgICAgICAgIExBQkVMKEtFWV9GMTEpLAorICAgICAgICBMQUJFTChLRVlfRjEyKSwKKyAgICAgICAgTEFCRUwoS0VZX1JPKSwKKyAgICAgICAgTEFCRUwoS0VZX0tBVEFLQU5BKSwKKyAgICAgICAgTEFCRUwoS0VZX0hJUkFHQU5BKSwKKyAgICAgICAgTEFCRUwoS0VZX0hFTktBTiksCisgICAgICAgIExBQkVMKEtFWV9LQVRBS0FOQUhJUkFHQU5BKSwKKyAgICAgICAgTEFCRUwoS0VZX01VSEVOS0FOKSwKKyAgICAgICAgTEFCRUwoS0VZX0tQSlBDT01NQSksCisgICAgICAgIExBQkVMKEtFWV9LUEVOVEVSKSwKKyAgICAgICAgTEFCRUwoS0VZX1JJR0hUQ1RSTCksCisgICAgICAgIExBQkVMKEtFWV9LUFNMQVNIKSwKKyAgICAgICAgTEFCRUwoS0VZX1NZU1JRKSwKKyAgICAgICAgTEFCRUwoS0VZX1JJR0hUQUxUKSwKKyAgICAgICAgTEFCRUwoS0VZX0xJTkVGRUVEKSwKKyAgICAgICAgTEFCRUwoS0VZX0hPTUUpLAorICAgICAgICBMQUJFTChLRVlfVVApLAorICAgICAgICBMQUJFTChLRVlfUEFHRVVQKSwKKyAgICAgICAgTEFCRUwoS0VZX0xFRlQpLAorICAgICAgICBMQUJFTChLRVlfUklHSFQpLAorICAgICAgICBMQUJFTChLRVlfRU5EKSwKKyAgICAgICAgTEFCRUwoS0VZX0RPV04pLAorICAgICAgICBMQUJFTChLRVlfUEFHRURPV04pLAorICAgICAgICBMQUJFTChLRVlfSU5TRVJUKSwKKyAgICAgICAgTEFCRUwoS0VZX0RFTEVURSksCisgICAgICAgIExBQkVMKEtFWV9NQUNSTyksCisgICAgICAgIExBQkVMKEtFWV9NVVRFKSwKKyAgICAgICAgTEFCRUwoS0VZX1ZPTFVNRURPV04pLAorICAgICAgICBMQUJFTChLRVlfVk9MVU1FVVApLAorICAgICAgICBMQUJFTChLRVlfUE9XRVIpLAorICAgICAgICBMQUJFTChLRVlfS1BFUVVBTCksCisgICAgICAgIExBQkVMKEtFWV9LUFBMVVNNSU5VUyksCisgICAgICAgIExBQkVMKEtFWV9QQVVTRSksCisgICAgICAgIExBQkVMKEtFWV9TQ0FMRSksCisgICAgICAgIExBQkVMKEtFWV9LUENPTU1BKSwKKyAgICAgICAgTEFCRUwoS0VZX0hBTkdFVUwpLAorICAgICAgICBMQUJFTChLRVlfSEFOR1VFTCksCisgICAgICAgIExBQkVMKEtFWV9IQU5KQSksCisgICAgICAgIExBQkVMKEtFWV9ZRU4pLAorICAgICAgICBMQUJFTChLRVlfTEVGVE1FVEEpLAorICAgICAgICBMQUJFTChLRVlfUklHSFRNRVRBKSwKKyAgICAgICAgTEFCRUwoS0VZX0NPTVBPU0UpLAorICAgICAgICBMQUJFTChLRVlfU1RPUCksCisgICAgICAgIExBQkVMKEtFWV9BR0FJTiksCisgICAgICAgIExBQkVMKEtFWV9QUk9QUyksCisgICAgICAgIExBQkVMKEtFWV9VTkRPKSwKKyAgICAgICAgTEFCRUwoS0VZX0ZST05UKSwKKyAgICAgICAgTEFCRUwoS0VZX0NPUFkpLAorICAgICAgICBMQUJFTChLRVlfT1BFTiksCisgICAgICAgIExBQkVMKEtFWV9QQVNURSksCisgICAgICAgIExBQkVMKEtFWV9GSU5EKSwKKyAgICAgICAgTEFCRUwoS0VZX0NVVCksCisgICAgICAgIExBQkVMKEtFWV9IRUxQKSwKKyAgICAgICAgTEFCRUwoS0VZX01FTlUpLAorICAgICAgICBMQUJFTChLRVlfQ0FMQyksCisgICAgICAgIExBQkVMKEtFWV9TRVRVUCksCisgICAgICAgIExBQkVMKEtFWV9TTEVFUCksCisgICAgICAgIExBQkVMKEtFWV9XQUtFVVApLAorICAgICAgICBMQUJFTChLRVlfRklMRSksCisgICAgICAgIExBQkVMKEtFWV9TRU5ERklMRSksCisgICAgICAgIExBQkVMKEtFWV9ERUxFVEVGSUxFKSwKKyAgICAgICAgTEFCRUwoS0VZX1hGRVIpLAorICAgICAgICBMQUJFTChLRVlfUFJPRzEpLAorICAgICAgICBMQUJFTChLRVlfUFJPRzIpLAorICAgICAgICBMQUJFTChLRVlfV1dXKSwKKyAgICAgICAgTEFCRUwoS0VZX01TRE9TKSwKKyAgICAgICAgTEFCRUwoS0VZX0NPRkZFRSksCisgICAgICAgIExBQkVMKEtFWV9TQ1JFRU5MT0NLKSwKKyAgICAgICAgTEFCRUwoS0VZX0RJUkVDVElPTiksCisgICAgICAgIExBQkVMKEtFWV9DWUNMRVdJTkRPV1MpLAorICAgICAgICBMQUJFTChLRVlfTUFJTCksCisgICAgICAgIExBQkVMKEtFWV9CT09LTUFSS1MpLAorICAgICAgICBMQUJFTChLRVlfQ09NUFVURVIpLAorICAgICAgICBMQUJFTChLRVlfQkFDSyksCisgICAgICAgIExBQkVMKEtFWV9GT1JXQVJEKSwKKyAgICAgICAgTEFCRUwoS0VZX0NMT1NFQ0QpLAorICAgICAgICBMQUJFTChLRVlfRUpFQ1RDRCksCisgICAgICAgIExBQkVMKEtFWV9FSkVDVENMT1NFQ0QpLAorICAgICAgICBMQUJFTChLRVlfTkVYVFNPTkcpLAorICAgICAgICBMQUJFTChLRVlfUExBWVBBVVNFKSwKKyAgICAgICAgTEFCRUwoS0VZX1BSRVZJT1VTU09ORyksCisgICAgICAgIExBQkVMKEtFWV9TVE9QQ0QpLAorICAgICAgICBMQUJFTChLRVlfUkVDT1JEKSwKKyAgICAgICAgTEFCRUwoS0VZX1JFV0lORCksCisgICAgICAgIExBQkVMKEtFWV9QSE9ORSksCisgICAgICAgIExBQkVMKEtFWV9JU08pLAorICAgICAgICBMQUJFTChLRVlfQ09ORklHKSwKKyAgICAgICAgTEFCRUwoS0VZX0hPTUVQQUdFKSwKKyAgICAgICAgTEFCRUwoS0VZX1JFRlJFU0gpLAorICAgICAgICBMQUJFTChLRVlfRVhJVCksCisgICAgICAgIExBQkVMKEtFWV9NT1ZFKSwKKyAgICAgICAgTEFCRUwoS0VZX0VESVQpLAorICAgICAgICBMQUJFTChLRVlfU0NST0xMVVApLAorICAgICAgICBMQUJFTChLRVlfU0NST0xMRE9XTiksCisgICAgICAgIExBQkVMKEtFWV9LUExFRlRQQVJFTiksCisgICAgICAgIExBQkVMKEtFWV9LUFJJR0hUUEFSRU4pLAorICAgICAgICBMQUJFTChLRVlfTkVXKSwKKyAgICAgICAgTEFCRUwoS0VZX1JFRE8pLAorICAgICAgICBMQUJFTChLRVlfRjEzKSwKKyAgICAgICAgTEFCRUwoS0VZX0YxNCksCisgICAgICAgIExBQkVMKEtFWV9GMTUpLAorICAgICAgICBMQUJFTChLRVlfRjE2KSwKKyAgICAgICAgTEFCRUwoS0VZX0YxNyksCisgICAgICAgIExBQkVMKEtFWV9GMTgpLAorICAgICAgICBMQUJFTChLRVlfRjE5KSwKKyAgICAgICAgTEFCRUwoS0VZX0YyMCksCisgICAgICAgIExBQkVMKEtFWV9GMjEpLAorICAgICAgICBMQUJFTChLRVlfRjIyKSwKKyAgICAgICAgTEFCRUwoS0VZX0YyMyksCisgICAgICAgIExBQkVMKEtFWV9GMjQpLAorICAgICAgICBMQUJFTChLRVlfUExBWUNEKSwKKyAgICAgICAgTEFCRUwoS0VZX1BBVVNFQ0QpLAorICAgICAgICBMQUJFTChLRVlfUFJPRzMpLAorICAgICAgICBMQUJFTChLRVlfUFJPRzQpLAorICAgICAgICBMQUJFTChLRVlfREFTSEJPQVJEKSwKKyAgICAgICAgTEFCRUwoS0VZX1NVU1BFTkQpLAorICAgICAgICBMQUJFTChLRVlfQ0xPU0UpLAorICAgICAgICBMQUJFTChLRVlfUExBWSksCisgICAgICAgIExBQkVMKEtFWV9GQVNURk9SV0FSRCksCisgICAgICAgIExBQkVMKEtFWV9CQVNTQk9PU1QpLAorICAgICAgICBMQUJFTChLRVlfUFJJTlQpLAorICAgICAgICBMQUJFTChLRVlfSFApLAorICAgICAgICBMQUJFTChLRVlfQ0FNRVJBKSwKKyAgICAgICAgTEFCRUwoS0VZX1NPVU5EKSwKKyAgICAgICAgTEFCRUwoS0VZX1FVRVNUSU9OKSwKKyAgICAgICAgTEFCRUwoS0VZX0VNQUlMKSwKKyAgICAgICAgTEFCRUwoS0VZX0NIQVQpLAorICAgICAgICBMQUJFTChLRVlfU0VBUkNIKSwKKyAgICAgICAgTEFCRUwoS0VZX0NPTk5FQ1QpLAorICAgICAgICBMQUJFTChLRVlfRklOQU5DRSksCisgICAgICAgIExBQkVMKEtFWV9TUE9SVCksCisgICAgICAgIExBQkVMKEtFWV9TSE9QKSwKKyAgICAgICAgTEFCRUwoS0VZX0FMVEVSQVNFKSwKKyAgICAgICAgTEFCRUwoS0VZX0NBTkNFTCksCisgICAgICAgIExBQkVMKEtFWV9CUklHSFRORVNTRE9XTiksCisgICAgICAgIExBQkVMKEtFWV9CUklHSFRORVNTVVApLAorICAgICAgICBMQUJFTChLRVlfTUVESUEpLAorICAgICAgICBMQUJFTChLRVlfU1dJVENIVklERU9NT0RFKSwKKyAgICAgICAgTEFCRUwoS0VZX0tCRElMTFVNVE9HR0xFKSwKKyAgICAgICAgTEFCRUwoS0VZX0tCRElMTFVNRE9XTiksCisgICAgICAgIExBQkVMKEtFWV9LQkRJTExVTVVQKSwKKyAgICAgICAgTEFCRUwoS0VZX1NFTkQpLAorICAgICAgICBMQUJFTChLRVlfUkVQTFkpLAorICAgICAgICBMQUJFTChLRVlfRk9SV0FSRE1BSUwpLAorICAgICAgICBMQUJFTChLRVlfU0FWRSksCisgICAgICAgIExBQkVMKEtFWV9ET0NVTUVOVFMpLAorICAgICAgICBMQUJFTChLRVlfQkFUVEVSWSksCisgICAgICAgIExBQkVMKEtFWV9CTFVFVE9PVEgpLAorICAgICAgICBMQUJFTChLRVlfV0xBTiksCisgICAgICAgIExBQkVMKEtFWV9VV0IpLAorICAgICAgICBMQUJFTChLRVlfVU5LTk9XTiksCisgICAgICAgIExBQkVMKEtFWV9WSURFT19ORVhUKSwKKyAgICAgICAgTEFCRUwoS0VZX1ZJREVPX1BSRVYpLAorICAgICAgICBMQUJFTChLRVlfQlJJR0hUTkVTU19DWUNMRSksCisgICAgICAgIExBQkVMKEtFWV9CUklHSFRORVNTX1pFUk8pLAorICAgICAgICBMQUJFTChLRVlfRElTUExBWV9PRkYpLAorICAgICAgICBMQUJFTChLRVlfV0lNQVgpLAorICAgICAgICBMQUJFTChLRVlfUkZLSUxMKSwKKyAgICAgICAgTEFCRUwoQlROXzApLAorICAgICAgICBMQUJFTChCVE5fMSksCisgICAgICAgIExBQkVMKEJUTl8yKSwKKyAgICAgICAgTEFCRUwoQlROXzMpLAorICAgICAgICBMQUJFTChCVE5fNCksCisgICAgICAgIExBQkVMKEJUTl81KSwKKyAgICAgICAgTEFCRUwoQlROXzYpLAorICAgICAgICBMQUJFTChCVE5fNyksCisgICAgICAgIExBQkVMKEJUTl84KSwKKyAgICAgICAgTEFCRUwoQlROXzkpLAorICAgICAgICBMQUJFTChCVE5fTEVGVCksCisgICAgICAgIExBQkVMKEJUTl9SSUdIVCksCisgICAgICAgIExBQkVMKEJUTl9NSURETEUpLAorICAgICAgICBMQUJFTChCVE5fU0lERSksCisgICAgICAgIExBQkVMKEJUTl9FWFRSQSksCisgICAgICAgIExBQkVMKEJUTl9GT1JXQVJEKSwKKyAgICAgICAgTEFCRUwoQlROX0JBQ0spLAorICAgICAgICBMQUJFTChCVE5fVEFTSyksCisgICAgICAgIExBQkVMKEJUTl9KT1lTVElDSyksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSKSwKKyAgICAgICAgTEFCRUwoQlROX1RIVU1CKSwKKyAgICAgICAgTEFCRUwoQlROX1RIVU1CMiksCisgICAgICAgIExBQkVMKEJUTl9UT1ApLAorICAgICAgICBMQUJFTChCVE5fVE9QMiksCisgICAgICAgIExBQkVMKEJUTl9QSU5LSUUpLAorICAgICAgICBMQUJFTChCVE5fQkFTRSksCisgICAgICAgIExBQkVMKEJUTl9CQVNFMiksCisgICAgICAgIExBQkVMKEJUTl9CQVNFMyksCisgICAgICAgIExBQkVMKEJUTl9CQVNFNCksCisgICAgICAgIExBQkVMKEJUTl9CQVNFNSksCisgICAgICAgIExBQkVMKEJUTl9CQVNFNiksCisgICAgICAgIExBQkVMKEJUTl9ERUFEKSwKKyAgICAgICAgTEFCRUwoQlROX0EpLAorICAgICAgICBMQUJFTChCVE5fQiksCisgICAgICAgIExBQkVMKEJUTl9DKSwKKyAgICAgICAgTEFCRUwoQlROX1gpLAorICAgICAgICBMQUJFTChCVE5fWSksCisgICAgICAgIExBQkVMKEJUTl9aKSwKKyAgICAgICAgTEFCRUwoQlROX1RMKSwKKyAgICAgICAgTEFCRUwoQlROX1RSKSwKKyAgICAgICAgTEFCRUwoQlROX1RMMiksCisgICAgICAgIExBQkVMKEJUTl9UUjIpLAorICAgICAgICBMQUJFTChCVE5fU0VMRUNUKSwKKyAgICAgICAgTEFCRUwoQlROX1NUQVJUKSwKKyAgICAgICAgTEFCRUwoQlROX01PREUpLAorICAgICAgICBMQUJFTChCVE5fVEhVTUJMKSwKKyAgICAgICAgTEFCRUwoQlROX1RIVU1CUiksCisgICAgICAgIExBQkVMKEJUTl9UT09MX1BFTiksCisgICAgICAgIExBQkVMKEJUTl9UT09MX1JVQkJFUiksCisgICAgICAgIExBQkVMKEJUTl9UT09MX0JSVVNIKSwKKyAgICAgICAgTEFCRUwoQlROX1RPT0xfUEVOQ0lMKSwKKyAgICAgICAgTEFCRUwoQlROX1RPT0xfQUlSQlJVU0gpLAorICAgICAgICBMQUJFTChCVE5fVE9PTF9GSU5HRVIpLAorICAgICAgICBMQUJFTChCVE5fVE9PTF9NT1VTRSksCisgICAgICAgIExBQkVMKEJUTl9UT09MX0xFTlMpLAorICAgICAgICBMQUJFTChCVE5fVE9VQ0gpLAorICAgICAgICBMQUJFTChCVE5fU1RZTFVTKSwKKyAgICAgICAgTEFCRUwoQlROX1NUWUxVUzIpLAorICAgICAgICBMQUJFTChCVE5fVE9PTF9ET1VCTEVUQVApLAorICAgICAgICBMQUJFTChCVE5fVE9PTF9UUklQTEVUQVApLAorICAgICAgICBMQUJFTChCVE5fVE9PTF9RVUFEVEFQKSwKKyAgICAgICAgTEFCRUwoQlROX0dFQVJfRE9XTiksCisgICAgICAgIExBQkVMKEJUTl9HRUFSX1VQKSwKKyAgICAgICAgTEFCRUwoS0VZX09LKSwKKyAgICAgICAgTEFCRUwoS0VZX1NFTEVDVCksCisgICAgICAgIExBQkVMKEtFWV9HT1RPKSwKKyAgICAgICAgTEFCRUwoS0VZX0NMRUFSKSwKKyAgICAgICAgTEFCRUwoS0VZX1BPV0VSMiksCisgICAgICAgIExBQkVMKEtFWV9PUFRJT04pLAorICAgICAgICBMQUJFTChLRVlfSU5GTyksCisgICAgICAgIExBQkVMKEtFWV9USU1FKSwKKyAgICAgICAgTEFCRUwoS0VZX1ZFTkRPUiksCisgICAgICAgIExBQkVMKEtFWV9BUkNISVZFKSwKKyAgICAgICAgTEFCRUwoS0VZX1BST0dSQU0pLAorICAgICAgICBMQUJFTChLRVlfQ0hBTk5FTCksCisgICAgICAgIExBQkVMKEtFWV9GQVZPUklURVMpLAorICAgICAgICBMQUJFTChLRVlfRVBHKSwKKyAgICAgICAgTEFCRUwoS0VZX1BWUiksCisgICAgICAgIExBQkVMKEtFWV9NSFApLAorICAgICAgICBMQUJFTChLRVlfTEFOR1VBR0UpLAorICAgICAgICBMQUJFTChLRVlfVElUTEUpLAorICAgICAgICBMQUJFTChLRVlfU1VCVElUTEUpLAorICAgICAgICBMQUJFTChLRVlfQU5HTEUpLAorICAgICAgICBMQUJFTChLRVlfWk9PTSksCisgICAgICAgIExBQkVMKEtFWV9NT0RFKSwKKyAgICAgICAgTEFCRUwoS0VZX0tFWUJPQVJEKSwKKyAgICAgICAgTEFCRUwoS0VZX1NDUkVFTiksCisgICAgICAgIExBQkVMKEtFWV9QQyksCisgICAgICAgIExBQkVMKEtFWV9UViksCisgICAgICAgIExBQkVMKEtFWV9UVjIpLAorICAgICAgICBMQUJFTChLRVlfVkNSKSwKKyAgICAgICAgTEFCRUwoS0VZX1ZDUjIpLAorICAgICAgICBMQUJFTChLRVlfU0FUKSwKKyAgICAgICAgTEFCRUwoS0VZX1NBVDIpLAorICAgICAgICBMQUJFTChLRVlfQ0QpLAorICAgICAgICBMQUJFTChLRVlfVEFQRSksCisgICAgICAgIExBQkVMKEtFWV9SQURJTyksCisgICAgICAgIExBQkVMKEtFWV9UVU5FUiksCisgICAgICAgIExBQkVMKEtFWV9QTEFZRVIpLAorICAgICAgICBMQUJFTChLRVlfVEVYVCksCisgICAgICAgIExBQkVMKEtFWV9EVkQpLAorICAgICAgICBMQUJFTChLRVlfQVVYKSwKKyAgICAgICAgTEFCRUwoS0VZX01QMyksCisgICAgICAgIExBQkVMKEtFWV9BVURJTyksCisgICAgICAgIExBQkVMKEtFWV9WSURFTyksCisgICAgICAgIExBQkVMKEtFWV9ESVJFQ1RPUlkpLAorICAgICAgICBMQUJFTChLRVlfTElTVCksCisgICAgICAgIExBQkVMKEtFWV9NRU1PKSwKKyAgICAgICAgTEFCRUwoS0VZX0NBTEVOREFSKSwKKyAgICAgICAgTEFCRUwoS0VZX1JFRCksCisgICAgICAgIExBQkVMKEtFWV9HUkVFTiksCisgICAgICAgIExBQkVMKEtFWV9ZRUxMT1cpLAorICAgICAgICBMQUJFTChLRVlfQkxVRSksCisgICAgICAgIExBQkVMKEtFWV9DSEFOTkVMVVApLAorICAgICAgICBMQUJFTChLRVlfQ0hBTk5FTERPV04pLAorICAgICAgICBMQUJFTChLRVlfRklSU1QpLAorICAgICAgICBMQUJFTChLRVlfTEFTVCksCisgICAgICAgIExBQkVMKEtFWV9BQiksCisgICAgICAgIExBQkVMKEtFWV9ORVhUKSwKKyAgICAgICAgTEFCRUwoS0VZX1JFU1RBUlQpLAorICAgICAgICBMQUJFTChLRVlfU0xPVyksCisgICAgICAgIExBQkVMKEtFWV9TSFVGRkxFKSwKKyAgICAgICAgTEFCRUwoS0VZX0JSRUFLKSwKKyAgICAgICAgTEFCRUwoS0VZX1BSRVZJT1VTKSwKKyAgICAgICAgTEFCRUwoS0VZX0RJR0lUUyksCisgICAgICAgIExBQkVMKEtFWV9URUVOKSwKKyAgICAgICAgTEFCRUwoS0VZX1RXRU4pLAorICAgICAgICBMQUJFTChLRVlfVklERU9QSE9ORSksCisgICAgICAgIExBQkVMKEtFWV9HQU1FUyksCisgICAgICAgIExBQkVMKEtFWV9aT09NSU4pLAorICAgICAgICBMQUJFTChLRVlfWk9PTU9VVCksCisgICAgICAgIExBQkVMKEtFWV9aT09NUkVTRVQpLAorICAgICAgICBMQUJFTChLRVlfV09SRFBST0NFU1NPUiksCisgICAgICAgIExBQkVMKEtFWV9FRElUT1IpLAorICAgICAgICBMQUJFTChLRVlfU1BSRUFEU0hFRVQpLAorICAgICAgICBMQUJFTChLRVlfR1JBUEhJQ1NFRElUT1IpLAorICAgICAgICBMQUJFTChLRVlfUFJFU0VOVEFUSU9OKSwKKyAgICAgICAgTEFCRUwoS0VZX0RBVEFCQVNFKSwKKyAgICAgICAgTEFCRUwoS0VZX05FV1MpLAorICAgICAgICBMQUJFTChLRVlfVk9JQ0VNQUlMKSwKKyAgICAgICAgTEFCRUwoS0VZX0FERFJFU1NCT09LKSwKKyAgICAgICAgTEFCRUwoS0VZX01FU1NFTkdFUiksCisgICAgICAgIExBQkVMKEtFWV9ESVNQTEFZVE9HR0xFKSwKKyAgICAgICAgTEFCRUwoS0VZX1NQRUxMQ0hFQ0spLAorICAgICAgICBMQUJFTChLRVlfTE9HT0ZGKSwKKyAgICAgICAgTEFCRUwoS0VZX0RPTExBUiksCisgICAgICAgIExBQkVMKEtFWV9FVVJPKSwKKyAgICAgICAgTEFCRUwoS0VZX0ZSQU1FQkFDSyksCisgICAgICAgIExBQkVMKEtFWV9GUkFNRUZPUldBUkQpLAorICAgICAgICBMQUJFTChLRVlfQ09OVEVYVF9NRU5VKSwKKyAgICAgICAgTEFCRUwoS0VZX01FRElBX1JFUEVBVCksCisgICAgICAgIExBQkVMKEtFWV8xMENIQU5ORUxTVVApLAorICAgICAgICBMQUJFTChLRVlfMTBDSEFOTkVMU0RPV04pLAorICAgICAgICBMQUJFTChLRVlfSU1BR0VTKSwKKyAgICAgICAgTEFCRUwoS0VZX0RFTF9FT0wpLAorICAgICAgICBMQUJFTChLRVlfREVMX0VPUyksCisgICAgICAgIExBQkVMKEtFWV9JTlNfTElORSksCisgICAgICAgIExBQkVMKEtFWV9ERUxfTElORSksCisgICAgICAgIExBQkVMKEtFWV9GTiksCisgICAgICAgIExBQkVMKEtFWV9GTl9FU0MpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjEpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjIpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjMpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjQpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjUpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjYpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjcpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjgpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjkpLAorICAgICAgICBMQUJFTChLRVlfRk5fRjEwKSwKKyAgICAgICAgTEFCRUwoS0VZX0ZOX0YxMSksCisgICAgICAgIExBQkVMKEtFWV9GTl9GMTIpLAorICAgICAgICBMQUJFTChLRVlfRk5fMSksCisgICAgICAgIExBQkVMKEtFWV9GTl8yKSwKKyAgICAgICAgTEFCRUwoS0VZX0ZOX0QpLAorICAgICAgICBMQUJFTChLRVlfRk5fRSksCisgICAgICAgIExBQkVMKEtFWV9GTl9GKSwKKyAgICAgICAgTEFCRUwoS0VZX0ZOX1MpLAorICAgICAgICBMQUJFTChLRVlfRk5fQiksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UMSksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UMiksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UMyksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UNCksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UNSksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UNiksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UNyksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UOCksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UOSksCisgICAgICAgIExBQkVMKEtFWV9CUkxfRE9UMTApLAorICAgICAgICBMQUJFTChLRVlfTlVNRVJJQ18wKSwKKyAgICAgICAgTEFCRUwoS0VZX05VTUVSSUNfMSksCisgICAgICAgIExBQkVMKEtFWV9OVU1FUklDXzIpLAorICAgICAgICBMQUJFTChLRVlfTlVNRVJJQ18zKSwKKyAgICAgICAgTEFCRUwoS0VZX05VTUVSSUNfNCksCisgICAgICAgIExBQkVMKEtFWV9OVU1FUklDXzUpLAorICAgICAgICBMQUJFTChLRVlfTlVNRVJJQ182KSwKKyAgICAgICAgTEFCRUwoS0VZX05VTUVSSUNfNyksCisgICAgICAgIExBQkVMKEtFWV9OVU1FUklDXzgpLAorICAgICAgICBMQUJFTChLRVlfTlVNRVJJQ185KSwKKyAgICAgICAgTEFCRUwoS0VZX05VTUVSSUNfU1RBUiksCisgICAgICAgIExBQkVMKEtFWV9OVU1FUklDX1BPVU5EKSwKKyAgICAgICAgTEFCRUwoS0VZX0NBTUVSQV9GT0NVUyksCisgICAgICAgIExBQkVMKEtFWV9XUFNfQlVUVE9OKSwKKyAgICAgICAgTEFCRUwoS0VZX1RPVUNIUEFEX1RPR0dMRSksCisgICAgICAgIExBQkVMKEtFWV9UT1VDSFBBRF9PTiksCisgICAgICAgIExBQkVMKEtFWV9UT1VDSFBBRF9PRkYpLAorICAgICAgICBMQUJFTChLRVlfQ0FNRVJBX1pPT01JTiksCisgICAgICAgIExBQkVMKEtFWV9DQU1FUkFfWk9PTU9VVCksCisgICAgICAgIExBQkVMKEtFWV9DQU1FUkFfVVApLAorICAgICAgICBMQUJFTChLRVlfQ0FNRVJBX0RPV04pLAorICAgICAgICBMQUJFTChLRVlfQ0FNRVJBX0xFRlQpLAorICAgICAgICBMQUJFTChLRVlfQ0FNRVJBX1JJR0hUKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkxKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkyKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkzKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk0KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk1KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk2KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk3KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk4KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk5KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkxMCksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMTEpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTEyKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkxMyksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMTQpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTE1KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkxNiksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMTcpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTE4KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkxOSksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMjApLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTIxKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkyMiksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMjMpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTI0KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkyNSksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMjYpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTI3KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkyOCksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMjkpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTMwKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkzMSksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMzIpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTMzKSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkzNCksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMzUpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTM2KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFkzNyksCisgICAgICAgIExBQkVMKEJUTl9UUklHR0VSX0hBUFBZMzgpLAorICAgICAgICBMQUJFTChCVE5fVFJJR0dFUl9IQVBQWTM5KSwKKyAgICAgICAgTEFCRUwoQlROX1RSSUdHRVJfSEFQUFk0MCksCisgICAgICAgIExBQkVMX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFiZWwgcmVsX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChSRUxfWCksCisgICAgICAgIExBQkVMKFJFTF9ZKSwKKyAgICAgICAgTEFCRUwoUkVMX1opLAorICAgICAgICBMQUJFTChSRUxfUlgpLAorICAgICAgICBMQUJFTChSRUxfUlkpLAorICAgICAgICBMQUJFTChSRUxfUlopLAorICAgICAgICBMQUJFTChSRUxfSFdIRUVMKSwKKyAgICAgICAgTEFCRUwoUkVMX0RJQUwpLAorICAgICAgICBMQUJFTChSRUxfV0hFRUwpLAorICAgICAgICBMQUJFTChSRUxfTUlTQyksCisgICAgICAgIExBQkVMX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFiZWwgYWJzX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChBQlNfWCksCisgICAgICAgIExBQkVMKEFCU19ZKSwKKyAgICAgICAgTEFCRUwoQUJTX1opLAorICAgICAgICBMQUJFTChBQlNfUlgpLAorICAgICAgICBMQUJFTChBQlNfUlkpLAorICAgICAgICBMQUJFTChBQlNfUlopLAorICAgICAgICBMQUJFTChBQlNfVEhST1RUTEUpLAorICAgICAgICBMQUJFTChBQlNfUlVEREVSKSwKKyAgICAgICAgTEFCRUwoQUJTX1dIRUVMKSwKKyAgICAgICAgTEFCRUwoQUJTX0dBUyksCisgICAgICAgIExBQkVMKEFCU19CUkFLRSksCisgICAgICAgIExBQkVMKEFCU19IQVQwWCksCisgICAgICAgIExBQkVMKEFCU19IQVQwWSksCisgICAgICAgIExBQkVMKEFCU19IQVQxWCksCisgICAgICAgIExBQkVMKEFCU19IQVQxWSksCisgICAgICAgIExBQkVMKEFCU19IQVQyWCksCisgICAgICAgIExBQkVMKEFCU19IQVQyWSksCisgICAgICAgIExBQkVMKEFCU19IQVQzWCksCisgICAgICAgIExBQkVMKEFCU19IQVQzWSksCisgICAgICAgIExBQkVMKEFCU19QUkVTU1VSRSksCisgICAgICAgIExBQkVMKEFCU19ESVNUQU5DRSksCisgICAgICAgIExBQkVMKEFCU19USUxUX1gpLAorICAgICAgICBMQUJFTChBQlNfVElMVF9ZKSwKKyAgICAgICAgTEFCRUwoQUJTX1RPT0xfV0lEVEgpLAorICAgICAgICBMQUJFTChBQlNfVk9MVU1FKSwKKyAgICAgICAgTEFCRUwoQUJTX01JU0MpLAorICAgICAgICBMQUJFTChBQlNfTVRfU0xPVCksCisgICAgICAgIExBQkVMKEFCU19NVF9UT1VDSF9NQUpPUiksCisgICAgICAgIExBQkVMKEFCU19NVF9UT1VDSF9NSU5PUiksCisgICAgICAgIExBQkVMKEFCU19NVF9XSURUSF9NQUpPUiksCisgICAgICAgIExBQkVMKEFCU19NVF9XSURUSF9NSU5PUiksCisgICAgICAgIExBQkVMKEFCU19NVF9PUklFTlRBVElPTiksCisgICAgICAgIExBQkVMKEFCU19NVF9QT1NJVElPTl9YKSwKKyAgICAgICAgTEFCRUwoQUJTX01UX1BPU0lUSU9OX1kpLAorICAgICAgICBMQUJFTChBQlNfTVRfVE9PTF9UWVBFKSwKKyAgICAgICAgTEFCRUwoQUJTX01UX0JMT0JfSUQpLAorICAgICAgICBMQUJFTChBQlNfTVRfVFJBQ0tJTkdfSUQpLAorICAgICAgICBMQUJFTChBQlNfTVRfUFJFU1NVUkUpLAorICAgICAgICBMQUJFTChBQlNfTVRfRElTVEFOQ0UpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIHN3X2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChTV19MSUQpLAorICAgICAgICBMQUJFTChTV19UQUJMRVRfTU9ERSksCisgICAgICAgIExBQkVMKFNXX0hFQURQSE9ORV9JTlNFUlQpLAorICAgICAgICBMQUJFTChTV19SRktJTExfQUxMKSwKKyAgICAgICAgTEFCRUwoU1dfUkFESU8pLAorICAgICAgICBMQUJFTChTV19NSUNST1BIT05FX0lOU0VSVCksCisgICAgICAgIExBQkVMKFNXX0RPQ0spLAorICAgICAgICBMQUJFTChTV19MSU5FT1VUX0lOU0VSVCksCisgICAgICAgIExBQkVMKFNXX0pBQ0tfUEhZU0lDQUxfSU5TRVJUKSwKKyAgICAgICAgTEFCRUwoU1dfVklERU9PVVRfSU5TRVJUKSwKKyAgICAgICAgTEFCRUwoU1dfQ0FNRVJBX0xFTlNfQ09WRVIpLAorICAgICAgICBMQUJFTChTV19LRVlQQURfU0xJREUpLAorICAgICAgICBMQUJFTChTV19GUk9OVF9QUk9YSU1JVFkpLAorICAgICAgICBMQUJFTChTV19ST1RBVEVfTE9DSyksCisgICAgICAgIExBQkVMX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFiZWwgbXNjX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChNU0NfU0VSSUFMKSwKKyAgICAgICAgTEFCRUwoTVNDX1BVTFNFTEVEKSwKKyAgICAgICAgTEFCRUwoTVNDX0dFU1RVUkUpLAorICAgICAgICBMQUJFTChNU0NfUkFXKSwKKyAgICAgICAgTEFCRUwoTVNDX1NDQU4pLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGxlZF9sYWJlbHNbXSA9IHsKKyAgICAgICAgTEFCRUwoTEVEX05VTUwpLAorICAgICAgICBMQUJFTChMRURfQ0FQU0wpLAorICAgICAgICBMQUJFTChMRURfU0NST0xMTCksCisgICAgICAgIExBQkVMKExFRF9DT01QT1NFKSwKKyAgICAgICAgTEFCRUwoTEVEX0tBTkEpLAorICAgICAgICBMQUJFTChMRURfU0xFRVApLAorICAgICAgICBMQUJFTChMRURfU1VTUEVORCksCisgICAgICAgIExBQkVMKExFRF9NVVRFKSwKKyAgICAgICAgTEFCRUwoTEVEX01JU0MpLAorICAgICAgICBMQUJFTChMRURfTUFJTCksCisgICAgICAgIExBQkVMKExFRF9DSEFSR0lORyksCisgICAgICAgIExBQkVMX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFiZWwgcmVwX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChSRVBfREVMQVkpLAorICAgICAgICBMQUJFTChSRVBfUEVSSU9EKSwKKyAgICAgICAgTEFCRUxfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCBsYWJlbCBzbmRfbGFiZWxzW10gPSB7CisgICAgICAgIExBQkVMKFNORF9DTElDSyksCisgICAgICAgIExBQkVMKFNORF9CRUxMKSwKKyAgICAgICAgTEFCRUwoU05EX1RPTkUpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGlkX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChJRF9CVVMpLAorICAgICAgICBMQUJFTChJRF9WRU5ET1IpLAorICAgICAgICBMQUJFTChJRF9QUk9EVUNUKSwKKyAgICAgICAgTEFCRUwoSURfVkVSU0lPTiksCisgICAgICAgIExBQkVMX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFiZWwgYnVzX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChCVVNfUENJKSwKKyAgICAgICAgTEFCRUwoQlVTX0lTQVBOUCksCisgICAgICAgIExBQkVMKEJVU19VU0IpLAorICAgICAgICBMQUJFTChCVVNfSElMKSwKKyAgICAgICAgTEFCRUwoQlVTX0JMVUVUT09USCksCisgICAgICAgIExBQkVMKEJVU19WSVJUVUFMKSwKKyAgICAgICAgTEFCRUwoQlVTX0lTQSksCisgICAgICAgIExBQkVMKEJVU19JODA0MiksCisgICAgICAgIExBQkVMKEJVU19YVEtCRCksCisgICAgICAgIExBQkVMKEJVU19SUzIzMiksCisgICAgICAgIExBQkVMKEJVU19HQU1FUE9SVCksCisgICAgICAgIExBQkVMKEJVU19QQVJQT1JUKSwKKyAgICAgICAgTEFCRUwoQlVTX0FNSUdBKSwKKyAgICAgICAgTEFCRUwoQlVTX0FEQiksCisgICAgICAgIExBQkVMKEJVU19JMkMpLAorICAgICAgICBMQUJFTChCVVNfSE9TVCksCisgICAgICAgIExBQkVMKEJVU19HU0MpLAorICAgICAgICBMQUJFTChCVVNfQVRBUkkpLAorICAgICAgICBMQUJFTChCVVNfU1BJKSwKKyAgICAgICAgTEFCRUxfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCBsYWJlbCBtdF90b29sX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChNVF9UT09MX0ZJTkdFUiksCisgICAgICAgIExBQkVMKE1UX1RPT0xfUEVOKSwKKyAgICAgICAgTEFCRUwoTVRfVE9PTF9NQVgpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGZmX3N0YXR1c19sYWJlbHNbXSA9IHsKKyAgICAgICAgTEFCRUwoRkZfU1RBVFVTX1NUT1BQRUQpLAorICAgICAgICBMQUJFTChGRl9TVEFUVVNfUExBWUlORyksCisgICAgICAgIExBQkVMKEZGX1NUQVRVU19NQVgpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGZmX2xhYmVsc1tdID0geworICAgICAgICBMQUJFTChGRl9SVU1CTEUpLAorICAgICAgICBMQUJFTChGRl9QRVJJT0RJQyksCisgICAgICAgIExBQkVMKEZGX0NPTlNUQU5UKSwKKyAgICAgICAgTEFCRUwoRkZfU1BSSU5HKSwKKyAgICAgICAgTEFCRUwoRkZfRlJJQ1RJT04pLAorICAgICAgICBMQUJFTChGRl9EQU1QRVIpLAorICAgICAgICBMQUJFTChGRl9JTkVSVElBKSwKKyAgICAgICAgTEFCRUwoRkZfUkFNUCksCisgICAgICAgIExBQkVMKEZGX1NRVUFSRSksCisgICAgICAgIExBQkVMKEZGX1RSSUFOR0xFKSwKKyAgICAgICAgTEFCRUwoRkZfU0lORSksCisgICAgICAgIExBQkVMKEZGX1NBV19VUCksCisgICAgICAgIExBQkVMKEZGX1NBV19ET1dOKSwKKyAgICAgICAgTEFCRUwoRkZfQ1VTVE9NKSwKKyAgICAgICAgTEFCRUwoRkZfR0FJTiksCisgICAgICAgIExBQkVMKEZGX0FVVE9DRU5URVIpLAorICAgICAgICBMQUJFTF9FTkQsCit9OworCitzdGF0aWMgc3RydWN0IGxhYmVsIGtleV92YWx1ZV9sYWJlbHNbXSA9IHsKKyAgICAgICAgeyAiVVAiLCAwIH0sCisgICAgICAgIHsgIkRPV04iLCAxIH0sCisgICAgICAgIHsgIlJFUEVBVCIsIDIgfSwKKyAgICAgICAgTEFCRUxfRU5ELAorfTsKZGlmZiAtLWdpdCBhL3Rvb2xib3gvbHMuYyBiL3Rvb2xib3gvbHMuYwppbmRleCBiMDhlMzc4Li5iZWUzNjVjIDEwMDY0NAotLS0gYS90b29sYm94L2xzLmMKKysrIGIvdG9vbGJveC9scy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjZGVmaW5lIExJU1RfRElSRUNUT1JJRVMgICAgKDEgPDwgMykKICNkZWZpbmUgTElTVF9TSVpFICAgICAgICAgICAoMSA8PCA0KQogI2RlZmluZSBMSVNUX0xPTkdfTlVNRVJJQyAgICgxIDw8IDUpCisjZGVmaW5lIExJU1RfQ0xBU1NJRlkgICAgICAgKDEgPDwgNikKIAogLy8gZndkCiBzdGF0aWMgaW50IGxpc3RwYXRoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncyk7CkBAIC0xMzMsNyArMTM0LDI3IEBACiAgICAgfQogCiAgICAgLyogYmxvY2tzIGFyZSA1MTIgYnl0ZXMsIHdlIHdhbnQgb3V0cHV0IHRvIGJlIEtCICovCi0gICAgcHJpbnRmKCIlbGxkICVzXG4iLCBzLnN0X2Jsb2NrcyAvIDIsIGZpbGVuYW1lKTsKKyAgICBpZiAoKGZsYWdzICYgTElTVF9TSVpFKSAhPSAwKSB7CisgICAgICAgIHByaW50ZigiJWxsZCAiLCBzLnN0X2Jsb2NrcyAvIDIpOworICAgIH0KKworICAgIGlmICgoZmxhZ3MgJiBMSVNUX0NMQVNTSUZZKSAhPSAwKSB7CisgICAgICAgIGNoYXIgZmlsZXR5cGUgPSBtb2RlMmtpbmQocy5zdF9tb2RlKTsKKyAgICAgICAgaWYgKGZpbGV0eXBlICE9ICdsJykgeworICAgICAgICAgICAgcHJpbnRmKCIlYyAiLCBmaWxldHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBsaW5rX2Rlc3Q7CisgICAgICAgICAgICBpZiAoIXN0YXQocGF0aCwgJmxpbmtfZGVzdCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImwlYyAiLCBtb2RlMmtpbmQobGlua19kZXN0LnN0X21vZGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzdGF0ICclcycgZmFpbGVkOiAlc1xuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImw/ICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRmKCIlc1xuIiwgZmlsZW5hbWUpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIxNSw3ICsyMzYsNyBAQAogCiBzdGF0aWMgaW50IGxpc3RmaWxlKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCiB7Ci0gICAgaWYgKChmbGFncyAmIChMSVNUX0xPTkcgfCBMSVNUX1NJWkUpKSA9PSAwKSB7CisgICAgaWYgKChmbGFncyAmIChMSVNUX0xPTkcgfCBMSVNUX1NJWkUgfCBMSVNUX0NMQVNTSUZZKSkgPT0gMCkgewogICAgICAgICBwcmludGYoIiVzXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTM2Niw2ICszODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZmxhZ3MgfD0gTElTVF9SRUNVUlNJVkU7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogZmxhZ3MgfD0gTElTVF9ESVJFQ1RPUklFUzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOiBmbGFncyB8PSBMSVNUX0FMTDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOiBmbGFncyB8PSBMSVNUX0NMQVNTSUZZOyBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IFVua25vd24gb3B0aW9uICctJWMnLiBBYm9ydGluZy5cbiIsICJscyIsIGFyZ1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwpkaWZmIC0tZ2l0IGEvdG9vbGJveC9sc29mLmMgYi90b29sYm94L2xzb2YuYwppbmRleCBjNTUzODRiLi40ZTJmNzdhIDEwMDY0NAotLS0gYS90b29sYm94L2xzb2YuYworKysgYi90b29sYm94L2xzb2YuYwpAQCAtMzcsMTEgKzM3LDE2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCiAjZGVmaW5lIEJVRl9NQVggMTAyNAotI2RlZmluZSBDTURfRElTUExBWV9NQVggMTAKKyNkZWZpbmUgQ01EX0RJU1BMQVlfTUFYICg5ICsgMSkKKyNkZWZpbmUgVVNFUl9ESVNQTEFZX01BWCAoMTAgKyAxKQogCiBzdHJ1Y3QgcGlkX2luZm9fdCB7CiAgICAgcGlkX3QgcGlkOworICAgIGNoYXIgdXNlcltVU0VSX0RJU1BMQVlfTUFYXTsKIAogICAgIGNoYXIgY21kbGluZVtDTURfRElTUExBWV9NQVhdOwogCkBAIC04Miw3ICs4Nyw4IEBACiAgICAgaWYgKCFzdHJjbXAobGlua19kZXN0LCAiLyIpKQogICAgICAgICBnb3RvIG91dDsKIAotICAgIHByaW50ZigiJS05cyAlNWQgJTEwcyAlNHMgJTlzICUxOHMgJTlzICUxMHMgJXNcbiIsIGluZm8tPmNtZGxpbmUsIGluZm8tPnBpZCwgIj8/PyIsIHR5cGUsCisgICAgcHJpbnRmKCIlLTlzICU1ZCAlMTBzICU0cyAlOXMgJTE4cyAlOXMgJTEwcyAlc1xuIiwKKyAgICAgICAgICAgIGluZm8tPmNtZGxpbmUsIGluZm8tPnBpZCwgaW5mby0+dXNlciwgdHlwZSwKICAgICAgICAgICAgICI/Pz8iLCAiPz8/IiwgIj8/PyIsICI/Pz8iLCBsaW5rX2Rlc3QpOwogCiBvdXQ6CkBAIC0xMTMsNyArMTE5LDggQEAKICAgICAgICAgaWYgKGlub2RlID09IDAgfHwgIXN0cmNtcChkZXZpY2UsICIwMDowMCIpKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgcHJpbnRmKCIlLTlzICU1ZCAlMTBzICU0cyAlOXMgJTE4cyAlOXpkICUxMGxkICVzXG4iLCBpbmZvLT5jbWRsaW5lLCBpbmZvLT5waWQsICI/Pz8iLCAibWVtIiwKKyAgICAgICAgcHJpbnRmKCIlLTlzICU1ZCAlMTBzICU0cyAlOXMgJTE4cyAlOXpkICUxMGxkICVzXG4iLAorICAgICAgICAgICAgICAgIGluZm8tPmNtZGxpbmUsIGluZm8tPnBpZCwgaW5mby0+dXNlciwgIm1lbSIsCiAgICAgICAgICAgICAgICAgIj8/PyIsIGRldmljZSwgb2Zmc2V0LCBpbm9kZSwgZmlsZSk7CiAgICAgfQogCkBAIC0xMzYsNyArMTQzLDggQEAKICAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICAgY2hhciBtc2dbQlVGX01BWF07CiAgICAgICAgIHNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICIlcyAob3BlbmRpcjogJXMpIiwgaW5mby0+cGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHJpbnRmKCIlLTlzICU1ZCAlMTBzICU0cyAlOXMgJTE4cyAlOXMgJTEwcyAlc1xuIiwgaW5mby0+Y21kbGluZSwgaW5mby0+cGlkLCAiPz8/IiwgIkZEUyIsCisgICAgICAgIHByaW50ZigiJS05cyAlNWQgJTEwcyAlNHMgJTlzICUxOHMgJTlzICUxMHMgJXNcbiIsCisgICAgICAgICAgICAgICAgaW5mby0+Y21kbGluZSwgaW5mby0+cGlkLCBpbmZvLT51c2VyLCAiRkRTIiwKICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgbXNnKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQpAQCAtMTU5LDEyICsxNjcsMjYgQEAKIHsKICAgICBpbnQgZmQ7CiAgICAgc3RydWN0IHBpZF9pbmZvX3QgaW5mbzsKKyAgICBzdHJ1Y3Qgc3RhdCBwaWRzdGF0OworICAgIHN0cnVjdCBwYXNzd2QgKnB3OworCiAgICAgaW5mby5waWQgPSBwaWQ7Ci0KICAgICBzbnByaW50ZihpbmZvLnBhdGgsIHNpemVvZihpbmZvLnBhdGgpLCAiL3Byb2MvJWQvIiwgcGlkKTsKLQogICAgIGluZm8ucGFyZW50X2xlbmd0aCA9IHN0cmxlbihpbmZvLnBhdGgpOwogCisgICAgLy8gR2V0IHRoZSBVSUQgYnkgY2FsbGluZyBzdGF0IG9uIHRoZSBwcm9jL3BpZCBkaXJlY3RvcnkuCisgICAgaWYgKCFzdGF0KGluZm8ucGF0aCwgJnBpZHN0YXQpKSB7CisgICAgICAgIHB3ID0gZ2V0cHd1aWQocGlkc3RhdC5zdF91aWQpOworICAgICAgICBpZiAocHcpIHsKKyAgICAgICAgICAgIHN0cm5jcHkoaW5mby51c2VyLCBwdy0+cHdfbmFtZSwgVVNFUl9ESVNQTEFZX01BWCAtIDEpOworICAgICAgICAgICAgaW5mby51c2VyW1VTRVJfRElTUExBWV9NQVggLSAxXSA9ICdcMCc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihpbmZvLnVzZXIsIFVTRVJfRElTUExBWV9NQVgsICIlZCIsIChpbnQpcGlkc3RhdC5zdF91aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyY3B5KGluZm8udXNlciwgIj8/PyIpOworICAgIH0KKwogICAgIC8vIFJlYWQgdGhlIGNvbW1hbmQgbGluZSBpbmZvcm1hdGlvbjsgZWFjaCBhcmd1bWVudCBpcyB0ZXJtaW5hdGVkIHdpdGggTlVMTC4KICAgICBzdHJuY2F0KGluZm8ucGF0aCwgImNtZGxpbmUiLCBzaXplb2YoaW5mby5wYXRoKSk7CiAgICAgZmQgPSBvcGVuKGluZm8ucGF0aCwgT19SRE9OTFkpOwpAQCAtMjE5LDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIC8vIE9ubHkgaW5zcGVjdCBkaXJlY3RvcmllcyB0aGF0IGFyZSBQSUQgbnVtYmVycwotICAgICAgICAgICAgICAgIHBpZCA9IHN0cnRvbChkZS0+ZF9uYW1lLCAmZW5kcHRyLCAxMCk7CisgICAgICAgICAgICBwaWQgPSBzdHJ0b2woZGUtPmRfbmFtZSwgJmVuZHB0ciwgMTApOwogICAgICAgICAgICAgaWYgKCplbmRwdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvdG9vbGJveC9tb3VudC5jIGIvdG9vbGJveC9tb3VudC5jCmluZGV4IDgyZWNjNTYuLjI3Y2YzYzkgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvbW91bnQuYworKysgYi90b29sYm94L21vdW50LmMKQEAgLTE1LDggKzE1LDggQEAKIAogI2RlZmluZSBBUlJBWV9TSVpFKHgpCShzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCiAKLS8vIEZJWE1FIC0gb25seSBvbmUgbG9vcCBtb3VudCBpcyBzdXBwb3J0ZWQgYXQgYSB0aW1lCi0jZGVmaW5lIExPT1BfREVWSUNFICIvZGV2L2Jsb2NrL2xvb3AwIgorI2RlZmluZSBERUZBVUxUX0xPT1BfREVWSUNFICIvZGV2L2Jsb2NrL2xvb3AwIgorI2RlZmluZSBMT09QREVWX01BWExFTiA2NAogCiBzdHJ1Y3QgbW91bnRfb3B0cyB7CiAJY29uc3QgY2hhciBzdHJbOF07CkBAIC04Nyw3ICs4Nyw3IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1wYXJzZV9tb3VudF9vcHRpb25zKGNoYXIgKmFyZywgdW5zaWduZWQgbG9uZyByd2ZsYWcsIHN0cnVjdCBleHRyYV9vcHRzICpleHRyYSwgaW50KiBsb29wKQorcGFyc2VfbW91bnRfb3B0aW9ucyhjaGFyICphcmcsIHVuc2lnbmVkIGxvbmcgcndmbGFnLCBzdHJ1Y3QgZXh0cmFfb3B0cyAqZXh0cmEsIGludCogbG9vcCwgY2hhciAqbG9vcGRldikKIHsKIAljaGFyICpzOwogICAgIApAQCAtMTAwLDggKzEwMCwxNSBAQAogCQlpZiAobm8pCiAJCQlzICs9IDI7CiAKKyAgICAgICAgaWYgKHN0cm5jbXAocywgImxvb3A9IiwgNSkgPT0gMCkgeworICAgICAgICAgICAgKmxvb3AgPSAxOworICAgICAgICAgICAgc3RybGNweShsb29wZGV2LCBzICsgNSwgTE9PUERFVl9NQVhMRU4pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc3RyY21wKHMsICJsb29wIikgPT0gMCkgewogICAgICAgICAgICAgKmxvb3AgPSAxOworICAgICAgICAgICAgc3RybGNweShsb29wZGV2LCBERUZBVUxUX0xPT1BfREVWSUNFLCBMT09QREVWX01BWExFTik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCQlmb3IgKGkgPSAwLCByZXMgPSAxOyBpIDwgQVJSQVlfU0laRShvcHRpb25zKTsgaSsrKSB7CkBAIC0xMzEsNyArMTM4LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJ3ZmxhZzsKIAogc3RhdGljIGludAotZG9fbW91bnQoY2hhciAqZGV2LCBjaGFyICpkaXIsIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgcndmbGFnLCB2b2lkICpkYXRhLCBpbnQgbG9vcCkKK2RvX21vdW50KGNoYXIgKmRldiwgY2hhciAqZGlyLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIHJ3ZmxhZywgdm9pZCAqZGF0YSwgaW50IGxvb3AsCisgICAgICAgICBjaGFyICpsb29wZGV2KQogewogCWNoYXIgKnM7CiAJaW50IGVycm9yID0gMDsKQEAgLTE0MiwxNCArMTUwLDEzIEBACiAKICAgICAgICAgZmxhZ3MgPSAocndmbGFnICYgTVNfUkRPTkxZKSA/IE9fUkRPTkxZIDogT19SRFdSOwogICAgICAgICAKLSAgICAgICAgLy8gRklYTUUgLSBvbmx5IG9uZSBsb29wIG1vdW50IHN1cHBvcnRlZCBhdCBhIHRpbWUKICAgICAgICAgZmlsZV9mZCA9IG9wZW4oZGV2LCBmbGFncyk7Ci0gICAgICAgIGlmIChmaWxlX2ZkIDwgLTEpIHsKKyAgICAgICAgaWYgKGZpbGVfZmQgPCAwKSB7CiAgICAgICAgICAgICBwZXJyb3IoIm9wZW4gYmFja2luZyBmaWxlIGZhaWxlZCIpOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlX2ZkID0gb3BlbihMT09QX0RFVklDRSwgZmxhZ3MpOwotICAgICAgICBpZiAoZGV2aWNlX2ZkIDwgLTEpIHsKKyAgICAgICAgZGV2aWNlX2ZkID0gb3Blbihsb29wZGV2LCBmbGFncyk7CisgICAgICAgIGlmIChkZXZpY2VfZmQgPCAwKSB7CiAgICAgICAgICAgICBwZXJyb3IoIm9wZW4gbG9vcCBkZXZpY2UgZmFpbGVkIik7CiAgICAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKICAgICAgICAgICAgIHJldHVybiAxOwpAQCAtMTYzLDcgKzE3MCw3IEBACiAKICAgICAgICAgY2xvc2UoZmlsZV9mZCk7CiAgICAgICAgIGNsb3NlKGRldmljZV9mZCk7Ci0gICAgICAgIGRldiA9IExPT1BfREVWSUNFOworICAgICAgICBkZXYgPSBsb29wZGV2OwogICAgIH0KIAogCXdoaWxlICgocyA9IHN0cnNlcCgmdHlwZSwgIiwiKSkgIT0gTlVMTCkgewpAQCAtMjY4LDYgKzI3NSw3IEBACiAJY2hhciAqZGlyID0gTlVMTDsKIAlpbnQgYzsKIAlpbnQgbG9vcCA9IDA7CisJY2hhciBsb29wZGV2W0xPT1BERVZfTUFYTEVOXTsKIAogCXByb2duYW1lID0gYXJndlswXTsKIAlyd2ZsYWcgPSBNU19WRVJCT1NFOwpAQCAtMjgxLDcgKzI4OSw3IEBACiAJCQlicmVhazsKIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJ28nOgotCQkJcndmbGFnID0gcGFyc2VfbW91bnRfb3B0aW9ucyhvcHRhcmcsIHJ3ZmxhZywgJmV4dHJhLCAmbG9vcCk7CisJCQlyd2ZsYWcgPSBwYXJzZV9tb3VudF9vcHRpb25zKG9wdGFyZywgcndmbGFnLCAmZXh0cmEsICZsb29wLCBsb29wZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlICdyJzoKIAkJCXJ3ZmxhZyB8PSBNU19SRE9OTFk7CkBAIC0zMTksNiArMzI3LDYgQEAKIAkJZXhpdCgxKTsKIAl9CiAKLQlyZXR1cm4gZG9fbW91bnQoZGV2LCBkaXIsIHR5cGUsIHJ3ZmxhZywgZXh0cmEuc3RyLCBsb29wKTsKKwlyZXR1cm4gZG9fbW91bnQoZGV2LCBkaXIsIHR5cGUsIHJ3ZmxhZywgZXh0cmEuc3RyLCBsb29wLCBsb29wZGV2KTsKIAkvKiBXZSBsZWFrIGRldiBhbmQgZGlyIGluIHNvbWUgY2FzZXMsIGJ1dCB3ZSdyZSBhYm91dCB0byBleGl0ICovCiB9CmRpZmYgLS1naXQgYS90b29sYm94L3Vtb3VudC5jIGIvdG9vbGJveC91bW91bnQuYwppbmRleCA5MmM2MDc2Li44OTBlODcwIDEwMDY0NAotLS0gYS90b29sYm94L3Vtb3VudC5jCisrKyBiL3Rvb2xib3gvdW1vdW50LmMKQEAgLTYsMTEgKzYsMjYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAotLy8gRklYTUUgLSBvbmx5IG9uZSBsb29wIG1vdW50IGlzIHN1cHBvcnRlZCBhdCBhIHRpbWUKLSNkZWZpbmUgTE9PUF9ERVZJQ0UgIi9kZXYvYmxvY2svbG9vcDAiCisjZGVmaW5lIExPT1BERVZfTUFYTEVOIDY0CisjZGVmaW5lIExPT1BfTUFKT1IgNwogCi1zdGF0aWMgaW50IGlzX2xvb3BfbW91bnQoY29uc3QgY2hhciogcGF0aCkKK3N0YXRpYyBpbnQgaXNfbG9vcChjaGFyICpkZXYpCit7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoc3RhdChkZXYsICZzdCkgPT0gMCkgeworICAgICAgICBpZiAoU19JU0JMSyhzdC5zdF9tb2RlKSAmJiAobWFqb3Ioc3Quc3RfcmRldikgPT0gTE9PUF9NQUpPUikpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzX2xvb3BfbW91bnQoY29uc3QgY2hhciogcGF0aCwgY2hhciAqbG9vcGRldikKIHsKICAgICBGSUxFKiBmOwogICAgIGludCBjb3VudDsKQEAgLTIyLDE0ICszNywxNSBAQAogICAgIAogICAgIGYgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInIiKTsKICAgICBpZiAoIWYpIHsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJjb3VsZCBub3Qgb3BlbiAvcHJvYy9tb3VudHNcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBvcGVuIC9wcm9jL21vdW50czogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBkbyB7CiAgICAgICAgIGNvdW50ID0gZnNjYW5mKGYsICIlMjU1cyAlMjU1cyAlMjU1c1xuIiwgZGV2aWNlLCBtb3VudF9wYXRoLCByZXN0KTsKICAgICAgICAgaWYgKGNvdW50ID09IDMpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoTE9PUF9ERVZJQ0UsIGRldmljZSkgPT0gMCAmJiBzdHJjbXAocGF0aCwgbW91bnRfcGF0aCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGlzX2xvb3AoZGV2aWNlKSAmJiBzdHJjbXAocGF0aCwgbW91bnRfcGF0aCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cmxjcHkobG9vcGRldiwgZGV2aWNlLCBMT09QREVWX01BWExFTik7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQzLDI3ICs1OSwyOCBAQAogaW50IHVtb3VudF9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAgICAgaW50IGxvb3AsIGxvb3BfZmQ7Ci0gICAgCisgICAgY2hhciBsb29wZGV2W0xPT1BERVZfTUFYTEVOXTsKKwogICAgIGlmKGFyZ2MgIT0gMikgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwidW1vdW50IDxwYXRoPlxuIik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGxvb3AgPSBpc19sb29wX21vdW50KGFyZ3ZbMV0pOwotICAgIGlmKHVtb3VudChhcmd2WzFdKSl7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJmYWlsZWQuXG4iKTsKKyAgICBsb29wID0gaXNfbG9vcF9tb3VudChhcmd2WzFdLCBsb29wZGV2KTsKKyAgICBpZiAodW1vdW50KGFyZ3ZbMV0pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCiAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgLy8gZnJlZSB0aGUgbG9vcCBkZXZpY2UKLSAgICAgICAgbG9vcF9mZCA9IG9wZW4oTE9PUF9ERVZJQ0UsIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGxvb3BfZmQgPCAtMSkgewotICAgICAgICAgICAgcGVycm9yKCJvcGVuIGxvb3AgZGV2aWNlIGZhaWxlZCIpOworICAgICAgICBsb29wX2ZkID0gb3Blbihsb29wZGV2LCBPX1JET05MWSk7CisgICAgICAgIGlmIChsb29wX2ZkIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuIGxvb3AgZGV2aWNlIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApIDwgMCkgewotICAgICAgICAgICAgcGVycm9yKCJpb2N0bCBMT09QX0NMUl9GRCBmYWlsZWQiKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW9jdGwgTE9PUF9DTFJfRkQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAK